@agentv/core 0.23.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/evaluation/types.ts","../src/evaluation/yaml-parser.ts","../src/evaluation/formatting/segment-formatter.ts","../src/evaluation/loaders/config-loader.ts","../src/evaluation/loaders/file-resolver.ts","../src/evaluation/loaders/evaluator-parser.ts","../src/evaluation/validation/prompt-validator.ts","../src/evaluation/template-variables.ts","../src/evaluation/loaders/message-processor.ts","../src/evaluation/formatting/prompt-builder.ts","../src/evaluation/file-utils.ts","../src/evaluation/providers/ai-sdk.ts","../src/evaluation/providers/cli.ts","../src/evaluation/providers/codex.ts","../src/evaluation/providers/codex-log-tracker.ts","../src/evaluation/providers/preread.ts","../src/evaluation/providers/mock.ts","../src/evaluation/providers/targets.ts","../src/evaluation/providers/vscode.ts","../src/evaluation/providers/vscode-templates.ts","../src/evaluation/providers/targets-file.ts","../src/evaluation/providers/index.ts","../src/evaluation/evaluators.ts","../src/evaluation/orchestrator.ts","../../../node_modules/.bun/yocto-queue@1.2.2/node_modules/yocto-queue/index.js","../../../node_modules/.bun/p-limit@6.2.0/node_modules/p-limit/index.js","../src/evaluation/providers/types.ts","../src/evaluation/generators/rubric-generator.ts"],"sourcesContent":["export * from './evaluation/types.js';\nexport * from './evaluation/yaml-parser.js';\nexport * from './evaluation/file-utils.js';\nexport * from './evaluation/providers/index.js';\nexport * from './evaluation/evaluators.js';\nexport * from './evaluation/orchestrator.js';\nexport * from './evaluation/generators/index.js';\n\nexport type AgentKernel = {\n status: string;\n};\n\nexport function createAgentKernel(): AgentKernel {\n return { status: 'stub' };\n}\n","/**\n * JSON primitive values appearing in AgentV payloads.\n */\nexport type JsonPrimitive = string | number | boolean | null;\n\n/**\n * Immutable JSON object representation for test fixtures.\n */\nexport interface JsonObject {\n readonly [key: string]: JsonValue;\n}\n\n/**\n * Recursive JSON value supporting nested structures.\n */\nexport type JsonValue = JsonPrimitive | JsonObject | readonly JsonValue[];\n\nconst TEST_MESSAGE_ROLE_VALUES = ['system', 'user', 'assistant', 'tool'] as const;\n\n/**\n * Immutable list of supported message roles.\n */\nexport const TEST_MESSAGE_ROLES = TEST_MESSAGE_ROLE_VALUES;\n\n/**\n * Role literals used by test messages.\n */\nexport type TestMessageRole = (typeof TEST_MESSAGE_ROLE_VALUES)[number];\n\nconst TEST_MESSAGE_ROLE_SET: ReadonlySet<string> = new Set(TEST_MESSAGE_ROLE_VALUES);\n\n/**\n * Text or structured payload attached to a message.\n */\nexport type TestMessageContent = string | readonly JsonObject[];\n\n/**\n * System-authored instruction message.\n */\nexport type SystemTestMessage = {\n readonly role: 'system';\n readonly content: TestMessageContent;\n};\n\n/**\n * User-authored prompt message.\n */\nexport type UserTestMessage = {\n readonly role: 'user';\n readonly content: TestMessageContent;\n};\n\n/**\n * Assistant response message.\n */\nexport type AssistantTestMessage = {\n readonly role: 'assistant';\n readonly content: TestMessageContent;\n};\n\n/**\n * Tool invocation message.\n */\nexport type ToolTestMessage = {\n readonly role: 'tool';\n readonly content: TestMessageContent;\n};\n\n/**\n * Conversation message union with role discrimination.\n */\nexport type TestMessage =\n | SystemTestMessage\n | UserTestMessage\n | AssistantTestMessage\n | ToolTestMessage;\n\n/**\n * Guard validating supported message roles.\n */\nexport function isTestMessageRole(value: unknown): value is TestMessageRole {\n return typeof value === 'string' && TEST_MESSAGE_ROLE_SET.has(value);\n}\n\n/**\n * Guard matching AgentV JSON objects.\n */\nexport function isJsonObject(value: unknown): value is JsonObject {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n return Object.values(value as Record<string, unknown>).every(isJsonValue);\n}\n\n/**\n * Guard matching AgentV JSON values.\n */\nexport function isJsonValue(value: unknown): value is JsonValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n if (typeof value === 'object') {\n return isJsonObject(value);\n }\n return false;\n}\n\n/**\n * Guard validating raw test messages.\n */\nexport function isTestMessage(value: unknown): value is TestMessage {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const candidate = value as { role?: unknown; content?: unknown };\n if (!isTestMessageRole(candidate.role)) {\n return false;\n }\n if (typeof candidate.content === 'string') {\n return true;\n }\n if (!Array.isArray(candidate.content)) {\n return false;\n }\n return candidate.content.every(isJsonObject);\n}\n\nconst EVALUATOR_KIND_VALUES = ['code_judge', 'llm_judge', 'rubric', 'composite'] as const;\n\nexport type EvaluatorKind = (typeof EVALUATOR_KIND_VALUES)[number];\n\nconst EVALUATOR_KIND_SET: ReadonlySet<string> = new Set(EVALUATOR_KIND_VALUES);\n\nexport function isEvaluatorKind(value: unknown): value is EvaluatorKind {\n return typeof value === 'string' && EVALUATOR_KIND_SET.has(value);\n}\n\nexport type CodeEvaluatorConfig = {\n readonly name: string;\n readonly type: 'code';\n readonly script: string;\n readonly resolvedScriptPath?: string;\n readonly cwd?: string;\n readonly resolvedCwd?: string;\n};\n\nexport type LlmJudgeEvaluatorConfig = {\n readonly name: string;\n readonly type: 'llm_judge';\n readonly prompt?: string;\n readonly promptPath?: string;\n readonly rubrics?: readonly RubricItem[];\n};\n\nexport type RubricItem = {\n readonly id: string;\n readonly description: string;\n readonly weight: number;\n readonly required: boolean;\n};\n\nexport type CompositeAggregatorConfig =\n | { readonly type: 'weighted_average'; readonly weights?: Record<string, number> }\n | { readonly type: 'code_judge'; readonly path: string; readonly cwd?: string }\n | {\n readonly type: 'llm_judge';\n readonly prompt?: string;\n readonly promptPath?: string;\n readonly model?: string;\n };\n\nexport type CompositeEvaluatorConfig = {\n readonly name: string;\n readonly type: 'composite';\n readonly evaluators: readonly EvaluatorConfig[];\n readonly aggregator: CompositeAggregatorConfig;\n};\n\nexport type EvaluatorConfig =\n | CodeEvaluatorConfig\n | LlmJudgeEvaluatorConfig\n | CompositeEvaluatorConfig;\n\n/**\n * Eval case definition sourced from AgentV specs.\n */\nexport interface EvalCase {\n readonly id: string;\n readonly dataset?: string;\n readonly conversation_id?: string;\n readonly question: string;\n readonly input_messages: readonly TestMessage[];\n readonly input_segments: readonly JsonObject[];\n readonly expected_segments: readonly JsonObject[];\n readonly reference_answer?: string;\n readonly guideline_paths: readonly string[];\n readonly guideline_patterns?: readonly string[];\n readonly file_paths: readonly string[];\n readonly code_snippets: readonly string[];\n readonly expected_outcome: string;\n readonly evaluator?: EvaluatorKind;\n readonly evaluators?: readonly EvaluatorConfig[];\n}\n\n/**\n * Evaluator scorecard for a single eval case run.\n */\nexport interface EvaluationResult {\n readonly timestamp: string;\n readonly eval_id: string;\n readonly dataset?: string;\n readonly conversation_id?: string;\n readonly score: number;\n readonly hits: readonly string[];\n readonly misses: readonly string[];\n readonly candidate_answer: string;\n readonly target: string;\n readonly reasoning?: string;\n readonly raw_aspects?: readonly string[];\n readonly agent_provider_request?: JsonObject;\n readonly lm_provider_request?: JsonObject;\n readonly evaluator_provider_request?: JsonObject;\n readonly evaluator_results?: readonly EvaluatorResult[];\n readonly error?: string;\n}\n\nexport type EvaluationVerdict = 'pass' | 'fail' | 'borderline';\n\nexport interface EvaluatorResult {\n readonly name: string;\n readonly type: EvaluatorKind;\n readonly score: number;\n readonly weight?: number;\n readonly verdict?: EvaluationVerdict;\n readonly hits: readonly string[];\n readonly misses: readonly string[];\n readonly reasoning?: string;\n readonly raw_request?: JsonObject;\n readonly evaluator_provider_request?: JsonObject;\n readonly evaluator_results?: readonly EvaluatorResult[];\n}\n\n/**\n * Convenience accessor matching the Python hit_count property.\n */\nexport function getHitCount(result: Pick<EvaluationResult, 'hits'>): number {\n return result.hits.length;\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { extractCodeBlocks } from './formatting/segment-formatter.js';\nimport { extractTargetFromSuite, loadConfig } from './loaders/config-loader.js';\nimport { coerceEvaluator, parseEvaluators } from './loaders/evaluator-parser.js';\nimport { buildSearchRoots, resolveToAbsolutePath } from './loaders/file-resolver.js';\nimport { processMessages, resolveAssistantContent } from './loaders/message-processor.js';\nimport type { EvalCase, JsonObject, JsonValue, TestMessage } from './types.js';\nimport { isJsonObject, isTestMessage } from './types.js';\n\n// Re-export public APIs from modules\nexport { buildPromptInputs, type PromptInputs } from './formatting/prompt-builder.js';\nexport { extractCodeBlocks } from './formatting/segment-formatter.js';\nexport { isGuidelineFile } from './loaders/config-loader.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RED = '\\u001b[31m';\nconst ANSI_RESET = '\\u001b[0m';\n\ntype LoadOptions = {\n readonly verbose?: boolean;\n readonly evalId?: string;\n};\n\ntype RawTestSuite = JsonObject & {\n readonly evalcases?: JsonValue;\n readonly target?: JsonValue;\n readonly execution?: JsonValue;\n readonly dataset?: JsonValue;\n};\n\ntype RawEvalCase = JsonObject & {\n readonly id?: JsonValue;\n readonly conversation_id?: JsonValue;\n readonly outcome?: JsonValue;\n readonly expected_outcome?: JsonValue;\n readonly input_messages?: JsonValue;\n readonly expected_messages?: JsonValue;\n readonly execution?: JsonValue;\n readonly evaluators?: JsonValue;\n readonly rubrics?: JsonValue;\n};\n\n/**\n * Read metadata from a test suite file (like target name).\n * This is a convenience function for CLI tools that need metadata without loading all eval cases.\n */\nexport async function readTestSuiteMetadata(testFilePath: string): Promise<{ target?: string }> {\n try {\n const absolutePath = path.resolve(testFilePath);\n const content = await readFile(absolutePath, 'utf8');\n const parsed = parse(content) as unknown;\n\n if (!isJsonObject(parsed)) {\n return {};\n }\n\n return { target: extractTargetFromSuite(parsed) };\n } catch {\n return {};\n }\n}\n\n/**\n * Load eval cases from a AgentV YAML specification file.\n */\nexport async function loadEvalCases(\n evalFilePath: string,\n repoRoot: URL | string,\n options?: LoadOptions,\n): Promise<readonly EvalCase[]> {\n const verbose = options?.verbose ?? false;\n const evalIdFilter = options?.evalId;\n const absoluteTestPath = path.resolve(evalFilePath);\n\n const repoRootPath = resolveToAbsolutePath(repoRoot);\n const searchRoots = buildSearchRoots(absoluteTestPath, repoRootPath);\n\n // Load configuration (walks up directory tree to repo root)\n const config = await loadConfig(absoluteTestPath, repoRootPath);\n const guidelinePatterns = config?.guideline_patterns;\n\n const rawFile = await readFile(absoluteTestPath, 'utf8');\n const parsed = parse(rawFile) as unknown;\n if (!isJsonObject(parsed)) {\n throw new Error(`Invalid test file format: ${evalFilePath}`);\n }\n\n const suite = parsed as RawTestSuite;\n const datasetNameFromSuite = asString(suite.dataset)?.trim();\n const fallbackDataset = path.basename(absoluteTestPath).replace(/\\.ya?ml$/i, '') || 'eval';\n const datasetName =\n datasetNameFromSuite && datasetNameFromSuite.length > 0\n ? datasetNameFromSuite\n : fallbackDataset;\n\n const rawTestcases = suite.evalcases;\n if (!Array.isArray(rawTestcases)) {\n throw new Error(`Invalid test file format: ${evalFilePath} - missing 'evalcases' field`);\n }\n\n const globalEvaluator = coerceEvaluator(suite.evaluator, 'global') ?? 'llm_judge';\n\n // Extract global target from execution.target (or legacy root-level target)\n const globalExecution = isJsonObject(suite.execution) ? suite.execution : undefined;\n const _globalTarget = asString(globalExecution?.target) ?? asString(suite.target);\n\n const results: EvalCase[] = [];\n\n for (const rawEvalcase of rawTestcases) {\n if (!isJsonObject(rawEvalcase)) {\n logWarning('Skipping invalid eval case entry (expected object)');\n continue;\n }\n\n const evalcase = rawEvalcase as RawEvalCase;\n const id = asString(evalcase.id);\n\n // Skip eval cases that don't match the filter\n if (evalIdFilter && id !== evalIdFilter) {\n continue;\n }\n\n const conversationId = asString(evalcase.conversation_id);\n // Support both expected_outcome and outcome (backward compatibility)\n const outcome = asString(evalcase.expected_outcome) ?? asString(evalcase.outcome);\n\n const inputMessagesValue = evalcase.input_messages;\n const expectedMessagesValue = evalcase.expected_messages;\n\n if (!id || !outcome || !Array.isArray(inputMessagesValue)) {\n logError(\n `Skipping incomplete eval case: ${id ?? 'unknown'}. Missing required fields: id, outcome, and/or input_messages`,\n );\n continue;\n }\n\n // expected_messages is optional - for outcome-only evaluation\n const hasExpectedMessages =\n Array.isArray(expectedMessagesValue) && expectedMessagesValue.length > 0;\n\n // V2 format: input_messages vs expected_messages\n const inputMessages = inputMessagesValue.filter((msg): msg is TestMessage =>\n isTestMessage(msg),\n );\n const expectedMessages = hasExpectedMessages\n ? expectedMessagesValue.filter((msg): msg is TestMessage => isTestMessage(msg))\n : [];\n\n if (hasExpectedMessages && expectedMessages.length === 0) {\n logError(`No valid expected message found for eval case: ${id}`);\n continue;\n }\n\n if (expectedMessages.length > 1) {\n logWarning(`Multiple expected messages found for eval case: ${id}, using first`);\n }\n\n const guidelinePaths: string[] = [];\n const inputTextParts: string[] = [];\n\n // Process all input messages to extract files and guidelines\n const inputSegments = await processMessages({\n messages: inputMessages,\n searchRoots,\n repoRootPath,\n guidelinePatterns,\n guidelinePaths,\n textParts: inputTextParts,\n messageType: 'input',\n verbose,\n });\n\n // Process expected_messages into segments (only if provided)\n const outputSegments = hasExpectedMessages\n ? await processMessages({\n messages: expectedMessages,\n searchRoots,\n repoRootPath,\n guidelinePatterns,\n messageType: 'output',\n verbose,\n })\n : [];\n\n const codeSnippets = extractCodeBlocks(inputSegments);\n const expectedContent = expectedMessages[0]?.content;\n const referenceAnswer = expectedContent\n ? await resolveAssistantContent(expectedContent, searchRoots, verbose)\n : '';\n const question = inputTextParts\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .join(' ');\n\n const evalCaseEvaluatorKind = coerceEvaluator(evalcase.evaluator, id) ?? globalEvaluator;\n let evaluators: Awaited<ReturnType<typeof parseEvaluators>>;\n try {\n evaluators = await parseEvaluators(evalcase, globalExecution, searchRoots, id ?? 'unknown');\n } catch (error) {\n // Skip entire eval case if evaluator validation fails\n const message = error instanceof Error ? error.message : String(error);\n logError(`Skipping eval case '${id}': ${message}`);\n continue;\n }\n\n // Handle inline rubrics field (syntactic sugar)\n const inlineRubrics = evalcase.rubrics;\n if (inlineRubrics !== undefined && Array.isArray(inlineRubrics)) {\n const rubricItems = inlineRubrics\n .filter((r): r is JsonObject | string => isJsonObject(r) || typeof r === 'string')\n .map((rubric, index) => {\n if (typeof rubric === 'string') {\n return {\n id: `rubric-${index + 1}`,\n description: rubric,\n weight: 1.0,\n required: true,\n };\n }\n return {\n id: asString(rubric.id) ?? `rubric-${index + 1}`,\n description: asString(rubric.description) ?? '',\n weight: typeof rubric.weight === 'number' ? rubric.weight : 1.0,\n required: typeof rubric.required === 'boolean' ? rubric.required : true,\n };\n })\n .filter((r) => r.description.length > 0);\n\n if (rubricItems.length > 0) {\n const rubricEvaluator: import('./types.js').LlmJudgeEvaluatorConfig = {\n name: 'rubric',\n type: 'llm_judge',\n rubrics: rubricItems,\n };\n // Prepend rubric evaluator to existing evaluators\n evaluators = evaluators ? [rubricEvaluator, ...evaluators] : [rubricEvaluator];\n }\n }\n\n // Extract file paths from all input segments (non-guideline files)\n const userFilePaths: string[] = [];\n for (const segment of inputSegments) {\n if (segment.type === 'file' && typeof segment.resolvedPath === 'string') {\n userFilePaths.push(segment.resolvedPath);\n }\n }\n\n // Combine all file paths (guidelines + regular files)\n const allFilePaths = [\n ...guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\n ...userFilePaths,\n ];\n\n const testCase: EvalCase = {\n id,\n dataset: datasetName,\n conversation_id: conversationId,\n question: question,\n input_messages: inputMessages,\n input_segments: inputSegments,\n expected_segments: outputSegments,\n reference_answer: referenceAnswer,\n guideline_paths: guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\n guideline_patterns: guidelinePatterns,\n file_paths: allFilePaths,\n code_snippets: codeSnippets,\n expected_outcome: outcome,\n evaluator: evalCaseEvaluatorKind,\n evaluators,\n };\n\n if (verbose) {\n console.log(`\\n[Eval Case: ${id}]`);\n if (testCase.guideline_paths.length > 0) {\n console.log(` Guidelines used: ${testCase.guideline_paths.length}`);\n for (const guidelinePath of testCase.guideline_paths) {\n console.log(` - ${guidelinePath}`);\n }\n } else {\n console.log(' No guidelines found');\n }\n }\n\n results.push(testCase);\n }\n\n return results;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\nfunction logError(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.error(`${ANSI_RED}Error: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.error(`${ANSI_RED}Error: ${message}${ANSI_RESET}`);\n }\n}\n","import type { JsonObject } from '../types.js';\n\n/**\n * Formatting mode for segment content.\n * - 'agent': File references only (for providers with filesystem access)\n * - 'lm': Embedded file content with XML tags (for language model providers)\n */\nexport type FormattingMode = 'agent' | 'lm';\n\n/**\n * Extract fenced code blocks from AgentV user segments.\n */\nexport function extractCodeBlocks(segments: readonly JsonObject[]): readonly string[] {\n const CODE_BLOCK_PATTERN = /```[\\s\\S]*?```/g;\n const codeBlocks: string[] = [];\n for (const segment of segments) {\n const typeValue = segment.type;\n if (typeof typeValue !== 'string' || typeValue !== 'text') {\n continue;\n }\n const textValue = segment.value;\n if (typeof textValue !== 'string') {\n continue;\n }\n const matches = textValue.match(CODE_BLOCK_PATTERN);\n if (matches) {\n codeBlocks.push(...matches);\n }\n }\n return codeBlocks;\n}\n\n/**\n * Format file contents with XML tags for all files.\n */\nexport function formatFileContents(\n parts: Array<{ content: string; isFile: boolean; displayPath?: string }>,\n): string {\n const fileCount = parts.filter((p) => p.isFile).length;\n\n // Use XML tags if any files are present\n if (fileCount > 0) {\n return parts\n .map((part) => {\n if (part.isFile && part.displayPath) {\n return `<file path=\"${part.displayPath}\">\\n${part.content}\\n</file>`;\n }\n return part.content;\n })\n .join('\\n\\n');\n }\n\n // Otherwise, join normally\n return parts.map((p) => p.content).join(' ');\n}\n\n/**\n * Format a segment into its display string.\n * Text segments return their value; file segments return formatted file content with header.\n *\n * @param segment - The segment to format\n * @param mode - Formatting mode: 'agent' for file references, 'lm' for embedded content\n */\nexport function formatSegment(\n segment: JsonObject,\n mode: FormattingMode = 'lm',\n): string | undefined {\n const type = asString(segment.type);\n\n if (type === 'text') {\n return asString(segment.value);\n }\n\n if (type === 'guideline_ref') {\n const refPath = asString(segment.path);\n return refPath ? `<Attached: ${refPath}>` : undefined;\n }\n\n if (type === 'file') {\n const filePath = asString(segment.path);\n if (!filePath) {\n return undefined;\n }\n\n // Agent mode: return file reference only\n if (mode === 'agent') {\n return `<file: path=\"${filePath}\">`;\n }\n\n // LM mode: return embedded content with XML tags\n const text = asString(segment.text);\n if (text && filePath) {\n // Use formatFileContents for consistent XML formatting\n return formatFileContents([{ content: text.trim(), isFile: true, displayPath: filePath }]);\n }\n }\n\n return undefined;\n}\n\n/**\n * Check if processed segments contain visible content (text or file attachments).\n */\nexport function hasVisibleContent(segments: readonly JsonObject[]): boolean {\n return segments.some((segment) => {\n const type = asString(segment.type);\n\n if (type === 'text') {\n const value = asString(segment.value);\n return value !== undefined && value.trim().length > 0;\n }\n\n if (type === 'guideline_ref') {\n return false;\n }\n\n if (type === 'file') {\n const text = asString(segment.text);\n return text !== undefined && text.trim().length > 0;\n }\n\n return false;\n });\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\nimport { parse } from 'yaml';\n\nimport type { JsonObject, JsonValue } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport { buildDirectoryChain, fileExists } from './file-resolver.js';\n\nconst SCHEMA_CONFIG_V2 = 'agentv-config-v2';\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\nexport type AgentVConfig = {\n readonly $schema?: JsonValue;\n readonly guideline_patterns?: readonly string[];\n};\n\n/**\n * Load optional .agentv/config.yaml configuration file.\n * Searches from eval file directory up to repo root.\n */\nexport async function loadConfig(\n evalFilePath: string,\n repoRoot: string,\n): Promise<AgentVConfig | null> {\n const directories = buildDirectoryChain(evalFilePath, repoRoot);\n\n for (const directory of directories) {\n const configPath = path.join(directory, '.agentv', 'config.yaml');\n\n if (!(await fileExists(configPath))) {\n continue;\n }\n\n try {\n const rawConfig = await readFile(configPath, 'utf8');\n const parsed = parse(rawConfig) as unknown;\n\n if (!isJsonObject(parsed)) {\n logWarning(`Invalid .agentv/config.yaml format at ${configPath}`);\n continue;\n }\n\n const config = parsed as AgentVConfig;\n\n // Check $schema field to ensure V2 format\n const schema = config.$schema;\n\n if (schema !== SCHEMA_CONFIG_V2) {\n const message =\n typeof schema === 'string'\n ? `Invalid $schema value '${schema}' in ${configPath}. Expected '${SCHEMA_CONFIG_V2}'`\n : `Missing required field '$schema' in ${configPath}.\\nPlease add '$schema: ${SCHEMA_CONFIG_V2}' at the top of the file.`;\n logWarning(message);\n continue;\n }\n\n const guidelinePatterns = config.guideline_patterns;\n if (guidelinePatterns !== undefined && !Array.isArray(guidelinePatterns)) {\n logWarning(`Invalid guideline_patterns in ${configPath}, expected array`);\n continue;\n }\n\n if (\n Array.isArray(guidelinePatterns) &&\n !guidelinePatterns.every((p) => typeof p === 'string')\n ) {\n logWarning(`Invalid guideline_patterns in ${configPath}, all entries must be strings`);\n continue;\n }\n\n return {\n guideline_patterns: guidelinePatterns as readonly string[] | undefined,\n };\n } catch (error) {\n logWarning(\n `Could not read .agentv/config.yaml at ${configPath}: ${(error as Error).message}`,\n );\n }\n }\n\n return null;\n}\n\n/**\n * Determine whether a path references guideline content (instructions or prompts).\n */\nexport function isGuidelineFile(filePath: string, patterns?: readonly string[]): boolean {\n const normalized = filePath.split('\\\\').join('/');\n const patternsToUse = patterns ?? [];\n\n return micromatch.isMatch(normalized, patternsToUse as string[]);\n}\n\n/**\n * Extract target name from parsed eval suite (checks execution.target then falls back to root-level target).\n */\nexport function extractTargetFromSuite(suite: JsonObject): string | undefined {\n // Check execution.target first (new location), fallback to root-level target (legacy)\n const execution = suite.execution;\n if (execution && typeof execution === 'object' && !Array.isArray(execution)) {\n const executionTarget = (execution as Record<string, unknown>).target;\n if (typeof executionTarget === 'string' && executionTarget.trim().length > 0) {\n return executionTarget.trim();\n }\n }\n\n // Fallback to legacy root-level target\n const targetValue = suite.target;\n if (typeof targetValue === 'string' && targetValue.trim().length > 0) {\n return targetValue.trim();\n }\n\n return undefined;\n}\n\nfunction logWarning(message: string): void {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n}\n","import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport path from 'node:path';\n\n/**\n * Check if a file exists on disk.\n */\nexport async function fileExists(absolutePath: string): Promise<boolean> {\n try {\n await access(absolutePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Convert URL or string to absolute file path.\n */\nexport function resolveToAbsolutePath(candidate: URL | string): string {\n if (candidate instanceof URL) {\n return new URL(candidate).pathname;\n }\n if (typeof candidate === 'string') {\n if (candidate.startsWith('file://')) {\n return new URL(candidate).pathname;\n }\n return path.resolve(candidate);\n }\n throw new TypeError('Unsupported repoRoot value. Expected string or URL.');\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.\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.\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.\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 path from 'node:path';\n\nimport type { EvaluatorConfig, EvaluatorKind, JsonObject, JsonValue } from '../types.js';\nimport { isEvaluatorKind } from '../types.js';\nimport { validateCustomPromptContent } from '../validation/prompt-validator.js';\nimport { resolveFileReference } from './file-resolver.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Parse evaluators from eval case configuration.\n */\nexport async function parseEvaluators(\n rawEvalCase: JsonObject & {\n readonly execution?: JsonValue;\n readonly evaluators?: JsonValue;\n },\n globalExecution: JsonObject | undefined,\n searchRoots: readonly string[],\n evalId: string,\n): Promise<readonly EvaluatorConfig[] | undefined> {\n const execution = rawEvalCase.execution;\n // Priority: case-level execution.evaluators > case-level evaluators > global execution.evaluators\n const candidateEvaluators = isJsonObject(execution)\n ? (execution.evaluators ?? rawEvalCase.evaluators)\n : (rawEvalCase.evaluators ?? globalExecution?.evaluators);\n if (candidateEvaluators === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(candidateEvaluators)) {\n logWarning(`Skipping evaluators for '${evalId}': expected array`);\n return undefined;\n }\n\n const evaluators: EvaluatorConfig[] = [];\n\n for (const rawEvaluator of candidateEvaluators) {\n if (!isJsonObject(rawEvaluator)) {\n logWarning(`Skipping invalid evaluator entry for '${evalId}' (expected object)`);\n continue;\n }\n\n const name = asString(rawEvaluator.name);\n const typeValue = rawEvaluator.type;\n\n if (!name || !isEvaluatorKind(typeValue)) {\n logWarning(`Skipping evaluator with invalid name/type in '${evalId}'`);\n continue;\n }\n\n if (typeValue === 'code_judge') {\n const script = asString(rawEvaluator.script);\n if (!script) {\n logWarning(`Skipping code_judge evaluator '${name}' in '${evalId}': missing script`);\n continue;\n }\n\n const cwd = asString(rawEvaluator.cwd);\n let resolvedCwd: string | undefined;\n\n if (cwd) {\n const resolved = await resolveFileReference(cwd, searchRoots);\n if (resolved.resolvedPath) {\n resolvedCwd = path.resolve(resolved.resolvedPath);\n } else {\n logWarning(\n `Code_judge evaluator '${name}' in '${evalId}': cwd not found (${resolved.displayPath})`,\n resolved.attempted.length > 0\n ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`)\n : undefined,\n );\n }\n } else {\n resolvedCwd = searchRoots[0];\n }\n\n evaluators.push({\n name,\n type: 'code',\n script,\n cwd,\n resolvedCwd,\n });\n continue;\n }\n\n if (typeValue === 'composite') {\n const rawMembers = rawEvaluator.evaluators;\n if (!Array.isArray(rawMembers)) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': missing evaluators array`,\n );\n continue;\n }\n\n const rawAggregator = rawEvaluator.aggregator;\n if (!isJsonObject(rawAggregator)) {\n logWarning(`Skipping composite evaluator '${name}' in '${evalId}': missing aggregator`);\n continue;\n }\n\n const aggregatorType = asString(rawAggregator.type);\n if (\n aggregatorType !== 'weighted_average' &&\n aggregatorType !== 'code_judge' &&\n aggregatorType !== 'llm_judge'\n ) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': invalid aggregator type '${aggregatorType}'`,\n );\n continue;\n }\n\n // Recursively parse member evaluators\n const memberEvaluators: EvaluatorConfig[] = [];\n for (const rawMember of rawMembers) {\n if (!isJsonObject(rawMember)) {\n logWarning(`Skipping invalid member evaluator in composite '${name}' (expected object)`);\n continue;\n }\n\n const memberName = asString(rawMember.name);\n const memberType = rawMember.type;\n\n if (!memberName || !isEvaluatorKind(memberType)) {\n logWarning(`Skipping member evaluator with invalid name/type in composite '${name}'`);\n continue;\n }\n\n // Parse member evaluator (reuse existing logic for code, llm_judge, code_judge)\n const memberConfigs = await parseEvaluators(\n { evaluators: [rawMember] },\n undefined,\n searchRoots,\n `${evalId}:${name}:${memberName}`,\n );\n\n if (memberConfigs && memberConfigs.length > 0) {\n memberEvaluators.push(memberConfigs[0]);\n }\n }\n\n if (memberEvaluators.length === 0) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': no valid member evaluators`,\n );\n continue;\n }\n\n // Parse aggregator config\n let aggregator: import('../types.js').CompositeAggregatorConfig;\n\n if (aggregatorType === 'weighted_average') {\n const weights = isJsonObject(rawAggregator.weights)\n ? (rawAggregator.weights as Record<string, unknown>)\n : undefined;\n const parsedWeights: Record<string, number> = {};\n if (weights) {\n for (const [key, value] of Object.entries(weights)) {\n if (typeof value === 'number') {\n parsedWeights[key] = value;\n }\n }\n }\n aggregator = {\n type: 'weighted_average',\n ...(Object.keys(parsedWeights).length > 0 ? { weights: parsedWeights } : {}),\n };\n } else if (aggregatorType === 'code_judge') {\n const aggregatorPath = asString(rawAggregator.path);\n if (!aggregatorPath) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': code_judge aggregator missing path`,\n );\n continue;\n }\n\n // Don't try to resolve if path contains a command (e.g., \"node script.js\", \"uv run script.py\")\n // This matches the behavior of code evaluators which accept full commands\n // Set cwd to eval file directory (first search root)\n aggregator = {\n type: 'code_judge',\n path: aggregatorPath,\n cwd: searchRoots[0],\n };\n } else {\n // llm_judge aggregator\n const aggregatorPrompt = asString(rawAggregator.prompt);\n let promptPath: string | undefined;\n\n if (aggregatorPrompt) {\n const resolved = await resolveFileReference(aggregatorPrompt, searchRoots);\n if (resolved.resolvedPath) {\n promptPath = path.resolve(resolved.resolvedPath);\n }\n }\n\n aggregator = {\n type: 'llm_judge',\n ...(aggregatorPrompt ? { prompt: aggregatorPrompt } : {}),\n ...(promptPath ? { promptPath } : {}),\n };\n }\n\n evaluators.push({\n name,\n type: 'composite',\n evaluators: memberEvaluators,\n aggregator,\n });\n continue;\n }\n\n const prompt = asString(rawEvaluator.prompt);\n let promptPath: string | undefined;\n if (prompt) {\n const resolved = await resolveFileReference(prompt, searchRoots);\n if (resolved.resolvedPath) {\n promptPath = path.resolve(resolved.resolvedPath);\n // Validate custom prompt content upfront - throws error if validation fails\n try {\n await validateCustomPromptContent(promptPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n // Add context and re-throw for the caller to handle\n throw new Error(`Evaluator '${name}' template (${promptPath}): ${message}`);\n }\n } else {\n logWarning(\n `Inline prompt used for evaluator '${name}' in '${evalId}' (file not found: ${resolved.displayPath})`,\n resolved.attempted.length > 0\n ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`)\n : undefined,\n );\n }\n }\n\n const _model = asString(rawEvaluator.model);\n\n const rawRubrics = rawEvaluator.rubrics;\n const parsedRubrics = Array.isArray(rawRubrics)\n ? rawRubrics\n .filter((r): r is JsonObject => isJsonObject(r))\n .map((rubric, index) => ({\n id: asString(rubric.id) ?? `rubric-${index + 1}`,\n description: asString(rubric.description) ?? '',\n weight: typeof rubric.weight === 'number' ? rubric.weight : 1.0,\n required: typeof rubric.required === 'boolean' ? rubric.required : true,\n }))\n .filter((r) => r.description.length > 0)\n : undefined;\n\n if (typeValue === 'rubric') {\n if (!parsedRubrics) {\n logWarning(`Skipping rubric evaluator '${name}' in '${evalId}': missing rubrics array`);\n continue;\n }\n if (parsedRubrics.length === 0) {\n logWarning(`Skipping rubric evaluator '${name}' in '${evalId}': no valid rubrics found`);\n continue;\n }\n\n // Back-compat: `type: rubric` maps to `type: llm_judge` with `rubrics`.\n evaluators.push({\n name,\n type: 'llm_judge',\n rubrics: parsedRubrics,\n });\n continue;\n }\n\n evaluators.push({\n name,\n type: 'llm_judge',\n prompt,\n promptPath,\n ...(parsedRubrics && parsedRubrics.length > 0 ? { rubrics: parsedRubrics } : {}),\n });\n }\n\n return evaluators.length > 0 ? evaluators : undefined;\n}\n\n/**\n * Coerce evaluator value to valid EvaluatorKind.\n */\nexport function coerceEvaluator(\n candidate: JsonValue | undefined,\n contextId: string,\n): EvaluatorKind | undefined {\n if (typeof candidate !== 'string') {\n return undefined;\n }\n if (isEvaluatorKind(candidate)) {\n return candidate;\n }\n logWarning(`Unknown evaluator '${candidate}' in ${contextId}, falling back to default`);\n return undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n","import { readFile } from 'node:fs/promises';\n\nimport { TEMPLATE_VARIABLES, VALID_TEMPLATE_VARIABLES } from '../template-variables.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Validate custom prompt template content from a file.\n * Reads the file and checks for valid template variables.\n * Throws an error if required template variables are missing.\n */\nexport async function validateCustomPromptContent(promptPath: string): Promise<void> {\n const content = await readFile(promptPath, 'utf8');\n validateTemplateVariables(content, promptPath);\n}\n\n/**\n * Validate template variables in a custom prompt template string.\n * Exported for testing purposes.\n * @throws Error if required template variables are missing\n */\nexport function validateTemplateVariables(content: string, source: string): void {\n // Extract all template variables from content\n const variablePattern = /\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g;\n const foundVariables = new Set<string>();\n const invalidVariables: string[] = [];\n\n let match: RegExpExecArray | null = variablePattern.exec(content);\n while (match !== null) {\n const varName = match[1];\n foundVariables.add(varName);\n if (!VALID_TEMPLATE_VARIABLES.has(varName)) {\n invalidVariables.push(varName);\n }\n match = variablePattern.exec(content);\n }\n\n // Check if template contains required variables for evaluation\n const hasCandidateAnswer = foundVariables.has(TEMPLATE_VARIABLES.CANDIDATE_ANSWER);\n const hasExpectedMessages = foundVariables.has(TEMPLATE_VARIABLES.EXPECTED_MESSAGES);\n const hasRequiredFields = hasCandidateAnswer || hasExpectedMessages;\n\n // ERROR: Missing required fields - throw error to skip this evaluator/eval case\n if (!hasRequiredFields) {\n throw new Error(\n `Missing required fields. Must include at least one of:\\n - {{ ${TEMPLATE_VARIABLES.CANDIDATE_ANSWER} }}\\n - {{ ${TEMPLATE_VARIABLES.EXPECTED_MESSAGES} }}`,\n );\n }\n\n // WARNING: Invalid variables - show warning but continue\n if (invalidVariables.length > 0) {\n const warningMessage = `${ANSI_YELLOW}Warning: Custom evaluator template at ${source}\n Contains invalid variables: ${invalidVariables.map((v) => `{{ ${v} }}`).join(', ')}\n Valid variables: ${Array.from(VALID_TEMPLATE_VARIABLES)\n .map((v) => `{{ ${v} }}`)\n .join(', ')}${ANSI_RESET}`;\n\n console.warn(warningMessage);\n }\n}\n","/**\n * Template variable constants for evaluator prompts.\n * These variables can be used in custom evaluator templates with {{ variable_name }} syntax.\n */\nexport const TEMPLATE_VARIABLES = {\n CANDIDATE_ANSWER: 'candidate_answer',\n EXPECTED_MESSAGES: 'expected_messages',\n QUESTION: 'question',\n EXPECTED_OUTCOME: 'expected_outcome',\n REFERENCE_ANSWER: 'reference_answer',\n INPUT_MESSAGES: 'input_messages',\n} as const;\n\n/**\n * Type representing all valid template variable names.\n */\nexport type TemplateVariable = (typeof TEMPLATE_VARIABLES)[keyof typeof TEMPLATE_VARIABLES];\n\n/**\n * Set of all valid template variable names for runtime validation.\n */\nexport const VALID_TEMPLATE_VARIABLES = new Set<string>(Object.values(TEMPLATE_VARIABLES));\n\n/**\n * Template variables that are required for meaningful evaluation.\n * At least one of these should be present in a custom evaluator template.\n */\nexport const REQUIRED_TEMPLATE_VARIABLES = new Set<string>([\n TEMPLATE_VARIABLES.CANDIDATE_ANSWER,\n TEMPLATE_VARIABLES.EXPECTED_MESSAGES,\n]);\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { formatFileContents } from '../formatting/segment-formatter.js';\nimport type { JsonObject, TestMessage } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport { isGuidelineFile } from './config-loader.js';\nimport { resolveFileReference } from './file-resolver.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\ntype ProcessMessagesOptions = {\n readonly messages: readonly TestMessage[];\n readonly searchRoots: readonly string[];\n readonly repoRootPath: string;\n readonly guidelinePatterns?: readonly string[];\n readonly guidelinePaths?: string[];\n readonly textParts?: string[];\n readonly messageType: 'input' | 'output';\n readonly verbose: boolean;\n};\n\n/**\n * Process message content into structured segments with file resolution.\n */\nexport async function processMessages(options: ProcessMessagesOptions): Promise<JsonObject[]> {\n const {\n messages,\n searchRoots,\n repoRootPath,\n guidelinePatterns,\n guidelinePaths,\n textParts,\n messageType,\n verbose,\n } = options;\n\n const segments: JsonObject[] = [];\n\n for (const message of messages) {\n const content = message.content;\n if (typeof content === 'string') {\n segments.push({ type: 'text', value: content });\n if (textParts) {\n textParts.push(content);\n }\n continue;\n }\n\n for (const rawSegment of content) {\n if (!isJsonObject(rawSegment)) {\n continue;\n }\n\n const segmentType = asString(rawSegment.type);\n if (segmentType === 'file') {\n const rawValue = asString(rawSegment.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n const context = messageType === 'input' ? '' : ' in expected_messages';\n logWarning(`File not found${context}: ${displayPath}`, attempts);\n continue;\n }\n\n try {\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n');\n\n // Only check for guidelines in input messages\n if (messageType === 'input' && guidelinePatterns && guidelinePaths) {\n const relativeToRepo = path.relative(repoRootPath, resolvedPath);\n\n if (isGuidelineFile(relativeToRepo, guidelinePatterns)) {\n guidelinePaths.push(path.resolve(resolvedPath));\n if (verbose) {\n console.log(` [Guideline] Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n continue;\n }\n }\n\n segments.push({\n type: 'file',\n path: displayPath,\n text: fileContent,\n resolvedPath: path.resolve(resolvedPath),\n });\n\n if (verbose) {\n const label = messageType === 'input' ? '[File]' : '[Expected Output File]';\n console.log(` ${label} Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n } catch (error) {\n const context = messageType === 'input' ? '' : ' expected output';\n logWarning(`Could not read${context} file ${resolvedPath}: ${(error as Error).message}`);\n }\n continue;\n }\n\n const clonedSegment = cloneJsonObject(rawSegment);\n segments.push(clonedSegment);\n const inlineValue = clonedSegment.value;\n if (typeof inlineValue === 'string' && textParts) {\n textParts.push(inlineValue);\n }\n }\n }\n\n return segments;\n}\n\n/**\n * Resolve assistant content including file references.\n * Similar to input message processing, but for expected assistant responses.\n */\nexport async function resolveAssistantContent(\n content: TestMessage['content'] | undefined,\n searchRoots: readonly string[],\n verbose: boolean,\n): Promise<string> {\n if (typeof content === 'string') {\n return content;\n }\n if (!content) {\n return '';\n }\n\n // Track parts with metadata about whether they came from files\n const parts: Array<{ content: string; isFile: boolean; displayPath?: string }> = [];\n\n for (const entry of content) {\n if (typeof entry === 'string') {\n parts.push({ content: entry, isFile: false });\n continue;\n }\n\n if (!isJsonObject(entry)) {\n continue;\n }\n\n const segmentType = asString(entry.type);\n\n // Handle file references\n if (segmentType === 'file') {\n const rawValue = asString(entry.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n logWarning(`File not found in expected_messages: ${displayPath}`, attempts);\n continue;\n }\n\n try {\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n').trim();\n parts.push({ content: fileContent, isFile: true, displayPath });\n if (verbose) {\n console.log(` [Expected Assistant File] Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n } catch (error) {\n logWarning(`Could not read file ${resolvedPath}: ${(error as Error).message}`);\n }\n continue;\n }\n\n // Handle text segments\n const textValue = asString(entry.text);\n if (typeof textValue === 'string') {\n parts.push({ content: textValue, isFile: false });\n continue;\n }\n\n const valueValue = asString(entry.value);\n if (typeof valueValue === 'string') {\n parts.push({ content: valueValue, isFile: false });\n continue;\n }\n\n parts.push({ content: JSON.stringify(entry), isFile: false });\n }\n\n return formatFileContents(parts);\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction cloneJsonObject(source: JsonObject): JsonObject {\n const entries = Object.entries(source).map(([key, value]) => [key, cloneJsonValue(value)]);\n return Object.fromEntries(entries) as JsonObject;\n}\n\nfunction cloneJsonValue(value: unknown): unknown {\n if (value === null) {\n return null;\n }\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneJsonValue(item));\n }\n if (typeof value === 'object') {\n return cloneJsonObject(value as JsonObject);\n }\n return value;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { isGuidelineFile } from '../loaders/config-loader.js';\nimport { fileExists } from '../loaders/file-resolver.js';\nimport type { ChatMessageRole, ChatPrompt } from '../providers/types.js';\nimport type { EvalCase, JsonObject, TestMessage } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport {\n type FormattingMode,\n formatFileContents,\n formatSegment,\n hasVisibleContent,\n} from './segment-formatter.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Build prompt inputs by consolidating user request context and guideline content.\n */\nexport interface PromptInputs {\n readonly question: string;\n readonly guidelines: string;\n readonly chatPrompt?: ChatPrompt;\n readonly systemMessage?: string;\n}\n\n/**\n * Build prompt inputs by consolidating user request context and guideline content.\n *\n * @param testCase - The evaluation test case\n * @param mode - Formatting mode: 'agent' for file references, 'lm' for embedded content (default: 'lm')\n */\nexport async function buildPromptInputs(\n testCase: EvalCase,\n mode: FormattingMode = 'lm',\n): Promise<PromptInputs> {\n const guidelineParts: Array<{ content: string; isFile: boolean; displayPath?: string }> = [];\n for (const rawPath of testCase.guideline_paths) {\n const absolutePath = path.resolve(rawPath);\n if (!(await fileExists(absolutePath))) {\n logWarning(`Could not read guideline file ${absolutePath}: file does not exist`);\n continue;\n }\n\n try {\n const content = (await readFile(absolutePath, 'utf8')).replace(/\\r\\n/g, '\\n').trim();\n guidelineParts.push({\n content,\n isFile: true,\n displayPath: path.basename(absolutePath),\n });\n } catch (error) {\n logWarning(`Could not read guideline file ${absolutePath}: ${(error as Error).message}`);\n }\n }\n\n const guidelines = formatFileContents(guidelineParts);\n\n // Build segments per message to determine if role markers are needed\n const segmentsByMessage: JsonObject[][] = [];\n const fileContentsByPath = new Map<string, string>();\n for (const segment of testCase.input_segments) {\n if (\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n typeof segment.text === 'string'\n ) {\n fileContentsByPath.set(segment.path, segment.text);\n }\n }\n\n for (const message of testCase.input_messages) {\n const messageSegments: JsonObject[] = [];\n\n if (typeof message.content === 'string') {\n if (message.content.trim().length > 0) {\n messageSegments.push({ type: 'text', value: message.content });\n }\n } else if (Array.isArray(message.content)) {\n for (const segment of message.content) {\n if (typeof segment === 'string') {\n if (segment.trim().length > 0) {\n messageSegments.push({ type: 'text', value: segment });\n }\n } else if (isJsonObject(segment)) {\n const type = asString(segment.type);\n\n if (type === 'file') {\n const value = asString(segment.value);\n if (!value) continue;\n\n // Check if this is a guideline file (extracted separately)\n if (\n testCase.guideline_patterns &&\n isGuidelineFile(value, testCase.guideline_patterns)\n ) {\n // Reference marker only - actual content is in guidelines field\n messageSegments.push({ type: 'guideline_ref', path: value });\n continue;\n }\n\n // Find the file content from input_segments\n const fileText = fileContentsByPath.get(value);\n\n if (fileText !== undefined) {\n messageSegments.push({ type: 'file', text: fileText, path: value });\n }\n } else if (type === 'text') {\n const textValue = asString(segment.value);\n if (textValue && textValue.trim().length > 0) {\n messageSegments.push({ type: 'text', value: textValue });\n }\n }\n }\n }\n }\n\n segmentsByMessage.push(messageSegments);\n }\n\n // Determine if we need role markers based on actual processed content\n const useRoleMarkers = needsRoleMarkers(testCase.input_messages, segmentsByMessage);\n\n let question: string;\n\n if (useRoleMarkers) {\n // Multi-turn format with role markers using pre-computed segments\n const messageParts: string[] = [];\n\n for (let i = 0; i < testCase.input_messages.length; i++) {\n const message = testCase.input_messages[i];\n const segments = segmentsByMessage[i];\n\n if (!hasVisibleContent(segments)) {\n continue;\n }\n\n const roleLabel = message.role.charAt(0).toUpperCase() + message.role.slice(1);\n const contentParts: string[] = [];\n\n for (const segment of segments) {\n const formattedContent = formatSegment(segment, mode);\n if (formattedContent) {\n contentParts.push(formattedContent);\n }\n }\n\n if (contentParts.length > 0) {\n const messageContent = contentParts.join('\\n');\n messageParts.push(`@[${roleLabel}]:\\n${messageContent}`);\n }\n }\n\n question = messageParts.join('\\n\\n');\n } else {\n // Single-turn flat format\n const questionParts: string[] = [];\n for (const segment of testCase.input_segments) {\n // Skip guideline files - they're in the guidelines field\n if (\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n testCase.guideline_patterns &&\n isGuidelineFile(segment.path, testCase.guideline_patterns)\n ) {\n // Add reference marker for guideline files\n questionParts.push(`<Attached: ${segment.path}>`);\n continue;\n }\n\n const formattedContent = formatSegment(segment, mode);\n if (formattedContent) {\n questionParts.push(formattedContent);\n }\n }\n\n if (testCase.code_snippets.length > 0) {\n questionParts.push(testCase.code_snippets.join('\\n'));\n }\n\n question = questionParts\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .join('\\n\\n');\n }\n\n const chatPrompt = useRoleMarkers\n ? buildChatPromptFromSegments({\n messages: testCase.input_messages,\n segmentsByMessage,\n guidelinePatterns: testCase.guideline_patterns,\n guidelineContent: guidelines,\n mode,\n })\n : undefined;\n\n return { question, guidelines, chatPrompt };\n}\n\n/**\n * Detect if role markers are needed based on conversational structure.\n *\n * Role markers ([System]:, [User]:, etc.) are added when:\n * 1. There are assistant/tool messages (true multi-turn conversation), OR\n * 2. There are multiple messages that will produce visible content in the formatted output\n */\nfunction needsRoleMarkers(\n messages: readonly TestMessage[],\n processedSegmentsByMessage: readonly (readonly JsonObject[])[],\n): boolean {\n // Check for multi-turn conversation (assistant/tool messages)\n if (messages.some((msg) => msg.role === 'assistant' || msg.role === 'tool')) {\n return true;\n }\n\n // Count how many messages have actual content after processing\n let messagesWithContent = 0;\n\n for (const segments of processedSegmentsByMessage) {\n if (hasVisibleContent(segments)) {\n messagesWithContent++;\n }\n }\n\n return messagesWithContent > 1;\n}\n\nfunction buildChatPromptFromSegments(options: {\n readonly messages: readonly TestMessage[];\n readonly segmentsByMessage: readonly JsonObject[][];\n readonly guidelinePatterns?: readonly string[];\n readonly guidelineContent?: string;\n readonly systemPrompt?: string;\n readonly mode?: FormattingMode;\n}): ChatPrompt | undefined {\n const {\n messages,\n segmentsByMessage,\n guidelinePatterns,\n guidelineContent,\n systemPrompt,\n mode = 'lm',\n } = options;\n\n if (messages.length === 0) {\n return undefined;\n }\n\n const systemSegments: string[] = [];\n\n if (systemPrompt && systemPrompt.trim().length > 0) {\n systemSegments.push(systemPrompt.trim());\n }\n\n if (guidelineContent && guidelineContent.trim().length > 0) {\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${guidelineContent.trim()}`);\n }\n\n let startIndex = 0;\n while (startIndex < messages.length && messages[startIndex].role === 'system') {\n const segments = segmentsByMessage[startIndex];\n const contentParts: string[] = [];\n\n for (const segment of segments) {\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length > 0) {\n systemSegments.push(contentParts.join('\\n'));\n }\n\n startIndex += 1;\n }\n\n const chatPrompt: Array<ChatPrompt[number]> = [];\n\n if (systemSegments.length > 0) {\n chatPrompt.push({\n role: 'system',\n content: systemSegments.join('\\n\\n'),\n });\n }\n\n for (let i = startIndex; i < messages.length; i++) {\n const message = messages[i];\n const segments = segmentsByMessage[i];\n const contentParts: string[] = [];\n\n let role: ChatMessageRole = message.role as ChatMessageRole;\n\n if (role === 'system') {\n role = 'assistant';\n contentParts.push('@[System]:');\n } else if (role === 'tool') {\n role = 'assistant';\n contentParts.push('@[Tool]:');\n }\n\n for (const segment of segments) {\n if (segment.type === 'guideline_ref') {\n continue;\n }\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n const isGuidelineRef =\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n guidelinePatterns &&\n isGuidelineFile(segment.path, guidelinePatterns);\n\n if (isGuidelineRef) {\n continue;\n }\n\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length === 0) {\n continue;\n }\n\n const content = contentParts.join('\\n');\n\n chatPrompt.push({\n role,\n content,\n });\n }\n\n return chatPrompt.length > 0 ? (chatPrompt as ChatPrompt) : undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction logWarning(message: string): void {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n}\n","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 { createAnthropic } from '@ai-sdk/anthropic';\nimport { type AzureOpenAIProviderSettings, createAzure } from '@ai-sdk/azure';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { type LanguageModel, type ModelMessage, generateText } from 'ai';\n\nimport type { JsonObject } from '../types.js';\nimport type {\n AnthropicResolvedConfig,\n AzureResolvedConfig,\n GeminiResolvedConfig,\n RetryConfig,\n} from './targets.js';\nimport type { ChatPrompt, Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst DEFAULT_SYSTEM_PROMPT =\n 'You are a careful assistant. Follow all provided instructions and do not fabricate results.';\n\ntype TextResult = Awaited<ReturnType<typeof generateText>>;\ntype GenerateTextOptions = Parameters<typeof generateText>[0];\n\ninterface ProviderDefaults {\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly thinkingBudget?: number;\n}\n\nexport class AzureProvider implements Provider {\n readonly id: string;\n readonly kind = 'azure' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: AzureResolvedConfig,\n ) {\n this.id = `azure:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n\n const azure = createAzure(buildAzureOptions(config));\n this.model = azure(config.deploymentName);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nexport class AnthropicProvider implements Provider {\n readonly id: string;\n readonly kind = 'anthropic' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: AnthropicResolvedConfig,\n ) {\n this.id = `anthropic:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n thinkingBudget: config.thinkingBudget,\n };\n this.retryConfig = config.retry;\n\n const anthropic = createAnthropic({\n apiKey: config.apiKey,\n });\n this.model = anthropic(config.model);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n const providerOptions = buildAnthropicProviderOptions(this.defaults);\n\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n providerOptions,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nexport class GeminiProvider implements Provider {\n readonly id: string;\n readonly kind = 'gemini' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: GeminiResolvedConfig,\n ) {\n this.id = `gemini:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n\n const google = createGoogleGenerativeAI({\n apiKey: config.apiKey,\n });\n this.model = google(config.model);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nfunction buildAzureOptions(config: AzureResolvedConfig): AzureOpenAIProviderSettings {\n const options: AzureOpenAIProviderSettings = {\n apiKey: config.apiKey,\n apiVersion: config.version,\n useDeploymentBasedUrls: true,\n };\n\n const baseURL = normalizeAzureBaseUrl(config.resourceName);\n if (baseURL) {\n options.baseURL = baseURL;\n } else {\n options.resourceName = config.resourceName;\n }\n\n return options;\n}\n\nfunction normalizeAzureBaseUrl(resourceName: string): string | undefined {\n const trimmed = resourceName.trim();\n if (!/^https?:\\/\\//i.test(trimmed)) {\n return undefined;\n }\n\n const withoutSlash = trimmed.replace(/\\/+$/, '');\n const normalized = withoutSlash.endsWith('/openai') ? withoutSlash : `${withoutSlash}/openai`;\n return normalized;\n}\n\nfunction buildAnthropicProviderOptions(\n defaults: ProviderDefaults,\n): GenerateTextOptions['providerOptions'] | undefined {\n if (defaults.thinkingBudget === undefined) {\n return undefined;\n }\n\n return {\n anthropic: {\n thinking: {\n type: 'enabled',\n budgetTokens: defaults.thinkingBudget,\n },\n },\n };\n}\n\nfunction buildChatPrompt(request: ProviderRequest): ChatPrompt {\n const provided = request.chatPrompt?.length ? request.chatPrompt : undefined;\n if (provided) {\n const hasSystemMessage = provided.some((message) => message.role === 'system');\n if (hasSystemMessage) {\n return provided;\n }\n\n const systemContent = resolveSystemContent(request, false);\n return [{ role: 'system', content: systemContent }, ...provided];\n }\n\n const systemContent = resolveSystemContent(request, true);\n const userContent = request.question.trim();\n\n const prompt: ChatPrompt = [\n { role: 'system', content: systemContent },\n { role: 'user', content: userContent },\n ];\n\n return prompt;\n}\n\nfunction resolveSystemContent(request: ProviderRequest, includeGuidelines: boolean): string {\n const systemSegments: string[] = [];\n\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\n systemSegments.push(request.systemPrompt.trim());\n } else {\n systemSegments.push(DEFAULT_SYSTEM_PROMPT);\n }\n\n if (includeGuidelines && request.guidelines && request.guidelines.trim().length > 0) {\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${request.guidelines.trim()}`);\n }\n\n return systemSegments.join('\\n\\n');\n}\n\nfunction toModelMessages(chatPrompt: ChatPrompt): ModelMessage[] {\n return chatPrompt.map((message) => {\n if (message.role === 'tool' || message.role === 'function') {\n const prefix = message.name ? `@[${message.name}]: ` : '@[Tool]: ';\n return {\n role: 'assistant',\n content: `${prefix}${message.content}`,\n } satisfies ModelMessage;\n }\n\n if (message.role === 'assistant' || message.role === 'system' || message.role === 'user') {\n return {\n role: message.role,\n content: message.content,\n } satisfies ModelMessage;\n }\n\n return {\n role: 'user',\n content: message.content,\n } satisfies ModelMessage;\n });\n}\n\nfunction resolveModelSettings(\n request: ProviderRequest,\n defaults: ProviderDefaults,\n): { temperature?: number; maxOutputTokens?: number } {\n const temperature = request.temperature ?? defaults.temperature;\n const maxOutputTokens = request.maxOutputTokens ?? defaults.maxOutputTokens;\n return {\n temperature,\n maxOutputTokens,\n };\n}\n\nasync function invokeModel(options: {\n readonly model: LanguageModel;\n readonly request: ProviderRequest;\n readonly defaults: ProviderDefaults;\n readonly retryConfig?: RetryConfig;\n readonly providerOptions?: GenerateTextOptions['providerOptions'];\n}): Promise<ProviderResponse> {\n const { model, request, defaults, retryConfig, providerOptions } = options;\n const chatPrompt = buildChatPrompt(request);\n const { temperature, maxOutputTokens } = resolveModelSettings(request, defaults);\n\n const result = await withRetry(\n () =>\n generateText({\n model,\n messages: toModelMessages(chatPrompt),\n temperature,\n maxOutputTokens,\n maxRetries: 0,\n abortSignal: request.signal,\n ...(providerOptions ? { providerOptions } : {}),\n }),\n retryConfig,\n request.signal,\n );\n\n return mapResponse(result);\n}\n\nfunction mapResponse(result: TextResult): ProviderResponse {\n return {\n text: result.text ?? '',\n reasoning: result.reasoningText ?? undefined,\n raw: result,\n usage: toJsonObject(result.totalUsage ?? result.usage),\n };\n}\n\nfunction toJsonObject(value: unknown): JsonObject | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n try {\n return JSON.parse(JSON.stringify(value)) as JsonObject;\n } catch {\n return undefined;\n }\n}\n\nfunction extractStatus(error: unknown): number | undefined {\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n\n const candidate = error as Record<string, unknown>;\n const directStatus = candidate.status ?? candidate.statusCode;\n if (typeof directStatus === 'number' && Number.isFinite(directStatus)) {\n return directStatus;\n }\n\n const responseStatus =\n typeof candidate.response === 'object' && candidate.response\n ? (candidate.response as { status?: unknown }).status\n : undefined;\n if (typeof responseStatus === 'number' && Number.isFinite(responseStatus)) {\n return responseStatus;\n }\n\n const message = typeof candidate.message === 'string' ? candidate.message : undefined;\n if (message) {\n const match = message.match(/HTTP\\s+(\\d{3})/i);\n if (match) {\n const parsed = Number.parseInt(match[1], 10);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n\n return undefined;\n}\n\nfunction isNetworkError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const candidate = error as Record<string, unknown>;\n if (candidate.name === 'AbortError') {\n return false;\n }\n\n const code = candidate.code;\n if (typeof code === 'string' && /^E(AI|CONN|HOST|NET|PIPE|TIME|REFUSED|RESET)/i.test(code)) {\n return true;\n }\n\n const message = typeof candidate.message === 'string' ? candidate.message : undefined;\n if (\n message &&\n /(network|fetch failed|ECONNRESET|ENOTFOUND|EAI_AGAIN|ETIMEDOUT|ECONNREFUSED)/i.test(message)\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction isRetryableError(error: unknown, retryableStatusCodes: readonly number[]): boolean {\n const status = extractStatus(error);\n if (status === 401 || status === 403) {\n return false;\n }\n if (typeof status === 'number') {\n return retryableStatusCodes.includes(status);\n }\n\n return isNetworkError(error);\n}\n\nfunction calculateRetryDelay(attempt: number, config: Required<RetryConfig>): number {\n const delay = Math.min(\n config.maxDelayMs,\n config.initialDelayMs * config.backoffFactor ** attempt,\n );\n return delay * (0.75 + Math.random() * 0.5);\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function withRetry<T>(\n fn: () => Promise<T>,\n retryConfig?: RetryConfig,\n signal?: AbortSignal,\n): Promise<T> {\n const config: Required<RetryConfig> = {\n maxRetries: retryConfig?.maxRetries ?? 3,\n initialDelayMs: retryConfig?.initialDelayMs ?? 1000,\n maxDelayMs: retryConfig?.maxDelayMs ?? 60000,\n backoffFactor: retryConfig?.backoffFactor ?? 2,\n retryableStatusCodes: retryConfig?.retryableStatusCodes ?? [500, 408, 429, 502, 503, 504],\n };\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n if (signal?.aborted) {\n throw new Error(`Request aborted: ${signal.reason ?? 'Unknown reason'}`);\n }\n\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt >= config.maxRetries) {\n break;\n }\n\n if (!isRetryableError(error, config.retryableStatusCodes)) {\n throw error;\n }\n\n const delay = calculateRetryDelay(attempt, config);\n await sleep(delay);\n }\n }\n\n throw lastError;\n}\n","import { type ExecException, type ExecOptions, exec as execWithCallback } from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { readTextFile } from '../file-utils.js';\nimport type { CliResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst execAsync = promisify(execWithCallback);\nconst DEFAULT_MAX_BUFFER = 10 * 1024 * 1024; // 10 MB to accommodate verbose CLI output\n\nexport interface CommandRunOptions {\n readonly cwd?: string;\n readonly env?: NodeJS.ProcessEnv;\n readonly timeoutMs?: number;\n readonly signal?: AbortSignal;\n}\n\nexport interface CommandRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number | null;\n readonly failed: boolean;\n readonly timedOut?: boolean;\n readonly signal?: NodeJS.Signals | null;\n}\n\nexport type CommandRunner = (\n command: string,\n options: CommandRunOptions,\n) => Promise<CommandRunResult>;\n\nasync function defaultCommandRunner(\n command: string,\n options: CommandRunOptions,\n): Promise<CommandRunResult> {\n const execOptions: ExecOptions = {\n cwd: options.cwd,\n env: options.env,\n timeout: options.timeoutMs,\n signal: options.signal,\n maxBuffer: DEFAULT_MAX_BUFFER,\n shell: process.platform === 'win32' ? 'powershell.exe' : undefined,\n };\n\n try {\n const { stdout, stderr } = await execAsync(command, execOptions);\n\n return {\n stdout,\n stderr,\n exitCode: 0,\n failed: false,\n timedOut: false,\n signal: null,\n };\n } catch (error) {\n const execError = error as ExecException & {\n stdout?: string;\n stderr?: string;\n timedOut?: boolean;\n killed?: boolean;\n };\n\n return {\n stdout: execError.stdout ?? '',\n stderr: execError.stderr ?? '',\n exitCode: typeof execError.code === 'number' ? execError.code : null,\n failed: true,\n timedOut: execError.timedOut === true || execError.killed === true,\n signal: execError.signal ?? null,\n };\n }\n}\n\nexport class CliProvider implements Provider {\n readonly id: string;\n readonly kind = 'cli';\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: CliResolvedConfig;\n private readonly runCommand: CommandRunner;\n private readonly verbose: boolean;\n private healthcheckPromise?: Promise<void>;\n\n constructor(\n targetName: string,\n config: CliResolvedConfig,\n runner: CommandRunner = defaultCommandRunner,\n ) {\n this.targetName = targetName;\n this.id = `cli:${targetName}`;\n this.config = config;\n this.runCommand = runner;\n this.verbose = config.verbose ?? false;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('CLI provider request was aborted before execution');\n }\n\n await this.ensureHealthy(request.signal);\n\n const outputFilePath = generateOutputFilePath(request.evalCaseId);\n const templateValues = buildTemplateValues(request, this.config, outputFilePath);\n const renderedCommand = renderTemplate(this.config.commandTemplate, templateValues);\n\n const result = await this.runCommand(renderedCommand, {\n cwd: this.config.cwd,\n env: process.env,\n timeoutMs: this.config.timeoutMs,\n signal: request.signal,\n });\n\n if (result.failed || (result.exitCode ?? 0) !== 0) {\n if (request.signal?.aborted) {\n throw new Error('CLI provider request was aborted');\n }\n if (result.timedOut) {\n throw new Error(\n `CLI provider timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\n const detail = result.stderr.trim() || result.stdout.trim();\n const message = detail\n ? `${detail} (exit code ${codeText})`\n : `CLI exited with code ${codeText}`;\n throw new Error(message);\n }\n\n // Read from output file\n const responseText = await this.readAndCleanupOutputFile(outputFilePath);\n\n return {\n text: responseText,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: this.config.cwd,\n outputFile: outputFilePath,\n },\n };\n }\n\n private async readAndCleanupOutputFile(filePath: string): Promise<string> {\n try {\n const content = await readTextFile(filePath);\n return content;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to read output file '${filePath}': ${errorMsg}`);\n } finally {\n // Clean up temp file - ignore errors as the file might not exist on read failure\n await fs.unlink(filePath).catch(() => {\n /* ignore cleanup errors */\n });\n }\n }\n\n private async ensureHealthy(signal?: AbortSignal): Promise<void> {\n if (!this.config.healthcheck) {\n return;\n }\n if (!this.healthcheckPromise) {\n this.healthcheckPromise = this.runHealthcheck(this.config.healthcheck, signal);\n }\n return this.healthcheckPromise;\n }\n\n private async runHealthcheck(\n healthcheck: CliResolvedConfig['healthcheck'],\n signal?: AbortSignal,\n ): Promise<void> {\n if (!healthcheck) {\n return;\n }\n\n const timeoutMs = healthcheck.timeoutMs ?? this.config.timeoutMs;\n\n if (healthcheck.type === 'http') {\n const controller = new AbortController();\n const timer = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : undefined;\n signal?.addEventListener('abort', () => controller.abort(), { once: true });\n\n try {\n const response = await fetch(healthcheck.url, { method: 'GET', signal: controller.signal });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\n }\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${reason}`);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n return;\n }\n\n const renderedCommand = renderTemplate(\n healthcheck.commandTemplate,\n buildTemplateValues(\n {\n question: '',\n guidelines: '',\n inputFiles: [],\n evalCaseId: 'healthcheck',\n attempt: 0,\n },\n this.config,\n generateOutputFilePath('healthcheck'),\n ),\n );\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] (healthcheck) CLI_EVALS_DIR=${process.env.CLI_EVALS_DIR ?? ''} cwd=${healthcheck.cwd ?? this.config.cwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n const result = await this.runCommand(renderedCommand, {\n cwd: healthcheck.cwd ?? this.config.cwd,\n env: process.env,\n timeoutMs,\n signal,\n });\n\n if (result.failed || (result.exitCode ?? 0) !== 0) {\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\n const detail = result.stderr.trim() || result.stdout.trim();\n const message = detail\n ? `${detail} (exit code ${codeText})`\n : `CLI healthcheck command exited with code ${codeText}`;\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${message}`);\n }\n }\n}\n\nfunction buildTemplateValues(\n request: Pick<\n ProviderRequest,\n 'question' | 'guidelines' | 'inputFiles' | 'evalCaseId' | 'attempt'\n >,\n config: CliResolvedConfig,\n outputFilePath: string,\n): Record<string, string> {\n const inputFiles = normalizeInputFiles(request.inputFiles);\n return {\n PROMPT: shellEscape(request.question ?? ''),\n GUIDELINES: shellEscape(request.guidelines ?? ''),\n EVAL_ID: shellEscape(request.evalCaseId ?? ''),\n ATTEMPT: shellEscape(String(request.attempt ?? 0)),\n FILES: formatFileList(inputFiles, config.filesFormat),\n OUTPUT_FILE: shellEscape(outputFilePath),\n };\n}\n\nfunction normalizeInputFiles(\n inputFiles: readonly string[] | undefined,\n): readonly string[] | undefined {\n if (!inputFiles || inputFiles.length === 0) {\n return undefined;\n }\n\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction formatFileList(\n files: readonly string[] | undefined,\n template: string | undefined,\n): string {\n if (!files || files.length === 0) {\n return '';\n }\n\n const formatter = template ?? '{path}';\n return files\n .map((filePath) => {\n const escapedPath = shellEscape(filePath);\n const escapedName = shellEscape(path.basename(filePath));\n return formatter.replaceAll('{path}', escapedPath).replaceAll('{basename}', escapedName);\n })\n .join(' ');\n}\n\nfunction renderTemplate(template: string, values: Record<string, string>): string {\n return template.replace(/\\{([A-Z_]+)\\}/g, (match, key) => {\n const replacement = values[key];\n return replacement !== undefined ? replacement : match;\n });\n}\n\nfunction shellEscape(value: string): string {\n if (value.length === 0) {\n return \"''\";\n }\n\n if (process.platform === 'win32') {\n // PowerShell uses backtick (`) for escaping, not backslash\n // Double quotes inside the string need to be escaped with backtick\n // Single quotes can be used instead for simpler escaping\n const escaped = value.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n\n return `'${value.replace(/'/g, \"'\\\"'\\\"'\")}'`;\n}\n\nfunction generateOutputFilePath(evalCaseId?: string): string {\n const safeEvalId = evalCaseId || 'unknown';\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 9);\n return path.join(os.tmpdir(), `agentv-${safeEvalId}-${timestamp}-${random}.json`);\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n","import { exec as execCallback, spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { constants, createWriteStream } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { access, mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { recordCodexLogEntry } from './codex-log-tracker.js';\nimport { buildPromptDocument, normalizeInputFiles } from './preread.js';\nimport type { CodexResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst execAsync = promisify(execCallback);\nconst WORKSPACE_PREFIX = 'agentv-codex-';\nconst PROMPT_FILENAME = 'prompt.md';\nconst JSONL_TYPE_ITEM_COMPLETED = 'item.completed';\n\ninterface CodexRunOptions {\n readonly executable: string;\n readonly args: readonly string[];\n readonly cwd: string;\n readonly prompt: string;\n readonly timeoutMs?: number;\n readonly env: NodeJS.ProcessEnv;\n readonly signal?: AbortSignal;\n readonly onStdoutChunk?: (chunk: string) => void;\n readonly onStderrChunk?: (chunk: string) => void;\n}\n\ninterface CodexRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n readonly timedOut?: boolean;\n}\n\ntype CodexRunner = (options: CodexRunOptions) => Promise<CodexRunResult>;\n\nexport class CodexProvider implements Provider {\n readonly id: string;\n readonly kind = 'codex' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: CodexResolvedConfig;\n private readonly runCodex: CodexRunner;\n private environmentCheck?: Promise<void>;\n private resolvedExecutable?: string;\n\n constructor(\n targetName: string,\n config: CodexResolvedConfig,\n runner: CodexRunner = defaultCodexRunner,\n ) {\n this.id = `codex:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n this.runCodex = runner;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Codex provider request was aborted before execution');\n }\n\n await this.ensureEnvironmentReady();\n\n const inputFiles = normalizeInputFiles(request.inputFiles);\n\n const workspaceRoot = await this.createWorkspace();\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n try {\n const promptContent = buildPromptDocument(request, inputFiles);\n const promptFile = path.join(workspaceRoot, PROMPT_FILENAME);\n await writeFile(promptFile, promptContent, 'utf8');\n\n const args = this.buildCodexArgs();\n const cwd = this.resolveCwd(workspaceRoot);\n\n const result = await this.executeCodex(args, cwd, promptContent, request.signal, logger);\n\n if (result.timedOut) {\n throw new Error(\n `Codex CLI timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n\n if (result.exitCode !== 0) {\n const detail = pickDetail(result.stderr, result.stdout);\n const prefix = `Codex CLI exited with code ${result.exitCode}`;\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\n }\n\n const parsed = parseCodexJson(result.stdout);\n const assistantText = extractAssistantText(parsed);\n\n return {\n text: assistantText,\n raw: {\n response: parsed,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n args,\n executable: this.resolvedExecutable ?? this.config.executable,\n promptFile,\n workspace: workspaceRoot,\n inputFiles,\n logFile: logger?.filePath,\n },\n };\n } finally {\n await logger?.close();\n await this.cleanupWorkspace(workspaceRoot);\n }\n }\n\n private async ensureEnvironmentReady(): Promise<void> {\n if (!this.environmentCheck) {\n this.environmentCheck = this.validateEnvironment();\n }\n await this.environmentCheck;\n }\n\n private async validateEnvironment(): Promise<void> {\n this.resolvedExecutable = await locateExecutable(this.config.executable);\n }\n\n private resolveCwd(workspaceRoot: string): string {\n if (!this.config.cwd) {\n return workspaceRoot;\n }\n return path.resolve(this.config.cwd);\n }\n\n private buildCodexArgs(): string[] {\n // Global flags must come before 'exec' subcommand\n const args = [\n '--ask-for-approval',\n 'never',\n 'exec',\n '--json',\n '--color',\n 'never',\n '--skip-git-repo-check',\n ];\n if (this.config.args && this.config.args.length > 0) {\n args.push(...this.config.args);\n }\n args.push('-');\n return args;\n }\n\n private async executeCodex(\n args: readonly string[],\n cwd: string,\n promptContent: string,\n signal: AbortSignal | undefined,\n logger: CodexStreamLogger | undefined,\n ): Promise<CodexRunResult> {\n try {\n return await this.runCodex({\n executable: this.resolvedExecutable ?? this.config.executable,\n args,\n cwd,\n prompt: promptContent,\n timeoutMs: this.config.timeoutMs,\n env: process.env,\n signal,\n onStdoutChunk: logger ? (chunk) => logger.handleStdoutChunk(chunk) : undefined,\n onStderrChunk: logger ? (chunk) => logger.handleStderrChunk(chunk) : undefined,\n });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n throw new Error(\n `Codex executable '${this.config.executable}' was not found. Update the target settings.executable or add it to PATH.`,\n );\n }\n throw error;\n }\n }\n\n private async createWorkspace(): Promise<string> {\n return await mkdtemp(path.join(tmpdir(), WORKSPACE_PREFIX));\n }\n\n private async cleanupWorkspace(workspaceRoot: string): Promise<void> {\n try {\n await rm(workspaceRoot, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n\n private resolveLogDirectory(): string | undefined {\n const disabled = isCodexLogStreamingDisabled();\n if (disabled) {\n return undefined;\n }\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'codex');\n }\n\n private async createStreamLogger(\n request: ProviderRequest,\n ): Promise<CodexStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Codex stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\n\n try {\n const logger = await CodexStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n });\n recordCodexLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Codex stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\nclass CodexStreamLogger {\n readonly filePath: string;\n private readonly stream: WriteStream;\n private readonly startedAt = Date.now();\n private stdoutBuffer = '';\n private stderrBuffer = '';\n private readonly format: 'summary' | 'json';\n\n private constructor(filePath: string, format: 'summary' | 'json') {\n this.filePath = filePath;\n this.format = format;\n this.stream = createWriteStream(filePath, { flags: 'a' });\n }\n\n static async create(options: {\n readonly filePath: string;\n readonly targetName: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly format: 'summary' | 'json';\n }): Promise<CodexStreamLogger> {\n const logger = new CodexStreamLogger(options.filePath, options.format);\n const header = [\n '# Codex CLI stream log',\n `# target: ${options.targetName}`,\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\n `# started: ${new Date().toISOString()}`,\n '',\n ].filter((line): line is string => Boolean(line));\n logger.writeLines(header);\n return logger;\n }\n\n handleStdoutChunk(chunk: string): void {\n this.stdoutBuffer += chunk;\n this.flushBuffer('stdout');\n }\n\n handleStderrChunk(chunk: string): void {\n this.stderrBuffer += chunk;\n this.flushBuffer('stderr');\n }\n\n async close(): Promise<void> {\n this.flushBuffer('stdout');\n this.flushBuffer('stderr');\n this.flushRemainder();\n await new Promise<void>((resolve, reject) => {\n this.stream.once('error', reject);\n this.stream.end(() => resolve());\n });\n }\n\n private writeLines(lines: readonly string[]): void {\n for (const line of lines) {\n this.stream.write(`${line}\\n`);\n }\n }\n\n private flushBuffer(source: 'stdout' | 'stderr'): void {\n const buffer = source === 'stdout' ? this.stdoutBuffer : this.stderrBuffer;\n const lines = buffer.split(/\\r?\\n/);\n const remainder = lines.pop() ?? '';\n if (source === 'stdout') {\n this.stdoutBuffer = remainder;\n } else {\n this.stderrBuffer = remainder;\n }\n for (const line of lines) {\n const formatted = this.formatLine(line, source);\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n }\n\n private formatLine(rawLine: string, source: 'stdout' | 'stderr'): string | undefined {\n const trimmed = rawLine.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n const message =\n this.format === 'json' ? formatCodexJsonLog(trimmed) : formatCodexLogMessage(trimmed, source);\n return `[+${formatElapsed(this.startedAt)}] [${source}] ${message}`;\n }\n\n private flushRemainder(): void {\n const stdoutRemainder = this.stdoutBuffer.trim();\n if (stdoutRemainder.length > 0) {\n const formatted = this.formatLine(stdoutRemainder, 'stdout');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n const stderrRemainder = this.stderrBuffer.trim();\n if (stderrRemainder.length > 0) {\n const formatted = this.formatLine(stderrRemainder, 'stderr');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n this.stdoutBuffer = '';\n this.stderrBuffer = '';\n }\n}\n\nfunction isCodexLogStreamingDisabled(): boolean {\n const envValue = process.env.AGENTV_CODEX_STREAM_LOGS;\n if (!envValue) {\n return false;\n }\n const normalized = envValue.trim().toLowerCase();\n return normalized === 'false' || normalized === '0' || normalized === 'off';\n}\n\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const evalId = sanitizeForFilename(request.evalCaseId ?? 'codex');\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : '';\n const target = sanitizeForFilename(targetName);\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\n}\n\nfunction sanitizeForFilename(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : 'codex';\n}\n\nfunction formatElapsed(startedAt: number): string {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\n const hours = Math.floor(elapsedSeconds / 3600);\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\n const seconds = elapsedSeconds % 60;\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\nfunction formatCodexLogMessage(rawLine: string, source: 'stdout' | 'stderr'): string {\n const parsed = tryParseJsonValue(rawLine);\n if (parsed) {\n const summary = summarizeCodexEvent(parsed);\n if (summary) {\n return summary;\n }\n }\n if (source === 'stderr') {\n return `stderr: ${rawLine}`;\n }\n return rawLine;\n}\n\nfunction formatCodexJsonLog(rawLine: string): string {\n const parsed = tryParseJsonValue(rawLine);\n if (!parsed) {\n return rawLine;\n }\n try {\n return JSON.stringify(parsed, null, 2);\n } catch {\n return rawLine;\n }\n}\n\nfunction summarizeCodexEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n let message =\n extractFromEvent(event) ??\n extractFromItem(record.item) ??\n flattenContent(record.output ?? record.content);\n if (!message && type === JSONL_TYPE_ITEM_COMPLETED) {\n const item = record.item;\n if (item && typeof item === 'object') {\n const candidate = flattenContent(\n (item as Record<string, unknown>).text ??\n (item as Record<string, unknown>).content ??\n (item as Record<string, unknown>).output,\n );\n if (candidate) {\n message = candidate;\n }\n }\n }\n if (!message) {\n const itemType =\n typeof (record.item as Record<string, unknown> | undefined)?.type === 'string'\n ? (record.item as Record<string, unknown>).type\n : undefined;\n if (type && itemType) {\n return `${type}:${itemType}`;\n }\n if (type) {\n return type;\n }\n }\n if (type && message) {\n return `${type}: ${message}`;\n }\n if (message) {\n return message;\n }\n return type;\n}\n\nfunction tryParseJsonValue(rawLine: string): unknown | undefined {\n try {\n return JSON.parse(rawLine);\n } catch {\n return undefined;\n }\n}\n\nasync function locateExecutable(candidate: string): Promise<string> {\n const includesPathSeparator = candidate.includes('/') || candidate.includes('\\\\');\n if (includesPathSeparator) {\n const resolved = path.isAbsolute(candidate) ? candidate : path.resolve(candidate);\n const executablePath = await ensureWindowsExecutableVariant(resolved);\n await access(executablePath, constants.F_OK);\n return executablePath;\n }\n\n const locator = process.platform === 'win32' ? 'where' : 'which';\n try {\n const { stdout } = await execAsync(`${locator} ${candidate}`);\n const lines = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n const preferred = selectExecutableCandidate(lines);\n if (preferred) {\n const executablePath = await ensureWindowsExecutableVariant(preferred);\n await access(executablePath, constants.F_OK);\n return executablePath;\n }\n } catch {\n // ignore and fall back to error below\n }\n\n throw new Error(`Codex executable '${candidate}' was not found on PATH`);\n}\n\nfunction selectExecutableCandidate(candidates: readonly string[]): string | undefined {\n if (candidates.length === 0) {\n return undefined;\n }\n if (process.platform !== 'win32') {\n return candidates[0];\n }\n const extensions = getWindowsExecutableExtensions();\n for (const ext of extensions) {\n const match = candidates.find((candidate) => candidate.toLowerCase().endsWith(ext));\n if (match) {\n return match;\n }\n }\n return candidates[0];\n}\n\nasync function ensureWindowsExecutableVariant(candidate: string): Promise<string> {\n if (process.platform !== 'win32') {\n return candidate;\n }\n if (hasExecutableExtension(candidate)) {\n return candidate;\n }\n\n const extensions = getWindowsExecutableExtensions();\n for (const ext of extensions) {\n const withExtension = `${candidate}${ext}`;\n try {\n await access(withExtension, constants.F_OK);\n return withExtension;\n } catch {\n // keep searching\n }\n }\n return candidate;\n}\n\nfunction hasExecutableExtension(candidate: string): boolean {\n const lower = candidate.toLowerCase();\n return getWindowsExecutableExtensions().some((ext) => lower.endsWith(ext));\n}\n\nconst DEFAULT_WINDOWS_EXTENSIONS = ['.com', '.exe', '.bat', '.cmd', '.ps1'] as const;\n\nfunction getWindowsExecutableExtensions(): readonly string[] {\n if (process.platform !== 'win32') {\n return [];\n }\n const fromEnv = process.env.PATHEXT?.split(';')\n .map((ext) => ext.trim().toLowerCase())\n .filter((ext) => ext.length > 0);\n return fromEnv && fromEnv.length > 0 ? fromEnv : DEFAULT_WINDOWS_EXTENSIONS;\n}\n\nfunction parseCodexJson(output: string): unknown {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n throw new Error('Codex CLI produced no output in --json mode');\n }\n try {\n return JSON.parse(trimmed);\n } catch {\n const lineObjects = parseJsonLines(trimmed);\n if (lineObjects) {\n return lineObjects;\n }\n const lastBrace = trimmed.lastIndexOf('{');\n if (lastBrace >= 0) {\n const candidate = trimmed.slice(lastBrace);\n try {\n return JSON.parse(candidate);\n } catch {\n // fallthrough\n }\n }\n const preview = trimmed.slice(0, 200);\n throw new Error(`Codex CLI emitted invalid JSON: ${preview}${trimmed.length > 200 ? '…' : ''}`);\n }\n}\n\nfunction extractAssistantText(parsed: unknown): string {\n if (Array.isArray(parsed)) {\n const text = extractFromEventStream(parsed);\n if (text) {\n return text;\n }\n }\n\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('Codex CLI JSON response did not include an assistant message');\n }\n\n const record = parsed as Record<string, unknown>;\n const eventText = extractFromEvent(record);\n if (eventText) {\n return eventText;\n }\n\n const messages = Array.isArray(record.messages) ? record.messages : undefined;\n if (messages) {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const entry = messages[index];\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n const role = (entry as Record<string, unknown>).role;\n if (role !== 'assistant') {\n continue;\n }\n const content = (entry as Record<string, unknown>).content;\n const flattened = flattenContent(content);\n if (flattened) {\n return flattened;\n }\n }\n }\n\n const response = record.response;\n if (response && typeof response === 'object') {\n const content = (response as Record<string, unknown>).content;\n const flattened = flattenContent(content);\n if (flattened) {\n return flattened;\n }\n }\n\n const output = record.output;\n const flattenedOutput = flattenContent(output);\n if (flattenedOutput) {\n return flattenedOutput;\n }\n\n throw new Error('Codex CLI JSON response did not include an assistant message');\n}\n\nfunction extractFromEventStream(events: readonly unknown[]): string | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const candidate = events[index];\n const text = extractFromEvent(candidate);\n if (text) {\n return text;\n }\n }\n return undefined;\n}\n\nfunction extractFromEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n if (type === JSONL_TYPE_ITEM_COMPLETED) {\n const item = record.item;\n const text = extractFromItem(item);\n if (text) {\n return text;\n }\n }\n const output = record.output ?? record.content;\n const flattened = flattenContent(output);\n if (flattened) {\n return flattened;\n }\n return undefined;\n}\n\nfunction extractFromItem(item: unknown): string | undefined {\n if (!item || typeof item !== 'object') {\n return undefined;\n }\n const record = item as Record<string, unknown>;\n const itemType = typeof record.type === 'string' ? record.type : undefined;\n if (itemType === 'agent_message' || itemType === 'response' || itemType === 'output') {\n const text = flattenContent(record.text ?? record.content ?? record.output);\n if (text) {\n return text;\n }\n }\n return undefined;\n}\n\nfunction flattenContent(value: unknown): string | undefined {\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n const parts = value\n .map((segment) => {\n if (typeof segment === 'string') {\n return segment;\n }\n if (segment && typeof segment === 'object' && 'text' in segment) {\n const text = (segment as Record<string, unknown>).text;\n return typeof text === 'string' ? text : undefined;\n }\n return undefined;\n })\n .filter((part): part is string => typeof part === 'string' && part.length > 0);\n return parts.length > 0 ? parts.join(' \\n') : undefined;\n }\n if (value && typeof value === 'object' && 'text' in value) {\n const text = (value as Record<string, unknown>).text;\n return typeof text === 'string' ? text : undefined;\n }\n return undefined;\n}\n\nfunction parseJsonLines(output: string): unknown[] | undefined {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length <= 1) {\n return undefined;\n }\n const parsed: unknown[] = [];\n for (const line of lines) {\n try {\n parsed.push(JSON.parse(line));\n } catch {\n return undefined;\n }\n }\n return parsed;\n}\n\nfunction pickDetail(stderr: string, stdout: string): string | undefined {\n const errorText = stderr.trim();\n if (errorText.length > 0) {\n return errorText;\n }\n const stdoutText = stdout.trim();\n return stdoutText.length > 0 ? stdoutText : undefined;\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n\nasync function defaultCodexRunner(options: CodexRunOptions): Promise<CodexRunResult> {\n return await new Promise<CodexRunResult>((resolve, reject) => {\n const child = spawn(options.executable, options.args, {\n cwd: options.cwd,\n env: options.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n shell: shouldShellExecute(options.executable),\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const onAbort = (): void => {\n child.kill('SIGTERM');\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeoutMs);\n timeoutHandle.unref?.();\n }\n\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk) => {\n stdout += chunk;\n options.onStdoutChunk?.(chunk);\n });\n\n child.stderr.setEncoding('utf8');\n child.stderr.on('data', (chunk) => {\n stderr += chunk;\n options.onStderrChunk?.(chunk);\n });\n\n child.stdin.end(options.prompt);\n\n const cleanup = (): void => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n if (options.signal) {\n options.signal.removeEventListener('abort', onAbort);\n }\n };\n\n child.on('error', (error) => {\n cleanup();\n reject(error);\n });\n\n child.on('close', (code) => {\n cleanup();\n resolve({\n stdout,\n stderr,\n exitCode: typeof code === 'number' ? code : -1,\n timedOut,\n });\n });\n });\n}\n\nfunction shouldShellExecute(executable: string): boolean {\n if (process.platform !== 'win32') {\n return false;\n }\n const lower = executable.toLowerCase();\n return lower.endsWith('.cmd') || lower.endsWith('.bat') || lower.endsWith('.ps1');\n}\n","export type CodexLogEntry = {\n readonly filePath: string;\n readonly evalCaseId?: string;\n readonly targetName: string;\n readonly attempt?: number;\n};\n\nconst GLOBAL_LOGS_KEY = Symbol.for('agentv.codexLogs');\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for('agentv.codexLogSubscribers');\n\ntype CodexLogListener = (entry: CodexLogEntry) => void;\n\ntype GlobalWithCodexLogs = typeof globalThis & {\n [GLOBAL_LOGS_KEY]?: CodexLogEntry[];\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<CodexLogListener>;\n};\n\nfunction getCodexLogStore(): CodexLogEntry[] {\n const globalObject = globalThis as GlobalWithCodexLogs;\n const existing = globalObject[GLOBAL_LOGS_KEY];\n if (existing) {\n return existing;\n }\n const created: CodexLogEntry[] = [];\n globalObject[GLOBAL_LOGS_KEY] = created;\n return created;\n}\n\nfunction getSubscriberStore(): Set<CodexLogListener> {\n const globalObject = globalThis as GlobalWithCodexLogs;\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\n if (existing) {\n return existing;\n }\n const created = new Set<CodexLogListener>();\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\n return created;\n}\n\nfunction notifySubscribers(entry: CodexLogEntry): void {\n const subscribers = Array.from(getSubscriberStore());\n for (const listener of subscribers) {\n try {\n listener(entry);\n } catch (error) {\n // Avoid surfacing subscriber errors to providers; log for visibility.\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Codex log subscriber failed: ${message}`);\n }\n }\n}\n\nexport function recordCodexLogEntry(entry: CodexLogEntry): void {\n getCodexLogStore().push(entry);\n notifySubscribers(entry);\n}\n\nexport function consumeCodexLogEntries(): CodexLogEntry[] {\n const store = getCodexLogStore();\n if (store.length === 0) {\n return [];\n }\n return store.splice(0, store.length);\n}\n\nexport function subscribeToCodexLogEntries(listener: CodexLogListener): () => void {\n const store = getSubscriberStore();\n store.add(listener);\n return () => {\n store.delete(listener);\n };\n}\n","import path from 'node:path';\n\nimport { isGuidelineFile } from '../yaml-parser.js';\nimport type { ProviderRequest } from './types.js';\n\nexport interface PromptDocumentOptions {\n readonly guidelinePatterns?: readonly string[];\n readonly guidelineOverrides?: ReadonlySet<string>;\n}\n\nexport function buildPromptDocument(\n request: ProviderRequest,\n inputFiles: readonly string[] | undefined,\n options?: PromptDocumentOptions,\n): string {\n const parts: string[] = [];\n\n const guidelineFiles = collectGuidelineFiles(\n inputFiles,\n options?.guidelinePatterns ?? request.guideline_patterns,\n options?.guidelineOverrides,\n );\n const inputFilesList = collectInputFiles(inputFiles);\n\n const nonGuidelineInputFiles = inputFilesList.filter((file) => !guidelineFiles.includes(file));\n\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineInputFiles);\n if (prereadBlock.length > 0) {\n parts.push('\\n', prereadBlock);\n }\n\n parts.push('\\n[[ ## user_query ## ]]\\n', request.question.trim());\n\n return parts.join('\\n').trim();\n}\n\nexport function normalizeInputFiles(\n inputFiles: readonly string[] | undefined,\n): string[] | undefined {\n if (!inputFiles || inputFiles.length === 0) {\n return undefined;\n }\n const deduped = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!deduped.has(absolutePath)) {\n deduped.set(absolutePath, absolutePath);\n }\n }\n return Array.from(deduped.values());\n}\n\nexport function collectGuidelineFiles(\n inputFiles: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n overrides?: ReadonlySet<string>,\n): string[] {\n if (!inputFiles || inputFiles.length === 0) {\n return [];\n }\n\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (overrides?.has(absolutePath)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n continue;\n }\n\n const normalized = absolutePath.split(path.sep).join('/');\n if (isGuidelineFile(normalized, guidelinePatterns)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction collectInputFiles(inputFiles: readonly string[] | undefined): string[] {\n if (!inputFiles || inputFiles.length === 0) {\n return [];\n }\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n return Array.from(unique.values());\n}\n\nfunction buildMandatoryPrereadBlock(\n guidelineFiles: readonly string[],\n inputFiles: readonly string[],\n): string {\n if (guidelineFiles.length === 0 && inputFiles.length === 0) {\n return '';\n }\n\n const buildList = (files: readonly string[]): string[] =>\n files.map((absolutePath) => {\n const fileName = path.basename(absolutePath);\n const fileUri = pathToFileUri(absolutePath);\n return `* [${fileName}](${fileUri})`;\n });\n\n const sections: string[] = [];\n if (guidelineFiles.length > 0) {\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join('\\n')}.`);\n }\n\n if (inputFiles.length > 0) {\n sections.push(`Read all input files:\\n${buildList(inputFiles).join('\\n')}.`);\n }\n\n sections.push(\n 'If any file is missing, fail with ERROR: missing-file <filename> and stop.',\n 'Then apply system_instructions on the user query below.',\n );\n\n return sections.join('\\n');\n}\n\nfunction pathToFileUri(filePath: string): string {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n return `file://${normalizedPath}`;\n}\n","import type { MockResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst DEFAULT_MOCK_RESPONSE =\n '{\"answer\":\"Mock provider response. Configure targets.yaml to supply a custom value.\"}';\n\nexport class MockProvider implements Provider {\n readonly id: string;\n readonly kind = 'mock' as const;\n readonly targetName: string;\n\n private readonly cannedResponse: string;\n private readonly delayMs: number;\n private readonly delayMinMs: number;\n private readonly delayMaxMs: number;\n\n constructor(targetName: string, config: MockResolvedConfig) {\n this.id = `mock:${targetName}`;\n this.targetName = targetName;\n this.cannedResponse = config.response ?? DEFAULT_MOCK_RESPONSE;\n this.delayMs = config.delayMs ?? 0;\n this.delayMinMs = config.delayMinMs ?? 0;\n this.delayMaxMs = config.delayMaxMs ?? 0;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n const delay = this.calculateDelay();\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n return {\n text: this.cannedResponse,\n raw: {\n question: request.question,\n guidelines: request.guidelines,\n },\n };\n }\n\n private calculateDelay(): number {\n // If range is specified, use uniform random distribution\n if (this.delayMinMs > 0 || this.delayMaxMs > 0) {\n const min = Math.max(0, this.delayMinMs);\n const max = Math.max(min, this.delayMaxMs);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n // Otherwise use fixed delay\n return this.delayMs;\n }\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 path from 'node:path';\nimport {\n dispatchAgentSession,\n dispatchBatchAgent,\n getSubagentRoot,\n provisionSubagents,\n} from 'subagent';\n\nimport { readTextFile } from '../file-utils.js';\nimport { isGuidelineFile } from '../yaml-parser.js';\nimport type { VSCodeResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\nimport { AGENTV_BATCH_REQUEST_TEMPLATE, AGENTV_REQUEST_TEMPLATE } from './vscode-templates.js';\n\nexport class VSCodeProvider implements Provider {\n readonly id: string;\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly targetName: string;\n readonly supportsBatch = true;\n\n private readonly config: VSCodeResolvedConfig;\n\n constructor(\n targetName: string,\n config: VSCodeResolvedConfig,\n kind: 'vscode' | 'vscode-insiders',\n ) {\n this.id = `${kind}:${targetName}`;\n this.kind = kind;\n this.targetName = targetName;\n this.config = config;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('VS Code provider request was aborted before dispatch');\n }\n\n const inputFiles = normalizeAttachments(request.inputFiles);\n const promptContent = buildPromptDocument(request, inputFiles, request.guideline_patterns);\n\n const session = await dispatchAgentSession({\n userQuery: promptContent,\n extraAttachments: inputFiles,\n requestTemplate: AGENTV_REQUEST_TEMPLATE,\n wait: this.config.waitForResponse,\n dryRun: this.config.dryRun,\n vscodeCmd: this.config.command,\n subagentRoot: this.config.subagentRoot,\n workspaceTemplate: this.config.workspaceTemplate,\n silent: true,\n });\n\n if (session.exitCode !== 0 || !session.responseFile) {\n const failure = session.error ?? 'VS Code subagent did not produce a response';\n throw new Error(failure);\n }\n\n if (this.config.dryRun) {\n return {\n text: '',\n raw: {\n session,\n inputFiles,\n },\n };\n }\n\n const responseText = await readTextFile(session.responseFile);\n\n return {\n text: responseText,\n raw: {\n session,\n inputFiles,\n },\n };\n }\n\n async invokeBatch(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]> {\n if (requests.length === 0) {\n return [];\n }\n\n const normalizedRequests = requests.map((req) => ({\n request: req,\n inputFiles: normalizeAttachments(req.inputFiles),\n }));\n\n const combinedInputFiles = mergeAttachments(\n normalizedRequests.map(({ inputFiles }) => inputFiles),\n );\n const userQueries = normalizedRequests.map(({ request, inputFiles }) =>\n buildPromptDocument(request, inputFiles, request.guideline_patterns),\n );\n\n const session = await dispatchBatchAgent({\n userQueries,\n extraAttachments: combinedInputFiles,\n requestTemplate: AGENTV_BATCH_REQUEST_TEMPLATE,\n wait: this.config.waitForResponse,\n dryRun: this.config.dryRun,\n vscodeCmd: this.config.command,\n subagentRoot: this.config.subagentRoot,\n workspaceTemplate: this.config.workspaceTemplate,\n silent: true,\n });\n\n if (session.exitCode !== 0 || !session.responseFiles) {\n const failure = session.error ?? 'VS Code subagent did not produce batch responses';\n throw new Error(failure);\n }\n\n if (this.config.dryRun) {\n return normalizedRequests.map(({ inputFiles }) => ({\n text: '',\n raw: {\n session,\n inputFiles,\n allInputFiles: combinedInputFiles,\n },\n }));\n }\n\n if (session.responseFiles.length !== requests.length) {\n throw new Error(\n `VS Code batch returned ${session.responseFiles.length} responses for ${requests.length} requests`,\n );\n }\n\n const responses: ProviderResponse[] = [];\n for (const [index, responseFile] of session.responseFiles.entries()) {\n const responseText = await readTextFile(responseFile);\n responses.push({\n text: responseText,\n raw: {\n session,\n inputFiles: normalizedRequests[index]?.inputFiles,\n allInputFiles: combinedInputFiles,\n responseFile,\n },\n });\n }\n\n return responses;\n }\n}\n\nfunction buildPromptDocument(\n request: ProviderRequest,\n attachments: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n): string {\n const parts: string[] = [];\n\n // Agent providers incorporate systemPrompt into the question\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\n parts.push(request.systemPrompt.trim());\n }\n\n const guidelineFiles = collectGuidelineFiles(attachments, guidelinePatterns);\n const attachmentFiles = collectAttachmentFiles(attachments);\n\n const nonGuidelineAttachments = attachmentFiles.filter((file) => !guidelineFiles.includes(file));\n\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineAttachments);\n if (prereadBlock.length > 0) {\n parts.push('\\n', prereadBlock);\n }\n\n parts.push('\\n[[ ## user_query ## ]]\\n', request.question.trim());\n\n return parts.join('\\n').trim();\n}\n\nfunction buildMandatoryPrereadBlock(\n guidelineFiles: readonly string[],\n attachmentFiles: readonly string[],\n): string {\n if (guidelineFiles.length === 0 && attachmentFiles.length === 0) {\n return '';\n }\n\n const buildList = (files: readonly string[]): string[] =>\n files.map((absolutePath) => {\n const fileName = path.basename(absolutePath);\n const fileUri = pathToFileUri(absolutePath);\n return `* [${fileName}](${fileUri})`;\n });\n\n const sections: string[] = [];\n if (guidelineFiles.length > 0) {\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join('\\n')}.`);\n }\n\n if (attachmentFiles.length > 0) {\n sections.push(`Read all attachment files:\\n${buildList(attachmentFiles).join('\\n')}.`);\n }\n\n sections.push(\n 'If any file is missing, fail with ERROR: missing-file <filename> and stop.',\n 'Then apply system_instructions on the user query below.',\n );\n\n return sections.join('\\n');\n}\n\nfunction collectGuidelineFiles(\n attachments: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n): string[] {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n\n const unique = new Map<string, string>();\n for (const attachment of attachments) {\n const absolutePath = path.resolve(attachment);\n const normalized = absolutePath.split(path.sep).join('/');\n\n if (isGuidelineFile(normalized, guidelinePatterns)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction collectAttachmentFiles(attachments: readonly string[] | undefined): string[] {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n const unique = new Map<string, string>();\n for (const attachment of attachments) {\n const absolutePath = path.resolve(attachment);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n return Array.from(unique.values());\n}\n\nfunction pathToFileUri(filePath: string): string {\n // Convert to absolute path if relative\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n\n // On Windows, convert backslashes to forward slashes\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n\n // Handle Windows drive letters (e.g., C:/ becomes file:///C:/)\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n\n // Unix-like paths\n return `file://${normalizedPath}`;\n}\n\nfunction _composeUserQuery(request: ProviderRequest): string {\n // For VS Code, guidelines are handled via file attachments\n // Do NOT include guideline content in the user query\n return request.question.trim();\n}\n\nfunction normalizeAttachments(attachments: readonly string[] | undefined): string[] | undefined {\n if (!attachments || attachments.length === 0) {\n return undefined;\n }\n const deduped = new Set<string>();\n for (const attachment of attachments) {\n deduped.add(path.resolve(attachment));\n }\n return Array.from(deduped);\n}\n\nfunction mergeAttachments(all: readonly (readonly string[] | undefined)[]): string[] | undefined {\n const deduped = new Set<string>();\n for (const list of all) {\n if (!list) continue;\n for (const inputFile of list) {\n deduped.add(path.resolve(inputFile));\n }\n }\n return deduped.size > 0 ? Array.from(deduped) : undefined;\n}\n\nexport interface EnsureSubagentsOptions {\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly count: number;\n readonly verbose?: boolean;\n}\n\nexport interface EnsureSubagentsResult {\n readonly provisioned: boolean;\n readonly message?: string;\n}\n\n/**\n * Ensures the required number of VSCode subagents are provisioned using the subagent package.\n * This guarantees version compatibility by using the same subagent package version.\n *\n * @param options - Configuration for subagent provisioning\n * @returns Information about the provisioning result\n */\nexport async function ensureVSCodeSubagents(\n options: EnsureSubagentsOptions,\n): Promise<EnsureSubagentsResult> {\n const { kind, count, verbose = false } = options;\n const vscodeCmd = kind === 'vscode-insiders' ? 'code-insiders' : 'code';\n const subagentRoot = getSubagentRoot(vscodeCmd);\n\n try {\n if (verbose) {\n console.log(`Provisioning ${count} subagent(s) via: subagent ${vscodeCmd} provision`);\n }\n\n const result = await provisionSubagents({\n targetRoot: subagentRoot,\n subagents: count,\n dryRun: false,\n });\n\n if (verbose) {\n if (result.created.length > 0) {\n console.log(`Created ${result.created.length} new subagent(s)`);\n }\n if (result.skippedExisting.length > 0) {\n console.log(`Reusing ${result.skippedExisting.length} existing unlocked subagent(s)`);\n }\n console.log(\n `\\ntotal unlocked subagents available: ${result.created.length + result.skippedExisting.length}`,\n );\n }\n\n return {\n provisioned: true,\n message: `Provisioned ${count} subagent(s): ${result.created.length} created, ${result.skippedExisting.length} reused`,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Don't fail if provisioning fails - agents might already exist\n if (verbose) {\n console.warn(`Provisioning failed (continuing anyway): ${errorMessage}`);\n }\n\n return {\n provisioned: false,\n message: `Provisioning failed: ${errorMessage}`,\n };\n }\n}\n","/**\n * Custom request templates for AgentV evaluation workflows\n * These templates are used when dispatching to VSCode via subagent\n */\n\nexport const AGENTV_REQUEST_TEMPLATE = `[[ ## task ## ]]\n\n{{userQuery}}\n\n[[ ## system_instructions ## ]]\n\n**IMPORTANT**: Follow these exact steps:\n1. Create and write your complete response to: {{responseFileTmp}}\n - Do NOT create any additional output files in the workspace.\n - All intended file outputs/changes MUST be written in your response file.\n - For each intended file, include the repo name, relative path and unified git diff following the convention \\`diff --git ...\\`.\n2. When completely finished, run these PowerShell commands to signal completion:\n\\`\\`\\`\nMove-Item -LiteralPath '{{responseFileTmp}}' -Destination '{{responseFileFinal}}'\nif (Test-Path subagent.lock) { del subagent.lock }\n\\`\\`\\`\n\nDo not proceed to step 2 until your response is completely written to the temporary file.\n`;\n\nexport const AGENTV_BATCH_REQUEST_TEMPLATE = `[[ ## task ## ]]\n\n{{userQuery}}\n\n[[ ## system_instructions ## ]]\n\n**IMPORTANT**: Follow these exact steps:\n1. Create and write your complete response to: {{responseFileTmp}}\n - Do NOT create any additional output files in the workspace.\n - All intended file outputs/changes MUST be written in your response file.\n - For each intended file, include the repo name, relative path and unified git diff following the convention \\`diff --git ...\\`.\n2. When completely finished and the response is stable, rename it to: {{responseFileFinal}}\n3. Do not unlock the workspace from this request; batch orchestration will handle unlocking after all responses are ready.\n`;\n\nexport const AGENTV_BATCH_ORCHESTRATOR_TEMPLATE = `MANDATORY: Run #runSubagent tool in your Available Actions for each request file to process them in isolated contexts.\nDO NOT read the request files yourself - only pass the file paths to each subagent:\n\n{{requestFiles}}\n\nAfter ALL queries complete, verify all responses exist and unlock:\n\n\\`\\`\\`powershell\n$responses = @({{responseList}})\n$missing = $responses | Where-Object { -not (Test-Path \"messages/$_\") }\nif ($missing.Count -eq 0) { del subagent.lock }\n\\`\\`\\`\n`;\n","import { constants } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { TARGETS_SCHEMA_V2 } from './types.js';\nimport type { TargetDefinition } from './types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction extractTargetsArray(parsed: Record<string, unknown>, absolutePath: string): unknown[] {\n const targets = parsed.targets;\n if (!Array.isArray(targets)) {\n throw new Error(`targets.yaml at ${absolutePath} must have a 'targets' array`);\n }\n return targets;\n}\n\nfunction assertTargetDefinition(value: unknown, index: number, filePath: string): TargetDefinition {\n if (!isRecord(value)) {\n throw new Error(`targets.yaml entry at index ${index} in ${filePath} must be an object`);\n }\n\n const name = value.name;\n const provider = value.provider;\n\n if (typeof name !== 'string' || name.trim().length === 0) {\n throw new Error(\n `targets.yaml entry at index ${index} in ${filePath} is missing a valid 'name'`,\n );\n }\n\n if (typeof provider !== 'string' || provider.trim().length === 0) {\n throw new Error(`targets.yaml entry '${name}' in ${filePath} is missing a valid 'provider'`);\n }\n\n // Pass through all properties from the YAML to support the flattened schema\n // This includes all provider-specific settings at the top level\n return value as unknown as TargetDefinition;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readTargetDefinitions(\n filePath: string,\n): Promise<readonly TargetDefinition[]> {\n const absolutePath = path.resolve(filePath);\n if (!(await fileExists(absolutePath))) {\n throw new Error(`targets.yaml not found at ${absolutePath}`);\n }\n\n const raw = await readFile(absolutePath, 'utf8');\n const parsed = parse(raw) as unknown;\n\n if (!isRecord(parsed)) {\n throw new Error(`targets.yaml at ${absolutePath} must be a YAML object with a 'targets' field`);\n }\n\n const targets = extractTargetsArray(parsed, absolutePath);\n const definitions = targets.map((entry, index) =>\n assertTargetDefinition(entry, index, absolutePath),\n );\n return definitions;\n}\n\nexport function listTargetNames(definitions: readonly TargetDefinition[]): readonly string[] {\n return definitions.map((definition) => definition.name);\n}\n","import { AnthropicProvider, AzureProvider, GeminiProvider } from './ai-sdk.js';\nimport { CliProvider } from './cli.js';\nimport { CodexProvider } from './codex.js';\nimport { MockProvider } from './mock.js';\nimport type { ResolvedTarget } from './targets.js';\nimport { resolveTargetDefinition } from './targets.js';\nimport type { EnvLookup, Provider, TargetDefinition } from './types.js';\nimport { VSCodeProvider } from './vscode.js';\n\nexport type {\n EnvLookup,\n Provider,\n ProviderKind,\n ProviderRequest,\n ProviderResponse,\n TargetDefinition,\n} from './types.js';\n\nexport type {\n AnthropicResolvedConfig,\n AzureResolvedConfig,\n CliResolvedConfig,\n GeminiResolvedConfig,\n MockResolvedConfig,\n ResolvedTarget,\n VSCodeResolvedConfig,\n} from './targets.js';\n\nexport { resolveTargetDefinition };\nexport { readTargetDefinitions, listTargetNames } from './targets-file.js';\nexport {\n ensureVSCodeSubagents,\n type EnsureSubagentsOptions,\n type EnsureSubagentsResult,\n} from './vscode.js';\nexport { consumeCodexLogEntries, subscribeToCodexLogEntries } from './codex-log-tracker.js';\n\nexport function createProvider(target: ResolvedTarget): Provider {\n switch (target.kind) {\n case 'azure':\n return new AzureProvider(target.name, target.config);\n case 'anthropic':\n return new AnthropicProvider(target.name, target.config);\n case 'gemini':\n return new GeminiProvider(target.name, target.config);\n case 'cli':\n return new CliProvider(target.name, target.config);\n case 'codex':\n return new CodexProvider(target.name, target.config);\n case 'mock':\n return new MockProvider(target.name, target.config);\n case 'vscode':\n case 'vscode-insiders':\n return new VSCodeProvider(target.name, target.config, target.kind);\n default: {\n // Exhaustive check\n const neverTarget: never = target;\n throw new Error(`Unsupported provider kind ${(neverTarget as { kind: string }).kind}`);\n }\n }\n}\n\nexport function resolveAndCreateProvider(\n definition: TargetDefinition,\n env: EnvLookup = process.env,\n): Provider {\n const resolved = resolveTargetDefinition(definition, env);\n return createProvider(resolved);\n}\n","import { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport type { ResolvedTarget } from './providers/targets.js';\nimport type { ChatPrompt, Provider, ProviderResponse } from './providers/types.js';\nimport { TEMPLATE_VARIABLES } from './template-variables.js';\nimport type {\n EvalCase,\n EvaluationVerdict,\n EvaluatorConfig,\n JsonObject,\n RubricItem,\n} from './types.js';\n\nexport type { EvaluationVerdict };\n\n/**\n * Default evaluator template for the user prompt (variables will be substituted).\n * Custom evaluators can override this via evaluatorTemplate option.\n */\nconst DEFAULT_EVALUATOR_TEMPLATE = `You are an expert evaluator. Your goal is to grade the candidate_answer based on how well it achieves the expected_outcome for the original task.\n\nUse the reference_answer as a gold standard for a high-quality response (if provided). The candidate_answer does not need to match it verbatim, but should capture the key points and follow the same spirit.\n\nBe concise and focused in your evaluation. Provide succinct, specific feedback rather than verbose explanations.\n\n[[ ## expected_outcome ## ]]\n{{${TEMPLATE_VARIABLES.EXPECTED_OUTCOME}}}\n\n[[ ## question ## ]]\n{{${TEMPLATE_VARIABLES.QUESTION}}}\n\n[[ ## reference_answer ## ]]\n{{${TEMPLATE_VARIABLES.REFERENCE_ANSWER}}}\n\n[[ ## candidate_answer ## ]]\n{{${TEMPLATE_VARIABLES.CANDIDATE_ANSWER}}}`;\n\nexport interface EvaluationContext {\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly attempt: number;\n readonly promptInputs: {\n readonly question: string;\n readonly guidelines: string;\n readonly systemMessage?: string;\n readonly chatPrompt?: ChatPrompt;\n };\n readonly now: Date;\n readonly judgeProvider?: Provider;\n readonly evaluatorTemplateOverride?: string;\n readonly evaluator?: EvaluatorConfig;\n}\n\nexport interface EvaluationScore {\n readonly score: number;\n readonly verdict: EvaluationVerdict;\n readonly hits: readonly string[];\n readonly misses: readonly string[];\n readonly expectedAspectCount: number;\n readonly reasoning?: string;\n readonly rawAspects?: readonly string[];\n readonly evaluatorRawRequest?: JsonObject;\n readonly evaluatorResults?: readonly ChildEvaluatorResult[];\n}\n\nexport interface ChildEvaluatorResult {\n readonly name: string;\n readonly type: string;\n readonly score: number;\n readonly weight?: number;\n readonly verdict: EvaluationVerdict;\n readonly hits: readonly string[];\n readonly misses: readonly string[];\n readonly reasoning?: string;\n readonly evaluatorRawRequest?: JsonObject;\n readonly evaluatorResults?: readonly ChildEvaluatorResult[];\n}\n\nexport interface Evaluator {\n readonly kind: string;\n evaluate(context: EvaluationContext): Promise<EvaluationScore> | EvaluationScore;\n}\n\ntype JudgeProviderResolver = (context: EvaluationContext) => Promise<Provider | undefined>;\n\nexport interface LlmJudgeEvaluatorOptions {\n readonly resolveJudgeProvider: JudgeProviderResolver;\n readonly maxOutputTokens?: number;\n readonly temperature?: number;\n readonly evaluatorTemplate?: string;\n}\n\nconst freeformEvaluationSchema = z.object({\n score: z.number().min(0).max(1).describe('Score between 0.0 and 1.0'),\n hits: z.array(z.string()).describe('Brief specific achievements').optional(),\n misses: z.array(z.string()).describe('Brief failures or omissions').optional(),\n reasoning: z.string().describe('Concise explanation (1-2 sentences)').optional(),\n});\n\nconst rubricCheckResultSchema = z.object({\n id: z.string().describe('The ID of the rubric item being checked'),\n satisfied: z.boolean().describe('Whether this rubric requirement is met'),\n reasoning: z.string().describe('Brief explanation (1-2 sentences) for this check'),\n});\n\nconst rubricEvaluationSchema = z.object({\n checks: z.array(rubricCheckResultSchema).describe('Results for each rubric item'),\n overall_reasoning: z.string().describe('Overall assessment summary (1-2 sentences)'),\n});\n\nexport class LlmJudgeEvaluator implements Evaluator {\n readonly kind = 'llm_judge';\n\n private readonly resolveJudgeProvider: JudgeProviderResolver;\n private readonly maxOutputTokens?: number;\n private readonly temperature?: number;\n private readonly evaluatorTemplate?: string;\n\n constructor(options: LlmJudgeEvaluatorOptions) {\n this.resolveJudgeProvider = options.resolveJudgeProvider;\n this.maxOutputTokens = options.maxOutputTokens;\n this.temperature = options.temperature;\n this.evaluatorTemplate = options.evaluatorTemplate;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n const judgeProvider = await this.resolveJudgeProvider(context);\n if (!judgeProvider) {\n throw new Error('No judge provider available for LLM grading');\n }\n\n const config = context.evaluator;\n if (config?.type === 'llm_judge' && config.rubrics && config.rubrics.length > 0) {\n return this.evaluateWithRubrics(context, judgeProvider, config.rubrics);\n }\n\n return this.evaluateFreeform(context, judgeProvider);\n }\n\n private async evaluateFreeform(\n context: EvaluationContext,\n judgeProvider: Provider,\n ): Promise<EvaluationScore> {\n const formattedQuestion =\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\n ? context.promptInputs.question\n : context.evalCase.question;\n\n // Prepare template variables for substitution\n const variables = {\n [TEMPLATE_VARIABLES.INPUT_MESSAGES]: JSON.stringify(context.evalCase.input_segments, null, 2),\n [TEMPLATE_VARIABLES.EXPECTED_MESSAGES]: JSON.stringify(\n context.evalCase.expected_segments,\n null,\n 2,\n ),\n [TEMPLATE_VARIABLES.CANDIDATE_ANSWER]: context.candidate.trim(),\n [TEMPLATE_VARIABLES.REFERENCE_ANSWER]: (context.evalCase.reference_answer ?? '').trim(),\n [TEMPLATE_VARIABLES.EXPECTED_OUTCOME]: context.evalCase.expected_outcome.trim(),\n [TEMPLATE_VARIABLES.QUESTION]: formattedQuestion.trim(),\n };\n\n // Build system prompt (only the mandatory output schema)\n const systemPrompt = buildOutputSchema();\n\n // Build user prompt based on custom template or default template\n const evaluatorTemplate =\n context.evaluatorTemplateOverride ?? this.evaluatorTemplate ?? DEFAULT_EVALUATOR_TEMPLATE;\n const userPrompt = substituteVariables(evaluatorTemplate, variables);\n\n const evaluatorRawRequest: JsonObject = {\n userPrompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n try {\n const { data, providerResponse } = await this.runWithRetry({\n context,\n judgeProvider,\n systemPrompt,\n userPrompt,\n schema: freeformEvaluationSchema,\n });\n\n const score = clampScore(data.score);\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning ?? providerResponse?.reasoning;\n const expectedAspectCount = Math.max(hits.length + misses.length, 1);\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount,\n reasoning,\n evaluatorRawRequest,\n };\n } catch {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [],\n expectedAspectCount: 1,\n evaluatorRawRequest,\n };\n }\n }\n\n private async evaluateWithRubrics(\n context: EvaluationContext,\n judgeProvider: Provider,\n rubrics: readonly RubricItem[],\n ): Promise<EvaluationScore> {\n if (!rubrics || rubrics.length === 0) {\n throw new Error(\n `No rubrics found for evaluator \"${context.evaluator?.name ?? 'llm_judge'}\". Run \"agentv generate rubrics\" first.`,\n );\n }\n\n const prompt = this.buildRubricPrompt(context, rubrics);\n const systemPrompt = buildRubricOutputSchema();\n\n const evaluatorRawRequest: JsonObject = {\n userPrompt: prompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n const { data } = await this.runWithRetry({\n context,\n judgeProvider,\n systemPrompt,\n userPrompt: prompt,\n schema: rubricEvaluationSchema,\n });\n\n const { score, verdict, hits, misses } = calculateRubricScore(data, rubrics);\n\n return {\n score,\n verdict,\n hits,\n misses,\n expectedAspectCount: rubrics.length,\n reasoning: data.overall_reasoning,\n evaluatorRawRequest,\n };\n }\n\n private buildRubricPrompt(context: EvaluationContext, rubrics: readonly RubricItem[]): string {\n const formattedQuestion =\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\n ? context.promptInputs.question\n : context.evalCase.question;\n\n const parts: string[] = [\n 'You are an expert evaluator. Evaluate the candidate answer against each rubric item below.',\n '',\n '[[ ## question ## ]]',\n formattedQuestion,\n '',\n '[[ ## expected_outcome ## ]]',\n context.evalCase.expected_outcome,\n '',\n ];\n\n if (context.evalCase.reference_answer && context.evalCase.reference_answer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', context.evalCase.reference_answer, '');\n }\n\n parts.push('[[ ## candidate_answer ## ]]', context.candidate, '', '[[ ## rubrics ## ]]');\n\n for (const rubric of rubrics) {\n const requiredLabel = rubric.required ? ' (REQUIRED)' : '';\n const weightLabel = rubric.weight !== 1.0 ? ` (weight: ${rubric.weight})` : '';\n parts.push(`- [${rubric.id}]${requiredLabel}${weightLabel}: ${rubric.description}`);\n }\n\n parts.push('', 'For each rubric, determine if it is satisfied and provide brief reasoning.');\n\n return parts.join('\\n');\n }\n\n private async runWithRetry<T>(options: {\n readonly context: EvaluationContext;\n readonly judgeProvider: Provider;\n readonly systemPrompt: string;\n readonly userPrompt: string;\n readonly schema: z.ZodSchema<T>;\n }): Promise<{ data: T; providerResponse?: ProviderResponse }> {\n const { context, judgeProvider, systemPrompt, userPrompt, schema } = options;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n // Prefer Vercel AI SDK language model if available.\n const model = judgeProvider.asLanguageModel?.();\n if (model) {\n const { text } = await generateText({\n model,\n system: systemPrompt,\n prompt: userPrompt,\n ...(this.maxOutputTokens ? { maxTokens: this.maxOutputTokens } : {}),\n ...(typeof this.temperature === 'number' ? { temperature: this.temperature } : {}),\n });\n\n const data = schema.parse(parseJsonFromText(text));\n return { data };\n }\n\n const response = await judgeProvider.invoke({\n question: userPrompt,\n systemPrompt,\n evalCaseId: context.evalCase.id,\n attempt: context.attempt,\n maxOutputTokens: this.maxOutputTokens,\n temperature: this.temperature,\n });\n\n const data = schema.parse(parseJsonFromText(response.text ?? ''));\n return { data, providerResponse: response };\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n }\n }\n\n throw new Error(`Failed to parse evaluator response after 3 attempts: ${lastError?.message}`);\n }\n}\n\n/**\n * Build the mandatory output schema that all evaluators must follow.\n * This schema is always appended to the evaluator template.\n */\nfunction buildOutputSchema(): string {\n return [\n 'You must respond with a single JSON object matching this schema:',\n '',\n '{',\n ' \"score\": <number between 0.0 and 1.0>,',\n ' \"hits\": [<array of strings, max 4 items, brief specific achievements>],',\n ' \"misses\": [<array of strings, max 4 items, brief specific failures or omissions, empty if none>],',\n ' \"reasoning\": \"<string, concise explanation for the score, 1-2 sentences max>\"',\n '}',\n ].join('\\n');\n}\n\nfunction buildRubricOutputSchema(): string {\n return `You are an expert evaluator. Evaluate the candidate answer against each rubric item.\nYou must return a valid JSON object matching this schema:\n{\n \"checks\": [\n {\n \"id\": \"string (rubric id)\",\n \"satisfied\": boolean,\n \"reasoning\": \"string (brief explanation)\"\n }\n ],\n \"overall_reasoning\": \"string (summary)\"\n}`;\n}\n\nfunction scoreToVerdict(score: number): EvaluationVerdict {\n if (score >= 0.8) {\n return 'pass';\n }\n if (score >= 0.6) {\n return 'borderline';\n }\n return 'fail';\n}\n\nfunction clampScore(value: number): number {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return 0;\n }\n if (value < 0) {\n return 0;\n }\n if (value > 1) {\n return 1;\n }\n return value;\n}\n\nfunction extractJsonBlob(text: string): string | undefined {\n const match = text.match(/\\{[\\s\\S]*\\}/);\n return match?.[0];\n}\n\nfunction parseJsonFromText(text: string): unknown {\n const cleaned = typeof text === 'string' ? text.replace(/```json\\n?|```/g, '').trim() : '';\n const blob = extractJsonBlob(cleaned) ?? cleaned;\n return JSON.parse(blob);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n// Code Evaluator\n\nexport interface CodeEvaluatorOptions {\n readonly script: string;\n readonly cwd?: string;\n readonly agentTimeoutMs?: number;\n}\n\nexport class CodeEvaluator implements Evaluator {\n readonly kind = 'code';\n\n private readonly script: string;\n private readonly cwd?: string;\n private readonly agentTimeoutMs?: number;\n\n constructor(options: CodeEvaluatorOptions) {\n this.script = options.script;\n this.cwd = options.cwd;\n this.agentTimeoutMs = options.agentTimeoutMs;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n const inputPayload = JSON.stringify(\n {\n question: context.evalCase.question,\n expected_outcome: context.evalCase.expected_outcome,\n reference_answer: context.evalCase.reference_answer,\n candidate_answer: context.candidate,\n guideline_paths: context.evalCase.guideline_paths,\n input_files: context.evalCase.file_paths,\n input_segments: context.evalCase.input_segments,\n },\n null,\n 2,\n );\n\n try {\n const stdout = await executeScript(this.script, inputPayload, this.agentTimeoutMs, this.cwd);\n const parsed = parseJsonSafe(stdout);\n const score = clampScore(typeof parsed?.score === 'number' ? parsed.score : 0);\n const hits = Array.isArray(parsed?.hits) ? parsed.hits.filter(isNonEmptyString) : [];\n const misses = Array.isArray(parsed?.misses) ? parsed.misses.filter(isNonEmptyString) : [];\n const reasoning = typeof parsed?.reasoning === 'string' ? parsed.reasoning : undefined;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: hits.length + misses.length || 1,\n reasoning,\n evaluatorRawRequest: {\n script: this.script,\n ...(this.cwd ? { cwd: this.cwd } : {}),\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Code evaluator failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n evaluatorRawRequest: {\n script: this.script,\n ...(this.cwd ? { cwd: this.cwd } : {}),\n error: message,\n },\n };\n }\n }\n}\n\nfunction calculateRubricScore(\n result: z.infer<typeof rubricEvaluationSchema>,\n rubrics: readonly RubricItem[],\n): {\n score: number;\n verdict: EvaluationVerdict;\n hits: string[];\n misses: string[];\n} {\n const rubricMap = new Map(rubrics.map((rubric) => [rubric.id, rubric]));\n const hits: string[] = [];\n const misses: string[] = [];\n let totalWeight = 0;\n let earnedWeight = 0;\n let failedRequired = false;\n\n for (const check of result.checks) {\n const rubric = rubricMap.get(check.id);\n if (!rubric) {\n continue;\n }\n\n totalWeight += rubric.weight;\n\n if (check.satisfied) {\n earnedWeight += rubric.weight;\n hits.push(`[${rubric.id}] ${rubric.description}: ${check.reasoning}`);\n } else {\n misses.push(`[${rubric.id}] ${rubric.description}: ${check.reasoning}`);\n if (rubric.required) {\n failedRequired = true;\n }\n }\n }\n\n const score = totalWeight > 0 ? Math.min(1, Math.max(0, earnedWeight / totalWeight)) : 0;\n const verdict = failedRequired ? 'fail' : scoreToVerdict(score);\n return { score, verdict, hits, misses };\n}\n\n// Helper functions for CodeEvaluator\n\nasync function executeScript(\n scriptPath: string,\n input: string,\n agentTimeoutMs?: number,\n cwd?: string,\n): Promise<string> {\n const { spawn } = await import('node:child_process');\n\n return await new Promise<string>((resolve, reject) => {\n const child = spawn(scriptPath, {\n shell: true,\n cwd,\n });\n\n let stdout = '';\n let stderr = '';\n\n const timeout = agentTimeoutMs\n ? setTimeout(() => {\n child.kill();\n reject(new Error(`Code evaluator timed out after ${agentTimeoutMs}ms`));\n }, agentTimeoutMs)\n : undefined;\n\n child.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n child.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n child.on('error', (error) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n reject(error);\n });\n child.on('exit', (code) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n if (code && code !== 0 && stderr.length > 0) {\n reject(new Error(`Code evaluator exited with code ${code}: ${stderr.trim()}`));\n return;\n }\n resolve(stdout.trim());\n });\n\n child.stdin?.write(input);\n child.stdin?.end();\n });\n}\n\nfunction parseJsonSafe(payload: string): Record<string, unknown> | undefined {\n try {\n return JSON.parse(payload) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nfunction substituteVariables(template: string, variables: Record<string, string>): string {\n return template.replace(/\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g, (match, varName) => {\n return variables[varName] ?? match;\n });\n}\n\n// Composite Evaluator\n\nexport interface EvaluatorFactory {\n create(config: EvaluatorConfig, context: EvaluationContext): Evaluator;\n}\n\ninterface MemberResult {\n readonly id: string;\n readonly type: string;\n readonly result: EvaluationScore;\n}\n\nconst DEFAULT_COMPOSITE_AGGREGATOR_PROMPT = `Review the following evaluation results:\n{{EVALUATOR_RESULTS_JSON}}\n\nDecide the final score and verdict based on all evaluator results.\nReturn a JSON object with: score (0.0-1.0), verdict (pass/fail/borderline), and reasoning.`;\n\nexport interface CompositeEvaluatorOptions {\n readonly config: import('./types.js').CompositeEvaluatorConfig;\n readonly evaluatorFactory: EvaluatorFactory;\n readonly cwd?: string;\n}\n\nexport class CompositeEvaluator implements Evaluator {\n readonly kind = 'composite';\n\n private readonly config: import('./types.js').CompositeEvaluatorConfig;\n private readonly evaluatorFactory: EvaluatorFactory;\n private readonly cwd?: string;\n\n constructor(options: CompositeEvaluatorOptions) {\n this.config = options.config;\n this.evaluatorFactory = options.evaluatorFactory;\n this.cwd = options.cwd;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n // 1. Instantiate and run evaluators in parallel\n const memberResults = await Promise.all(\n this.config.evaluators.map(async (memberConfig) => {\n const evaluator = this.evaluatorFactory.create(memberConfig, context);\n return {\n id: memberConfig.name,\n type: memberConfig.type,\n result: await evaluator.evaluate(context),\n };\n }),\n );\n\n // 2. Aggregate results\n return this.aggregate(memberResults, context);\n }\n\n private async aggregate(\n results: readonly MemberResult[],\n context: EvaluationContext,\n ): Promise<EvaluationScore> {\n const aggregator = this.config.aggregator;\n\n switch (aggregator.type) {\n case 'code_judge':\n return this.runCodeAggregator(results, aggregator.path, aggregator.cwd ?? this.cwd);\n case 'llm_judge':\n return this.runLlmAggregator(results, context, aggregator);\n default:\n return this.runWeightedAverage(results, aggregator.weights);\n }\n }\n\n private runWeightedAverage(\n results: readonly MemberResult[],\n weights?: Record<string, number>,\n ): EvaluationScore {\n let totalWeight = 0;\n let weightedSum = 0;\n const allHits: string[] = [];\n const allMisses: string[] = [];\n const reasoningParts: string[] = [];\n const evaluatorResults: ChildEvaluatorResult[] = [];\n\n for (const member of results) {\n const weight = weights?.[member.id] ?? 1.0;\n totalWeight += weight;\n weightedSum += member.result.score * weight;\n allHits.push(...member.result.hits.map((h) => `[${member.id}] ${h}`));\n allMisses.push(...member.result.misses.map((m) => `[${member.id}] ${m}`));\n if (member.result.reasoning) {\n reasoningParts.push(`${member.id}: ${member.result.reasoning}`);\n }\n\n // Build child result entry\n evaluatorResults.push({\n name: member.id,\n type: member.type,\n score: member.result.score,\n weight,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n evaluatorResults: member.result.evaluatorResults,\n });\n }\n\n const finalScore = totalWeight > 0 ? weightedSum / totalWeight : 0;\n\n return {\n score: clampScore(finalScore),\n verdict: scoreToVerdict(finalScore),\n hits: allHits,\n misses: allMisses,\n expectedAspectCount: Math.max(allHits.length + allMisses.length, 1),\n reasoning: reasoningParts.length > 0 ? reasoningParts.join('; ') : undefined,\n evaluatorRawRequest: {\n aggregator: 'weighted_average',\n ...(weights ? { weights } : {}),\n },\n evaluatorResults,\n };\n }\n\n private async runCodeAggregator(\n results: readonly MemberResult[],\n scriptPath: string,\n cwd?: string,\n weights?: Record<string, number>,\n ): Promise<EvaluationScore> {\n const resultsObject = Object.fromEntries(results.map((r) => [r.id, r.result]));\n const inputPayload = JSON.stringify({ results: resultsObject }, null, 2);\n\n // Build child results for output\n const evaluatorResults: ChildEvaluatorResult[] = results.map((member) => ({\n name: member.id,\n type: member.type,\n score: member.result.score,\n weight: weights?.[member.id] ?? 1.0,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n evaluatorResults: member.result.evaluatorResults,\n }));\n\n try {\n const stdout = await executeScript(scriptPath, inputPayload, undefined, cwd);\n const parsed = parseJsonSafe(stdout);\n const score = clampScore(typeof parsed?.score === 'number' ? parsed.score : 0);\n const hits = Array.isArray(parsed?.hits) ? parsed.hits.filter(isNonEmptyString) : [];\n const misses = Array.isArray(parsed?.misses) ? parsed.misses.filter(isNonEmptyString) : [];\n const reasoning = typeof parsed?.reasoning === 'string' ? parsed.reasoning : undefined;\n const verdict =\n typeof parsed?.verdict === 'string' &&\n (parsed.verdict === 'pass' || parsed.verdict === 'fail' || parsed.verdict === 'borderline')\n ? parsed.verdict\n : scoreToVerdict(score);\n\n return {\n score,\n verdict,\n hits,\n misses,\n expectedAspectCount: hits.length + misses.length || 1,\n reasoning,\n evaluatorRawRequest: {\n aggregator: 'code_judge',\n script: scriptPath,\n },\n evaluatorResults,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Code aggregator failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n evaluatorRawRequest: {\n aggregator: 'code_judge',\n script: scriptPath,\n error: message,\n },\n evaluatorResults,\n };\n }\n }\n\n private async runLlmAggregator(\n results: readonly MemberResult[],\n context: EvaluationContext,\n config: Extract<import('./types.js').CompositeAggregatorConfig, { type: 'llm_judge' }>,\n ): Promise<EvaluationScore> {\n const judgeProvider = context.judgeProvider;\n if (!judgeProvider) {\n throw new Error('No judge provider available for LLM aggregation');\n }\n\n const resultsObject = Object.fromEntries(results.map((r) => [r.id, r.result]));\n const resultsJson = JSON.stringify(resultsObject, null, 2);\n\n // Build child results for output\n const evaluatorResults: ChildEvaluatorResult[] = results.map((member) => ({\n name: member.id,\n type: member.type,\n score: member.result.score,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n evaluatorResults: member.result.evaluatorResults,\n }));\n\n // Use custom prompt if provided, otherwise use default\n const promptTemplate = config.prompt ?? DEFAULT_COMPOSITE_AGGREGATOR_PROMPT;\n const userPrompt = promptTemplate.replace(/\\{\\{EVALUATOR_RESULTS_JSON\\}\\}/g, resultsJson);\n\n const systemPrompt = buildOutputSchema();\n\n const evaluatorRawRequest: JsonObject = {\n aggregator: 'llm_judge',\n userPrompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n try {\n const model = judgeProvider.asLanguageModel?.();\n if (model) {\n const { text } = await generateText({\n model,\n system: systemPrompt,\n prompt: userPrompt,\n });\n\n const data = freeformEvaluationSchema.parse(parseJsonFromText(text));\n const score = clampScore(data.score);\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: Math.max(hits.length + misses.length, 1),\n reasoning,\n evaluatorRawRequest,\n evaluatorResults,\n };\n }\n\n const response = await judgeProvider.invoke({\n question: userPrompt,\n systemPrompt,\n evalCaseId: context.evalCase.id,\n attempt: context.attempt,\n });\n\n const data = freeformEvaluationSchema.parse(parseJsonFromText(response.text ?? ''));\n const score = clampScore(data.score);\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning ?? response.reasoning;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: Math.max(hits.length + misses.length, 1),\n reasoning,\n evaluatorRawRequest,\n evaluatorResults,\n };\n } catch {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [],\n expectedAspectCount: 1,\n evaluatorRawRequest,\n evaluatorResults,\n };\n }\n }\n}\n","import { createHash, randomUUID } from 'node:crypto';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport pLimit from 'p-limit';\n\nimport {\n type ChildEvaluatorResult,\n CodeEvaluator,\n CompositeEvaluator,\n type EvaluationScore,\n type Evaluator,\n LlmJudgeEvaluator,\n} from './evaluators.js';\nimport { readTextFile } from './file-utils.js';\nimport { createProvider } from './providers/index.js';\nimport { type ResolvedTarget, resolveTargetDefinition } from './providers/targets.js';\nimport type {\n EnvLookup,\n Provider,\n ProviderRequest,\n ProviderResponse,\n TargetDefinition,\n} from './providers/types.js';\nimport { isAgentProvider } from './providers/types.js';\nimport type {\n EvalCase,\n EvaluationResult,\n EvaluationVerdict,\n EvaluatorConfig,\n EvaluatorKind,\n EvaluatorResult,\n JsonObject,\n JsonValue,\n} from './types.js';\nimport { type PromptInputs, buildPromptInputs, loadEvalCases } from './yaml-parser.js';\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport interface EvaluationCache {\n get(key: string): MaybePromise<ProviderResponse | undefined>;\n set(key: string, value: ProviderResponse): MaybePromise<void>;\n}\n\nexport interface RunEvalCaseOptions {\n readonly evalCase: EvalCase;\n readonly provider: Provider;\n readonly target: ResolvedTarget;\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\n readonly now?: () => Date;\n readonly maxRetries?: number;\n readonly agentTimeoutMs?: number;\n readonly promptDumpDir?: string;\n readonly cache?: EvaluationCache;\n readonly useCache?: boolean;\n readonly signal?: AbortSignal;\n readonly judgeProvider?: Provider;\n}\n\nexport interface ProgressEvent {\n readonly workerId: number;\n readonly evalId: string;\n readonly status: 'pending' | 'running' | 'completed' | 'failed';\n readonly startedAt?: number;\n readonly completedAt?: number;\n readonly error?: string;\n}\n\nexport interface RunEvaluationOptions {\n readonly testFilePath: string;\n readonly repoRoot: URL | string;\n readonly target: ResolvedTarget;\n readonly targets?: readonly TargetDefinition[];\n readonly env?: EnvLookup;\n readonly providerFactory?: (target: ResolvedTarget) => Provider;\n readonly evaluators?: Partial<Record<string, Evaluator>>;\n readonly maxRetries?: number;\n readonly agentTimeoutMs?: number;\n readonly promptDumpDir?: string;\n readonly cache?: EvaluationCache;\n readonly useCache?: boolean;\n readonly now?: () => Date;\n readonly evalId?: string;\n readonly verbose?: boolean;\n readonly maxConcurrency?: number;\n readonly evalCases?: readonly EvalCase[];\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\n}\n\nexport async function runEvaluation(\n options: RunEvaluationOptions,\n): Promise<readonly EvaluationResult[]> {\n const {\n testFilePath: evalFilePath,\n repoRoot,\n target,\n targets,\n env,\n providerFactory,\n evaluators,\n maxRetries,\n agentTimeoutMs,\n promptDumpDir,\n cache,\n useCache,\n now,\n evalId,\n verbose,\n evalCases: preloadedEvalCases,\n onResult,\n onProgress,\n } = options;\n\n // Use pre-loaded eval cases if provided, otherwise load them\n const evalCases =\n preloadedEvalCases ?? (await loadEvalCases(evalFilePath, repoRoot, { verbose, evalId }));\n\n const filteredEvalCases = filterEvalCases(evalCases, evalId);\n if (filteredEvalCases.length === 0) {\n if (evalId) {\n throw new Error(`Eval case with id '${evalId}' not found in ${evalFilePath}`);\n }\n return [];\n }\n\n const resolvedTargetsByName = new Map<string, ResolvedTarget>();\n resolvedTargetsByName.set(target.name, target);\n\n const targetDefinitions = new Map<string, TargetDefinition>();\n for (const definition of targets ?? []) {\n targetDefinitions.set(definition.name, definition);\n }\n\n const envLookup: EnvLookup = env ?? process.env;\n const providerCache = new Map<string, Provider>();\n\n const getOrCreateProvider = (resolved: ResolvedTarget): Provider => {\n const existing = providerCache.get(resolved.name);\n if (existing) {\n return existing;\n }\n const factory = providerFactory ?? createProvider;\n const instance = factory(resolved);\n providerCache.set(resolved.name, instance);\n return instance;\n };\n\n const resolveTargetByName = (name: string): ResolvedTarget | undefined => {\n if (resolvedTargetsByName.has(name)) {\n return resolvedTargetsByName.get(name);\n }\n const definition = targetDefinitions.get(name);\n if (!definition) {\n return undefined;\n }\n const resolved = resolveTargetDefinition(definition, envLookup);\n resolvedTargetsByName.set(name, resolved);\n return resolved;\n };\n\n const resolveJudgeProvider = async (\n targetContext: ResolvedTarget,\n ): Promise<Provider | undefined> => {\n const judgeName = targetContext.judgeTarget ?? targetContext.name;\n const resolvedJudge = resolveTargetByName(judgeName);\n if (!resolvedJudge) {\n return getOrCreateProvider(targetContext);\n }\n return getOrCreateProvider(resolvedJudge);\n };\n\n const evaluatorRegistry = buildEvaluatorRegistry(evaluators, resolveJudgeProvider);\n\n const primaryProvider = getOrCreateProvider(target);\n const providerSupportsBatch =\n target.providerBatching === true &&\n primaryProvider.supportsBatch === true &&\n typeof primaryProvider.invokeBatch === 'function';\n if (target.providerBatching && !providerSupportsBatch && verbose) {\n console.warn(\n `Provider batching requested for target '${target.name}', but provider does not advertise batch support. Using per-case dispatch.`,\n );\n }\n\n // Notify about total test count before starting\n if (onProgress && filteredEvalCases.length > 0) {\n // Emit initial pending events for all tests\n for (let i = 0; i < filteredEvalCases.length; i++) {\n await onProgress({\n workerId: i + 1,\n evalId: filteredEvalCases[i].id,\n status: 'pending',\n });\n }\n }\n\n if (providerSupportsBatch) {\n try {\n return await runBatchEvaluation({\n evalCases: filteredEvalCases,\n provider: primaryProvider,\n target,\n evaluatorRegistry,\n promptDumpDir,\n nowFn: now ?? (() => new Date()),\n onProgress,\n onResult,\n verbose,\n resolveJudgeProvider,\n agentTimeoutMs,\n });\n } catch (error) {\n if (verbose) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `Provider batch execution failed, falling back to per-case dispatch: ${message}`,\n );\n }\n }\n }\n\n // Resolve worker count: CLI option > target setting > default (1)\n const workers = options.maxConcurrency ?? target.workers ?? 1;\n const limit = pLimit(workers);\n\n // Track worker assignments for progress reporting\n let nextWorkerId = 1;\n const workerIdByEvalId = new Map<string, number>();\n\n // Map test cases to limited promises for parallel execution\n const promises = filteredEvalCases.map((evalCase) =>\n limit(async () => {\n // Assign worker ID when test starts executing\n const workerId = nextWorkerId++;\n workerIdByEvalId.set(evalCase.id, workerId);\n\n if (onProgress) {\n await onProgress({\n workerId,\n evalId: evalCase.id,\n status: 'running',\n startedAt: Date.now(),\n });\n }\n\n try {\n const judgeProvider = await resolveJudgeProvider(target);\n const result = await runEvalCase({\n evalCase: evalCase,\n provider: primaryProvider,\n target,\n evaluators: evaluatorRegistry,\n maxRetries,\n agentTimeoutMs,\n promptDumpDir,\n cache,\n useCache,\n now,\n judgeProvider,\n });\n\n if (onProgress) {\n await onProgress({\n workerId,\n evalId: evalCase.id,\n status: result.error ? 'failed' : 'completed',\n startedAt: 0, // Not used for completed status\n completedAt: Date.now(),\n error: result.error,\n });\n }\n\n if (onResult) {\n await onResult(result);\n }\n return result;\n } catch (error) {\n if (onProgress) {\n await onProgress({\n workerId,\n evalId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: error instanceof Error ? error.message : String(error),\n });\n }\n throw error;\n }\n }),\n );\n\n // Wait for all workers to complete\n const settled = await Promise.allSettled(promises);\n\n // Extract results, handling both fulfilled and rejected promises\n const results: EvaluationResult[] = [];\n for (let i = 0; i < settled.length; i++) {\n const outcome = settled[i];\n if (outcome.status === 'fulfilled') {\n results.push(outcome.value);\n } else {\n // Build error result for rejected promise\n const evalCase = filteredEvalCases[i];\n const promptInputs = await buildPromptInputs(evalCase);\n const errorResult = buildErrorResult(\n evalCase,\n target.name,\n (now ?? (() => new Date()))(),\n outcome.reason,\n promptInputs,\n primaryProvider,\n );\n results.push(errorResult);\n if (onResult) {\n await onResult(errorResult);\n }\n }\n }\n\n return results;\n}\n\nasync function runBatchEvaluation(options: {\n readonly evalCases: readonly EvalCase[];\n readonly provider: Provider;\n readonly target: ResolvedTarget;\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\n readonly llm_judge: Evaluator;\n };\n readonly promptDumpDir?: string;\n readonly nowFn: () => Date;\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\n readonly verbose?: boolean;\n readonly resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>;\n readonly agentTimeoutMs?: number;\n}): Promise<readonly EvaluationResult[]> {\n const {\n evalCases,\n provider,\n target,\n evaluatorRegistry,\n promptDumpDir,\n nowFn,\n onProgress,\n onResult,\n resolveJudgeProvider,\n agentTimeoutMs,\n } = options;\n\n // Prepare prompt inputs up front so we can reuse them for grading.\n const promptInputsList: PromptInputs[] = [];\n const formattingMode = isAgentProvider(provider) ? 'agent' : 'lm';\n\n for (const evalCase of evalCases) {\n const promptInputs = await buildPromptInputs(evalCase, formattingMode);\n if (promptDumpDir) {\n await dumpPrompt(promptDumpDir, evalCase, promptInputs);\n }\n promptInputsList.push(promptInputs);\n }\n\n const batchRequests: ProviderRequest[] = evalCases.map((evalCase, index) => {\n const promptInputs = promptInputsList[index];\n return {\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_patterns: evalCase.guideline_patterns,\n inputFiles: evalCase.file_paths,\n evalCaseId: evalCase.id,\n metadata: {\n systemPrompt: promptInputs.systemMessage ?? '',\n },\n };\n });\n\n const batchResponse = await provider.invokeBatch?.(batchRequests);\n if (!Array.isArray(batchResponse)) {\n throw new Error('Provider batching failed: invokeBatch did not return an array');\n }\n if (batchResponse.length !== evalCases.length) {\n throw new Error(\n `Provider batching failed: expected ${evalCases.length} responses, received ${batchResponse.length}`,\n );\n }\n\n if (onProgress) {\n const startedAt = Date.now();\n for (let i = 0; i < evalCases.length; i++) {\n await onProgress({\n workerId: 1,\n evalId: evalCases[i].id,\n status: 'running',\n startedAt,\n });\n }\n }\n\n const results: EvaluationResult[] = [];\n for (let i = 0; i < evalCases.length; i++) {\n const evalCase = evalCases[i];\n const promptInputs = promptInputsList[i];\n const providerResponse = batchResponse[i];\n let result: EvaluationResult;\n try {\n result = await evaluateCandidate({\n evalCase,\n candidate: providerResponse.text ?? '',\n target,\n provider,\n evaluators: evaluatorRegistry,\n promptInputs,\n nowFn,\n attempt: 0,\n judgeProvider: await resolveJudgeProvider(target),\n agentTimeoutMs,\n });\n } catch (error) {\n const errorResult = buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n error,\n promptInputs,\n provider,\n );\n results.push(errorResult);\n if (onResult) {\n await onResult(errorResult);\n }\n if (onProgress) {\n await onProgress({\n workerId: 1,\n evalId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: error instanceof Error ? error.message : String(error),\n });\n }\n continue;\n }\n\n results.push(result);\n if (onResult) {\n await onResult(result);\n }\n\n if (onProgress) {\n await onProgress({\n workerId: 1,\n evalId: evalCase.id,\n status: 'completed',\n startedAt: 0,\n completedAt: Date.now(),\n });\n }\n }\n\n return results;\n}\n\nexport async function runEvalCase(options: RunEvalCaseOptions): Promise<EvaluationResult> {\n const {\n evalCase,\n provider,\n target,\n evaluators,\n now,\n maxRetries,\n agentTimeoutMs,\n promptDumpDir,\n cache,\n useCache,\n signal,\n judgeProvider,\n } = options;\n\n const formattingMode = isAgentProvider(provider) ? 'agent' : 'lm';\n const promptInputs = await buildPromptInputs(evalCase, formattingMode);\n if (promptDumpDir) {\n await dumpPrompt(promptDumpDir, evalCase, promptInputs);\n }\n\n const cacheKey = useCache ? createCacheKey(provider, target, evalCase, promptInputs) : undefined;\n let cachedResponse: ProviderResponse | undefined;\n if (cacheKey && cache) {\n cachedResponse = await cache.get(cacheKey);\n }\n\n const nowFn = now ?? (() => new Date());\n\n const attemptBudget = (maxRetries ?? 0) + 1;\n let attempt = 0;\n let providerResponse: ProviderResponse | undefined = cachedResponse;\n let lastError: unknown;\n\n while (!providerResponse && attempt < attemptBudget) {\n try {\n providerResponse = await invokeProvider(provider, {\n evalCase: evalCase,\n target,\n promptInputs,\n attempt,\n agentTimeoutMs,\n signal,\n });\n } catch (error) {\n lastError = error;\n if (isTimeoutLike(error) && attempt + 1 < attemptBudget) {\n attempt += 1;\n continue;\n }\n return buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs, provider);\n }\n }\n\n if (!providerResponse) {\n return buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n lastError ?? new Error('Provider did not return a response'),\n promptInputs,\n provider,\n );\n }\n\n if (cacheKey && cache && !cachedResponse) {\n await cache.set(cacheKey, providerResponse);\n }\n\n try {\n return await evaluateCandidate({\n evalCase,\n candidate: providerResponse.text ?? '',\n target,\n provider,\n evaluators,\n promptInputs,\n nowFn,\n attempt,\n judgeProvider,\n agentTimeoutMs,\n });\n } catch (error) {\n return buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs, provider);\n }\n}\n\nasync function evaluateCandidate(options: {\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\n readonly promptInputs: PromptInputs;\n readonly nowFn: () => Date;\n readonly attempt: number;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n}): Promise<EvaluationResult> {\n const {\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n promptInputs,\n nowFn,\n attempt,\n judgeProvider,\n agentTimeoutMs,\n } = options;\n\n const gradeTimestamp = nowFn();\n const { score, evaluatorResults } = await runEvaluatorsForCase({\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n attempt,\n promptInputs,\n now: gradeTimestamp,\n judgeProvider,\n agentTimeoutMs,\n });\n\n const completedAt = nowFn();\n\n let agentProviderRequest: JsonObject | undefined;\n let lmProviderRequest: JsonObject | undefined;\n\n if (isAgentProvider(provider)) {\n agentProviderRequest = {\n question: promptInputs.question,\n guideline_paths: evalCase.guideline_paths,\n } as JsonObject;\n } else {\n if (promptInputs.chatPrompt) {\n lmProviderRequest = {\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\n guideline_paths: evalCase.guideline_paths,\n } as JsonObject;\n } else {\n lmProviderRequest = {\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_paths: evalCase.guideline_paths,\n } as JsonObject;\n }\n }\n\n return {\n timestamp: completedAt.toISOString(),\n eval_id: evalCase.id,\n dataset: evalCase.dataset,\n conversation_id: evalCase.conversation_id,\n score: score.score,\n hits: score.hits,\n misses: score.misses,\n candidate_answer: candidate,\n target: target.name,\n reasoning: score.reasoning,\n raw_aspects: score.rawAspects,\n agent_provider_request: agentProviderRequest,\n lm_provider_request: lmProviderRequest,\n evaluator_provider_request: evaluatorResults ? undefined : score.evaluatorRawRequest,\n evaluator_results: evaluatorResults,\n };\n}\n\nasync function runEvaluatorsForCase(options: {\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n}): Promise<{ score: EvaluationScore; evaluatorResults?: EvaluatorResult[] }> {\n const {\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n } = options;\n\n if (evalCase.evaluators && evalCase.evaluators.length > 0) {\n return runEvaluatorList({\n evalCase,\n evaluators: evalCase.evaluators,\n candidate,\n target,\n provider,\n evaluatorRegistry: evaluators,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n });\n }\n\n const evaluatorKind = evalCase.evaluator ?? 'llm_judge';\n const activeEvaluator = evaluators[evaluatorKind] ?? evaluators.llm_judge;\n if (!activeEvaluator) {\n throw new Error(`No evaluator registered for kind '${evaluatorKind}'`);\n }\n\n const score = await activeEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n });\n\n return { score };\n}\n\nasync function runEvaluatorList(options: {\n readonly evalCase: EvalCase;\n readonly evaluators: readonly EvaluatorConfig[];\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\n readonly llm_judge: Evaluator;\n };\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n}): Promise<{ score: EvaluationScore; evaluatorResults: EvaluatorResult[] }> {\n const {\n evalCase,\n evaluators,\n candidate,\n target,\n provider,\n evaluatorRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n } = options;\n\n const scored: Array<{\n readonly score: EvaluationScore;\n readonly name: string;\n readonly type: string;\n }> = [];\n const evaluatorResults: EvaluatorResult[] = [];\n\n for (const evaluator of evaluators ?? []) {\n try {\n if (evaluator.type === 'llm_judge') {\n const score = await runLlmJudgeEvaluator({\n config: evaluator,\n evalCase,\n candidate,\n target,\n provider,\n evaluatorRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n });\n scored.push({ score, name: evaluator.name, type: evaluator.type });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n evaluator_provider_request: score.evaluatorRawRequest,\n });\n }\n\n if (evaluator.type === 'code') {\n const codeEvaluator = new CodeEvaluator({\n script: evaluator.script,\n cwd: evaluator.resolvedCwd ?? evaluator.cwd,\n agentTimeoutMs,\n });\n const score = await codeEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n });\n scored.push({ score, name: evaluator.name, type: 'code_judge' });\n evaluatorResults.push({\n name: evaluator.name,\n type: 'code_judge',\n score: score.score,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n evaluator_provider_request: score.evaluatorRawRequest,\n });\n }\n\n if (evaluator.type === 'composite') {\n const evalFileDir = evalCase.guideline_paths[0]\n ? path.dirname(evalCase.guideline_paths[0])\n : process.cwd();\n\n const createEvaluator = (memberConfig: import('./types.js').EvaluatorConfig): Evaluator => {\n switch (memberConfig.type) {\n case 'llm_judge':\n return evaluatorRegistry.llm_judge;\n case 'code':\n return new CodeEvaluator({\n script: memberConfig.script,\n cwd: memberConfig.resolvedCwd ?? memberConfig.cwd,\n agentTimeoutMs,\n });\n case 'composite':\n return new CompositeEvaluator({\n config: memberConfig,\n cwd: evalFileDir,\n evaluatorFactory: { create: createEvaluator },\n });\n default: {\n const unknownConfig = memberConfig as { type: string };\n throw new Error(`Unsupported evaluator type in composite: ${unknownConfig.type}`);\n }\n }\n };\n\n const compositeEvaluator = new CompositeEvaluator({\n config: evaluator,\n cwd: evalFileDir,\n evaluatorFactory: { create: createEvaluator },\n });\n const score = await compositeEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n });\n scored.push({ score, name: evaluator.name, type: evaluator.type });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n evaluator_provider_request: score.evaluatorRawRequest,\n evaluator_results: mapChildResults(score.evaluatorResults),\n });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const fallbackScore: EvaluationScore = {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Evaluator '${evaluator.name}' failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n };\n const resultType = evaluator.type === 'code' ? 'code_judge' : evaluator.type;\n scored.push({\n score: fallbackScore,\n name: evaluator.name ?? 'unknown',\n type: resultType ?? 'llm_judge',\n });\n evaluatorResults.push({\n name: evaluator.name ?? 'unknown',\n type: resultType ?? 'llm_judge',\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Evaluator '${evaluator.name ?? 'unknown'}' failed: ${message}`],\n reasoning: message,\n });\n }\n }\n\n const aggregateScore =\n scored.length > 0\n ? scored.reduce((total, entry) => total + entry.score.score, 0) / scored.length\n : 0;\n const hits = scored.flatMap((entry) => entry.score.hits);\n const misses = scored.flatMap((entry) => entry.score.misses);\n const expectedAspectCount = scored.reduce(\n (total, entry) => total + (entry.score.expectedAspectCount ?? 0),\n 0,\n );\n const rawAspects = scored.flatMap((entry) => entry.score.rawAspects ?? []);\n const reasoningParts = scored\n .map((entry) => (entry.score.reasoning ? `${entry.name}: ${entry.score.reasoning}` : undefined))\n .filter(isNonEmptyString);\n const reasoning = reasoningParts.length > 0 ? reasoningParts.join(' | ') : undefined;\n\n const score: EvaluationScore = {\n score: aggregateScore,\n verdict: scoreToVerdict(aggregateScore),\n hits,\n misses,\n expectedAspectCount,\n reasoning,\n rawAspects: rawAspects.length > 0 ? rawAspects : undefined,\n };\n\n return { score, evaluatorResults };\n}\n\nasync function runLlmJudgeEvaluator(options: {\n readonly config: import('./types.js').LlmJudgeEvaluatorConfig;\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\n readonly llm_judge: Evaluator;\n };\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly judgeProvider?: Provider;\n}): Promise<EvaluationScore> {\n const {\n config,\n evalCase,\n candidate,\n target,\n provider,\n evaluatorRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n } = options;\n const customPrompt = await resolveCustomPrompt(config);\n\n return evaluatorRegistry.llm_judge.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n evaluatorTemplateOverride: customPrompt,\n evaluator: config,\n });\n}\n\nasync function resolveCustomPrompt(config: {\n readonly prompt?: string;\n readonly promptPath?: string;\n}): Promise<string | undefined> {\n if (config.promptPath) {\n try {\n const content = await readTextFile(config.promptPath);\n return content;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Could not read custom prompt at ${config.promptPath}: ${message}`);\n }\n }\n return config.prompt;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction scoreToVerdict(score: number): EvaluationVerdict {\n if (score >= 0.8) {\n return 'pass';\n }\n if (score >= 0.6) {\n return 'borderline';\n }\n return 'fail';\n}\n\nfunction filterEvalCases(evalCases: readonly EvalCase[], evalId?: string): readonly EvalCase[] {\n if (!evalId) {\n return evalCases;\n }\n return evalCases.filter((evalCase) => evalCase.id === evalId);\n}\n\nfunction buildEvaluatorRegistry(\n overrides: Partial<Record<string, Evaluator>> | undefined,\n resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>,\n): Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator } {\n const llmJudge =\n overrides?.llm_judge ??\n new LlmJudgeEvaluator({\n resolveJudgeProvider: async (context) => {\n if (context.judgeProvider) {\n return context.judgeProvider;\n }\n return resolveJudgeProvider(context.target);\n },\n });\n\n return {\n ...overrides,\n llm_judge: llmJudge,\n };\n}\n\nasync function dumpPrompt(\n directory: string,\n evalCase: EvalCase,\n promptInputs: PromptInputs,\n): Promise<void> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filename = `${timestamp}_${sanitizeFilename(evalCase.id)}.json`;\n const filePath = path.resolve(directory, filename);\n\n await mkdir(path.dirname(filePath), { recursive: true });\n const payload = {\n eval_id: evalCase.id,\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_paths: evalCase.guideline_paths,\n } satisfies Record<string, unknown>;\n\n await writeFile(filePath, JSON.stringify(payload, null, 2), 'utf8');\n}\n\nfunction sanitizeFilename(value: string): string {\n if (!value) {\n return 'prompt';\n }\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : randomUUID();\n}\n\nasync function invokeProvider(\n provider: Provider,\n options: {\n readonly evalCase: EvalCase;\n readonly target: ResolvedTarget;\n readonly promptInputs: PromptInputs;\n readonly attempt: number;\n readonly agentTimeoutMs?: number;\n readonly signal?: AbortSignal;\n },\n): Promise<ProviderResponse> {\n const { evalCase, promptInputs, attempt, agentTimeoutMs, signal } = options;\n\n const controller = new AbortController();\n const timeout = agentTimeoutMs ? setTimeout(() => controller.abort(), agentTimeoutMs) : undefined;\n\n if (signal) {\n signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n return await provider.invoke({\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_patterns: evalCase.guideline_patterns,\n chatPrompt: promptInputs.chatPrompt,\n inputFiles: evalCase.file_paths,\n evalCaseId: evalCase.id,\n attempt,\n metadata: {\n systemPrompt: promptInputs.systemMessage ?? '',\n },\n signal: controller.signal,\n });\n } finally {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n }\n}\n\nfunction buildErrorResult(\n evalCase: EvalCase,\n targetName: string,\n timestamp: Date,\n error: unknown,\n promptInputs: PromptInputs,\n provider?: Provider,\n): EvaluationResult {\n const message = error instanceof Error ? error.message : String(error);\n\n let agentProviderRequest: JsonObject | undefined;\n let lmProviderRequest: JsonObject | undefined;\n\n if (isAgentProvider(provider)) {\n agentProviderRequest = {\n question: promptInputs.question,\n guideline_paths: evalCase.guideline_paths,\n error: message,\n } as JsonObject;\n } else {\n if (promptInputs.chatPrompt) {\n lmProviderRequest = {\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\n guideline_paths: evalCase.guideline_paths,\n error: message,\n } as JsonObject;\n } else {\n lmProviderRequest = {\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_paths: evalCase.guideline_paths,\n error: message,\n } as JsonObject;\n }\n }\n\n return {\n timestamp: timestamp.toISOString(),\n eval_id: evalCase.id,\n dataset: evalCase.dataset,\n conversation_id: evalCase.conversation_id,\n score: 0,\n hits: [],\n misses: [`Error: ${message}`],\n candidate_answer: `Error occurred: ${message}`,\n target: targetName,\n raw_aspects: [],\n agent_provider_request: agentProviderRequest,\n lm_provider_request: lmProviderRequest,\n error: message,\n } satisfies EvaluationResult;\n}\n\nfunction createCacheKey(\n provider: Provider,\n target: ResolvedTarget,\n evalCase: EvalCase,\n promptInputs: PromptInputs,\n): string {\n const hash = createHash('sha256');\n hash.update(provider.id);\n hash.update(target.name);\n hash.update(evalCase.id);\n hash.update(promptInputs.question);\n hash.update(promptInputs.guidelines);\n hash.update(promptInputs.systemMessage ?? '');\n if (promptInputs.chatPrompt) {\n hash.update(JSON.stringify(promptInputs.chatPrompt));\n }\n return hash.digest('hex');\n}\n\nfunction isTimeoutLike(error: unknown): boolean {\n if (!error) {\n return false;\n }\n if (\n typeof DOMException !== 'undefined' &&\n error instanceof DOMException &&\n error.name === 'AbortError'\n ) {\n return true;\n }\n if (error instanceof Error) {\n const name = error.name?.toLowerCase();\n const message = error.message?.toLowerCase();\n return name.includes('timeout') || message.includes('timeout');\n }\n const value = String(error).toLowerCase();\n return value.includes('timeout');\n}\n\nfunction mapChildResults(\n children?: readonly ChildEvaluatorResult[],\n): readonly EvaluatorResult[] | undefined {\n if (!children || children.length === 0) {\n return undefined;\n }\n\n return children.map((child) => ({\n name: child.name,\n type: child.type as EvaluatorKind,\n score: child.score,\n weight: child.weight,\n verdict: child.verdict,\n hits: child.hits,\n misses: child.misses,\n reasoning: child.reasoning,\n evaluator_provider_request: child.evaluatorRawRequest,\n evaluator_results: mapChildResults(child.evaluatorResults),\n }));\n}\n","/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\n\t\t// Clean up tail reference when queue becomes empty\n\t\tif (!this.#head) {\n\t\t\tthis.#tail = undefined;\n\t\t}\n\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t\t// Since `pendingCount` has been decreased by one, increase `activeCount` by one.\n\t\t\tactiveCount++;\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue `internalResolve` instead of the `run` function\n\t\t// to preserve asynchronous context.\n\t\tnew Promise(internalResolve => {\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(\n\t\t\trun.bind(undefined, function_, resolve, arguments_),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// after the `internalResolve` function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency) {\n\t\t\t\tresumeNext();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nexport function limitFunction(function_, option) {\n\tconst {concurrency} = option;\n\tconst limit = pLimit(concurrency);\n\n\treturn (...arguments_) => limit(() => function_(...arguments_));\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n","import 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","import { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport type { Provider } from '../providers/types.js';\nimport type { RubricItem } from '../types.js';\n\nconst rubricItemSchema = z.object({\n id: z.string().describe('Short identifier for this rubric (e.g., clarity, completeness)'),\n description: z.string().describe('What this rubric checks for'),\n weight: z.number().default(1.0).describe('Relative importance (default 1.0)'),\n required: z.boolean().default(true).describe('Whether this is a mandatory requirement'),\n});\n\nconst rubricGenerationSchema = z.object({\n rubrics: z.array(rubricItemSchema).describe('List of evaluation rubrics'),\n});\n\nexport interface GenerateRubricsOptions {\n readonly expectedOutcome: string;\n readonly question?: string;\n readonly referenceAnswer?: string;\n readonly provider: Provider;\n}\n\n/**\n * Generate rubrics from expected outcome using an LLM.\n */\nexport async function generateRubrics(\n options: GenerateRubricsOptions,\n): Promise<readonly RubricItem[]> {\n const { expectedOutcome, question, referenceAnswer, provider } = options;\n\n const prompt = buildPrompt(expectedOutcome, question, referenceAnswer);\n\n const model = provider.asLanguageModel?.();\n if (!model) {\n throw new Error('Provider does not support language model interface');\n }\n\n const system = `You are an expert at creating evaluation rubrics.\nYou must return a valid JSON object matching this schema:\n{\n \"rubrics\": [\n {\n \"id\": \"string (short identifier)\",\n \"description\": \"string (what to check)\",\n \"weight\": number (default 1.0),\n \"required\": boolean (default true)\n }\n ]\n}`;\n\n let result: z.infer<typeof rubricGenerationSchema> | undefined;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const { text } = await generateText({\n model,\n system,\n prompt,\n });\n\n const cleaned = text.replace(/```json\\n?|```/g, '').trim();\n result = rubricGenerationSchema.parse(JSON.parse(cleaned));\n break;\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n // Continue to next attempt\n }\n }\n\n if (!result) {\n throw new Error(`Failed to parse generated rubrics after 3 attempts: ${lastError?.message}`);\n }\n\n return result.rubrics;\n}\n\nfunction buildPrompt(expectedOutcome: string, question?: string, referenceAnswer?: string): string {\n const parts: string[] = [\n 'You are an expert at creating evaluation rubrics.',\n 'Given the expected outcome (and optionally the question and reference answer),',\n 'generate a list of specific, measurable rubric items to evaluate whether an answer meets the expected outcome.',\n '',\n 'Each rubric should:',\n '- Be specific and testable',\n '- Have a short, descriptive ID',\n '- Include a clear description of what to check',\n '- Indicate if it is required (mandatory) or optional',\n '- Have an appropriate weight (default 1.0, use higher values for more important aspects)',\n '',\n 'Generate 3-7 rubric items that comprehensively cover the expected outcome.',\n '',\n '[[ ## expected_outcome ## ]]',\n expectedOutcome,\n '',\n ];\n\n if (question && question.trim().length > 0) {\n parts.push('[[ ## question ## ]]', question, '');\n }\n\n if (referenceAnswer && referenceAnswer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', referenceAnswer, '');\n }\n\n return parts.join('\\n');\n}\n"],"mappings":"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","names":["buildDirectoryChain","buildSearchRoots","fileExists","resolveFileReference","import_promises","import_node_path","import_yaml","import_promises","import_node_path","path","path","micromatch","import_node_path","import_promises","ANSI_YELLOW","ANSI_RESET","ANSI_YELLOW","ANSI_RESET","isJsonObject","logWarning","asString","path","promptPath","import_promises","import_node_path","ANSI_YELLOW","ANSI_RESET","asString","logWarning","path","import_promises","import_node_path","ANSI_YELLOW","ANSI_RESET","path","logWarning","asString","ANSI_YELLOW","ANSI_RESET","path","asString","logWarning","import_node_fs","import_promises","import_node_path","fileExists","path","buildDirectoryChain","buildSearchRoots","trimLeadingSeparators","resolveFileReference","systemContent","import_promises","import_node_path","execWithCallback","fs","path","os","import_node_child_process","import_node_fs","import_promises","import_node_os","import_node_path","import_node_util","import_node_path","normalizeInputFiles","path","execAsync","execCallback","normalizeInputFiles","path","formatTimeoutSuffix","import_node_path","buildPromptDocument","collectGuidelineFiles","buildMandatoryPrereadBlock","path","pathToFileUri","path","import_node_fs","import_promises","import_node_path","import_yaml","fileExists","path","import_ai","import_zod","data","spawn","score","hits","misses","reasoning","import_node_crypto","import_promises","import_node_path","score","path","isNonEmptyString","scoreToVerdict","import_ai","import_zod"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/evaluation/types.ts","../src/evaluation/trace.ts","../src/evaluation/yaml-parser.ts","../src/evaluation/formatting/segment-formatter.ts","../src/evaluation/loaders/config-loader.ts","../src/evaluation/loaders/file-resolver.ts","../src/evaluation/loaders/evaluator-parser.ts","../src/evaluation/validation/prompt-validator.ts","../src/evaluation/template-variables.ts","../src/evaluation/loaders/message-processor.ts","../src/evaluation/formatting/prompt-builder.ts","../src/evaluation/file-utils.ts","../src/evaluation/providers/ai-sdk.ts","../src/evaluation/providers/cli.ts","../src/evaluation/providers/codex.ts","../src/evaluation/providers/codex-log-tracker.ts","../src/evaluation/providers/preread.ts","../src/evaluation/providers/mock.ts","../src/evaluation/providers/targets.ts","../src/evaluation/providers/vscode.ts","../src/evaluation/providers/vscode-templates.ts","../src/evaluation/providers/targets-file.ts","../src/evaluation/providers/index.ts","../src/evaluation/evaluators.ts","../src/evaluation/orchestrator.ts","../../../node_modules/.bun/yocto-queue@1.2.2/node_modules/yocto-queue/index.js","../../../node_modules/.bun/p-limit@6.2.0/node_modules/p-limit/index.js","../src/evaluation/providers/types.ts","../src/evaluation/generators/rubric-generator.ts"],"sourcesContent":["export * from './evaluation/types.js';\r\nexport * from './evaluation/trace.js';\r\nexport * from './evaluation/yaml-parser.js';\r\nexport * from './evaluation/file-utils.js';\r\nexport * from './evaluation/providers/index.js';\r\nexport * from './evaluation/evaluators.js';\r\nexport * from './evaluation/orchestrator.js';\r\nexport * from './evaluation/generators/index.js';\r\n\r\nexport type AgentKernel = {\r\n status: string;\r\n};\r\n\r\nexport function createAgentKernel(): AgentKernel {\r\n return { status: 'stub' };\r\n}\r\n","import type { ToolTrajectoryEvaluatorConfig, TraceEvent, TraceSummary } from './trace.js';\r\n\r\n/**\r\n * JSON primitive values appearing in AgentV payloads.\r\n */\r\nexport type JsonPrimitive = string | number | boolean | null;\r\n\r\n/**\r\n * Immutable JSON object representation for test fixtures.\r\n */\r\nexport interface JsonObject {\r\n readonly [key: string]: JsonValue;\r\n}\r\n\r\n/**\r\n * Recursive JSON value supporting nested structures.\r\n */\r\nexport type JsonValue = JsonPrimitive | JsonObject | readonly JsonValue[];\r\n\r\nconst TEST_MESSAGE_ROLE_VALUES = ['system', 'user', 'assistant', 'tool'] as const;\r\n\r\n/**\r\n * Immutable list of supported message roles.\r\n */\r\nexport const TEST_MESSAGE_ROLES = TEST_MESSAGE_ROLE_VALUES;\r\n\r\n/**\r\n * Role literals used by test messages.\r\n */\r\nexport type TestMessageRole = (typeof TEST_MESSAGE_ROLE_VALUES)[number];\r\n\r\nconst TEST_MESSAGE_ROLE_SET: ReadonlySet<string> = new Set(TEST_MESSAGE_ROLE_VALUES);\r\n\r\n/**\r\n * Text or structured payload attached to a message.\r\n */\r\nexport type TestMessageContent = string | readonly JsonObject[];\r\n\r\n/**\r\n * System-authored instruction message.\r\n */\r\nexport type SystemTestMessage = {\r\n readonly role: 'system';\r\n readonly content: TestMessageContent;\r\n};\r\n\r\n/**\r\n * User-authored prompt message.\r\n */\r\nexport type UserTestMessage = {\r\n readonly role: 'user';\r\n readonly content: TestMessageContent;\r\n};\r\n\r\n/**\r\n * Tool call specification for expected_messages validation.\r\n */\r\nexport type TestMessageToolCall = {\r\n readonly tool: string;\r\n readonly input?: unknown;\r\n};\r\n\r\n/**\r\n * Assistant response message.\r\n */\r\nexport type AssistantTestMessage = {\r\n readonly role: 'assistant';\r\n readonly content: TestMessageContent;\r\n /** Optional tool_calls for expected_messages validation against traces */\r\n readonly tool_calls?: readonly TestMessageToolCall[];\r\n};\r\n\r\n/**\r\n * Tool invocation message.\r\n */\r\nexport type ToolTestMessage = {\r\n readonly role: 'tool';\r\n readonly content: TestMessageContent;\r\n};\r\n\r\n/**\r\n * Conversation message union with role discrimination.\r\n */\r\nexport type TestMessage =\r\n | SystemTestMessage\r\n | UserTestMessage\r\n | AssistantTestMessage\r\n | ToolTestMessage;\r\n\r\n/**\r\n * Guard validating supported message roles.\r\n */\r\nexport function isTestMessageRole(value: unknown): value is TestMessageRole {\r\n return typeof value === 'string' && TEST_MESSAGE_ROLE_SET.has(value);\r\n}\r\n\r\n/**\r\n * Guard matching AgentV JSON objects.\r\n */\r\nexport function isJsonObject(value: unknown): value is JsonObject {\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n return false;\r\n }\r\n return Object.values(value as Record<string, unknown>).every(isJsonValue);\r\n}\r\n\r\n/**\r\n * Guard matching AgentV JSON values.\r\n */\r\nexport function isJsonValue(value: unknown): value is JsonValue {\r\n if (\r\n value === null ||\r\n typeof value === 'string' ||\r\n typeof value === 'number' ||\r\n typeof value === 'boolean'\r\n ) {\r\n return true;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.every(isJsonValue);\r\n }\r\n if (typeof value === 'object') {\r\n return isJsonObject(value);\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Guard validating raw test messages.\r\n */\r\nexport function isTestMessage(value: unknown): value is TestMessage {\r\n if (typeof value !== 'object' || value === null) {\r\n return false;\r\n }\r\n const candidate = value as { role?: unknown; content?: unknown };\r\n if (!isTestMessageRole(candidate.role)) {\r\n return false;\r\n }\r\n if (typeof candidate.content === 'string') {\r\n return true;\r\n }\r\n if (!Array.isArray(candidate.content)) {\r\n return false;\r\n }\r\n return candidate.content.every(isJsonObject);\r\n}\r\n\r\nconst EVALUATOR_KIND_VALUES = [\r\n 'code_judge',\r\n 'llm_judge',\r\n 'rubric',\r\n 'composite',\r\n 'tool_trajectory',\r\n 'expected_messages',\r\n] as const;\r\n\r\nexport type EvaluatorKind = (typeof EVALUATOR_KIND_VALUES)[number];\r\n\r\nconst EVALUATOR_KIND_SET: ReadonlySet<string> = new Set(EVALUATOR_KIND_VALUES);\r\n\r\nexport function isEvaluatorKind(value: unknown): value is EvaluatorKind {\r\n return typeof value === 'string' && EVALUATOR_KIND_SET.has(value);\r\n}\r\n\r\nexport type CodeEvaluatorConfig = {\r\n readonly name: string;\r\n readonly type: 'code';\r\n readonly script: string;\r\n readonly resolvedScriptPath?: string;\r\n readonly cwd?: string;\r\n readonly resolvedCwd?: string;\r\n readonly weight?: number;\r\n};\r\n\r\nexport type LlmJudgeEvaluatorConfig = {\r\n readonly name: string;\r\n readonly type: 'llm_judge';\r\n readonly prompt?: string;\r\n readonly promptPath?: string;\r\n readonly rubrics?: readonly RubricItem[];\r\n readonly weight?: number;\r\n};\r\n\r\nexport type RubricItem = {\r\n readonly id: string;\r\n readonly description: string;\r\n readonly weight: number;\r\n readonly required: boolean;\r\n};\r\n\r\nexport type CompositeAggregatorConfig =\r\n | { readonly type: 'weighted_average'; readonly weights?: Record<string, number> }\r\n | { readonly type: 'code_judge'; readonly path: string; readonly cwd?: string }\r\n | {\r\n readonly type: 'llm_judge';\r\n readonly prompt?: string;\r\n readonly promptPath?: string;\r\n readonly model?: string;\r\n };\r\n\r\nexport type CompositeEvaluatorConfig = {\r\n readonly name: string;\r\n readonly type: 'composite';\r\n readonly evaluators: readonly EvaluatorConfig[];\r\n readonly aggregator: CompositeAggregatorConfig;\r\n readonly weight?: number;\r\n};\r\n\r\nexport type ExpectedMessagesEvaluatorConfig = {\r\n readonly name: string;\r\n readonly type: 'expected_messages';\r\n readonly weight?: number;\r\n};\r\n\r\nexport type EvaluatorConfig =\r\n | CodeEvaluatorConfig\r\n | LlmJudgeEvaluatorConfig\r\n | CompositeEvaluatorConfig\r\n | ToolTrajectoryEvaluatorConfig\r\n | ExpectedMessagesEvaluatorConfig;\r\n\r\n/**\r\n * Eval case definition sourced from AgentV specs.\r\n */\r\nexport interface EvalCase {\r\n readonly id: string;\r\n readonly dataset?: string;\r\n readonly conversation_id?: string;\r\n readonly question: string;\r\n readonly input_messages: readonly TestMessage[];\r\n readonly input_segments: readonly JsonObject[];\r\n readonly expected_segments: readonly JsonObject[];\r\n readonly reference_answer?: string;\r\n readonly guideline_paths: readonly string[];\r\n readonly guideline_patterns?: readonly string[];\r\n readonly file_paths: readonly string[];\r\n readonly code_snippets: readonly string[];\r\n readonly expected_outcome: string;\r\n readonly evaluator?: EvaluatorKind;\r\n readonly evaluators?: readonly EvaluatorConfig[];\r\n}\r\n\r\n/**\r\n * Evaluator scorecard for a single eval case run.\r\n */\r\nexport interface EvaluationResult {\r\n readonly timestamp: string;\r\n readonly eval_id: string;\r\n readonly dataset?: string;\r\n readonly conversation_id?: string;\r\n readonly score: number;\r\n readonly hits: readonly string[];\r\n readonly misses: readonly string[];\r\n readonly candidate_answer: string;\r\n readonly target: string;\r\n readonly reasoning?: string;\r\n readonly raw_aspects?: readonly string[];\r\n readonly agent_provider_request?: JsonObject;\r\n readonly lm_provider_request?: JsonObject;\r\n readonly evaluator_provider_request?: JsonObject;\r\n readonly evaluator_results?: readonly EvaluatorResult[];\r\n readonly error?: string;\r\n /** Lightweight summary of the execution trace (always included when available) */\r\n readonly trace_summary?: TraceSummary;\r\n /** Full trace events (only included when --include-trace flag is set) */\r\n readonly trace?: readonly TraceEvent[];\r\n}\r\n\r\nexport type EvaluationVerdict = 'pass' | 'fail' | 'borderline';\r\n\r\nexport interface EvaluatorResult {\r\n readonly name: string;\r\n readonly type: EvaluatorKind;\r\n readonly score: number;\r\n readonly weight?: number;\r\n readonly verdict?: EvaluationVerdict;\r\n readonly hits: readonly string[];\r\n readonly misses: readonly string[];\r\n readonly reasoning?: string;\r\n readonly raw_request?: JsonObject;\r\n readonly evaluator_provider_request?: JsonObject;\r\n readonly evaluator_results?: readonly EvaluatorResult[];\r\n}\r\n\r\n/**\r\n * Convenience accessor matching the Python hit_count property.\r\n */\r\nexport function getHitCount(result: Pick<EvaluationResult, 'hits'>): number {\r\n return result.hits.length;\r\n}\r\n","/**\r\n * Trace event types for capturing agent execution traces.\r\n * Provides a normalized, provider-agnostic model for tool-call trajectories.\r\n */\r\n\r\n/**\r\n * Supported trace event types.\r\n */\r\nexport type TraceEventType = 'model_step' | 'tool_call' | 'tool_result' | 'message' | 'error';\r\n\r\n/**\r\n * Normalized trace event representing a single step in agent execution.\r\n * Provider-agnostic format for tool-call trajectory evaluation.\r\n */\r\nexport interface TraceEvent {\r\n /** Event type */\r\n readonly type: TraceEventType;\r\n /** ISO 8601 timestamp */\r\n readonly timestamp: string;\r\n /** Stable identifier for pairing tool_call/tool_result */\r\n readonly id?: string;\r\n /** Tool name (for tool_call/tool_result) */\r\n readonly name?: string;\r\n /** Tool input - any JSON value */\r\n readonly input?: unknown;\r\n /** Tool output - any JSON value */\r\n readonly output?: unknown;\r\n /** Message content (for message/model_step) */\r\n readonly text?: string;\r\n /** Provider-specific metadata */\r\n readonly metadata?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Compact summary of a trace for lightweight persistence.\r\n * Included in results by default to avoid payload bloat.\r\n */\r\nexport interface TraceSummary {\r\n /** Total number of events in trace */\r\n readonly eventCount: number;\r\n /** Unique tool names, sorted alphabetically */\r\n readonly toolNames: readonly string[];\r\n /** Map of tool name to call count */\r\n readonly toolCallsByName: Readonly<Record<string, number>>;\r\n /** Number of error events */\r\n readonly errorCount: number;\r\n}\r\n\r\n/**\r\n * Configuration for tool_trajectory evaluator.\r\n */\r\nexport interface ToolTrajectoryEvaluatorConfig {\r\n readonly name: string;\r\n readonly type: 'tool_trajectory';\r\n /** Matching mode */\r\n readonly mode: 'any_order' | 'in_order' | 'exact';\r\n /** Minimum call counts per tool (for any_order mode) */\r\n readonly minimums?: Readonly<Record<string, number>>;\r\n /** Expected tool sequence (for in_order/exact modes) */\r\n readonly expected?: readonly ToolTrajectoryExpectedItem[];\r\n /** Optional weight for top-level aggregation (defaults to 1.0) */\r\n readonly weight?: number;\r\n}\r\n\r\n/**\r\n * Expected tool call item in a trajectory sequence.\r\n */\r\nexport interface ToolTrajectoryExpectedItem {\r\n readonly tool: string;\r\n}\r\n\r\n/**\r\n * Expected tool call specification for expected_messages validation.\r\n */\r\nexport interface ExpectedToolCall {\r\n /** Tool name (required) */\r\n readonly tool: string;\r\n /** Tool input - if specified, must match exactly */\r\n readonly input?: unknown;\r\n /** Tool output - if specified, must match exactly */\r\n readonly output?: unknown;\r\n}\r\n\r\n/**\r\n * Type guard for TraceEventType values.\r\n */\r\nexport function isTraceEventType(value: unknown): value is TraceEventType {\r\n return (\r\n typeof value === 'string' &&\r\n ['model_step', 'tool_call', 'tool_result', 'message', 'error'].includes(value)\r\n );\r\n}\r\n\r\n/**\r\n * Type guard for TraceEvent objects.\r\n */\r\nexport function isTraceEvent(value: unknown): value is TraceEvent {\r\n if (typeof value !== 'object' || value === null) {\r\n return false;\r\n }\r\n const candidate = value as Record<string, unknown>;\r\n return isTraceEventType(candidate.type) && typeof candidate.timestamp === 'string';\r\n}\r\n\r\n/**\r\n * Type guard for ExpectedToolCall objects.\r\n */\r\nexport function isExpectedToolCall(value: unknown): value is ExpectedToolCall {\r\n if (typeof value !== 'object' || value === null) {\r\n return false;\r\n }\r\n const candidate = value as Record<string, unknown>;\r\n return typeof candidate.tool === 'string';\r\n}\r\n\r\n/**\r\n * Compute a lightweight summary from a full trace.\r\n * Used for default result persistence without payload bloat.\r\n */\r\nexport function computeTraceSummary(trace: readonly TraceEvent[]): TraceSummary {\r\n const toolCallCounts: Record<string, number> = {};\r\n let errorCount = 0;\r\n\r\n for (const event of trace) {\r\n if (event.type === 'tool_call' && event.name) {\r\n toolCallCounts[event.name] = (toolCallCounts[event.name] ?? 0) + 1;\r\n }\r\n if (event.type === 'error') {\r\n errorCount++;\r\n }\r\n }\r\n\r\n const toolNames = Object.keys(toolCallCounts).sort();\r\n\r\n return {\r\n eventCount: trace.length,\r\n toolNames,\r\n toolCallsByName: toolCallCounts,\r\n errorCount,\r\n };\r\n}\r\n","import { readFile } from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport { parse } from 'yaml';\r\n\r\nimport { extractCodeBlocks } from './formatting/segment-formatter.js';\r\nimport { extractTargetFromSuite, loadConfig } from './loaders/config-loader.js';\r\nimport { coerceEvaluator, parseEvaluators } from './loaders/evaluator-parser.js';\r\nimport { buildSearchRoots, resolveToAbsolutePath } from './loaders/file-resolver.js';\r\nimport {\r\n processExpectedMessages,\r\n processMessages,\r\n resolveAssistantContent,\r\n} from './loaders/message-processor.js';\r\nimport type { EvalCase, JsonObject, JsonValue, TestMessage } from './types.js';\r\nimport { isJsonObject, isTestMessage } from './types.js';\r\n\r\n// Re-export public APIs from modules\r\nexport { buildPromptInputs, type PromptInputs } from './formatting/prompt-builder.js';\r\nexport { extractCodeBlocks } from './formatting/segment-formatter.js';\r\nexport { isGuidelineFile } from './loaders/config-loader.js';\r\n\r\nconst ANSI_YELLOW = '\\u001b[33m';\r\nconst ANSI_RED = '\\u001b[31m';\r\nconst ANSI_RESET = '\\u001b[0m';\r\n\r\ntype LoadOptions = {\r\n readonly verbose?: boolean;\r\n readonly evalId?: string;\r\n};\r\n\r\ntype RawTestSuite = JsonObject & {\r\n readonly evalcases?: JsonValue;\r\n readonly target?: JsonValue;\r\n readonly execution?: JsonValue;\r\n readonly dataset?: JsonValue;\r\n};\r\n\r\ntype RawEvalCase = JsonObject & {\r\n readonly id?: JsonValue;\r\n readonly conversation_id?: JsonValue;\r\n readonly outcome?: JsonValue;\r\n readonly expected_outcome?: JsonValue;\r\n readonly input_messages?: JsonValue;\r\n readonly expected_messages?: JsonValue;\r\n readonly execution?: JsonValue;\r\n readonly evaluators?: JsonValue;\r\n readonly rubrics?: JsonValue;\r\n};\r\n\r\n/**\r\n * Read metadata from a test suite file (like target name).\r\n * This is a convenience function for CLI tools that need metadata without loading all eval cases.\r\n */\r\nexport async function readTestSuiteMetadata(testFilePath: string): Promise<{ target?: string }> {\r\n try {\r\n const absolutePath = path.resolve(testFilePath);\r\n const content = await readFile(absolutePath, 'utf8');\r\n const parsed = parse(content) as unknown;\r\n\r\n if (!isJsonObject(parsed)) {\r\n return {};\r\n }\r\n\r\n return { target: extractTargetFromSuite(parsed) };\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * Load eval cases from a AgentV YAML specification file.\r\n */\r\nexport async function loadEvalCases(\r\n evalFilePath: string,\r\n repoRoot: URL | string,\r\n options?: LoadOptions,\r\n): Promise<readonly EvalCase[]> {\r\n const verbose = options?.verbose ?? false;\r\n const evalIdFilter = options?.evalId;\r\n const absoluteTestPath = path.resolve(evalFilePath);\r\n\r\n const repoRootPath = resolveToAbsolutePath(repoRoot);\r\n const searchRoots = buildSearchRoots(absoluteTestPath, repoRootPath);\r\n\r\n // Load configuration (walks up directory tree to repo root)\r\n const config = await loadConfig(absoluteTestPath, repoRootPath);\r\n const guidelinePatterns = config?.guideline_patterns;\r\n\r\n const rawFile = await readFile(absoluteTestPath, 'utf8');\r\n const parsed = parse(rawFile) as unknown;\r\n if (!isJsonObject(parsed)) {\r\n throw new Error(`Invalid test file format: ${evalFilePath}`);\r\n }\r\n\r\n const suite = parsed as RawTestSuite;\r\n const datasetNameFromSuite = asString(suite.dataset)?.trim();\r\n const fallbackDataset = path.basename(absoluteTestPath).replace(/\\.ya?ml$/i, '') || 'eval';\r\n const datasetName =\r\n datasetNameFromSuite && datasetNameFromSuite.length > 0\r\n ? datasetNameFromSuite\r\n : fallbackDataset;\r\n\r\n const rawTestcases = suite.evalcases;\r\n if (!Array.isArray(rawTestcases)) {\r\n throw new Error(`Invalid test file format: ${evalFilePath} - missing 'evalcases' field`);\r\n }\r\n\r\n const globalEvaluator = coerceEvaluator(suite.evaluator, 'global') ?? 'llm_judge';\r\n\r\n // Extract global target from execution.target (or legacy root-level target)\r\n const globalExecution = isJsonObject(suite.execution) ? suite.execution : undefined;\r\n const _globalTarget = asString(globalExecution?.target) ?? asString(suite.target);\r\n\r\n const results: EvalCase[] = [];\r\n\r\n for (const rawEvalcase of rawTestcases) {\r\n if (!isJsonObject(rawEvalcase)) {\r\n logWarning('Skipping invalid eval case entry (expected object)');\r\n continue;\r\n }\r\n\r\n const evalcase = rawEvalcase as RawEvalCase;\r\n const id = asString(evalcase.id);\r\n\r\n // Skip eval cases that don't match the filter\r\n if (evalIdFilter && id !== evalIdFilter) {\r\n continue;\r\n }\r\n\r\n const conversationId = asString(evalcase.conversation_id);\r\n // Support both expected_outcome and outcome (backward compatibility)\r\n const outcome = asString(evalcase.expected_outcome) ?? asString(evalcase.outcome);\r\n\r\n const inputMessagesValue = evalcase.input_messages;\r\n const expectedMessagesValue = evalcase.expected_messages;\r\n\r\n if (!id || !outcome || !Array.isArray(inputMessagesValue)) {\r\n logError(\r\n `Skipping incomplete eval case: ${id ?? 'unknown'}. Missing required fields: id, outcome, and/or input_messages`,\r\n );\r\n continue;\r\n }\r\n\r\n // expected_messages is optional - for outcome-only evaluation\r\n const hasExpectedMessages =\r\n Array.isArray(expectedMessagesValue) && expectedMessagesValue.length > 0;\r\n\r\n // V2 format: input_messages vs expected_messages\r\n const inputMessages = inputMessagesValue.filter((msg): msg is TestMessage =>\r\n isTestMessage(msg),\r\n );\r\n const expectedMessages = hasExpectedMessages\r\n ? expectedMessagesValue.filter((msg): msg is TestMessage => isTestMessage(msg))\r\n : [];\r\n\r\n if (hasExpectedMessages && expectedMessages.length === 0) {\r\n logError(`No valid expected message found for eval case: ${id}`);\r\n continue;\r\n }\r\n\r\n if (expectedMessages.length > 1) {\r\n logWarning(`Multiple expected messages found for eval case: ${id}, using first`);\r\n }\r\n\r\n const guidelinePaths: string[] = [];\r\n const inputTextParts: string[] = [];\r\n\r\n // Process all input messages to extract files and guidelines\r\n const inputSegments = await processMessages({\r\n messages: inputMessages,\r\n searchRoots,\r\n repoRootPath,\r\n guidelinePatterns,\r\n guidelinePaths,\r\n textParts: inputTextParts,\r\n messageType: 'input',\r\n verbose,\r\n });\r\n\r\n // Process expected_messages into segments (only if provided)\r\n // Preserve full message structure including role and tool_calls for expected_messages evaluator\r\n const outputSegments = hasExpectedMessages\r\n ? await processExpectedMessages({\r\n messages: expectedMessages,\r\n searchRoots,\r\n repoRootPath,\r\n verbose,\r\n })\r\n : [];\r\n\r\n const codeSnippets = extractCodeBlocks(inputSegments);\r\n const expectedContent = expectedMessages[0]?.content;\r\n const referenceAnswer = expectedContent\r\n ? await resolveAssistantContent(expectedContent, searchRoots, verbose)\r\n : '';\r\n const question = inputTextParts\r\n .map((part) => part.trim())\r\n .filter((part) => part.length > 0)\r\n .join(' ');\r\n\r\n const evalCaseEvaluatorKind = coerceEvaluator(evalcase.evaluator, id) ?? globalEvaluator;\r\n let evaluators: Awaited<ReturnType<typeof parseEvaluators>>;\r\n try {\r\n evaluators = await parseEvaluators(evalcase, globalExecution, searchRoots, id ?? 'unknown');\r\n } catch (error) {\r\n // Skip entire eval case if evaluator validation fails\r\n const message = error instanceof Error ? error.message : String(error);\r\n logError(`Skipping eval case '${id}': ${message}`);\r\n continue;\r\n }\r\n\r\n // Handle inline rubrics field (syntactic sugar)\r\n const inlineRubrics = evalcase.rubrics;\r\n if (inlineRubrics !== undefined && Array.isArray(inlineRubrics)) {\r\n const rubricItems = inlineRubrics\r\n .filter((r): r is JsonObject | string => isJsonObject(r) || typeof r === 'string')\r\n .map((rubric, index) => {\r\n if (typeof rubric === 'string') {\r\n return {\r\n id: `rubric-${index + 1}`,\r\n description: rubric,\r\n weight: 1.0,\r\n required: true,\r\n };\r\n }\r\n return {\r\n id: asString(rubric.id) ?? `rubric-${index + 1}`,\r\n description: asString(rubric.description) ?? '',\r\n weight: typeof rubric.weight === 'number' ? rubric.weight : 1.0,\r\n required: typeof rubric.required === 'boolean' ? rubric.required : true,\r\n };\r\n })\r\n .filter((r) => r.description.length > 0);\r\n\r\n if (rubricItems.length > 0) {\r\n const rubricEvaluator: import('./types.js').LlmJudgeEvaluatorConfig = {\r\n name: 'rubric',\r\n type: 'llm_judge',\r\n rubrics: rubricItems,\r\n };\r\n // Prepend rubric evaluator to existing evaluators\r\n evaluators = evaluators ? [rubricEvaluator, ...evaluators] : [rubricEvaluator];\r\n }\r\n }\r\n\r\n // Extract file paths from all input segments (non-guideline files)\r\n const userFilePaths: string[] = [];\r\n for (const segment of inputSegments) {\r\n if (segment.type === 'file' && typeof segment.resolvedPath === 'string') {\r\n userFilePaths.push(segment.resolvedPath);\r\n }\r\n }\r\n\r\n // Combine all file paths (guidelines + regular files)\r\n const allFilePaths = [\r\n ...guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\r\n ...userFilePaths,\r\n ];\r\n\r\n const testCase: EvalCase = {\r\n id,\r\n dataset: datasetName,\r\n conversation_id: conversationId,\r\n question: question,\r\n input_messages: inputMessages,\r\n input_segments: inputSegments,\r\n expected_segments: outputSegments,\r\n reference_answer: referenceAnswer,\r\n guideline_paths: guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\r\n guideline_patterns: guidelinePatterns,\r\n file_paths: allFilePaths,\r\n code_snippets: codeSnippets,\r\n expected_outcome: outcome,\r\n evaluator: evalCaseEvaluatorKind,\r\n evaluators,\r\n };\r\n\r\n if (verbose) {\r\n console.log(`\\n[Eval Case: ${id}]`);\r\n if (testCase.guideline_paths.length > 0) {\r\n console.log(` Guidelines used: ${testCase.guideline_paths.length}`);\r\n for (const guidelinePath of testCase.guideline_paths) {\r\n console.log(` - ${guidelinePath}`);\r\n }\r\n } else {\r\n console.log(' No guidelines found');\r\n }\r\n }\r\n\r\n results.push(testCase);\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction asString(value: unknown): string | undefined {\r\n return typeof value === 'string' ? value : undefined;\r\n}\r\n\r\nfunction logWarning(message: string, details?: readonly string[]): void {\r\n if (details && details.length > 0) {\r\n const detailBlock = details.join('\\n');\r\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\r\n } else {\r\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\r\n }\r\n}\r\n\r\nfunction logError(message: string, details?: readonly string[]): void {\r\n if (details && details.length > 0) {\r\n const detailBlock = details.join('\\n');\r\n console.error(`${ANSI_RED}Error: ${message}\\n${detailBlock}${ANSI_RESET}`);\r\n } else {\r\n console.error(`${ANSI_RED}Error: ${message}${ANSI_RESET}`);\r\n }\r\n}\r\n","import type { JsonObject } from '../types.js';\n\n/**\n * Formatting mode for segment content.\n * - 'agent': File references only (for providers with filesystem access)\n * - 'lm': Embedded file content with XML tags (for language model providers)\n */\nexport type FormattingMode = 'agent' | 'lm';\n\n/**\n * Extract fenced code blocks from AgentV user segments.\n */\nexport function extractCodeBlocks(segments: readonly JsonObject[]): readonly string[] {\n const CODE_BLOCK_PATTERN = /```[\\s\\S]*?```/g;\n const codeBlocks: string[] = [];\n for (const segment of segments) {\n const typeValue = segment.type;\n if (typeof typeValue !== 'string' || typeValue !== 'text') {\n continue;\n }\n const textValue = segment.value;\n if (typeof textValue !== 'string') {\n continue;\n }\n const matches = textValue.match(CODE_BLOCK_PATTERN);\n if (matches) {\n codeBlocks.push(...matches);\n }\n }\n return codeBlocks;\n}\n\n/**\n * Format file contents with XML tags for all files.\n */\nexport function formatFileContents(\n parts: Array<{ content: string; isFile: boolean; displayPath?: string }>,\n): string {\n const fileCount = parts.filter((p) => p.isFile).length;\n\n // Use XML tags if any files are present\n if (fileCount > 0) {\n return parts\n .map((part) => {\n if (part.isFile && part.displayPath) {\n return `<file path=\"${part.displayPath}\">\\n${part.content}\\n</file>`;\n }\n return part.content;\n })\n .join('\\n\\n');\n }\n\n // Otherwise, join normally\n return parts.map((p) => p.content).join(' ');\n}\n\n/**\n * Format a segment into its display string.\n * Text segments return their value; file segments return formatted file content with header.\n *\n * @param segment - The segment to format\n * @param mode - Formatting mode: 'agent' for file references, 'lm' for embedded content\n */\nexport function formatSegment(\n segment: JsonObject,\n mode: FormattingMode = 'lm',\n): string | undefined {\n const type = asString(segment.type);\n\n if (type === 'text') {\n return asString(segment.value);\n }\n\n if (type === 'guideline_ref') {\n const refPath = asString(segment.path);\n return refPath ? `<Attached: ${refPath}>` : undefined;\n }\n\n if (type === 'file') {\n const filePath = asString(segment.path);\n if (!filePath) {\n return undefined;\n }\n\n // Agent mode: return file reference only\n if (mode === 'agent') {\n return `<file: path=\"${filePath}\">`;\n }\n\n // LM mode: return embedded content with XML tags\n const text = asString(segment.text);\n if (text && filePath) {\n // Use formatFileContents for consistent XML formatting\n return formatFileContents([{ content: text.trim(), isFile: true, displayPath: filePath }]);\n }\n }\n\n return undefined;\n}\n\n/**\n * Check if processed segments contain visible content (text or file attachments).\n */\nexport function hasVisibleContent(segments: readonly JsonObject[]): boolean {\n return segments.some((segment) => {\n const type = asString(segment.type);\n\n if (type === 'text') {\n const value = asString(segment.value);\n return value !== undefined && value.trim().length > 0;\n }\n\n if (type === 'guideline_ref') {\n return false;\n }\n\n if (type === 'file') {\n const text = asString(segment.text);\n return text !== undefined && text.trim().length > 0;\n }\n\n return false;\n });\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\nimport { parse } from 'yaml';\n\nimport type { JsonObject, JsonValue } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport { buildDirectoryChain, fileExists } from './file-resolver.js';\n\nconst SCHEMA_CONFIG_V2 = 'agentv-config-v2';\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\nexport type AgentVConfig = {\n readonly $schema?: JsonValue;\n readonly guideline_patterns?: readonly string[];\n};\n\n/**\n * Load optional .agentv/config.yaml configuration file.\n * Searches from eval file directory up to repo root.\n */\nexport async function loadConfig(\n evalFilePath: string,\n repoRoot: string,\n): Promise<AgentVConfig | null> {\n const directories = buildDirectoryChain(evalFilePath, repoRoot);\n\n for (const directory of directories) {\n const configPath = path.join(directory, '.agentv', 'config.yaml');\n\n if (!(await fileExists(configPath))) {\n continue;\n }\n\n try {\n const rawConfig = await readFile(configPath, 'utf8');\n const parsed = parse(rawConfig) as unknown;\n\n if (!isJsonObject(parsed)) {\n logWarning(`Invalid .agentv/config.yaml format at ${configPath}`);\n continue;\n }\n\n const config = parsed as AgentVConfig;\n\n // Check $schema field to ensure V2 format\n const schema = config.$schema;\n\n if (schema !== SCHEMA_CONFIG_V2) {\n const message =\n typeof schema === 'string'\n ? `Invalid $schema value '${schema}' in ${configPath}. Expected '${SCHEMA_CONFIG_V2}'`\n : `Missing required field '$schema' in ${configPath}.\\nPlease add '$schema: ${SCHEMA_CONFIG_V2}' at the top of the file.`;\n logWarning(message);\n continue;\n }\n\n const guidelinePatterns = config.guideline_patterns;\n if (guidelinePatterns !== undefined && !Array.isArray(guidelinePatterns)) {\n logWarning(`Invalid guideline_patterns in ${configPath}, expected array`);\n continue;\n }\n\n if (\n Array.isArray(guidelinePatterns) &&\n !guidelinePatterns.every((p) => typeof p === 'string')\n ) {\n logWarning(`Invalid guideline_patterns in ${configPath}, all entries must be strings`);\n continue;\n }\n\n return {\n guideline_patterns: guidelinePatterns as readonly string[] | undefined,\n };\n } catch (error) {\n logWarning(\n `Could not read .agentv/config.yaml at ${configPath}: ${(error as Error).message}`,\n );\n }\n }\n\n return null;\n}\n\n/**\n * Determine whether a path references guideline content (instructions or prompts).\n */\nexport function isGuidelineFile(filePath: string, patterns?: readonly string[]): boolean {\n const normalized = filePath.split('\\\\').join('/');\n const patternsToUse = patterns ?? [];\n\n return micromatch.isMatch(normalized, patternsToUse as string[]);\n}\n\n/**\n * Extract target name from parsed eval suite (checks execution.target then falls back to root-level target).\n */\nexport function extractTargetFromSuite(suite: JsonObject): string | undefined {\n // Check execution.target first (new location), fallback to root-level target (legacy)\n const execution = suite.execution;\n if (execution && typeof execution === 'object' && !Array.isArray(execution)) {\n const executionTarget = (execution as Record<string, unknown>).target;\n if (typeof executionTarget === 'string' && executionTarget.trim().length > 0) {\n return executionTarget.trim();\n }\n }\n\n // Fallback to legacy root-level target\n const targetValue = suite.target;\n if (typeof targetValue === 'string' && targetValue.trim().length > 0) {\n return targetValue.trim();\n }\n\n return undefined;\n}\n\nfunction logWarning(message: string): void {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n}\n","import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport path from 'node:path';\n\n/**\n * Check if a file exists on disk.\n */\nexport async function fileExists(absolutePath: string): Promise<boolean> {\n try {\n await access(absolutePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Convert URL or string to absolute file path.\n */\nexport function resolveToAbsolutePath(candidate: URL | string): string {\n if (candidate instanceof URL) {\n return new URL(candidate).pathname;\n }\n if (typeof candidate === 'string') {\n if (candidate.startsWith('file://')) {\n return new URL(candidate).pathname;\n }\n return path.resolve(candidate);\n }\n throw new TypeError('Unsupported repoRoot value. Expected string or URL.');\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.\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.\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.\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 path from 'node:path';\r\n\r\nimport type { ToolTrajectoryEvaluatorConfig, ToolTrajectoryExpectedItem } from '../trace.js';\r\nimport type { EvaluatorConfig, EvaluatorKind, JsonObject, JsonValue } from '../types.js';\r\nimport { isEvaluatorKind } from '../types.js';\r\nimport { validateCustomPromptContent } from '../validation/prompt-validator.js';\r\nimport { resolveFileReference } from './file-resolver.js';\r\n\r\nconst ANSI_YELLOW = '\\u001b[33m';\r\nconst ANSI_RESET = '\\u001b[0m';\r\n\r\n/**\r\n * Parse evaluators from eval case configuration.\r\n */\r\nexport async function parseEvaluators(\r\n rawEvalCase: JsonObject & {\r\n readonly execution?: JsonValue;\r\n readonly evaluators?: JsonValue;\r\n },\r\n globalExecution: JsonObject | undefined,\r\n searchRoots: readonly string[],\r\n evalId: string,\r\n): Promise<readonly EvaluatorConfig[] | undefined> {\r\n const execution = rawEvalCase.execution;\r\n // Priority: case-level execution.evaluators > case-level evaluators > global execution.evaluators\r\n const candidateEvaluators = isJsonObject(execution)\r\n ? (execution.evaluators ?? rawEvalCase.evaluators)\r\n : (rawEvalCase.evaluators ?? globalExecution?.evaluators);\r\n if (candidateEvaluators === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (!Array.isArray(candidateEvaluators)) {\r\n logWarning(`Skipping evaluators for '${evalId}': expected array`);\r\n return undefined;\r\n }\r\n\r\n const evaluators: EvaluatorConfig[] = [];\r\n\r\n for (const rawEvaluator of candidateEvaluators) {\r\n if (!isJsonObject(rawEvaluator)) {\r\n logWarning(`Skipping invalid evaluator entry for '${evalId}' (expected object)`);\r\n continue;\r\n }\r\n\r\n const name = asString(rawEvaluator.name);\r\n const typeValue = rawEvaluator.type;\r\n\r\n if (!name || !isEvaluatorKind(typeValue)) {\r\n logWarning(`Skipping evaluator with invalid name/type in '${evalId}'`);\r\n continue;\r\n }\r\n\r\n if (typeValue === 'code_judge') {\r\n const script = asString(rawEvaluator.script);\r\n if (!script) {\r\n logWarning(`Skipping code_judge evaluator '${name}' in '${evalId}': missing script`);\r\n continue;\r\n }\r\n\r\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\r\n\r\n const cwd = asString(rawEvaluator.cwd);\r\n let resolvedCwd: string | undefined;\r\n\r\n if (cwd) {\r\n const resolved = await resolveFileReference(cwd, searchRoots);\r\n if (resolved.resolvedPath) {\r\n resolvedCwd = path.resolve(resolved.resolvedPath);\r\n } else {\r\n logWarning(\r\n `Code_judge evaluator '${name}' in '${evalId}': cwd not found (${resolved.displayPath})`,\r\n resolved.attempted.length > 0\r\n ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`)\r\n : undefined,\r\n );\r\n }\r\n } else {\r\n resolvedCwd = searchRoots[0];\r\n }\r\n\r\n evaluators.push({\r\n name,\r\n type: 'code',\r\n script,\r\n cwd,\r\n resolvedCwd,\r\n ...(weight !== undefined ? { weight } : {}),\r\n });\r\n continue;\r\n }\r\n\r\n if (typeValue === 'composite') {\r\n const rawMembers = rawEvaluator.evaluators;\r\n if (!Array.isArray(rawMembers)) {\r\n logWarning(\r\n `Skipping composite evaluator '${name}' in '${evalId}': missing evaluators array`,\r\n );\r\n continue;\r\n }\r\n\r\n const rawAggregator = rawEvaluator.aggregator;\r\n if (!isJsonObject(rawAggregator)) {\r\n logWarning(`Skipping composite evaluator '${name}' in '${evalId}': missing aggregator`);\r\n continue;\r\n }\r\n\r\n const aggregatorType = asString(rawAggregator.type);\r\n if (\r\n aggregatorType !== 'weighted_average' &&\r\n aggregatorType !== 'code_judge' &&\r\n aggregatorType !== 'llm_judge'\r\n ) {\r\n logWarning(\r\n `Skipping composite evaluator '${name}' in '${evalId}': invalid aggregator type '${aggregatorType}'`,\r\n );\r\n continue;\r\n }\r\n\r\n // Recursively parse member evaluators\r\n const memberEvaluators: EvaluatorConfig[] = [];\r\n for (const rawMember of rawMembers) {\r\n if (!isJsonObject(rawMember)) {\r\n logWarning(`Skipping invalid member evaluator in composite '${name}' (expected object)`);\r\n continue;\r\n }\r\n\r\n const memberName = asString(rawMember.name);\r\n const memberType = rawMember.type;\r\n\r\n if (!memberName || !isEvaluatorKind(memberType)) {\r\n logWarning(`Skipping member evaluator with invalid name/type in composite '${name}'`);\r\n continue;\r\n }\r\n\r\n // Parse member evaluator (reuse existing logic for code, llm_judge, code_judge)\r\n const memberConfigs = await parseEvaluators(\r\n { evaluators: [rawMember] },\r\n undefined,\r\n searchRoots,\r\n `${evalId}:${name}:${memberName}`,\r\n );\r\n\r\n if (memberConfigs && memberConfigs.length > 0) {\r\n memberEvaluators.push(memberConfigs[0]);\r\n }\r\n }\r\n\r\n if (memberEvaluators.length === 0) {\r\n logWarning(\r\n `Skipping composite evaluator '${name}' in '${evalId}': no valid member evaluators`,\r\n );\r\n continue;\r\n }\r\n\r\n // Parse aggregator config\r\n let aggregator: import('../types.js').CompositeAggregatorConfig;\r\n\r\n if (aggregatorType === 'weighted_average') {\r\n const weights = isJsonObject(rawAggregator.weights)\r\n ? (rawAggregator.weights as Record<string, unknown>)\r\n : undefined;\r\n const parsedWeights: Record<string, number> = {};\r\n if (weights) {\r\n for (const [key, value] of Object.entries(weights)) {\r\n if (typeof value === 'number') {\r\n parsedWeights[key] = value;\r\n }\r\n }\r\n }\r\n aggregator = {\r\n type: 'weighted_average',\r\n ...(Object.keys(parsedWeights).length > 0 ? { weights: parsedWeights } : {}),\r\n };\r\n } else if (aggregatorType === 'code_judge') {\r\n const aggregatorPath = asString(rawAggregator.path);\r\n if (!aggregatorPath) {\r\n logWarning(\r\n `Skipping composite evaluator '${name}' in '${evalId}': code_judge aggregator missing path`,\r\n );\r\n continue;\r\n }\r\n\r\n // Don't try to resolve if path contains a command (e.g., \"node script.js\", \"uv run script.py\")\r\n // This matches the behavior of code evaluators which accept full commands\r\n // Set cwd to eval file directory (first search root)\r\n aggregator = {\r\n type: 'code_judge',\r\n path: aggregatorPath,\r\n cwd: searchRoots[0],\r\n };\r\n } else {\r\n // llm_judge aggregator\r\n const aggregatorPrompt = asString(rawAggregator.prompt);\r\n let promptPath: string | undefined;\r\n\r\n if (aggregatorPrompt) {\r\n const resolved = await resolveFileReference(aggregatorPrompt, searchRoots);\r\n if (resolved.resolvedPath) {\r\n promptPath = path.resolve(resolved.resolvedPath);\r\n }\r\n }\r\n\r\n aggregator = {\r\n type: 'llm_judge',\r\n ...(aggregatorPrompt ? { prompt: aggregatorPrompt } : {}),\r\n ...(promptPath ? { promptPath } : {}),\r\n };\r\n }\r\n\r\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\r\n\r\n evaluators.push({\r\n name,\r\n type: 'composite',\r\n evaluators: memberEvaluators,\r\n aggregator,\r\n ...(weight !== undefined ? { weight } : {}),\r\n });\r\n continue;\r\n }\r\n\r\n if (typeValue === 'expected_messages') {\r\n // expected_messages evaluator validates tool_calls against trace\r\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\r\n\r\n evaluators.push({\r\n name,\r\n type: 'expected_messages',\r\n ...(weight !== undefined ? { weight } : {}),\r\n });\r\n continue;\r\n }\r\n\r\n if (typeValue === 'tool_trajectory') {\r\n const mode = asString(rawEvaluator.mode);\r\n if (mode !== 'any_order' && mode !== 'in_order' && mode !== 'exact') {\r\n logWarning(\r\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': invalid mode '${mode}' (must be any_order, in_order, or exact)`,\r\n );\r\n continue;\r\n }\r\n\r\n const rawMinimums = rawEvaluator.minimums;\r\n let minimums: Record<string, number> | undefined;\r\n if (rawMinimums !== undefined) {\r\n if (!isJsonObject(rawMinimums)) {\r\n logWarning(\r\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': minimums must be an object`,\r\n );\r\n continue;\r\n }\r\n minimums = {};\r\n for (const [toolName, count] of Object.entries(rawMinimums)) {\r\n if (typeof count === 'number' && count >= 0) {\r\n minimums[toolName] = count;\r\n }\r\n }\r\n }\r\n\r\n const rawExpected = rawEvaluator.expected;\r\n let expected: ToolTrajectoryExpectedItem[] | undefined;\r\n if (rawExpected !== undefined) {\r\n if (!Array.isArray(rawExpected)) {\r\n logWarning(\r\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': expected must be an array`,\r\n );\r\n continue;\r\n }\r\n expected = [];\r\n for (const item of rawExpected) {\r\n if (isJsonObject(item) && typeof item.tool === 'string') {\r\n expected.push({ tool: item.tool });\r\n }\r\n }\r\n }\r\n\r\n // Validate config completeness based on mode\r\n if (mode === 'any_order' && !minimums) {\r\n logWarning(\r\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': any_order mode requires minimums`,\r\n );\r\n continue;\r\n }\r\n\r\n if ((mode === 'in_order' || mode === 'exact') && !expected) {\r\n logWarning(\r\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': ${mode} mode requires expected`,\r\n );\r\n continue;\r\n }\r\n\r\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\r\n\r\n const config: ToolTrajectoryEvaluatorConfig = {\r\n name,\r\n type: 'tool_trajectory',\r\n mode,\r\n ...(minimums ? { minimums } : {}),\r\n ...(expected ? { expected } : {}),\r\n ...(weight !== undefined ? { weight } : {}),\r\n };\r\n\r\n evaluators.push(config);\r\n continue;\r\n }\r\n\r\n const prompt = asString(rawEvaluator.prompt);\r\n let promptPath: string | undefined;\r\n if (prompt) {\r\n const resolved = await resolveFileReference(prompt, searchRoots);\r\n if (resolved.resolvedPath) {\r\n promptPath = path.resolve(resolved.resolvedPath);\r\n // Validate custom prompt content upfront - throws error if validation fails\r\n try {\r\n await validateCustomPromptContent(promptPath);\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n // Add context and re-throw for the caller to handle\r\n throw new Error(`Evaluator '${name}' template (${promptPath}): ${message}`);\r\n }\r\n } else {\r\n logWarning(\r\n `Inline prompt used for evaluator '${name}' in '${evalId}' (file not found: ${resolved.displayPath})`,\r\n resolved.attempted.length > 0\r\n ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`)\r\n : undefined,\r\n );\r\n }\r\n }\r\n\r\n const _model = asString(rawEvaluator.model);\r\n\r\n const rawRubrics = rawEvaluator.rubrics;\r\n const parsedRubrics = Array.isArray(rawRubrics)\r\n ? rawRubrics\r\n .filter((r): r is JsonObject => isJsonObject(r))\r\n .map((rubric, index) => ({\r\n id: asString(rubric.id) ?? `rubric-${index + 1}`,\r\n description: asString(rubric.description) ?? '',\r\n weight: typeof rubric.weight === 'number' ? rubric.weight : 1.0,\r\n required: typeof rubric.required === 'boolean' ? rubric.required : true,\r\n }))\r\n .filter((r) => r.description.length > 0)\r\n : undefined;\r\n\r\n if (typeValue === 'rubric') {\r\n if (!parsedRubrics) {\r\n logWarning(`Skipping rubric evaluator '${name}' in '${evalId}': missing rubrics array`);\r\n continue;\r\n }\r\n if (parsedRubrics.length === 0) {\r\n logWarning(`Skipping rubric evaluator '${name}' in '${evalId}': no valid rubrics found`);\r\n continue;\r\n }\r\n\r\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\r\n\r\n // Back-compat: `type: rubric` maps to `type: llm_judge` with `rubrics`.\r\n evaluators.push({\r\n name,\r\n type: 'llm_judge',\r\n rubrics: parsedRubrics,\r\n ...(weight !== undefined ? { weight } : {}),\r\n });\r\n continue;\r\n }\r\n\r\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\r\n\r\n evaluators.push({\r\n name,\r\n type: 'llm_judge',\r\n prompt,\r\n promptPath,\r\n ...(parsedRubrics && parsedRubrics.length > 0 ? { rubrics: parsedRubrics } : {}),\r\n ...(weight !== undefined ? { weight } : {}),\r\n });\r\n }\r\n\r\n return evaluators.length > 0 ? evaluators : undefined;\r\n}\r\n\r\n/**\r\n * Coerce evaluator value to valid EvaluatorKind.\r\n */\r\nexport function coerceEvaluator(\r\n candidate: JsonValue | undefined,\r\n contextId: string,\r\n): EvaluatorKind | undefined {\r\n if (typeof candidate !== 'string') {\r\n return undefined;\r\n }\r\n if (isEvaluatorKind(candidate)) {\r\n return candidate;\r\n }\r\n logWarning(`Unknown evaluator '${candidate}' in ${contextId}, falling back to default`);\r\n return undefined;\r\n}\r\n\r\nfunction asString(value: unknown): string | undefined {\r\n return typeof value === 'string' ? value : undefined;\r\n}\r\n\r\nfunction isJsonObject(value: unknown): value is JsonObject {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction logWarning(message: string, details?: readonly string[]): void {\r\n if (details && details.length > 0) {\r\n const detailBlock = details.join('\\n');\r\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\r\n } else {\r\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\r\n }\r\n}\r\n\r\n/**\r\n * Validate and extract weight from evaluator config.\r\n * Throws if weight is invalid (negative, NaN, or Infinity).\r\n * Returns undefined if weight is not specified.\r\n */\r\nfunction validateWeight(\r\n rawWeight: unknown,\r\n evaluatorName: string,\r\n evalId: string,\r\n): number | undefined {\r\n if (rawWeight === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (typeof rawWeight !== 'number') {\r\n throw new Error(\r\n `Invalid weight for evaluator '${evaluatorName}' in '${evalId}': must be a number`,\r\n );\r\n }\r\n\r\n if (!Number.isFinite(rawWeight)) {\r\n throw new Error(\r\n `Invalid weight for evaluator '${evaluatorName}' in '${evalId}': must be finite (got ${rawWeight})`,\r\n );\r\n }\r\n\r\n if (rawWeight < 0) {\r\n throw new Error(\r\n `Invalid weight for evaluator '${evaluatorName}' in '${evalId}': must be non-negative (got ${rawWeight})`,\r\n );\r\n }\r\n\r\n return rawWeight;\r\n}\r\n","import { readFile } from 'node:fs/promises';\n\nimport { TEMPLATE_VARIABLES, VALID_TEMPLATE_VARIABLES } from '../template-variables.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Validate custom prompt template content from a file.\n * Reads the file and checks for valid template variables.\n * Throws an error if required template variables are missing.\n */\nexport async function validateCustomPromptContent(promptPath: string): Promise<void> {\n const content = await readFile(promptPath, 'utf8');\n validateTemplateVariables(content, promptPath);\n}\n\n/**\n * Validate template variables in a custom prompt template string.\n * Exported for testing purposes.\n * @throws Error if required template variables are missing\n */\nexport function validateTemplateVariables(content: string, source: string): void {\n // Extract all template variables from content\n const variablePattern = /\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g;\n const foundVariables = new Set<string>();\n const invalidVariables: string[] = [];\n\n let match: RegExpExecArray | null = variablePattern.exec(content);\n while (match !== null) {\n const varName = match[1];\n foundVariables.add(varName);\n if (!VALID_TEMPLATE_VARIABLES.has(varName)) {\n invalidVariables.push(varName);\n }\n match = variablePattern.exec(content);\n }\n\n // Check if template contains required variables for evaluation\n const hasCandidateAnswer = foundVariables.has(TEMPLATE_VARIABLES.CANDIDATE_ANSWER);\n const hasExpectedMessages = foundVariables.has(TEMPLATE_VARIABLES.EXPECTED_MESSAGES);\n const hasRequiredFields = hasCandidateAnswer || hasExpectedMessages;\n\n // ERROR: Missing required fields - throw error to skip this evaluator/eval case\n if (!hasRequiredFields) {\n throw new Error(\n `Missing required fields. Must include at least one of:\\n - {{ ${TEMPLATE_VARIABLES.CANDIDATE_ANSWER} }}\\n - {{ ${TEMPLATE_VARIABLES.EXPECTED_MESSAGES} }}`,\n );\n }\n\n // WARNING: Invalid variables - show warning but continue\n if (invalidVariables.length > 0) {\n const warningMessage = `${ANSI_YELLOW}Warning: Custom evaluator template at ${source}\n Contains invalid variables: ${invalidVariables.map((v) => `{{ ${v} }}`).join(', ')}\n Valid variables: ${Array.from(VALID_TEMPLATE_VARIABLES)\n .map((v) => `{{ ${v} }}`)\n .join(', ')}${ANSI_RESET}`;\n\n console.warn(warningMessage);\n }\n}\n","/**\n * Template variable constants for evaluator prompts.\n * These variables can be used in custom evaluator templates with {{ variable_name }} syntax.\n */\nexport const TEMPLATE_VARIABLES = {\n CANDIDATE_ANSWER: 'candidate_answer',\n EXPECTED_MESSAGES: 'expected_messages',\n QUESTION: 'question',\n EXPECTED_OUTCOME: 'expected_outcome',\n REFERENCE_ANSWER: 'reference_answer',\n INPUT_MESSAGES: 'input_messages',\n} as const;\n\n/**\n * Type representing all valid template variable names.\n */\nexport type TemplateVariable = (typeof TEMPLATE_VARIABLES)[keyof typeof TEMPLATE_VARIABLES];\n\n/**\n * Set of all valid template variable names for runtime validation.\n */\nexport const VALID_TEMPLATE_VARIABLES = new Set<string>(Object.values(TEMPLATE_VARIABLES));\n\n/**\n * Template variables that are required for meaningful evaluation.\n * At least one of these should be present in a custom evaluator template.\n */\nexport const REQUIRED_TEMPLATE_VARIABLES = new Set<string>([\n TEMPLATE_VARIABLES.CANDIDATE_ANSWER,\n TEMPLATE_VARIABLES.EXPECTED_MESSAGES,\n]);\n","import { readFile } from 'node:fs/promises';\r\nimport path from 'node:path';\r\n\r\nimport { formatFileContents } from '../formatting/segment-formatter.js';\r\nimport type { JsonObject, TestMessage } from '../types.js';\r\nimport { isJsonObject } from '../types.js';\r\nimport { isGuidelineFile } from './config-loader.js';\r\nimport { resolveFileReference } from './file-resolver.js';\r\n\r\nconst ANSI_YELLOW = '\\u001b[33m';\r\nconst ANSI_RESET = '\\u001b[0m';\r\n\r\ntype ProcessMessagesOptions = {\r\n readonly messages: readonly TestMessage[];\r\n readonly searchRoots: readonly string[];\r\n readonly repoRootPath: string;\r\n readonly guidelinePatterns?: readonly string[];\r\n readonly guidelinePaths?: string[];\r\n readonly textParts?: string[];\r\n readonly messageType: 'input' | 'output';\r\n readonly verbose: boolean;\r\n};\r\n\r\n/**\r\n * Process message content into structured segments with file resolution.\r\n */\r\nexport async function processMessages(options: ProcessMessagesOptions): Promise<JsonObject[]> {\r\n const {\r\n messages,\r\n searchRoots,\r\n repoRootPath,\r\n guidelinePatterns,\r\n guidelinePaths,\r\n textParts,\r\n messageType,\r\n verbose,\r\n } = options;\r\n\r\n const segments: JsonObject[] = [];\r\n\r\n for (const message of messages) {\r\n const content = message.content;\r\n if (typeof content === 'string') {\r\n segments.push({ type: 'text', value: content });\r\n if (textParts) {\r\n textParts.push(content);\r\n }\r\n continue;\r\n }\r\n\r\n for (const rawSegment of content) {\r\n if (!isJsonObject(rawSegment)) {\r\n continue;\r\n }\r\n\r\n const segmentType = asString(rawSegment.type);\r\n if (segmentType === 'file') {\r\n const rawValue = asString(rawSegment.value);\r\n if (!rawValue) {\r\n continue;\r\n }\r\n\r\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\r\n rawValue,\r\n searchRoots,\r\n );\r\n\r\n if (!resolvedPath) {\r\n const attempts = attempted.length\r\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\r\n : undefined;\r\n const context = messageType === 'input' ? '' : ' in expected_messages';\r\n logWarning(`File not found${context}: ${displayPath}`, attempts);\r\n continue;\r\n }\r\n\r\n try {\r\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n');\r\n\r\n // Only check for guidelines in input messages\r\n if (messageType === 'input' && guidelinePatterns && guidelinePaths) {\r\n const relativeToRepo = path.relative(repoRootPath, resolvedPath);\r\n\r\n if (isGuidelineFile(relativeToRepo, guidelinePatterns)) {\r\n guidelinePaths.push(path.resolve(resolvedPath));\r\n if (verbose) {\r\n console.log(` [Guideline] Found: ${displayPath}`);\r\n console.log(` Resolved to: ${resolvedPath}`);\r\n }\r\n continue;\r\n }\r\n }\r\n\r\n segments.push({\r\n type: 'file',\r\n path: displayPath,\r\n text: fileContent,\r\n resolvedPath: path.resolve(resolvedPath),\r\n });\r\n\r\n if (verbose) {\r\n const label = messageType === 'input' ? '[File]' : '[Expected Output File]';\r\n console.log(` ${label} Found: ${displayPath}`);\r\n console.log(` Resolved to: ${resolvedPath}`);\r\n }\r\n } catch (error) {\r\n const context = messageType === 'input' ? '' : ' expected output';\r\n logWarning(`Could not read${context} file ${resolvedPath}: ${(error as Error).message}`);\r\n }\r\n continue;\r\n }\r\n\r\n const clonedSegment = cloneJsonObject(rawSegment);\r\n segments.push(clonedSegment);\r\n const inlineValue = clonedSegment.value;\r\n if (typeof inlineValue === 'string' && textParts) {\r\n textParts.push(inlineValue);\r\n }\r\n }\r\n }\r\n\r\n return segments;\r\n}\r\n\r\n/**\r\n * Resolve assistant content including file references.\r\n * Similar to input message processing, but for expected assistant responses.\r\n */\r\nexport async function resolveAssistantContent(\r\n content: TestMessage['content'] | undefined,\r\n searchRoots: readonly string[],\r\n verbose: boolean,\r\n): Promise<string> {\r\n if (typeof content === 'string') {\r\n return content;\r\n }\r\n if (!content) {\r\n return '';\r\n }\r\n\r\n // Track parts with metadata about whether they came from files\r\n const parts: Array<{ content: string; isFile: boolean; displayPath?: string }> = [];\r\n\r\n for (const entry of content) {\r\n if (typeof entry === 'string') {\r\n parts.push({ content: entry, isFile: false });\r\n continue;\r\n }\r\n\r\n if (!isJsonObject(entry)) {\r\n continue;\r\n }\r\n\r\n const segmentType = asString(entry.type);\r\n\r\n // Handle file references\r\n if (segmentType === 'file') {\r\n const rawValue = asString(entry.value);\r\n if (!rawValue) {\r\n continue;\r\n }\r\n\r\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\r\n rawValue,\r\n searchRoots,\r\n );\r\n\r\n if (!resolvedPath) {\r\n const attempts = attempted.length\r\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\r\n : undefined;\r\n logWarning(`File not found in expected_messages: ${displayPath}`, attempts);\r\n continue;\r\n }\r\n\r\n try {\r\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n').trim();\r\n parts.push({ content: fileContent, isFile: true, displayPath });\r\n if (verbose) {\r\n console.log(` [Expected Assistant File] Found: ${displayPath}`);\r\n console.log(` Resolved to: ${resolvedPath}`);\r\n }\r\n } catch (error) {\r\n logWarning(`Could not read file ${resolvedPath}: ${(error as Error).message}`);\r\n }\r\n continue;\r\n }\r\n\r\n // Handle text segments\r\n const textValue = asString(entry.text);\r\n if (typeof textValue === 'string') {\r\n parts.push({ content: textValue, isFile: false });\r\n continue;\r\n }\r\n\r\n const valueValue = asString(entry.value);\r\n if (typeof valueValue === 'string') {\r\n parts.push({ content: valueValue, isFile: false });\r\n continue;\r\n }\r\n\r\n parts.push({ content: JSON.stringify(entry), isFile: false });\r\n }\r\n\r\n return formatFileContents(parts);\r\n}\r\n\r\nfunction asString(value: unknown): string | undefined {\r\n return typeof value === 'string' ? value : undefined;\r\n}\r\n\r\nfunction cloneJsonObject(source: JsonObject): JsonObject {\r\n const entries = Object.entries(source).map(([key, value]) => [key, cloneJsonValue(value)]);\r\n return Object.fromEntries(entries) as JsonObject;\r\n}\r\n\r\nfunction cloneJsonValue(value: unknown): unknown {\r\n if (value === null) {\r\n return null;\r\n }\r\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\r\n return value;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.map((item) => cloneJsonValue(item));\r\n }\r\n if (typeof value === 'object') {\r\n return cloneJsonObject(value as JsonObject);\r\n }\r\n return value;\r\n}\r\n\r\nfunction logWarning(message: string, details?: readonly string[]): void {\r\n if (details && details.length > 0) {\r\n const detailBlock = details.join('\\n');\r\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\r\n } else {\r\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\r\n }\r\n}\r\n\r\ntype ProcessExpectedMessagesOptions = {\r\n readonly messages: readonly TestMessage[];\r\n readonly searchRoots: readonly string[];\r\n readonly repoRootPath: string;\r\n readonly verbose: boolean;\r\n};\r\n\r\n/**\r\n * Process expected_messages preserving full message structure including role and tool_calls.\r\n * This is needed for the expected_messages evaluator to validate tool_calls against traces.\r\n */\r\nexport async function processExpectedMessages(\r\n options: ProcessExpectedMessagesOptions,\r\n): Promise<JsonObject[]> {\r\n const { messages, searchRoots, repoRootPath, verbose } = options;\r\n const segments: JsonObject[] = [];\r\n\r\n for (const message of messages) {\r\n const segment: Record<string, unknown> = {\r\n role: message.role,\r\n };\r\n\r\n // Preserve tool_calls if present (only on AssistantTestMessage)\r\n if (message.role === 'assistant' && message.tool_calls !== undefined) {\r\n segment.tool_calls = message.tool_calls as unknown as JsonObject[];\r\n }\r\n\r\n // Process content\r\n const content = message.content;\r\n if (typeof content === 'string') {\r\n segment.content = content;\r\n } else if (Array.isArray(content)) {\r\n // Process content array, resolving file references\r\n const processedContent: JsonObject[] = [];\r\n for (const rawSegment of content) {\r\n if (!isJsonObject(rawSegment)) {\r\n continue;\r\n }\r\n\r\n const segmentType = asString(rawSegment.type);\r\n if (segmentType === 'file') {\r\n const rawValue = asString(rawSegment.value);\r\n if (!rawValue) {\r\n continue;\r\n }\r\n\r\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\r\n rawValue,\r\n searchRoots,\r\n );\r\n\r\n if (!resolvedPath) {\r\n const attempts = attempted.length\r\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\r\n : undefined;\r\n logWarning(`File not found in expected_messages: ${displayPath}`, attempts);\r\n continue;\r\n }\r\n\r\n try {\r\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n');\r\n processedContent.push({\r\n type: 'file',\r\n path: displayPath,\r\n text: fileContent,\r\n resolvedPath: path.resolve(resolvedPath),\r\n });\r\n\r\n if (verbose) {\r\n console.log(` [Expected Output File] Found: ${displayPath}`);\r\n console.log(` Resolved to: ${resolvedPath}`);\r\n }\r\n } catch (error) {\r\n logWarning(\r\n `Could not read expected output file ${resolvedPath}: ${(error as Error).message}`,\r\n );\r\n }\r\n continue;\r\n }\r\n\r\n processedContent.push(cloneJsonObject(rawSegment));\r\n }\r\n segment.content = processedContent;\r\n }\r\n\r\n segments.push(segment as JsonObject);\r\n }\r\n\r\n return segments;\r\n}\r\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { isGuidelineFile } from '../loaders/config-loader.js';\nimport { fileExists } from '../loaders/file-resolver.js';\nimport type { ChatMessageRole, ChatPrompt } from '../providers/types.js';\nimport type { EvalCase, JsonObject, TestMessage } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport {\n type FormattingMode,\n formatFileContents,\n formatSegment,\n hasVisibleContent,\n} from './segment-formatter.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Build prompt inputs by consolidating user request context and guideline content.\n */\nexport interface PromptInputs {\n readonly question: string;\n readonly guidelines: string;\n readonly chatPrompt?: ChatPrompt;\n readonly systemMessage?: string;\n}\n\n/**\n * Build prompt inputs by consolidating user request context and guideline content.\n *\n * @param testCase - The evaluation test case\n * @param mode - Formatting mode: 'agent' for file references, 'lm' for embedded content (default: 'lm')\n */\nexport async function buildPromptInputs(\n testCase: EvalCase,\n mode: FormattingMode = 'lm',\n): Promise<PromptInputs> {\n const guidelineParts: Array<{ content: string; isFile: boolean; displayPath?: string }> = [];\n for (const rawPath of testCase.guideline_paths) {\n const absolutePath = path.resolve(rawPath);\n if (!(await fileExists(absolutePath))) {\n logWarning(`Could not read guideline file ${absolutePath}: file does not exist`);\n continue;\n }\n\n try {\n const content = (await readFile(absolutePath, 'utf8')).replace(/\\r\\n/g, '\\n').trim();\n guidelineParts.push({\n content,\n isFile: true,\n displayPath: path.basename(absolutePath),\n });\n } catch (error) {\n logWarning(`Could not read guideline file ${absolutePath}: ${(error as Error).message}`);\n }\n }\n\n const guidelines = formatFileContents(guidelineParts);\n\n // Build segments per message to determine if role markers are needed\n const segmentsByMessage: JsonObject[][] = [];\n const fileContentsByPath = new Map<string, string>();\n for (const segment of testCase.input_segments) {\n if (\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n typeof segment.text === 'string'\n ) {\n fileContentsByPath.set(segment.path, segment.text);\n }\n }\n\n for (const message of testCase.input_messages) {\n const messageSegments: JsonObject[] = [];\n\n if (typeof message.content === 'string') {\n if (message.content.trim().length > 0) {\n messageSegments.push({ type: 'text', value: message.content });\n }\n } else if (Array.isArray(message.content)) {\n for (const segment of message.content) {\n if (typeof segment === 'string') {\n if (segment.trim().length > 0) {\n messageSegments.push({ type: 'text', value: segment });\n }\n } else if (isJsonObject(segment)) {\n const type = asString(segment.type);\n\n if (type === 'file') {\n const value = asString(segment.value);\n if (!value) continue;\n\n // Check if this is a guideline file (extracted separately)\n if (\n testCase.guideline_patterns &&\n isGuidelineFile(value, testCase.guideline_patterns)\n ) {\n // Reference marker only - actual content is in guidelines field\n messageSegments.push({ type: 'guideline_ref', path: value });\n continue;\n }\n\n // Find the file content from input_segments\n const fileText = fileContentsByPath.get(value);\n\n if (fileText !== undefined) {\n messageSegments.push({ type: 'file', text: fileText, path: value });\n }\n } else if (type === 'text') {\n const textValue = asString(segment.value);\n if (textValue && textValue.trim().length > 0) {\n messageSegments.push({ type: 'text', value: textValue });\n }\n }\n }\n }\n }\n\n segmentsByMessage.push(messageSegments);\n }\n\n // Determine if we need role markers based on actual processed content\n const useRoleMarkers = needsRoleMarkers(testCase.input_messages, segmentsByMessage);\n\n let question: string;\n\n if (useRoleMarkers) {\n // Multi-turn format with role markers using pre-computed segments\n const messageParts: string[] = [];\n\n for (let i = 0; i < testCase.input_messages.length; i++) {\n const message = testCase.input_messages[i];\n const segments = segmentsByMessage[i];\n\n if (!hasVisibleContent(segments)) {\n continue;\n }\n\n const roleLabel = message.role.charAt(0).toUpperCase() + message.role.slice(1);\n const contentParts: string[] = [];\n\n for (const segment of segments) {\n const formattedContent = formatSegment(segment, mode);\n if (formattedContent) {\n contentParts.push(formattedContent);\n }\n }\n\n if (contentParts.length > 0) {\n const messageContent = contentParts.join('\\n');\n messageParts.push(`@[${roleLabel}]:\\n${messageContent}`);\n }\n }\n\n question = messageParts.join('\\n\\n');\n } else {\n // Single-turn flat format\n const questionParts: string[] = [];\n for (const segment of testCase.input_segments) {\n // Skip guideline files - they're in the guidelines field\n if (\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n testCase.guideline_patterns &&\n isGuidelineFile(segment.path, testCase.guideline_patterns)\n ) {\n // Add reference marker for guideline files\n questionParts.push(`<Attached: ${segment.path}>`);\n continue;\n }\n\n const formattedContent = formatSegment(segment, mode);\n if (formattedContent) {\n questionParts.push(formattedContent);\n }\n }\n\n if (testCase.code_snippets.length > 0) {\n questionParts.push(testCase.code_snippets.join('\\n'));\n }\n\n question = questionParts\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .join('\\n\\n');\n }\n\n const chatPrompt = useRoleMarkers\n ? buildChatPromptFromSegments({\n messages: testCase.input_messages,\n segmentsByMessage,\n guidelinePatterns: testCase.guideline_patterns,\n guidelineContent: guidelines,\n mode,\n })\n : undefined;\n\n return { question, guidelines, chatPrompt };\n}\n\n/**\n * Detect if role markers are needed based on conversational structure.\n *\n * Role markers ([System]:, [User]:, etc.) are added when:\n * 1. There are assistant/tool messages (true multi-turn conversation), OR\n * 2. There are multiple messages that will produce visible content in the formatted output\n */\nfunction needsRoleMarkers(\n messages: readonly TestMessage[],\n processedSegmentsByMessage: readonly (readonly JsonObject[])[],\n): boolean {\n // Check for multi-turn conversation (assistant/tool messages)\n if (messages.some((msg) => msg.role === 'assistant' || msg.role === 'tool')) {\n return true;\n }\n\n // Count how many messages have actual content after processing\n let messagesWithContent = 0;\n\n for (const segments of processedSegmentsByMessage) {\n if (hasVisibleContent(segments)) {\n messagesWithContent++;\n }\n }\n\n return messagesWithContent > 1;\n}\n\nfunction buildChatPromptFromSegments(options: {\n readonly messages: readonly TestMessage[];\n readonly segmentsByMessage: readonly JsonObject[][];\n readonly guidelinePatterns?: readonly string[];\n readonly guidelineContent?: string;\n readonly systemPrompt?: string;\n readonly mode?: FormattingMode;\n}): ChatPrompt | undefined {\n const {\n messages,\n segmentsByMessage,\n guidelinePatterns,\n guidelineContent,\n systemPrompt,\n mode = 'lm',\n } = options;\n\n if (messages.length === 0) {\n return undefined;\n }\n\n const systemSegments: string[] = [];\n\n if (systemPrompt && systemPrompt.trim().length > 0) {\n systemSegments.push(systemPrompt.trim());\n }\n\n if (guidelineContent && guidelineContent.trim().length > 0) {\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${guidelineContent.trim()}`);\n }\n\n let startIndex = 0;\n while (startIndex < messages.length && messages[startIndex].role === 'system') {\n const segments = segmentsByMessage[startIndex];\n const contentParts: string[] = [];\n\n for (const segment of segments) {\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length > 0) {\n systemSegments.push(contentParts.join('\\n'));\n }\n\n startIndex += 1;\n }\n\n const chatPrompt: Array<ChatPrompt[number]> = [];\n\n if (systemSegments.length > 0) {\n chatPrompt.push({\n role: 'system',\n content: systemSegments.join('\\n\\n'),\n });\n }\n\n for (let i = startIndex; i < messages.length; i++) {\n const message = messages[i];\n const segments = segmentsByMessage[i];\n const contentParts: string[] = [];\n\n let role: ChatMessageRole = message.role as ChatMessageRole;\n\n if (role === 'system') {\n role = 'assistant';\n contentParts.push('@[System]:');\n } else if (role === 'tool') {\n role = 'assistant';\n contentParts.push('@[Tool]:');\n }\n\n for (const segment of segments) {\n if (segment.type === 'guideline_ref') {\n continue;\n }\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n const isGuidelineRef =\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n guidelinePatterns &&\n isGuidelineFile(segment.path, guidelinePatterns);\n\n if (isGuidelineRef) {\n continue;\n }\n\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length === 0) {\n continue;\n }\n\n const content = contentParts.join('\\n');\n\n chatPrompt.push({\n role,\n content,\n });\n }\n\n return chatPrompt.length > 0 ? (chatPrompt as ChatPrompt) : undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction logWarning(message: string): void {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n}\n","import { constants } from 'node:fs';\r\nimport { access, readFile } from 'node:fs/promises';\r\nimport path from 'node:path';\r\n\r\nexport async function fileExists(filePath: string): Promise<boolean> {\r\n try {\r\n await access(filePath, constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Normalize line endings to LF (\\n).\r\n * This ensures consistent behavior across Windows (CRLF) and Unix (LF) systems.\r\n */\r\nexport function normalizeLineEndings(content: string): string {\r\n return content.replace(/\\r\\n/g, '\\n');\r\n}\r\n\r\n/**\r\n * Read a text file and normalize line endings to LF (\\n).\r\n * This ensures consistent behavior across Windows (CRLF) and Unix (LF) systems.\r\n */\r\nexport async function readTextFile(filePath: string): Promise<string> {\r\n const content = await readFile(filePath, 'utf8');\r\n return normalizeLineEndings(content);\r\n}\r\n\r\n/**\r\n * Read a JSON file and parse it.\r\n */\r\nexport async function readJsonFile<T = unknown>(filePath: string): Promise<T> {\r\n const content = await readFile(filePath, 'utf8');\r\n return JSON.parse(content) as T;\r\n}\r\n\r\n/**\r\n * Find git repository root by walking up the directory tree.\r\n */\r\nexport async function findGitRoot(startPath: string): Promise<string | null> {\r\n let currentDir = path.dirname(path.resolve(startPath));\r\n const root = path.parse(currentDir).root;\r\n\r\n while (currentDir !== root) {\r\n const gitPath = path.join(currentDir, '.git');\r\n if (await fileExists(gitPath)) {\r\n return currentDir;\r\n }\r\n\r\n const parentDir = path.dirname(currentDir);\r\n if (parentDir === currentDir) {\r\n break;\r\n }\r\n currentDir = parentDir;\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Build a chain of directories walking from a file's location up to repo root.\r\n * Used for discovering configuration files like targets.yaml or config.yaml.\r\n */\r\nexport function buildDirectoryChain(filePath: string, repoRoot: string): readonly string[] {\r\n const directories: string[] = [];\r\n const seen = new Set<string>();\r\n const boundary = path.resolve(repoRoot);\r\n let current: string | undefined = path.resolve(path.dirname(filePath));\r\n\r\n while (current !== undefined) {\r\n if (!seen.has(current)) {\r\n directories.push(current);\r\n seen.add(current);\r\n }\r\n if (current === boundary) {\r\n break;\r\n }\r\n const parent = path.dirname(current);\r\n if (parent === current) {\r\n break;\r\n }\r\n current = parent;\r\n }\r\n\r\n if (!seen.has(boundary)) {\r\n directories.push(boundary);\r\n }\r\n\r\n return directories;\r\n}\r\n\r\n/**\r\n * Build search roots for file resolution, matching yaml-parser behavior.\r\n * Searches from eval file directory up to repo root.\r\n */\r\nexport function buildSearchRoots(evalPath: string, repoRoot: string): readonly string[] {\r\n const uniqueRoots: string[] = [];\r\n const addRoot = (root: string): void => {\r\n const normalized = path.resolve(root);\r\n if (!uniqueRoots.includes(normalized)) {\r\n uniqueRoots.push(normalized);\r\n }\r\n };\r\n\r\n let currentDir = path.dirname(evalPath);\r\n let reachedBoundary = false;\r\n while (!reachedBoundary) {\r\n addRoot(currentDir);\r\n const parentDir = path.dirname(currentDir);\r\n if (currentDir === repoRoot || parentDir === currentDir) {\r\n reachedBoundary = true;\r\n } else {\r\n currentDir = parentDir;\r\n }\r\n }\r\n\r\n addRoot(repoRoot);\r\n addRoot(process.cwd());\r\n return uniqueRoots;\r\n}\r\n\r\n/**\r\n * Trim leading path separators for display.\r\n */\r\nfunction trimLeadingSeparators(value: string): string {\r\n const trimmed = value.replace(/^[/\\\\]+/, '');\r\n return trimmed.length > 0 ? trimmed : value;\r\n}\r\n\r\n/**\r\n * Resolve a file reference using search roots, matching yaml-parser behavior.\r\n */\r\nexport async function resolveFileReference(\r\n rawValue: string,\r\n searchRoots: readonly string[],\r\n): Promise<{\r\n readonly displayPath: string;\r\n readonly resolvedPath?: string;\r\n readonly attempted: readonly string[];\r\n}> {\r\n const displayPath = trimLeadingSeparators(rawValue);\r\n const potentialPaths: string[] = [];\r\n\r\n if (path.isAbsolute(rawValue)) {\r\n potentialPaths.push(path.normalize(rawValue));\r\n }\r\n\r\n for (const base of searchRoots) {\r\n potentialPaths.push(path.resolve(base, displayPath));\r\n }\r\n\r\n const attempted: string[] = [];\r\n const seen = new Set<string>();\r\n for (const candidate of potentialPaths) {\r\n const absoluteCandidate = path.resolve(candidate);\r\n if (seen.has(absoluteCandidate)) {\r\n continue;\r\n }\r\n seen.add(absoluteCandidate);\r\n attempted.push(absoluteCandidate);\r\n if (await fileExists(absoluteCandidate)) {\r\n return { displayPath, resolvedPath: absoluteCandidate, attempted };\r\n }\r\n }\r\n\r\n return { displayPath, attempted };\r\n}\r\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { type AzureOpenAIProviderSettings, createAzure } from '@ai-sdk/azure';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { type LanguageModel, type ModelMessage, generateText } from 'ai';\n\nimport type { JsonObject } from '../types.js';\nimport type {\n AnthropicResolvedConfig,\n AzureResolvedConfig,\n GeminiResolvedConfig,\n RetryConfig,\n} from './targets.js';\nimport type { ChatPrompt, Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst DEFAULT_SYSTEM_PROMPT =\n 'You are a careful assistant. Follow all provided instructions and do not fabricate results.';\n\ntype TextResult = Awaited<ReturnType<typeof generateText>>;\ntype GenerateTextOptions = Parameters<typeof generateText>[0];\n\ninterface ProviderDefaults {\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly thinkingBudget?: number;\n}\n\nexport class AzureProvider implements Provider {\n readonly id: string;\n readonly kind = 'azure' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: AzureResolvedConfig,\n ) {\n this.id = `azure:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n\n const azure = createAzure(buildAzureOptions(config));\n this.model = azure(config.deploymentName);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nexport class AnthropicProvider implements Provider {\n readonly id: string;\n readonly kind = 'anthropic' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: AnthropicResolvedConfig,\n ) {\n this.id = `anthropic:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n thinkingBudget: config.thinkingBudget,\n };\n this.retryConfig = config.retry;\n\n const anthropic = createAnthropic({\n apiKey: config.apiKey,\n });\n this.model = anthropic(config.model);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n const providerOptions = buildAnthropicProviderOptions(this.defaults);\n\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n providerOptions,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nexport class GeminiProvider implements Provider {\n readonly id: string;\n readonly kind = 'gemini' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: GeminiResolvedConfig,\n ) {\n this.id = `gemini:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n\n const google = createGoogleGenerativeAI({\n apiKey: config.apiKey,\n });\n this.model = google(config.model);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nfunction buildAzureOptions(config: AzureResolvedConfig): AzureOpenAIProviderSettings {\n const options: AzureOpenAIProviderSettings = {\n apiKey: config.apiKey,\n apiVersion: config.version,\n useDeploymentBasedUrls: true,\n };\n\n const baseURL = normalizeAzureBaseUrl(config.resourceName);\n if (baseURL) {\n options.baseURL = baseURL;\n } else {\n options.resourceName = config.resourceName;\n }\n\n return options;\n}\n\nfunction normalizeAzureBaseUrl(resourceName: string): string | undefined {\n const trimmed = resourceName.trim();\n if (!/^https?:\\/\\//i.test(trimmed)) {\n return undefined;\n }\n\n const withoutSlash = trimmed.replace(/\\/+$/, '');\n const normalized = withoutSlash.endsWith('/openai') ? withoutSlash : `${withoutSlash}/openai`;\n return normalized;\n}\n\nfunction buildAnthropicProviderOptions(\n defaults: ProviderDefaults,\n): GenerateTextOptions['providerOptions'] | undefined {\n if (defaults.thinkingBudget === undefined) {\n return undefined;\n }\n\n return {\n anthropic: {\n thinking: {\n type: 'enabled',\n budgetTokens: defaults.thinkingBudget,\n },\n },\n };\n}\n\nfunction buildChatPrompt(request: ProviderRequest): ChatPrompt {\n const provided = request.chatPrompt?.length ? request.chatPrompt : undefined;\n if (provided) {\n const hasSystemMessage = provided.some((message) => message.role === 'system');\n if (hasSystemMessage) {\n return provided;\n }\n\n const systemContent = resolveSystemContent(request, false);\n return [{ role: 'system', content: systemContent }, ...provided];\n }\n\n const systemContent = resolveSystemContent(request, true);\n const userContent = request.question.trim();\n\n const prompt: ChatPrompt = [\n { role: 'system', content: systemContent },\n { role: 'user', content: userContent },\n ];\n\n return prompt;\n}\n\nfunction resolveSystemContent(request: ProviderRequest, includeGuidelines: boolean): string {\n const systemSegments: string[] = [];\n\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\n systemSegments.push(request.systemPrompt.trim());\n } else {\n systemSegments.push(DEFAULT_SYSTEM_PROMPT);\n }\n\n if (includeGuidelines && request.guidelines && request.guidelines.trim().length > 0) {\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${request.guidelines.trim()}`);\n }\n\n return systemSegments.join('\\n\\n');\n}\n\nfunction toModelMessages(chatPrompt: ChatPrompt): ModelMessage[] {\n return chatPrompt.map((message) => {\n if (message.role === 'tool' || message.role === 'function') {\n const prefix = message.name ? `@[${message.name}]: ` : '@[Tool]: ';\n return {\n role: 'assistant',\n content: `${prefix}${message.content}`,\n } satisfies ModelMessage;\n }\n\n if (message.role === 'assistant' || message.role === 'system' || message.role === 'user') {\n return {\n role: message.role,\n content: message.content,\n } satisfies ModelMessage;\n }\n\n return {\n role: 'user',\n content: message.content,\n } satisfies ModelMessage;\n });\n}\n\nfunction resolveModelSettings(\n request: ProviderRequest,\n defaults: ProviderDefaults,\n): { temperature?: number; maxOutputTokens?: number } {\n const temperature = request.temperature ?? defaults.temperature;\n const maxOutputTokens = request.maxOutputTokens ?? defaults.maxOutputTokens;\n return {\n temperature,\n maxOutputTokens,\n };\n}\n\nasync function invokeModel(options: {\n readonly model: LanguageModel;\n readonly request: ProviderRequest;\n readonly defaults: ProviderDefaults;\n readonly retryConfig?: RetryConfig;\n readonly providerOptions?: GenerateTextOptions['providerOptions'];\n}): Promise<ProviderResponse> {\n const { model, request, defaults, retryConfig, providerOptions } = options;\n const chatPrompt = buildChatPrompt(request);\n const { temperature, maxOutputTokens } = resolveModelSettings(request, defaults);\n\n const result = await withRetry(\n () =>\n generateText({\n model,\n messages: toModelMessages(chatPrompt),\n temperature,\n maxOutputTokens,\n maxRetries: 0,\n abortSignal: request.signal,\n ...(providerOptions ? { providerOptions } : {}),\n }),\n retryConfig,\n request.signal,\n );\n\n return mapResponse(result);\n}\n\nfunction mapResponse(result: TextResult): ProviderResponse {\n return {\n text: result.text ?? '',\n reasoning: result.reasoningText ?? undefined,\n raw: result,\n usage: toJsonObject(result.totalUsage ?? result.usage),\n };\n}\n\nfunction toJsonObject(value: unknown): JsonObject | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n try {\n return JSON.parse(JSON.stringify(value)) as JsonObject;\n } catch {\n return undefined;\n }\n}\n\nfunction extractStatus(error: unknown): number | undefined {\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n\n const candidate = error as Record<string, unknown>;\n const directStatus = candidate.status ?? candidate.statusCode;\n if (typeof directStatus === 'number' && Number.isFinite(directStatus)) {\n return directStatus;\n }\n\n const responseStatus =\n typeof candidate.response === 'object' && candidate.response\n ? (candidate.response as { status?: unknown }).status\n : undefined;\n if (typeof responseStatus === 'number' && Number.isFinite(responseStatus)) {\n return responseStatus;\n }\n\n const message = typeof candidate.message === 'string' ? candidate.message : undefined;\n if (message) {\n const match = message.match(/HTTP\\s+(\\d{3})/i);\n if (match) {\n const parsed = Number.parseInt(match[1], 10);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n\n return undefined;\n}\n\nfunction isNetworkError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const candidate = error as Record<string, unknown>;\n if (candidate.name === 'AbortError') {\n return false;\n }\n\n const code = candidate.code;\n if (typeof code === 'string' && /^E(AI|CONN|HOST|NET|PIPE|TIME|REFUSED|RESET)/i.test(code)) {\n return true;\n }\n\n const message = typeof candidate.message === 'string' ? candidate.message : undefined;\n if (\n message &&\n /(network|fetch failed|ECONNRESET|ENOTFOUND|EAI_AGAIN|ETIMEDOUT|ECONNREFUSED)/i.test(message)\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction isRetryableError(error: unknown, retryableStatusCodes: readonly number[]): boolean {\n const status = extractStatus(error);\n if (status === 401 || status === 403) {\n return false;\n }\n if (typeof status === 'number') {\n return retryableStatusCodes.includes(status);\n }\n\n return isNetworkError(error);\n}\n\nfunction calculateRetryDelay(attempt: number, config: Required<RetryConfig>): number {\n const delay = Math.min(\n config.maxDelayMs,\n config.initialDelayMs * config.backoffFactor ** attempt,\n );\n return delay * (0.75 + Math.random() * 0.5);\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function withRetry<T>(\n fn: () => Promise<T>,\n retryConfig?: RetryConfig,\n signal?: AbortSignal,\n): Promise<T> {\n const config: Required<RetryConfig> = {\n maxRetries: retryConfig?.maxRetries ?? 3,\n initialDelayMs: retryConfig?.initialDelayMs ?? 1000,\n maxDelayMs: retryConfig?.maxDelayMs ?? 60000,\n backoffFactor: retryConfig?.backoffFactor ?? 2,\n retryableStatusCodes: retryConfig?.retryableStatusCodes ?? [500, 408, 429, 502, 503, 504],\n };\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n if (signal?.aborted) {\n throw new Error(`Request aborted: ${signal.reason ?? 'Unknown reason'}`);\n }\n\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt >= config.maxRetries) {\n break;\n }\n\n if (!isRetryableError(error, config.retryableStatusCodes)) {\n throw error;\n }\n\n const delay = calculateRetryDelay(attempt, config);\n await sleep(delay);\n }\n }\n\n throw lastError;\n}\n","import { type ExecException, type ExecOptions, exec as execWithCallback } from 'node:child_process';\r\nimport fs from 'node:fs/promises';\r\nimport os from 'node:os';\r\nimport path from 'node:path';\r\nimport { promisify } from 'node:util';\r\n\r\nimport { readTextFile } from '../file-utils.js';\r\nimport { type TraceEvent, isTraceEvent } from '../trace.js';\r\nimport type { CliResolvedConfig } from './targets.js';\r\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\r\n\r\nconst execAsync = promisify(execWithCallback);\r\nconst DEFAULT_MAX_BUFFER = 10 * 1024 * 1024; // 10 MB to accommodate verbose CLI output\r\n\r\nexport interface CommandRunOptions {\r\n readonly cwd?: string;\r\n readonly env?: NodeJS.ProcessEnv;\r\n readonly timeoutMs?: number;\r\n readonly signal?: AbortSignal;\r\n}\r\n\r\nexport interface CommandRunResult {\r\n readonly stdout: string;\r\n readonly stderr: string;\r\n readonly exitCode: number | null;\r\n readonly failed: boolean;\r\n readonly timedOut?: boolean;\r\n readonly signal?: NodeJS.Signals | null;\r\n}\r\n\r\nexport type CommandRunner = (\r\n command: string,\r\n options: CommandRunOptions,\r\n) => Promise<CommandRunResult>;\r\n\r\nasync function defaultCommandRunner(\r\n command: string,\r\n options: CommandRunOptions,\r\n): Promise<CommandRunResult> {\r\n const execOptions: ExecOptions = {\r\n cwd: options.cwd,\r\n env: options.env,\r\n timeout: options.timeoutMs,\r\n signal: options.signal,\r\n maxBuffer: DEFAULT_MAX_BUFFER,\r\n shell: process.platform === 'win32' ? 'powershell.exe' : undefined,\r\n };\r\n\r\n try {\r\n const { stdout, stderr } = await execAsync(command, execOptions);\r\n\r\n return {\r\n stdout,\r\n stderr,\r\n exitCode: 0,\r\n failed: false,\r\n timedOut: false,\r\n signal: null,\r\n };\r\n } catch (error) {\r\n const execError = error as ExecException & {\r\n stdout?: string;\r\n stderr?: string;\r\n timedOut?: boolean;\r\n killed?: boolean;\r\n };\r\n\r\n return {\r\n stdout: execError.stdout ?? '',\r\n stderr: execError.stderr ?? '',\r\n exitCode: typeof execError.code === 'number' ? execError.code : null,\r\n failed: true,\r\n timedOut: execError.timedOut === true || execError.killed === true,\r\n signal: execError.signal ?? null,\r\n };\r\n }\r\n}\r\n\r\nexport class CliProvider implements Provider {\r\n readonly id: string;\r\n readonly kind = 'cli';\r\n readonly targetName: string;\r\n readonly supportsBatch = false;\r\n\r\n private readonly config: CliResolvedConfig;\r\n private readonly runCommand: CommandRunner;\r\n private readonly verbose: boolean;\r\n private healthcheckPromise?: Promise<void>;\r\n\r\n constructor(\r\n targetName: string,\r\n config: CliResolvedConfig,\r\n runner: CommandRunner = defaultCommandRunner,\r\n ) {\r\n this.targetName = targetName;\r\n this.id = `cli:${targetName}`;\r\n this.config = config;\r\n this.runCommand = runner;\r\n this.verbose = config.verbose ?? false;\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n if (request.signal?.aborted) {\r\n throw new Error('CLI provider request was aborted before execution');\r\n }\r\n\r\n await this.ensureHealthy(request.signal);\r\n\r\n const outputFilePath = generateOutputFilePath(request.evalCaseId);\r\n const templateValues = buildTemplateValues(request, this.config, outputFilePath);\r\n const renderedCommand = renderTemplate(this.config.commandTemplate, templateValues);\r\n\r\n const result = await this.runCommand(renderedCommand, {\r\n cwd: this.config.cwd,\r\n env: process.env,\r\n timeoutMs: this.config.timeoutMs,\r\n signal: request.signal,\r\n });\r\n\r\n if (result.failed || (result.exitCode ?? 0) !== 0) {\r\n if (request.signal?.aborted) {\r\n throw new Error('CLI provider request was aborted');\r\n }\r\n if (result.timedOut) {\r\n throw new Error(\r\n `CLI provider timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\r\n );\r\n }\r\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\r\n const detail = result.stderr.trim() || result.stdout.trim();\r\n const message = detail\r\n ? `${detail} (exit code ${codeText})`\r\n : `CLI exited with code ${codeText}`;\r\n throw new Error(message);\r\n }\r\n\r\n // Read from output file and parse as JSON if possible\r\n const responseContent = await this.readAndCleanupOutputFile(outputFilePath);\r\n const parsed = this.parseOutputContent(responseContent);\r\n\r\n return {\r\n text: parsed.text,\r\n trace: parsed.trace,\r\n raw: {\r\n command: renderedCommand,\r\n stderr: result.stderr,\r\n exitCode: result.exitCode ?? 0,\r\n cwd: this.config.cwd,\r\n outputFile: outputFilePath,\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Parse output content from CLI.\r\n * If the content is valid JSON with a 'text' field, extract text and optional trace.\r\n * Otherwise, treat the entire content as plain text.\r\n */\r\n private parseOutputContent(content: string): {\r\n text: string;\r\n trace?: readonly TraceEvent[];\r\n } {\r\n try {\r\n const parsed = JSON.parse(content) as unknown;\r\n if (typeof parsed === 'object' && parsed !== null && 'text' in parsed) {\r\n const obj = parsed as { text: unknown; trace?: unknown };\r\n const text = typeof obj.text === 'string' ? obj.text : String(obj.text);\r\n const trace = this.parseTrace(obj.trace);\r\n return { text, trace };\r\n }\r\n } catch {\r\n // Not valid JSON, treat as plain text\r\n }\r\n return { text: content };\r\n }\r\n\r\n private parseTrace(trace: unknown): readonly TraceEvent[] | undefined {\r\n if (!Array.isArray(trace)) {\r\n return undefined;\r\n }\r\n const validEvents = trace.filter(isTraceEvent);\r\n return validEvents.length > 0 ? validEvents : undefined;\r\n }\r\n\r\n private async readAndCleanupOutputFile(filePath: string): Promise<string> {\r\n try {\r\n const content = await readTextFile(filePath);\r\n return content;\r\n } catch (error) {\r\n const errorMsg = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Failed to read output file '${filePath}': ${errorMsg}`);\r\n } finally {\r\n // Clean up temp file - ignore errors as the file might not exist on read failure\r\n await fs.unlink(filePath).catch(() => {\r\n /* ignore cleanup errors */\r\n });\r\n }\r\n }\r\n\r\n private async ensureHealthy(signal?: AbortSignal): Promise<void> {\r\n if (!this.config.healthcheck) {\r\n return;\r\n }\r\n if (!this.healthcheckPromise) {\r\n this.healthcheckPromise = this.runHealthcheck(this.config.healthcheck, signal);\r\n }\r\n return this.healthcheckPromise;\r\n }\r\n\r\n private async runHealthcheck(\r\n healthcheck: CliResolvedConfig['healthcheck'],\r\n signal?: AbortSignal,\r\n ): Promise<void> {\r\n if (!healthcheck) {\r\n return;\r\n }\r\n\r\n const timeoutMs = healthcheck.timeoutMs ?? this.config.timeoutMs;\r\n\r\n if (healthcheck.type === 'http') {\r\n const controller = new AbortController();\r\n const timer = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : undefined;\r\n signal?.addEventListener('abort', () => controller.abort(), { once: true });\r\n\r\n try {\r\n const response = await fetch(healthcheck.url, { method: 'GET', signal: controller.signal });\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\r\n }\r\n } catch (error) {\r\n const reason = error instanceof Error ? error.message : String(error);\r\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${reason}`);\r\n } finally {\r\n if (timer !== undefined) {\r\n clearTimeout(timer);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const renderedCommand = renderTemplate(\r\n healthcheck.commandTemplate,\r\n buildTemplateValues(\r\n {\r\n question: '',\r\n guidelines: '',\r\n inputFiles: [],\r\n evalCaseId: 'healthcheck',\r\n attempt: 0,\r\n },\r\n this.config,\r\n generateOutputFilePath('healthcheck'),\r\n ),\r\n );\r\n if (this.verbose) {\r\n console.log(\r\n `[cli-provider:${this.targetName}] (healthcheck) CLI_EVALS_DIR=${process.env.CLI_EVALS_DIR ?? ''} cwd=${healthcheck.cwd ?? this.config.cwd ?? ''} command=${renderedCommand}`,\r\n );\r\n }\r\n\r\n const result = await this.runCommand(renderedCommand, {\r\n cwd: healthcheck.cwd ?? this.config.cwd,\r\n env: process.env,\r\n timeoutMs,\r\n signal,\r\n });\r\n\r\n if (result.failed || (result.exitCode ?? 0) !== 0) {\r\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\r\n const detail = result.stderr.trim() || result.stdout.trim();\r\n const message = detail\r\n ? `${detail} (exit code ${codeText})`\r\n : `CLI healthcheck command exited with code ${codeText}`;\r\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${message}`);\r\n }\r\n }\r\n}\r\n\r\nfunction buildTemplateValues(\r\n request: Pick<\r\n ProviderRequest,\r\n 'question' | 'guidelines' | 'inputFiles' | 'evalCaseId' | 'attempt'\r\n >,\r\n config: CliResolvedConfig,\r\n outputFilePath: string,\r\n): Record<string, string> {\r\n const inputFiles = normalizeInputFiles(request.inputFiles);\r\n return {\r\n PROMPT: shellEscape(request.question ?? ''),\r\n GUIDELINES: shellEscape(request.guidelines ?? ''),\r\n EVAL_ID: shellEscape(request.evalCaseId ?? ''),\r\n ATTEMPT: shellEscape(String(request.attempt ?? 0)),\r\n FILES: formatFileList(inputFiles, config.filesFormat),\r\n OUTPUT_FILE: shellEscape(outputFilePath),\r\n };\r\n}\r\n\r\nfunction normalizeInputFiles(\r\n inputFiles: readonly string[] | undefined,\r\n): readonly string[] | undefined {\r\n if (!inputFiles || inputFiles.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const unique = new Map<string, string>();\r\n for (const inputFile of inputFiles) {\r\n const absolutePath = path.resolve(inputFile);\r\n if (!unique.has(absolutePath)) {\r\n unique.set(absolutePath, absolutePath);\r\n }\r\n }\r\n\r\n return Array.from(unique.values());\r\n}\r\n\r\nfunction formatFileList(\r\n files: readonly string[] | undefined,\r\n template: string | undefined,\r\n): string {\r\n if (!files || files.length === 0) {\r\n return '';\r\n }\r\n\r\n const formatter = template ?? '{path}';\r\n return files\r\n .map((filePath) => {\r\n const escapedPath = shellEscape(filePath);\r\n const escapedName = shellEscape(path.basename(filePath));\r\n return formatter.replaceAll('{path}', escapedPath).replaceAll('{basename}', escapedName);\r\n })\r\n .join(' ');\r\n}\r\n\r\nfunction renderTemplate(template: string, values: Record<string, string>): string {\r\n return template.replace(/\\{([A-Z_]+)\\}/g, (match, key) => {\r\n const replacement = values[key];\r\n return replacement !== undefined ? replacement : match;\r\n });\r\n}\r\n\r\nfunction shellEscape(value: string): string {\r\n if (value.length === 0) {\r\n return \"''\";\r\n }\r\n\r\n if (process.platform === 'win32') {\r\n // PowerShell uses backtick (`) for escaping, not backslash\r\n // Double quotes inside the string need to be escaped with backtick\r\n // Single quotes can be used instead for simpler escaping\r\n const escaped = value.replace(/'/g, \"''\");\r\n return `'${escaped}'`;\r\n }\r\n\r\n return `'${value.replace(/'/g, \"'\\\"'\\\"'\")}'`;\r\n}\r\n\r\nfunction generateOutputFilePath(evalCaseId?: string): string {\r\n const safeEvalId = evalCaseId || 'unknown';\r\n const timestamp = Date.now();\r\n const random = Math.random().toString(36).substring(2, 9);\r\n return path.join(os.tmpdir(), `agentv-${safeEvalId}-${timestamp}-${random}.json`);\r\n}\r\n\r\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\r\n if (!timeoutMs || timeoutMs <= 0) {\r\n return '';\r\n }\r\n const seconds = Math.ceil(timeoutMs / 1000);\r\n return ` after ${seconds}s`;\r\n}\r\n","import { exec as execCallback, spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { constants, createWriteStream } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { access, mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { recordCodexLogEntry } from './codex-log-tracker.js';\nimport { buildPromptDocument, normalizeInputFiles } from './preread.js';\nimport type { CodexResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst execAsync = promisify(execCallback);\nconst WORKSPACE_PREFIX = 'agentv-codex-';\nconst PROMPT_FILENAME = 'prompt.md';\nconst JSONL_TYPE_ITEM_COMPLETED = 'item.completed';\n\ninterface CodexRunOptions {\n readonly executable: string;\n readonly args: readonly string[];\n readonly cwd: string;\n readonly prompt: string;\n readonly timeoutMs?: number;\n readonly env: NodeJS.ProcessEnv;\n readonly signal?: AbortSignal;\n readonly onStdoutChunk?: (chunk: string) => void;\n readonly onStderrChunk?: (chunk: string) => void;\n}\n\ninterface CodexRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n readonly timedOut?: boolean;\n}\n\ntype CodexRunner = (options: CodexRunOptions) => Promise<CodexRunResult>;\n\nexport class CodexProvider implements Provider {\n readonly id: string;\n readonly kind = 'codex' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: CodexResolvedConfig;\n private readonly runCodex: CodexRunner;\n private environmentCheck?: Promise<void>;\n private resolvedExecutable?: string;\n\n constructor(\n targetName: string,\n config: CodexResolvedConfig,\n runner: CodexRunner = defaultCodexRunner,\n ) {\n this.id = `codex:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n this.runCodex = runner;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Codex provider request was aborted before execution');\n }\n\n await this.ensureEnvironmentReady();\n\n const inputFiles = normalizeInputFiles(request.inputFiles);\n\n const workspaceRoot = await this.createWorkspace();\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n try {\n const promptContent = buildPromptDocument(request, inputFiles);\n const promptFile = path.join(workspaceRoot, PROMPT_FILENAME);\n await writeFile(promptFile, promptContent, 'utf8');\n\n const args = this.buildCodexArgs();\n const cwd = this.resolveCwd(workspaceRoot);\n\n const result = await this.executeCodex(args, cwd, promptContent, request.signal, logger);\n\n if (result.timedOut) {\n throw new Error(\n `Codex CLI timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n\n if (result.exitCode !== 0) {\n const detail = pickDetail(result.stderr, result.stdout);\n const prefix = `Codex CLI exited with code ${result.exitCode}`;\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\n }\n\n const parsed = parseCodexJson(result.stdout);\n const assistantText = extractAssistantText(parsed);\n\n return {\n text: assistantText,\n raw: {\n response: parsed,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n args,\n executable: this.resolvedExecutable ?? this.config.executable,\n promptFile,\n workspace: workspaceRoot,\n inputFiles,\n logFile: logger?.filePath,\n },\n };\n } finally {\n await logger?.close();\n await this.cleanupWorkspace(workspaceRoot);\n }\n }\n\n private async ensureEnvironmentReady(): Promise<void> {\n if (!this.environmentCheck) {\n this.environmentCheck = this.validateEnvironment();\n }\n await this.environmentCheck;\n }\n\n private async validateEnvironment(): Promise<void> {\n this.resolvedExecutable = await locateExecutable(this.config.executable);\n }\n\n private resolveCwd(workspaceRoot: string): string {\n if (!this.config.cwd) {\n return workspaceRoot;\n }\n return path.resolve(this.config.cwd);\n }\n\n private buildCodexArgs(): string[] {\n // Global flags must come before 'exec' subcommand\n const args = [\n '--ask-for-approval',\n 'never',\n 'exec',\n '--json',\n '--color',\n 'never',\n '--skip-git-repo-check',\n ];\n if (this.config.args && this.config.args.length > 0) {\n args.push(...this.config.args);\n }\n args.push('-');\n return args;\n }\n\n private async executeCodex(\n args: readonly string[],\n cwd: string,\n promptContent: string,\n signal: AbortSignal | undefined,\n logger: CodexStreamLogger | undefined,\n ): Promise<CodexRunResult> {\n try {\n return await this.runCodex({\n executable: this.resolvedExecutable ?? this.config.executable,\n args,\n cwd,\n prompt: promptContent,\n timeoutMs: this.config.timeoutMs,\n env: process.env,\n signal,\n onStdoutChunk: logger ? (chunk) => logger.handleStdoutChunk(chunk) : undefined,\n onStderrChunk: logger ? (chunk) => logger.handleStderrChunk(chunk) : undefined,\n });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n throw new Error(\n `Codex executable '${this.config.executable}' was not found. Update the target settings.executable or add it to PATH.`,\n );\n }\n throw error;\n }\n }\n\n private async createWorkspace(): Promise<string> {\n return await mkdtemp(path.join(tmpdir(), WORKSPACE_PREFIX));\n }\n\n private async cleanupWorkspace(workspaceRoot: string): Promise<void> {\n try {\n await rm(workspaceRoot, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n\n private resolveLogDirectory(): string | undefined {\n const disabled = isCodexLogStreamingDisabled();\n if (disabled) {\n return undefined;\n }\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'codex');\n }\n\n private async createStreamLogger(\n request: ProviderRequest,\n ): Promise<CodexStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Codex stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\n\n try {\n const logger = await CodexStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n });\n recordCodexLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Codex stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\nclass CodexStreamLogger {\n readonly filePath: string;\n private readonly stream: WriteStream;\n private readonly startedAt = Date.now();\n private stdoutBuffer = '';\n private stderrBuffer = '';\n private readonly format: 'summary' | 'json';\n\n private constructor(filePath: string, format: 'summary' | 'json') {\n this.filePath = filePath;\n this.format = format;\n this.stream = createWriteStream(filePath, { flags: 'a' });\n }\n\n static async create(options: {\n readonly filePath: string;\n readonly targetName: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly format: 'summary' | 'json';\n }): Promise<CodexStreamLogger> {\n const logger = new CodexStreamLogger(options.filePath, options.format);\n const header = [\n '# Codex CLI stream log',\n `# target: ${options.targetName}`,\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\n `# started: ${new Date().toISOString()}`,\n '',\n ].filter((line): line is string => Boolean(line));\n logger.writeLines(header);\n return logger;\n }\n\n handleStdoutChunk(chunk: string): void {\n this.stdoutBuffer += chunk;\n this.flushBuffer('stdout');\n }\n\n handleStderrChunk(chunk: string): void {\n this.stderrBuffer += chunk;\n this.flushBuffer('stderr');\n }\n\n async close(): Promise<void> {\n this.flushBuffer('stdout');\n this.flushBuffer('stderr');\n this.flushRemainder();\n await new Promise<void>((resolve, reject) => {\n this.stream.once('error', reject);\n this.stream.end(() => resolve());\n });\n }\n\n private writeLines(lines: readonly string[]): void {\n for (const line of lines) {\n this.stream.write(`${line}\\n`);\n }\n }\n\n private flushBuffer(source: 'stdout' | 'stderr'): void {\n const buffer = source === 'stdout' ? this.stdoutBuffer : this.stderrBuffer;\n const lines = buffer.split(/\\r?\\n/);\n const remainder = lines.pop() ?? '';\n if (source === 'stdout') {\n this.stdoutBuffer = remainder;\n } else {\n this.stderrBuffer = remainder;\n }\n for (const line of lines) {\n const formatted = this.formatLine(line, source);\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n }\n\n private formatLine(rawLine: string, source: 'stdout' | 'stderr'): string | undefined {\n const trimmed = rawLine.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n const message =\n this.format === 'json' ? formatCodexJsonLog(trimmed) : formatCodexLogMessage(trimmed, source);\n return `[+${formatElapsed(this.startedAt)}] [${source}] ${message}`;\n }\n\n private flushRemainder(): void {\n const stdoutRemainder = this.stdoutBuffer.trim();\n if (stdoutRemainder.length > 0) {\n const formatted = this.formatLine(stdoutRemainder, 'stdout');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n const stderrRemainder = this.stderrBuffer.trim();\n if (stderrRemainder.length > 0) {\n const formatted = this.formatLine(stderrRemainder, 'stderr');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n this.stdoutBuffer = '';\n this.stderrBuffer = '';\n }\n}\n\nfunction isCodexLogStreamingDisabled(): boolean {\n const envValue = process.env.AGENTV_CODEX_STREAM_LOGS;\n if (!envValue) {\n return false;\n }\n const normalized = envValue.trim().toLowerCase();\n return normalized === 'false' || normalized === '0' || normalized === 'off';\n}\n\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const evalId = sanitizeForFilename(request.evalCaseId ?? 'codex');\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : '';\n const target = sanitizeForFilename(targetName);\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\n}\n\nfunction sanitizeForFilename(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : 'codex';\n}\n\nfunction formatElapsed(startedAt: number): string {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\n const hours = Math.floor(elapsedSeconds / 3600);\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\n const seconds = elapsedSeconds % 60;\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\nfunction formatCodexLogMessage(rawLine: string, source: 'stdout' | 'stderr'): string {\n const parsed = tryParseJsonValue(rawLine);\n if (parsed) {\n const summary = summarizeCodexEvent(parsed);\n if (summary) {\n return summary;\n }\n }\n if (source === 'stderr') {\n return `stderr: ${rawLine}`;\n }\n return rawLine;\n}\n\nfunction formatCodexJsonLog(rawLine: string): string {\n const parsed = tryParseJsonValue(rawLine);\n if (!parsed) {\n return rawLine;\n }\n try {\n return JSON.stringify(parsed, null, 2);\n } catch {\n return rawLine;\n }\n}\n\nfunction summarizeCodexEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n let message =\n extractFromEvent(event) ??\n extractFromItem(record.item) ??\n flattenContent(record.output ?? record.content);\n if (!message && type === JSONL_TYPE_ITEM_COMPLETED) {\n const item = record.item;\n if (item && typeof item === 'object') {\n const candidate = flattenContent(\n (item as Record<string, unknown>).text ??\n (item as Record<string, unknown>).content ??\n (item as Record<string, unknown>).output,\n );\n if (candidate) {\n message = candidate;\n }\n }\n }\n if (!message) {\n const itemType =\n typeof (record.item as Record<string, unknown> | undefined)?.type === 'string'\n ? (record.item as Record<string, unknown>).type\n : undefined;\n if (type && itemType) {\n return `${type}:${itemType}`;\n }\n if (type) {\n return type;\n }\n }\n if (type && message) {\n return `${type}: ${message}`;\n }\n if (message) {\n return message;\n }\n return type;\n}\n\nfunction tryParseJsonValue(rawLine: string): unknown | undefined {\n try {\n return JSON.parse(rawLine);\n } catch {\n return undefined;\n }\n}\n\nasync function locateExecutable(candidate: string): Promise<string> {\n const includesPathSeparator = candidate.includes('/') || candidate.includes('\\\\');\n if (includesPathSeparator) {\n const resolved = path.isAbsolute(candidate) ? candidate : path.resolve(candidate);\n const executablePath = await ensureWindowsExecutableVariant(resolved);\n await access(executablePath, constants.F_OK);\n return executablePath;\n }\n\n const locator = process.platform === 'win32' ? 'where' : 'which';\n try {\n const { stdout } = await execAsync(`${locator} ${candidate}`);\n const lines = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n const preferred = selectExecutableCandidate(lines);\n if (preferred) {\n const executablePath = await ensureWindowsExecutableVariant(preferred);\n await access(executablePath, constants.F_OK);\n return executablePath;\n }\n } catch {\n // ignore and fall back to error below\n }\n\n throw new Error(`Codex executable '${candidate}' was not found on PATH`);\n}\n\nfunction selectExecutableCandidate(candidates: readonly string[]): string | undefined {\n if (candidates.length === 0) {\n return undefined;\n }\n if (process.platform !== 'win32') {\n return candidates[0];\n }\n const extensions = getWindowsExecutableExtensions();\n for (const ext of extensions) {\n const match = candidates.find((candidate) => candidate.toLowerCase().endsWith(ext));\n if (match) {\n return match;\n }\n }\n return candidates[0];\n}\n\nasync function ensureWindowsExecutableVariant(candidate: string): Promise<string> {\n if (process.platform !== 'win32') {\n return candidate;\n }\n if (hasExecutableExtension(candidate)) {\n return candidate;\n }\n\n const extensions = getWindowsExecutableExtensions();\n for (const ext of extensions) {\n const withExtension = `${candidate}${ext}`;\n try {\n await access(withExtension, constants.F_OK);\n return withExtension;\n } catch {\n // keep searching\n }\n }\n return candidate;\n}\n\nfunction hasExecutableExtension(candidate: string): boolean {\n const lower = candidate.toLowerCase();\n return getWindowsExecutableExtensions().some((ext) => lower.endsWith(ext));\n}\n\nconst DEFAULT_WINDOWS_EXTENSIONS = ['.com', '.exe', '.bat', '.cmd', '.ps1'] as const;\n\nfunction getWindowsExecutableExtensions(): readonly string[] {\n if (process.platform !== 'win32') {\n return [];\n }\n const fromEnv = process.env.PATHEXT?.split(';')\n .map((ext) => ext.trim().toLowerCase())\n .filter((ext) => ext.length > 0);\n return fromEnv && fromEnv.length > 0 ? fromEnv : DEFAULT_WINDOWS_EXTENSIONS;\n}\n\nfunction parseCodexJson(output: string): unknown {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n throw new Error('Codex CLI produced no output in --json mode');\n }\n try {\n return JSON.parse(trimmed);\n } catch {\n const lineObjects = parseJsonLines(trimmed);\n if (lineObjects) {\n return lineObjects;\n }\n const lastBrace = trimmed.lastIndexOf('{');\n if (lastBrace >= 0) {\n const candidate = trimmed.slice(lastBrace);\n try {\n return JSON.parse(candidate);\n } catch {\n // fallthrough\n }\n }\n const preview = trimmed.slice(0, 200);\n throw new Error(`Codex CLI emitted invalid JSON: ${preview}${trimmed.length > 200 ? '…' : ''}`);\n }\n}\n\nfunction extractAssistantText(parsed: unknown): string {\n if (Array.isArray(parsed)) {\n const text = extractFromEventStream(parsed);\n if (text) {\n return text;\n }\n }\n\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('Codex CLI JSON response did not include an assistant message');\n }\n\n const record = parsed as Record<string, unknown>;\n const eventText = extractFromEvent(record);\n if (eventText) {\n return eventText;\n }\n\n const messages = Array.isArray(record.messages) ? record.messages : undefined;\n if (messages) {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const entry = messages[index];\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n const role = (entry as Record<string, unknown>).role;\n if (role !== 'assistant') {\n continue;\n }\n const content = (entry as Record<string, unknown>).content;\n const flattened = flattenContent(content);\n if (flattened) {\n return flattened;\n }\n }\n }\n\n const response = record.response;\n if (response && typeof response === 'object') {\n const content = (response as Record<string, unknown>).content;\n const flattened = flattenContent(content);\n if (flattened) {\n return flattened;\n }\n }\n\n const output = record.output;\n const flattenedOutput = flattenContent(output);\n if (flattenedOutput) {\n return flattenedOutput;\n }\n\n throw new Error('Codex CLI JSON response did not include an assistant message');\n}\n\nfunction extractFromEventStream(events: readonly unknown[]): string | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const candidate = events[index];\n const text = extractFromEvent(candidate);\n if (text) {\n return text;\n }\n }\n return undefined;\n}\n\nfunction extractFromEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n if (type === JSONL_TYPE_ITEM_COMPLETED) {\n const item = record.item;\n const text = extractFromItem(item);\n if (text) {\n return text;\n }\n }\n const output = record.output ?? record.content;\n const flattened = flattenContent(output);\n if (flattened) {\n return flattened;\n }\n return undefined;\n}\n\nfunction extractFromItem(item: unknown): string | undefined {\n if (!item || typeof item !== 'object') {\n return undefined;\n }\n const record = item as Record<string, unknown>;\n const itemType = typeof record.type === 'string' ? record.type : undefined;\n if (itemType === 'agent_message' || itemType === 'response' || itemType === 'output') {\n const text = flattenContent(record.text ?? record.content ?? record.output);\n if (text) {\n return text;\n }\n }\n return undefined;\n}\n\nfunction flattenContent(value: unknown): string | undefined {\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n const parts = value\n .map((segment) => {\n if (typeof segment === 'string') {\n return segment;\n }\n if (segment && typeof segment === 'object' && 'text' in segment) {\n const text = (segment as Record<string, unknown>).text;\n return typeof text === 'string' ? text : undefined;\n }\n return undefined;\n })\n .filter((part): part is string => typeof part === 'string' && part.length > 0);\n return parts.length > 0 ? parts.join(' \\n') : undefined;\n }\n if (value && typeof value === 'object' && 'text' in value) {\n const text = (value as Record<string, unknown>).text;\n return typeof text === 'string' ? text : undefined;\n }\n return undefined;\n}\n\nfunction parseJsonLines(output: string): unknown[] | undefined {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length <= 1) {\n return undefined;\n }\n const parsed: unknown[] = [];\n for (const line of lines) {\n try {\n parsed.push(JSON.parse(line));\n } catch {\n return undefined;\n }\n }\n return parsed;\n}\n\nfunction pickDetail(stderr: string, stdout: string): string | undefined {\n const errorText = stderr.trim();\n if (errorText.length > 0) {\n return errorText;\n }\n const stdoutText = stdout.trim();\n return stdoutText.length > 0 ? stdoutText : undefined;\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n\nasync function defaultCodexRunner(options: CodexRunOptions): Promise<CodexRunResult> {\n return await new Promise<CodexRunResult>((resolve, reject) => {\n const child = spawn(options.executable, options.args, {\n cwd: options.cwd,\n env: options.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n shell: shouldShellExecute(options.executable),\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const onAbort = (): void => {\n child.kill('SIGTERM');\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeoutMs);\n timeoutHandle.unref?.();\n }\n\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk) => {\n stdout += chunk;\n options.onStdoutChunk?.(chunk);\n });\n\n child.stderr.setEncoding('utf8');\n child.stderr.on('data', (chunk) => {\n stderr += chunk;\n options.onStderrChunk?.(chunk);\n });\n\n child.stdin.end(options.prompt);\n\n const cleanup = (): void => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n if (options.signal) {\n options.signal.removeEventListener('abort', onAbort);\n }\n };\n\n child.on('error', (error) => {\n cleanup();\n reject(error);\n });\n\n child.on('close', (code) => {\n cleanup();\n resolve({\n stdout,\n stderr,\n exitCode: typeof code === 'number' ? code : -1,\n timedOut,\n });\n });\n });\n}\n\nfunction shouldShellExecute(executable: string): boolean {\n if (process.platform !== 'win32') {\n return false;\n }\n const lower = executable.toLowerCase();\n return lower.endsWith('.cmd') || lower.endsWith('.bat') || lower.endsWith('.ps1');\n}\n","export type CodexLogEntry = {\n readonly filePath: string;\n readonly evalCaseId?: string;\n readonly targetName: string;\n readonly attempt?: number;\n};\n\nconst GLOBAL_LOGS_KEY = Symbol.for('agentv.codexLogs');\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for('agentv.codexLogSubscribers');\n\ntype CodexLogListener = (entry: CodexLogEntry) => void;\n\ntype GlobalWithCodexLogs = typeof globalThis & {\n [GLOBAL_LOGS_KEY]?: CodexLogEntry[];\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<CodexLogListener>;\n};\n\nfunction getCodexLogStore(): CodexLogEntry[] {\n const globalObject = globalThis as GlobalWithCodexLogs;\n const existing = globalObject[GLOBAL_LOGS_KEY];\n if (existing) {\n return existing;\n }\n const created: CodexLogEntry[] = [];\n globalObject[GLOBAL_LOGS_KEY] = created;\n return created;\n}\n\nfunction getSubscriberStore(): Set<CodexLogListener> {\n const globalObject = globalThis as GlobalWithCodexLogs;\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\n if (existing) {\n return existing;\n }\n const created = new Set<CodexLogListener>();\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\n return created;\n}\n\nfunction notifySubscribers(entry: CodexLogEntry): void {\n const subscribers = Array.from(getSubscriberStore());\n for (const listener of subscribers) {\n try {\n listener(entry);\n } catch (error) {\n // Avoid surfacing subscriber errors to providers; log for visibility.\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Codex log subscriber failed: ${message}`);\n }\n }\n}\n\nexport function recordCodexLogEntry(entry: CodexLogEntry): void {\n getCodexLogStore().push(entry);\n notifySubscribers(entry);\n}\n\nexport function consumeCodexLogEntries(): CodexLogEntry[] {\n const store = getCodexLogStore();\n if (store.length === 0) {\n return [];\n }\n return store.splice(0, store.length);\n}\n\nexport function subscribeToCodexLogEntries(listener: CodexLogListener): () => void {\n const store = getSubscriberStore();\n store.add(listener);\n return () => {\n store.delete(listener);\n };\n}\n","import path from 'node:path';\n\nimport { isGuidelineFile } from '../yaml-parser.js';\nimport type { ProviderRequest } from './types.js';\n\nexport interface PromptDocumentOptions {\n readonly guidelinePatterns?: readonly string[];\n readonly guidelineOverrides?: ReadonlySet<string>;\n}\n\nexport function buildPromptDocument(\n request: ProviderRequest,\n inputFiles: readonly string[] | undefined,\n options?: PromptDocumentOptions,\n): string {\n const parts: string[] = [];\n\n const guidelineFiles = collectGuidelineFiles(\n inputFiles,\n options?.guidelinePatterns ?? request.guideline_patterns,\n options?.guidelineOverrides,\n );\n const inputFilesList = collectInputFiles(inputFiles);\n\n const nonGuidelineInputFiles = inputFilesList.filter((file) => !guidelineFiles.includes(file));\n\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineInputFiles);\n if (prereadBlock.length > 0) {\n parts.push('\\n', prereadBlock);\n }\n\n parts.push('\\n[[ ## user_query ## ]]\\n', request.question.trim());\n\n return parts.join('\\n').trim();\n}\n\nexport function normalizeInputFiles(\n inputFiles: readonly string[] | undefined,\n): string[] | undefined {\n if (!inputFiles || inputFiles.length === 0) {\n return undefined;\n }\n const deduped = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!deduped.has(absolutePath)) {\n deduped.set(absolutePath, absolutePath);\n }\n }\n return Array.from(deduped.values());\n}\n\nexport function collectGuidelineFiles(\n inputFiles: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n overrides?: ReadonlySet<string>,\n): string[] {\n if (!inputFiles || inputFiles.length === 0) {\n return [];\n }\n\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (overrides?.has(absolutePath)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n continue;\n }\n\n const normalized = absolutePath.split(path.sep).join('/');\n if (isGuidelineFile(normalized, guidelinePatterns)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction collectInputFiles(inputFiles: readonly string[] | undefined): string[] {\n if (!inputFiles || inputFiles.length === 0) {\n return [];\n }\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n return Array.from(unique.values());\n}\n\nfunction buildMandatoryPrereadBlock(\n guidelineFiles: readonly string[],\n inputFiles: readonly string[],\n): string {\n if (guidelineFiles.length === 0 && inputFiles.length === 0) {\n return '';\n }\n\n const buildList = (files: readonly string[]): string[] =>\n files.map((absolutePath) => {\n const fileName = path.basename(absolutePath);\n const fileUri = pathToFileUri(absolutePath);\n return `* [${fileName}](${fileUri})`;\n });\n\n const sections: string[] = [];\n if (guidelineFiles.length > 0) {\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join('\\n')}.`);\n }\n\n if (inputFiles.length > 0) {\n sections.push(`Read all input files:\\n${buildList(inputFiles).join('\\n')}.`);\n }\n\n sections.push(\n 'If any file is missing, fail with ERROR: missing-file <filename> and stop.',\n 'Then apply system_instructions on the user query below.',\n );\n\n return sections.join('\\n');\n}\n\nfunction pathToFileUri(filePath: string): string {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n return `file://${normalizedPath}`;\n}\n","import type { TraceEvent } from '../trace.js';\r\nimport type { MockResolvedConfig } from './targets.js';\r\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\r\n\r\nconst DEFAULT_MOCK_RESPONSE =\r\n '{\"answer\":\"Mock provider response. Configure targets.yaml to supply a custom value.\"}';\r\n\r\nexport class MockProvider implements Provider {\r\n readonly id: string;\r\n readonly kind = 'mock' as const;\r\n readonly targetName: string;\r\n\r\n private readonly cannedResponse: string;\r\n private readonly delayMs: number;\r\n private readonly delayMinMs: number;\r\n private readonly delayMaxMs: number;\r\n private readonly trace?: readonly TraceEvent[];\r\n\r\n constructor(targetName: string, config: MockResolvedConfig) {\r\n this.id = `mock:${targetName}`;\r\n this.targetName = targetName;\r\n this.cannedResponse = config.response ?? DEFAULT_MOCK_RESPONSE;\r\n this.delayMs = config.delayMs ?? 0;\r\n this.delayMinMs = config.delayMinMs ?? 0;\r\n this.delayMaxMs = config.delayMaxMs ?? 0;\r\n this.trace = config.trace;\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n const delay = this.calculateDelay();\r\n if (delay > 0) {\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n }\r\n\r\n return {\r\n text: this.cannedResponse,\r\n raw: {\r\n question: request.question,\r\n guidelines: request.guidelines,\r\n },\r\n trace: this.trace,\r\n };\r\n }\r\n\r\n private calculateDelay(): number {\r\n // If range is specified, use uniform random distribution\r\n if (this.delayMinMs > 0 || this.delayMaxMs > 0) {\r\n const min = Math.max(0, this.delayMinMs);\r\n const max = Math.max(min, this.delayMaxMs);\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n }\r\n // Otherwise use fixed delay\r\n return this.delayMs;\r\n }\r\n}\r\n","import path from 'node:path';\r\nimport { z } from 'zod';\r\n\r\nimport type { EnvLookup, TargetDefinition } from './types.js';\r\n\r\nexport const CLI_PLACEHOLDERS = new Set([\r\n 'PROMPT',\r\n 'GUIDELINES',\r\n 'EVAL_ID',\r\n 'ATTEMPT',\r\n 'FILES',\r\n 'OUTPUT_FILE',\r\n]);\r\n\r\nexport interface RetryConfig {\r\n readonly maxRetries?: number;\r\n readonly initialDelayMs?: number;\r\n readonly maxDelayMs?: number;\r\n readonly backoffFactor?: number;\r\n readonly retryableStatusCodes?: readonly number[];\r\n}\r\n\r\n/**\r\n * Azure OpenAI settings used by the Vercel AI SDK.\r\n */\r\nexport interface AzureResolvedConfig {\r\n readonly resourceName: string;\r\n readonly deploymentName: string;\r\n readonly apiKey: string;\r\n readonly version?: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly retry?: RetryConfig;\r\n}\r\n\r\n/**\r\n * Anthropic Claude settings used by the Vercel AI SDK.\r\n */\r\nexport interface AnthropicResolvedConfig {\r\n readonly apiKey: string;\r\n readonly model: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly thinkingBudget?: number;\r\n readonly retry?: RetryConfig;\r\n}\r\n\r\n/**\r\n * Google Gemini settings used by the Vercel AI SDK.\r\n */\r\nexport interface GeminiResolvedConfig {\r\n readonly apiKey: string;\r\n readonly model: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly retry?: RetryConfig;\r\n}\r\n\r\nexport interface CodexResolvedConfig {\r\n readonly executable: string;\r\n readonly args?: readonly string[];\r\n readonly cwd?: string;\r\n readonly timeoutMs?: number;\r\n readonly logDir?: string;\r\n readonly logFormat?: 'summary' | 'json';\r\n}\r\n\r\nexport interface MockResolvedConfig {\r\n readonly response?: string;\r\n readonly delayMs?: number;\r\n readonly delayMinMs?: number;\r\n readonly delayMaxMs?: number;\r\n /** Mock trace events for testing tool_trajectory evaluator */\r\n readonly trace?: readonly import('../trace.js').TraceEvent[];\r\n}\r\n\r\nexport interface VSCodeResolvedConfig {\r\n readonly command: string;\r\n readonly waitForResponse: boolean;\r\n readonly dryRun: boolean;\r\n readonly subagentRoot?: string;\r\n readonly workspaceTemplate?: string;\r\n}\r\n\r\nexport type CliHealthcheck =\r\n | {\r\n readonly type: 'http';\r\n readonly url: string;\r\n readonly timeoutMs?: number;\r\n }\r\n | {\r\n readonly type: 'command';\r\n readonly commandTemplate: string;\r\n readonly timeoutMs?: number;\r\n readonly cwd?: string;\r\n };\r\n\r\nexport interface CliResolvedConfig {\r\n readonly commandTemplate: string;\r\n readonly filesFormat?: string;\r\n readonly cwd?: string;\r\n readonly timeoutMs?: number;\r\n readonly healthcheck?: CliHealthcheck;\r\n readonly verbose?: boolean;\r\n}\r\n\r\nexport type ResolvedTarget =\r\n | {\r\n readonly kind: 'azure';\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: AzureResolvedConfig;\r\n }\r\n | {\r\n readonly kind: 'anthropic';\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: AnthropicResolvedConfig;\r\n }\r\n | {\r\n readonly kind: 'gemini';\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: GeminiResolvedConfig;\r\n }\r\n | {\r\n readonly kind: 'codex';\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: CodexResolvedConfig;\r\n }\r\n | {\r\n readonly kind: 'mock';\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: MockResolvedConfig;\r\n }\r\n | {\r\n readonly kind: 'vscode' | 'vscode-insiders';\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: VSCodeResolvedConfig;\r\n }\r\n | {\r\n readonly kind: 'cli';\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: CliResolvedConfig;\r\n };\r\n\r\nconst BASE_TARGET_SCHEMA = z\r\n .object({\r\n name: z.string().min(1, 'target name is required'),\r\n provider: z.string().min(1, 'provider is required'),\r\n judge_target: z.string().optional(),\r\n workers: z.number().int().min(1).optional(),\r\n })\r\n .passthrough();\r\n\r\nconst DEFAULT_AZURE_API_VERSION = '2024-12-01-preview';\r\n\r\nfunction normalizeAzureApiVersion(value: string | undefined): string {\r\n if (!value) {\r\n return DEFAULT_AZURE_API_VERSION;\r\n }\r\n\r\n const trimmed = value.trim();\r\n if (trimmed.length === 0) {\r\n return DEFAULT_AZURE_API_VERSION;\r\n }\r\n\r\n const withoutPrefix = trimmed.replace(/^api[-_]?version\\s*=\\s*/i, '').trim();\r\n return withoutPrefix.length > 0 ? withoutPrefix : DEFAULT_AZURE_API_VERSION;\r\n}\r\n\r\nfunction resolveRetryConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): RetryConfig | undefined {\r\n const maxRetries = resolveOptionalNumber(\r\n target.max_retries ?? target.maxRetries,\r\n `${target.name} max retries`,\r\n );\r\n const initialDelayMs = resolveOptionalNumber(\r\n target.retry_initial_delay_ms ?? target.retryInitialDelayMs,\r\n `${target.name} retry initial delay`,\r\n );\r\n const maxDelayMs = resolveOptionalNumber(\r\n target.retry_max_delay_ms ?? target.retryMaxDelayMs,\r\n `${target.name} retry max delay`,\r\n );\r\n const backoffFactor = resolveOptionalNumber(\r\n target.retry_backoff_factor ?? target.retryBackoffFactor,\r\n `${target.name} retry backoff factor`,\r\n );\r\n const retryableStatusCodes = resolveOptionalNumberArray(\r\n target.retry_status_codes ?? target.retryStatusCodes,\r\n `${target.name} retry status codes`,\r\n );\r\n\r\n // Only return retry config if at least one field is set\r\n if (\r\n maxRetries === undefined &&\r\n initialDelayMs === undefined &&\r\n maxDelayMs === undefined &&\r\n backoffFactor === undefined &&\r\n retryableStatusCodes === undefined\r\n ) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n maxRetries,\r\n initialDelayMs,\r\n maxDelayMs,\r\n backoffFactor,\r\n retryableStatusCodes,\r\n };\r\n}\r\n\r\nexport function resolveTargetDefinition(\r\n definition: TargetDefinition,\r\n env: EnvLookup = process.env,\r\n evalFilePath?: string,\r\n): ResolvedTarget {\r\n const parsed = BASE_TARGET_SCHEMA.parse(definition);\r\n const provider = parsed.provider.toLowerCase();\r\n const providerBatching = resolveOptionalBoolean(\r\n parsed.provider_batching ?? parsed.providerBatching,\r\n );\r\n\r\n switch (provider) {\r\n case 'azure':\r\n case 'azure-openai':\r\n return {\r\n kind: 'azure',\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveAzureConfig(parsed, env),\r\n };\r\n case 'anthropic':\r\n return {\r\n kind: 'anthropic',\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveAnthropicConfig(parsed, env),\r\n };\r\n case 'gemini':\r\n case 'google':\r\n case 'google-gemini':\r\n return {\r\n kind: 'gemini',\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveGeminiConfig(parsed, env),\r\n };\r\n case 'codex':\r\n case 'codex-cli':\r\n return {\r\n kind: 'codex',\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveCodexConfig(parsed, env),\r\n };\r\n case 'mock':\r\n return {\r\n kind: 'mock',\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveMockConfig(parsed),\r\n };\r\n case 'vscode':\r\n case 'vscode-insiders':\r\n return {\r\n kind: provider as 'vscode' | 'vscode-insiders',\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveVSCodeConfig(parsed, env, provider === 'vscode-insiders'),\r\n };\r\n case 'cli':\r\n return {\r\n kind: 'cli',\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveCliConfig(parsed, env, evalFilePath),\r\n };\r\n default:\r\n throw new Error(`Unsupported provider '${parsed.provider}' in target '${parsed.name}'`);\r\n }\r\n}\r\n\r\nfunction resolveAzureConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): AzureResolvedConfig {\r\n const endpointSource = target.endpoint ?? target.resource ?? target.resourceName;\r\n const apiKeySource = target.api_key ?? target.apiKey;\r\n const deploymentSource = target.deployment ?? target.deploymentName ?? target.model;\r\n const versionSource = target.version ?? target.api_version;\r\n const temperatureSource = target.temperature;\r\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\r\n\r\n const resourceName = resolveString(endpointSource, env, `${target.name} endpoint`);\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} api key`);\r\n const deploymentName = resolveString(deploymentSource, env, `${target.name} deployment`);\r\n const version = normalizeAzureApiVersion(\r\n resolveOptionalString(versionSource, env, `${target.name} api version`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n }),\r\n );\r\n const temperature = resolveOptionalNumber(temperatureSource, `${target.name} temperature`);\r\n const maxOutputTokens = resolveOptionalNumber(\r\n maxTokensSource,\r\n `${target.name} max output tokens`,\r\n );\r\n const retry = resolveRetryConfig(target);\r\n\r\n return {\r\n resourceName,\r\n deploymentName,\r\n apiKey,\r\n version,\r\n temperature,\r\n maxOutputTokens,\r\n retry,\r\n };\r\n}\r\n\r\nfunction resolveAnthropicConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): AnthropicResolvedConfig {\r\n const apiKeySource = target.api_key ?? target.apiKey;\r\n const modelSource = target.model ?? target.deployment ?? target.variant;\r\n const temperatureSource = target.temperature;\r\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\r\n const thinkingBudgetSource = target.thinking_budget ?? target.thinkingBudget;\r\n\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} Anthropic api key`);\r\n const model = resolveString(modelSource, env, `${target.name} Anthropic model`);\r\n const retry = resolveRetryConfig(target);\r\n\r\n return {\r\n apiKey,\r\n model,\r\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\r\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\r\n thinkingBudget: resolveOptionalNumber(thinkingBudgetSource, `${target.name} thinking budget`),\r\n retry,\r\n };\r\n}\r\n\r\nfunction resolveGeminiConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): GeminiResolvedConfig {\r\n const apiKeySource = target.api_key ?? target.apiKey;\r\n const modelSource = target.model ?? target.deployment ?? target.variant;\r\n const temperatureSource = target.temperature;\r\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\r\n\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} Google API key`);\r\n const model =\r\n resolveOptionalString(modelSource, env, `${target.name} Gemini model`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n }) ?? 'gemini-2.5-flash';\r\n const retry = resolveRetryConfig(target);\r\n\r\n return {\r\n apiKey,\r\n model,\r\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\r\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\r\n retry,\r\n };\r\n}\r\n\r\nfunction resolveCodexConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): CodexResolvedConfig {\r\n const executableSource = target.executable ?? target.command ?? target.binary;\r\n const argsSource = target.args ?? target.arguments;\r\n const cwdSource = target.cwd;\r\n const timeoutSource = target.timeout_seconds ?? target.timeoutSeconds;\r\n const logDirSource =\r\n target.log_dir ?? target.logDir ?? target.log_directory ?? target.logDirectory;\r\n const logFormatSource =\r\n target.log_format ??\r\n target.logFormat ??\r\n target.log_output_format ??\r\n target.logOutputFormat ??\r\n env.AGENTV_CODEX_LOG_FORMAT;\r\n\r\n const executable =\r\n resolveOptionalString(executableSource, env, `${target.name} codex executable`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n }) ?? 'codex';\r\n\r\n const args = resolveOptionalStringArray(argsSource, env, `${target.name} codex args`);\r\n\r\n const cwd = resolveOptionalString(cwdSource, env, `${target.name} codex cwd`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n });\r\n const timeoutMs = resolveTimeoutMs(timeoutSource, `${target.name} codex timeout`);\r\n const logDir = resolveOptionalString(logDirSource, env, `${target.name} codex log directory`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n });\r\n const logFormat = normalizeCodexLogFormat(logFormatSource);\r\n\r\n return {\r\n executable,\r\n args,\r\n cwd,\r\n timeoutMs,\r\n logDir,\r\n logFormat,\r\n };\r\n}\r\n\r\nfunction normalizeCodexLogFormat(value: unknown): 'summary' | 'json' | undefined {\r\n if (value === undefined || value === null) {\r\n return undefined;\r\n }\r\n if (typeof value !== 'string') {\r\n throw new Error(\"codex log format must be 'summary' or 'json'\");\r\n }\r\n const normalized = value.trim().toLowerCase();\r\n if (normalized === 'json' || normalized === 'summary') {\r\n return normalized;\r\n }\r\n throw new Error(\"codex log format must be 'summary' or 'json'\");\r\n}\r\n\r\nfunction resolveMockConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): MockResolvedConfig {\r\n const response = typeof target.response === 'string' ? target.response : undefined;\r\n // Parse trace array if provided (for testing tool_trajectory evaluator)\r\n const trace = Array.isArray(target.trace) ? target.trace : undefined;\r\n return { response, trace };\r\n}\r\n\r\nfunction resolveVSCodeConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n insiders: boolean,\r\n): VSCodeResolvedConfig {\r\n const workspaceTemplateEnvVar = resolveOptionalLiteralString(\r\n target.workspace_template ?? target.workspaceTemplate,\r\n );\r\n const workspaceTemplate = workspaceTemplateEnvVar\r\n ? resolveOptionalString(\r\n workspaceTemplateEnvVar,\r\n env,\r\n `${target.name} workspace template path`,\r\n {\r\n allowLiteral: false,\r\n optionalEnv: true,\r\n },\r\n )\r\n : undefined;\r\n\r\n const commandSource = target.vscode_cmd ?? target.command;\r\n const waitSource = target.wait;\r\n const dryRunSource = target.dry_run ?? target.dryRun;\r\n const subagentRootSource = target.subagent_root ?? target.subagentRoot;\r\n\r\n const defaultCommand = insiders ? 'code-insiders' : 'code';\r\n const command = resolveOptionalLiteralString(commandSource) ?? defaultCommand;\r\n\r\n return {\r\n command,\r\n waitForResponse: resolveOptionalBoolean(waitSource) ?? true,\r\n dryRun: resolveOptionalBoolean(dryRunSource) ?? false,\r\n subagentRoot: resolveOptionalString(subagentRootSource, env, `${target.name} subagent root`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n }),\r\n workspaceTemplate,\r\n };\r\n}\r\n\r\nfunction resolveCliConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n evalFilePath?: string,\r\n): CliResolvedConfig {\r\n const commandTemplateSource = target.command_template ?? target.commandTemplate;\r\n const filesFormat = resolveOptionalLiteralString(\r\n target.files_format ??\r\n target.filesFormat ??\r\n target.attachments_format ??\r\n target.attachmentsFormat,\r\n );\r\n let cwd = resolveOptionalString(target.cwd, env, `${target.name} working directory`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n });\r\n // Fallback: if cwd is not set and we have an eval file path, use the eval directory\r\n if (!cwd && evalFilePath) {\r\n cwd = path.dirname(path.resolve(evalFilePath));\r\n }\r\n const timeoutMs = resolveTimeoutMs(\r\n target.timeout_seconds ?? target.timeoutSeconds,\r\n `${target.name} timeout`,\r\n );\r\n const healthcheck = resolveCliHealthcheck(target.healthcheck, env, target.name);\r\n\r\n const commandTemplate = resolveString(\r\n commandTemplateSource,\r\n env,\r\n `${target.name} CLI command template`,\r\n true,\r\n );\r\n assertSupportedCliPlaceholders(commandTemplate, `${target.name} CLI command template`);\r\n\r\n return {\r\n commandTemplate,\r\n filesFormat,\r\n cwd,\r\n timeoutMs,\r\n healthcheck,\r\n };\r\n}\r\n\r\nfunction resolveTimeoutMs(source: unknown, description: string): number | undefined {\r\n const seconds = resolveOptionalNumber(source, `${description} (seconds)`);\r\n if (seconds === undefined) {\r\n return undefined;\r\n }\r\n if (seconds <= 0) {\r\n throw new Error(`${description} must be greater than zero seconds`);\r\n }\r\n return Math.floor(seconds * 1000);\r\n}\r\n\r\nfunction resolveCliHealthcheck(\r\n source: unknown,\r\n env: EnvLookup,\r\n targetName: string,\r\n): CliHealthcheck | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (typeof source !== 'object' || Array.isArray(source)) {\r\n throw new Error(`${targetName} healthcheck must be an object`);\r\n }\r\n\r\n const candidate = source as Record<string, unknown>;\r\n const type = candidate.type;\r\n const timeoutMs = resolveTimeoutMs(\r\n candidate.timeout_seconds ?? candidate.timeoutSeconds,\r\n `${targetName} healthcheck timeout`,\r\n );\r\n\r\n if (type === 'http') {\r\n const url = resolveString(candidate.url, env, `${targetName} healthcheck URL`);\r\n return {\r\n type: 'http',\r\n url,\r\n timeoutMs,\r\n };\r\n }\r\n\r\n if (type === 'command') {\r\n const commandTemplate = resolveString(\r\n candidate.command_template ?? candidate.commandTemplate,\r\n env,\r\n `${targetName} healthcheck command template`,\r\n true,\r\n );\r\n assertSupportedCliPlaceholders(commandTemplate, `${targetName} healthcheck command template`);\r\n const cwd = resolveOptionalString(candidate.cwd, env, `${targetName} healthcheck cwd`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n });\r\n return {\r\n type: 'command',\r\n commandTemplate,\r\n timeoutMs,\r\n cwd,\r\n };\r\n }\r\n\r\n throw new Error(`${targetName} healthcheck type must be 'http' or 'command'`);\r\n}\r\n\r\nfunction assertSupportedCliPlaceholders(template: string, description: string): void {\r\n const placeholders = extractCliPlaceholders(template);\r\n for (const placeholder of placeholders) {\r\n if (!CLI_PLACEHOLDERS.has(placeholder)) {\r\n throw new Error(\r\n `${description} includes unsupported placeholder '{${placeholder}}'. Supported placeholders: ${Array.from(CLI_PLACEHOLDERS).join(', ')}`,\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction extractCliPlaceholders(template: string): string[] {\r\n const matches = template.matchAll(/\\{([A-Z_]+)\\}/g);\r\n const results: string[] = [];\r\n for (const match of matches) {\r\n if (match[1]) {\r\n results.push(match[1]);\r\n }\r\n }\r\n return results;\r\n}\r\n\r\nfunction resolveString(\r\n source: unknown,\r\n env: EnvLookup,\r\n description: string,\r\n allowLiteral = false,\r\n): string {\r\n const value = resolveOptionalString(source, env, description, {\r\n allowLiteral,\r\n optionalEnv: false,\r\n });\r\n if (value === undefined) {\r\n throw new Error(`${description} is required`);\r\n }\r\n return value;\r\n}\r\n\r\nfunction resolveOptionalString(\r\n source: unknown,\r\n env: EnvLookup,\r\n description: string,\r\n options?: { allowLiteral?: boolean; optionalEnv?: boolean },\r\n): string | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (typeof source !== 'string') {\r\n throw new Error(`${description} must be a string`);\r\n }\r\n const trimmed = source.trim();\r\n if (trimmed.length === 0) {\r\n return undefined;\r\n }\r\n\r\n // Check for ${{ variable }} syntax\r\n const envVarMatch = trimmed.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\r\n if (envVarMatch) {\r\n const varName = envVarMatch[1];\r\n const envValue = env[varName];\r\n const optionalEnv = options?.optionalEnv ?? false;\r\n\r\n // Treat empty or undefined env vars the same way\r\n if (envValue === undefined || envValue.trim().length === 0) {\r\n if (optionalEnv) {\r\n return undefined;\r\n }\r\n const status = envValue === undefined ? 'is not set' : 'is empty';\r\n throw new Error(`Environment variable '${varName}' required for ${description} ${status}`);\r\n }\r\n return envValue;\r\n }\r\n\r\n // Return as literal value\r\n const allowLiteral = options?.allowLiteral ?? false;\r\n if (!allowLiteral) {\r\n throw new Error(\r\n `${description} must use \\${{ VARIABLE_NAME }} syntax for environment variables or be marked as allowing literals`,\r\n );\r\n }\r\n return trimmed;\r\n}\r\n\r\nfunction resolveOptionalLiteralString(source: unknown): string | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (typeof source !== 'string') {\r\n throw new Error('expected string value');\r\n }\r\n const trimmed = source.trim();\r\n return trimmed.length > 0 ? trimmed : undefined;\r\n}\r\n\r\nfunction resolveOptionalNumber(source: unknown, description: string): number | undefined {\r\n if (source === undefined || source === null || source === '') {\r\n return undefined;\r\n }\r\n if (typeof source === 'number') {\r\n return Number.isFinite(source) ? source : undefined;\r\n }\r\n if (typeof source === 'string') {\r\n const numeric = Number(source);\r\n if (Number.isFinite(numeric)) {\r\n return numeric;\r\n }\r\n }\r\n throw new Error(`${description} must be a number`);\r\n}\r\n\r\nfunction resolveOptionalBoolean(source: unknown): boolean | undefined {\r\n if (source === undefined || source === null || source === '') {\r\n return undefined;\r\n }\r\n if (typeof source === 'boolean') {\r\n return source;\r\n }\r\n if (typeof source === 'string') {\r\n const lowered = source.trim().toLowerCase();\r\n if (lowered === 'true' || lowered === '1') {\r\n return true;\r\n }\r\n if (lowered === 'false' || lowered === '0') {\r\n return false;\r\n }\r\n }\r\n throw new Error('expected boolean value');\r\n}\r\n\r\nfunction resolveOptionalStringArray(\r\n source: unknown,\r\n env: EnvLookup,\r\n description: string,\r\n): readonly string[] | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (!Array.isArray(source)) {\r\n throw new Error(`${description} must be an array of strings`);\r\n }\r\n if (source.length === 0) {\r\n return undefined;\r\n }\r\n const resolved: string[] = [];\r\n for (let i = 0; i < source.length; i++) {\r\n const item = source[i];\r\n if (typeof item !== 'string') {\r\n throw new Error(`${description}[${i}] must be a string`);\r\n }\r\n const trimmed = item.trim();\r\n if (trimmed.length === 0) {\r\n throw new Error(`${description}[${i}] cannot be empty`);\r\n }\r\n\r\n // Check for ${{ variable }} syntax\r\n const envVarMatch = trimmed.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\r\n if (envVarMatch) {\r\n const varName = envVarMatch[1];\r\n const envValue = env[varName];\r\n if (envValue !== undefined) {\r\n if (envValue.trim().length === 0) {\r\n throw new Error(`Environment variable '${varName}' for ${description}[${i}] is empty`);\r\n }\r\n resolved.push(envValue);\r\n continue;\r\n }\r\n throw new Error(`Environment variable '${varName}' for ${description}[${i}] is not set`);\r\n }\r\n\r\n // Treat as literal value\r\n resolved.push(trimmed);\r\n }\r\n return resolved.length > 0 ? resolved : undefined;\r\n}\r\n\r\nfunction resolveOptionalNumberArray(\r\n source: unknown,\r\n description: string,\r\n): readonly number[] | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (!Array.isArray(source)) {\r\n throw new Error(`${description} must be an array of numbers`);\r\n }\r\n if (source.length === 0) {\r\n return undefined;\r\n }\r\n const resolved: number[] = [];\r\n for (let i = 0; i < source.length; i++) {\r\n const item = source[i];\r\n if (typeof item !== 'number' || !Number.isFinite(item)) {\r\n throw new Error(`${description}[${i}] must be a number`);\r\n }\r\n resolved.push(item);\r\n }\r\n return resolved.length > 0 ? resolved : undefined;\r\n}\r\n","import path from 'node:path';\nimport {\n dispatchAgentSession,\n dispatchBatchAgent,\n getSubagentRoot,\n provisionSubagents,\n} from 'subagent';\n\nimport { readTextFile } from '../file-utils.js';\nimport { isGuidelineFile } from '../yaml-parser.js';\nimport type { VSCodeResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\nimport { AGENTV_BATCH_REQUEST_TEMPLATE, AGENTV_REQUEST_TEMPLATE } from './vscode-templates.js';\n\nexport class VSCodeProvider implements Provider {\n readonly id: string;\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly targetName: string;\n readonly supportsBatch = true;\n\n private readonly config: VSCodeResolvedConfig;\n\n constructor(\n targetName: string,\n config: VSCodeResolvedConfig,\n kind: 'vscode' | 'vscode-insiders',\n ) {\n this.id = `${kind}:${targetName}`;\n this.kind = kind;\n this.targetName = targetName;\n this.config = config;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('VS Code provider request was aborted before dispatch');\n }\n\n const inputFiles = normalizeAttachments(request.inputFiles);\n const promptContent = buildPromptDocument(request, inputFiles, request.guideline_patterns);\n\n const session = await dispatchAgentSession({\n userQuery: promptContent,\n extraAttachments: inputFiles,\n requestTemplate: AGENTV_REQUEST_TEMPLATE,\n wait: this.config.waitForResponse,\n dryRun: this.config.dryRun,\n vscodeCmd: this.config.command,\n subagentRoot: this.config.subagentRoot,\n workspaceTemplate: this.config.workspaceTemplate,\n silent: true,\n });\n\n if (session.exitCode !== 0 || !session.responseFile) {\n const failure = session.error ?? 'VS Code subagent did not produce a response';\n throw new Error(failure);\n }\n\n if (this.config.dryRun) {\n return {\n text: '',\n raw: {\n session,\n inputFiles,\n },\n };\n }\n\n const responseText = await readTextFile(session.responseFile);\n\n return {\n text: responseText,\n raw: {\n session,\n inputFiles,\n },\n };\n }\n\n async invokeBatch(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]> {\n if (requests.length === 0) {\n return [];\n }\n\n const normalizedRequests = requests.map((req) => ({\n request: req,\n inputFiles: normalizeAttachments(req.inputFiles),\n }));\n\n const combinedInputFiles = mergeAttachments(\n normalizedRequests.map(({ inputFiles }) => inputFiles),\n );\n const userQueries = normalizedRequests.map(({ request, inputFiles }) =>\n buildPromptDocument(request, inputFiles, request.guideline_patterns),\n );\n\n const session = await dispatchBatchAgent({\n userQueries,\n extraAttachments: combinedInputFiles,\n requestTemplate: AGENTV_BATCH_REQUEST_TEMPLATE,\n wait: this.config.waitForResponse,\n dryRun: this.config.dryRun,\n vscodeCmd: this.config.command,\n subagentRoot: this.config.subagentRoot,\n workspaceTemplate: this.config.workspaceTemplate,\n silent: true,\n });\n\n if (session.exitCode !== 0 || !session.responseFiles) {\n const failure = session.error ?? 'VS Code subagent did not produce batch responses';\n throw new Error(failure);\n }\n\n if (this.config.dryRun) {\n return normalizedRequests.map(({ inputFiles }) => ({\n text: '',\n raw: {\n session,\n inputFiles,\n allInputFiles: combinedInputFiles,\n },\n }));\n }\n\n if (session.responseFiles.length !== requests.length) {\n throw new Error(\n `VS Code batch returned ${session.responseFiles.length} responses for ${requests.length} requests`,\n );\n }\n\n const responses: ProviderResponse[] = [];\n for (const [index, responseFile] of session.responseFiles.entries()) {\n const responseText = await readTextFile(responseFile);\n responses.push({\n text: responseText,\n raw: {\n session,\n inputFiles: normalizedRequests[index]?.inputFiles,\n allInputFiles: combinedInputFiles,\n responseFile,\n },\n });\n }\n\n return responses;\n }\n}\n\nfunction buildPromptDocument(\n request: ProviderRequest,\n attachments: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n): string {\n const parts: string[] = [];\n\n // Agent providers incorporate systemPrompt into the question\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\n parts.push(request.systemPrompt.trim());\n }\n\n const guidelineFiles = collectGuidelineFiles(attachments, guidelinePatterns);\n const attachmentFiles = collectAttachmentFiles(attachments);\n\n const nonGuidelineAttachments = attachmentFiles.filter((file) => !guidelineFiles.includes(file));\n\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineAttachments);\n if (prereadBlock.length > 0) {\n parts.push('\\n', prereadBlock);\n }\n\n parts.push('\\n[[ ## user_query ## ]]\\n', request.question.trim());\n\n return parts.join('\\n').trim();\n}\n\nfunction buildMandatoryPrereadBlock(\n guidelineFiles: readonly string[],\n attachmentFiles: readonly string[],\n): string {\n if (guidelineFiles.length === 0 && attachmentFiles.length === 0) {\n return '';\n }\n\n const buildList = (files: readonly string[]): string[] =>\n files.map((absolutePath) => {\n const fileName = path.basename(absolutePath);\n const fileUri = pathToFileUri(absolutePath);\n return `* [${fileName}](${fileUri})`;\n });\n\n const sections: string[] = [];\n if (guidelineFiles.length > 0) {\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join('\\n')}.`);\n }\n\n if (attachmentFiles.length > 0) {\n sections.push(`Read all attachment files:\\n${buildList(attachmentFiles).join('\\n')}.`);\n }\n\n sections.push(\n 'If any file is missing, fail with ERROR: missing-file <filename> and stop.',\n 'Then apply system_instructions on the user query below.',\n );\n\n return sections.join('\\n');\n}\n\nfunction collectGuidelineFiles(\n attachments: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n): string[] {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n\n const unique = new Map<string, string>();\n for (const attachment of attachments) {\n const absolutePath = path.resolve(attachment);\n const normalized = absolutePath.split(path.sep).join('/');\n\n if (isGuidelineFile(normalized, guidelinePatterns)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction collectAttachmentFiles(attachments: readonly string[] | undefined): string[] {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n const unique = new Map<string, string>();\n for (const attachment of attachments) {\n const absolutePath = path.resolve(attachment);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n return Array.from(unique.values());\n}\n\nfunction pathToFileUri(filePath: string): string {\n // Convert to absolute path if relative\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n\n // On Windows, convert backslashes to forward slashes\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n\n // Handle Windows drive letters (e.g., C:/ becomes file:///C:/)\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n\n // Unix-like paths\n return `file://${normalizedPath}`;\n}\n\nfunction _composeUserQuery(request: ProviderRequest): string {\n // For VS Code, guidelines are handled via file attachments\n // Do NOT include guideline content in the user query\n return request.question.trim();\n}\n\nfunction normalizeAttachments(attachments: readonly string[] | undefined): string[] | undefined {\n if (!attachments || attachments.length === 0) {\n return undefined;\n }\n const deduped = new Set<string>();\n for (const attachment of attachments) {\n deduped.add(path.resolve(attachment));\n }\n return Array.from(deduped);\n}\n\nfunction mergeAttachments(all: readonly (readonly string[] | undefined)[]): string[] | undefined {\n const deduped = new Set<string>();\n for (const list of all) {\n if (!list) continue;\n for (const inputFile of list) {\n deduped.add(path.resolve(inputFile));\n }\n }\n return deduped.size > 0 ? Array.from(deduped) : undefined;\n}\n\nexport interface EnsureSubagentsOptions {\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly count: number;\n readonly verbose?: boolean;\n}\n\nexport interface EnsureSubagentsResult {\n readonly provisioned: boolean;\n readonly message?: string;\n}\n\n/**\n * Ensures the required number of VSCode subagents are provisioned using the subagent package.\n * This guarantees version compatibility by using the same subagent package version.\n *\n * @param options - Configuration for subagent provisioning\n * @returns Information about the provisioning result\n */\nexport async function ensureVSCodeSubagents(\n options: EnsureSubagentsOptions,\n): Promise<EnsureSubagentsResult> {\n const { kind, count, verbose = false } = options;\n const vscodeCmd = kind === 'vscode-insiders' ? 'code-insiders' : 'code';\n const subagentRoot = getSubagentRoot(vscodeCmd);\n\n try {\n if (verbose) {\n console.log(`Provisioning ${count} subagent(s) via: subagent ${vscodeCmd} provision`);\n }\n\n const result = await provisionSubagents({\n targetRoot: subagentRoot,\n subagents: count,\n dryRun: false,\n });\n\n if (verbose) {\n if (result.created.length > 0) {\n console.log(`Created ${result.created.length} new subagent(s)`);\n }\n if (result.skippedExisting.length > 0) {\n console.log(`Reusing ${result.skippedExisting.length} existing unlocked subagent(s)`);\n }\n console.log(\n `\\ntotal unlocked subagents available: ${result.created.length + result.skippedExisting.length}`,\n );\n }\n\n return {\n provisioned: true,\n message: `Provisioned ${count} subagent(s): ${result.created.length} created, ${result.skippedExisting.length} reused`,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Don't fail if provisioning fails - agents might already exist\n if (verbose) {\n console.warn(`Provisioning failed (continuing anyway): ${errorMessage}`);\n }\n\n return {\n provisioned: false,\n message: `Provisioning failed: ${errorMessage}`,\n };\n }\n}\n","/**\n * Custom request templates for AgentV evaluation workflows\n * These templates are used when dispatching to VSCode via subagent\n */\n\nexport const AGENTV_REQUEST_TEMPLATE = `[[ ## task ## ]]\n\n{{userQuery}}\n\n[[ ## system_instructions ## ]]\n\n**IMPORTANT**: Follow these exact steps:\n1. Create and write your complete response to: {{responseFileTmp}}\n - Do NOT create any additional output files in the workspace.\n - All intended file outputs/changes MUST be written in your response file.\n - For each intended file, include the repo name, relative path and unified git diff following the convention \\`diff --git ...\\`.\n2. When completely finished, run these PowerShell commands to signal completion:\n\\`\\`\\`\nMove-Item -LiteralPath '{{responseFileTmp}}' -Destination '{{responseFileFinal}}'\nif (Test-Path subagent.lock) { del subagent.lock }\n\\`\\`\\`\n\nDo not proceed to step 2 until your response is completely written to the temporary file.\n`;\n\nexport const AGENTV_BATCH_REQUEST_TEMPLATE = `[[ ## task ## ]]\n\n{{userQuery}}\n\n[[ ## system_instructions ## ]]\n\n**IMPORTANT**: Follow these exact steps:\n1. Create and write your complete response to: {{responseFileTmp}}\n - Do NOT create any additional output files in the workspace.\n - All intended file outputs/changes MUST be written in your response file.\n - For each intended file, include the repo name, relative path and unified git diff following the convention \\`diff --git ...\\`.\n2. When completely finished and the response is stable, rename it to: {{responseFileFinal}}\n3. Do not unlock the workspace from this request; batch orchestration will handle unlocking after all responses are ready.\n`;\n\nexport const AGENTV_BATCH_ORCHESTRATOR_TEMPLATE = `MANDATORY: Run #runSubagent tool in your Available Actions for each request file to process them in isolated contexts.\nDO NOT read the request files yourself - only pass the file paths to each subagent:\n\n{{requestFiles}}\n\nAfter ALL queries complete, verify all responses exist and unlock:\n\n\\`\\`\\`powershell\n$responses = @({{responseList}})\n$missing = $responses | Where-Object { -not (Test-Path \"messages/$_\") }\nif ($missing.Count -eq 0) { del subagent.lock }\n\\`\\`\\`\n`;\n","import { constants } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { TARGETS_SCHEMA_V2 } from './types.js';\nimport type { TargetDefinition } from './types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction extractTargetsArray(parsed: Record<string, unknown>, absolutePath: string): unknown[] {\n const targets = parsed.targets;\n if (!Array.isArray(targets)) {\n throw new Error(`targets.yaml at ${absolutePath} must have a 'targets' array`);\n }\n return targets;\n}\n\nfunction assertTargetDefinition(value: unknown, index: number, filePath: string): TargetDefinition {\n if (!isRecord(value)) {\n throw new Error(`targets.yaml entry at index ${index} in ${filePath} must be an object`);\n }\n\n const name = value.name;\n const provider = value.provider;\n\n if (typeof name !== 'string' || name.trim().length === 0) {\n throw new Error(\n `targets.yaml entry at index ${index} in ${filePath} is missing a valid 'name'`,\n );\n }\n\n if (typeof provider !== 'string' || provider.trim().length === 0) {\n throw new Error(`targets.yaml entry '${name}' in ${filePath} is missing a valid 'provider'`);\n }\n\n // Pass through all properties from the YAML to support the flattened schema\n // This includes all provider-specific settings at the top level\n return value as unknown as TargetDefinition;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readTargetDefinitions(\n filePath: string,\n): Promise<readonly TargetDefinition[]> {\n const absolutePath = path.resolve(filePath);\n if (!(await fileExists(absolutePath))) {\n throw new Error(`targets.yaml not found at ${absolutePath}`);\n }\n\n const raw = await readFile(absolutePath, 'utf8');\n const parsed = parse(raw) as unknown;\n\n if (!isRecord(parsed)) {\n throw new Error(`targets.yaml at ${absolutePath} must be a YAML object with a 'targets' field`);\n }\n\n const targets = extractTargetsArray(parsed, absolutePath);\n const definitions = targets.map((entry, index) =>\n assertTargetDefinition(entry, index, absolutePath),\n );\n return definitions;\n}\n\nexport function listTargetNames(definitions: readonly TargetDefinition[]): readonly string[] {\n return definitions.map((definition) => definition.name);\n}\n","import { AnthropicProvider, AzureProvider, GeminiProvider } from './ai-sdk.js';\nimport { CliProvider } from './cli.js';\nimport { CodexProvider } from './codex.js';\nimport { MockProvider } from './mock.js';\nimport type { ResolvedTarget } from './targets.js';\nimport { resolveTargetDefinition } from './targets.js';\nimport type { EnvLookup, Provider, TargetDefinition } from './types.js';\nimport { VSCodeProvider } from './vscode.js';\n\nexport type {\n EnvLookup,\n Provider,\n ProviderKind,\n ProviderRequest,\n ProviderResponse,\n TargetDefinition,\n} from './types.js';\n\nexport type {\n AnthropicResolvedConfig,\n AzureResolvedConfig,\n CliResolvedConfig,\n GeminiResolvedConfig,\n MockResolvedConfig,\n ResolvedTarget,\n VSCodeResolvedConfig,\n} from './targets.js';\n\nexport { resolveTargetDefinition };\nexport { readTargetDefinitions, listTargetNames } from './targets-file.js';\nexport {\n ensureVSCodeSubagents,\n type EnsureSubagentsOptions,\n type EnsureSubagentsResult,\n} from './vscode.js';\nexport { consumeCodexLogEntries, subscribeToCodexLogEntries } from './codex-log-tracker.js';\n\nexport function createProvider(target: ResolvedTarget): Provider {\n switch (target.kind) {\n case 'azure':\n return new AzureProvider(target.name, target.config);\n case 'anthropic':\n return new AnthropicProvider(target.name, target.config);\n case 'gemini':\n return new GeminiProvider(target.name, target.config);\n case 'cli':\n return new CliProvider(target.name, target.config);\n case 'codex':\n return new CodexProvider(target.name, target.config);\n case 'mock':\n return new MockProvider(target.name, target.config);\n case 'vscode':\n case 'vscode-insiders':\n return new VSCodeProvider(target.name, target.config, target.kind);\n default: {\n // Exhaustive check\n const neverTarget: never = target;\n throw new Error(`Unsupported provider kind ${(neverTarget as { kind: string }).kind}`);\n }\n }\n}\n\nexport function resolveAndCreateProvider(\n definition: TargetDefinition,\n env: EnvLookup = process.env,\n): Provider {\n const resolved = resolveTargetDefinition(definition, env);\n return createProvider(resolved);\n}\n","import { generateText } from 'ai';\r\nimport { z } from 'zod';\r\n\r\nimport type { ResolvedTarget } from './providers/targets.js';\r\nimport type { ChatPrompt, Provider, ProviderResponse } from './providers/types.js';\r\nimport { TEMPLATE_VARIABLES } from './template-variables.js';\r\nimport type { ToolTrajectoryEvaluatorConfig, TraceEvent, TraceSummary } from './trace.js';\r\nimport type {\r\n EvalCase,\r\n EvaluationVerdict,\r\n EvaluatorConfig,\r\n JsonObject,\r\n RubricItem,\r\n} from './types.js';\r\n\r\nexport type { EvaluationVerdict };\r\n\r\n/**\r\n * Default evaluator template for the user prompt (variables will be substituted).\r\n * Custom evaluators can override this via evaluatorTemplate option.\r\n */\r\nconst DEFAULT_EVALUATOR_TEMPLATE = `You are an expert evaluator. Your goal is to grade the candidate_answer based on how well it achieves the expected_outcome for the original task.\r\n\r\nUse the reference_answer as a gold standard for a high-quality response (if provided). The candidate_answer does not need to match it verbatim, but should capture the key points and follow the same spirit.\r\n\r\nBe concise and focused in your evaluation. Provide succinct, specific feedback rather than verbose explanations.\r\n\r\n[[ ## expected_outcome ## ]]\r\n{{${TEMPLATE_VARIABLES.EXPECTED_OUTCOME}}}\r\n\r\n[[ ## question ## ]]\r\n{{${TEMPLATE_VARIABLES.QUESTION}}}\r\n\r\n[[ ## reference_answer ## ]]\r\n{{${TEMPLATE_VARIABLES.REFERENCE_ANSWER}}}\r\n\r\n[[ ## candidate_answer ## ]]\r\n{{${TEMPLATE_VARIABLES.CANDIDATE_ANSWER}}}`;\r\n\r\nexport interface EvaluationContext {\r\n readonly evalCase: EvalCase;\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly attempt: number;\r\n readonly promptInputs: {\r\n readonly question: string;\r\n readonly guidelines: string;\r\n readonly systemMessage?: string;\r\n readonly chatPrompt?: ChatPrompt;\r\n };\r\n readonly now: Date;\r\n readonly judgeProvider?: Provider;\r\n readonly evaluatorTemplateOverride?: string;\r\n readonly evaluator?: EvaluatorConfig;\r\n /** Normalized trace events from provider execution (if available) */\r\n readonly candidateTrace?: readonly TraceEvent[];\r\n /** Lightweight summary of trace events (if available) */\r\n readonly candidateTraceSummary?: TraceSummary;\r\n}\r\n\r\nexport interface EvaluationScore {\r\n readonly score: number;\r\n readonly verdict: EvaluationVerdict;\r\n readonly hits: readonly string[];\r\n readonly misses: readonly string[];\r\n readonly expectedAspectCount: number;\r\n readonly reasoning?: string;\r\n readonly rawAspects?: readonly string[];\r\n readonly evaluatorRawRequest?: JsonObject;\r\n readonly evaluatorResults?: readonly ChildEvaluatorResult[];\r\n}\r\n\r\nexport interface ChildEvaluatorResult {\r\n readonly name: string;\r\n readonly type: string;\r\n readonly score: number;\r\n readonly weight?: number;\r\n readonly verdict: EvaluationVerdict;\r\n readonly hits: readonly string[];\r\n readonly misses: readonly string[];\r\n readonly reasoning?: string;\r\n readonly evaluatorRawRequest?: JsonObject;\r\n readonly evaluatorResults?: readonly ChildEvaluatorResult[];\r\n}\r\n\r\nexport interface Evaluator {\r\n readonly kind: string;\r\n evaluate(context: EvaluationContext): Promise<EvaluationScore> | EvaluationScore;\r\n}\r\n\r\ntype JudgeProviderResolver = (context: EvaluationContext) => Promise<Provider | undefined>;\r\n\r\nexport interface LlmJudgeEvaluatorOptions {\r\n readonly resolveJudgeProvider: JudgeProviderResolver;\r\n readonly maxOutputTokens?: number;\r\n readonly temperature?: number;\r\n readonly evaluatorTemplate?: string;\r\n}\r\n\r\nconst freeformEvaluationSchema = z.object({\r\n score: z.number().min(0).max(1).describe('Score between 0.0 and 1.0'),\r\n hits: z.array(z.string()).describe('Brief specific achievements').optional(),\r\n misses: z.array(z.string()).describe('Brief failures or omissions').optional(),\r\n reasoning: z.string().describe('Concise explanation (1-2 sentences)').optional(),\r\n});\r\n\r\nconst rubricCheckResultSchema = z.object({\r\n id: z.string().describe('The ID of the rubric item being checked'),\r\n satisfied: z.boolean().describe('Whether this rubric requirement is met'),\r\n reasoning: z.string().describe('Brief explanation (1-2 sentences) for this check'),\r\n});\r\n\r\nconst rubricEvaluationSchema = z.object({\r\n checks: z.array(rubricCheckResultSchema).describe('Results for each rubric item'),\r\n overall_reasoning: z.string().describe('Overall assessment summary (1-2 sentences)'),\r\n});\r\n\r\nexport class LlmJudgeEvaluator implements Evaluator {\r\n readonly kind = 'llm_judge';\r\n\r\n private readonly resolveJudgeProvider: JudgeProviderResolver;\r\n private readonly maxOutputTokens?: number;\r\n private readonly temperature?: number;\r\n private readonly evaluatorTemplate?: string;\r\n\r\n constructor(options: LlmJudgeEvaluatorOptions) {\r\n this.resolveJudgeProvider = options.resolveJudgeProvider;\r\n this.maxOutputTokens = options.maxOutputTokens;\r\n this.temperature = options.temperature;\r\n this.evaluatorTemplate = options.evaluatorTemplate;\r\n }\r\n\r\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\r\n const judgeProvider = await this.resolveJudgeProvider(context);\r\n if (!judgeProvider) {\r\n throw new Error('No judge provider available for LLM grading');\r\n }\r\n\r\n const config = context.evaluator;\r\n if (config?.type === 'llm_judge' && config.rubrics && config.rubrics.length > 0) {\r\n return this.evaluateWithRubrics(context, judgeProvider, config.rubrics);\r\n }\r\n\r\n return this.evaluateFreeform(context, judgeProvider);\r\n }\r\n\r\n private async evaluateFreeform(\r\n context: EvaluationContext,\r\n judgeProvider: Provider,\r\n ): Promise<EvaluationScore> {\r\n const formattedQuestion =\r\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\r\n ? context.promptInputs.question\r\n : context.evalCase.question;\r\n\r\n // Prepare template variables for substitution\r\n const variables = {\r\n [TEMPLATE_VARIABLES.INPUT_MESSAGES]: JSON.stringify(context.evalCase.input_segments, null, 2),\r\n [TEMPLATE_VARIABLES.EXPECTED_MESSAGES]: JSON.stringify(\r\n context.evalCase.expected_segments,\r\n null,\r\n 2,\r\n ),\r\n [TEMPLATE_VARIABLES.CANDIDATE_ANSWER]: context.candidate.trim(),\r\n [TEMPLATE_VARIABLES.REFERENCE_ANSWER]: (context.evalCase.reference_answer ?? '').trim(),\r\n [TEMPLATE_VARIABLES.EXPECTED_OUTCOME]: context.evalCase.expected_outcome.trim(),\r\n [TEMPLATE_VARIABLES.QUESTION]: formattedQuestion.trim(),\r\n };\r\n\r\n // Build system prompt (only the mandatory output schema)\r\n const systemPrompt = buildOutputSchema();\r\n\r\n // Build user prompt based on custom template or default template\r\n const evaluatorTemplate =\r\n context.evaluatorTemplateOverride ?? this.evaluatorTemplate ?? DEFAULT_EVALUATOR_TEMPLATE;\r\n const userPrompt = substituteVariables(evaluatorTemplate, variables);\r\n\r\n const evaluatorRawRequest: JsonObject = {\r\n userPrompt,\r\n systemPrompt,\r\n target: judgeProvider.targetName,\r\n };\r\n\r\n try {\r\n const { data, providerResponse } = await this.runWithRetry({\r\n context,\r\n judgeProvider,\r\n systemPrompt,\r\n userPrompt,\r\n schema: freeformEvaluationSchema,\r\n });\r\n\r\n const score = clampScore(data.score);\r\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\r\n const misses = Array.isArray(data.misses)\r\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\r\n : [];\r\n const reasoning = data.reasoning ?? providerResponse?.reasoning;\r\n const expectedAspectCount = Math.max(hits.length + misses.length, 1);\r\n\r\n return {\r\n score,\r\n verdict: scoreToVerdict(score),\r\n hits,\r\n misses,\r\n expectedAspectCount,\r\n reasoning,\r\n evaluatorRawRequest,\r\n };\r\n } catch {\r\n return {\r\n score: 0,\r\n verdict: 'fail',\r\n hits: [],\r\n misses: [],\r\n expectedAspectCount: 1,\r\n evaluatorRawRequest,\r\n };\r\n }\r\n }\r\n\r\n private async evaluateWithRubrics(\r\n context: EvaluationContext,\r\n judgeProvider: Provider,\r\n rubrics: readonly RubricItem[],\r\n ): Promise<EvaluationScore> {\r\n if (!rubrics || rubrics.length === 0) {\r\n throw new Error(\r\n `No rubrics found for evaluator \"${context.evaluator?.name ?? 'llm_judge'}\". Run \"agentv generate rubrics\" first.`,\r\n );\r\n }\r\n\r\n const prompt = this.buildRubricPrompt(context, rubrics);\r\n const systemPrompt = buildRubricOutputSchema();\r\n\r\n const evaluatorRawRequest: JsonObject = {\r\n userPrompt: prompt,\r\n systemPrompt,\r\n target: judgeProvider.targetName,\r\n };\r\n\r\n const { data } = await this.runWithRetry({\r\n context,\r\n judgeProvider,\r\n systemPrompt,\r\n userPrompt: prompt,\r\n schema: rubricEvaluationSchema,\r\n });\r\n\r\n const { score, verdict, hits, misses } = calculateRubricScore(data, rubrics);\r\n\r\n return {\r\n score,\r\n verdict,\r\n hits,\r\n misses,\r\n expectedAspectCount: rubrics.length,\r\n reasoning: data.overall_reasoning,\r\n evaluatorRawRequest,\r\n };\r\n }\r\n\r\n private buildRubricPrompt(context: EvaluationContext, rubrics: readonly RubricItem[]): string {\r\n const formattedQuestion =\r\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\r\n ? context.promptInputs.question\r\n : context.evalCase.question;\r\n\r\n const parts: string[] = [\r\n 'You are an expert evaluator. Evaluate the candidate answer against each rubric item below.',\r\n '',\r\n '[[ ## question ## ]]',\r\n formattedQuestion,\r\n '',\r\n '[[ ## expected_outcome ## ]]',\r\n context.evalCase.expected_outcome,\r\n '',\r\n ];\r\n\r\n if (context.evalCase.reference_answer && context.evalCase.reference_answer.trim().length > 0) {\r\n parts.push('[[ ## reference_answer ## ]]', context.evalCase.reference_answer, '');\r\n }\r\n\r\n parts.push('[[ ## candidate_answer ## ]]', context.candidate, '', '[[ ## rubrics ## ]]');\r\n\r\n for (const rubric of rubrics) {\r\n const requiredLabel = rubric.required ? ' (REQUIRED)' : '';\r\n const weightLabel = rubric.weight !== 1.0 ? ` (weight: ${rubric.weight})` : '';\r\n parts.push(`- [${rubric.id}]${requiredLabel}${weightLabel}: ${rubric.description}`);\r\n }\r\n\r\n parts.push('', 'For each rubric, determine if it is satisfied and provide brief reasoning.');\r\n\r\n return parts.join('\\n');\r\n }\r\n\r\n private async runWithRetry<T>(options: {\r\n readonly context: EvaluationContext;\r\n readonly judgeProvider: Provider;\r\n readonly systemPrompt: string;\r\n readonly userPrompt: string;\r\n readonly schema: z.ZodSchema<T>;\r\n }): Promise<{ data: T; providerResponse?: ProviderResponse }> {\r\n const { context, judgeProvider, systemPrompt, userPrompt, schema } = options;\r\n\r\n let lastError: Error | undefined;\r\n\r\n for (let attempt = 1; attempt <= 3; attempt++) {\r\n try {\r\n // Prefer Vercel AI SDK language model if available.\r\n const model = judgeProvider.asLanguageModel?.();\r\n if (model) {\r\n const { text } = await generateText({\r\n model,\r\n system: systemPrompt,\r\n prompt: userPrompt,\r\n ...(this.maxOutputTokens ? { maxTokens: this.maxOutputTokens } : {}),\r\n ...(typeof this.temperature === 'number' ? { temperature: this.temperature } : {}),\r\n });\r\n\r\n const data = schema.parse(parseJsonFromText(text));\r\n return { data };\r\n }\r\n\r\n const response = await judgeProvider.invoke({\r\n question: userPrompt,\r\n systemPrompt,\r\n evalCaseId: context.evalCase.id,\r\n attempt: context.attempt,\r\n maxOutputTokens: this.maxOutputTokens,\r\n temperature: this.temperature,\r\n });\r\n\r\n const data = schema.parse(parseJsonFromText(response.text ?? ''));\r\n return { data, providerResponse: response };\r\n } catch (e: unknown) {\r\n lastError = e instanceof Error ? e : new Error(String(e));\r\n }\r\n }\r\n\r\n throw new Error(`Failed to parse evaluator response after 3 attempts: ${lastError?.message}`);\r\n }\r\n}\r\n\r\n/**\r\n * Build the mandatory output schema that all evaluators must follow.\r\n * This schema is always appended to the evaluator template.\r\n */\r\nfunction buildOutputSchema(): string {\r\n return [\r\n 'You must respond with a single JSON object matching this schema:',\r\n '',\r\n '{',\r\n ' \"score\": <number between 0.0 and 1.0>,',\r\n ' \"hits\": [<array of strings, max 4 items, brief specific achievements>],',\r\n ' \"misses\": [<array of strings, max 4 items, brief specific failures or omissions, empty if none>],',\r\n ' \"reasoning\": \"<string, concise explanation for the score, 1-2 sentences max>\"',\r\n '}',\r\n ].join('\\n');\r\n}\r\n\r\nfunction buildRubricOutputSchema(): string {\r\n return `You are an expert evaluator. Evaluate the candidate answer against each rubric item.\r\nYou must return a valid JSON object matching this schema:\r\n{\r\n \"checks\": [\r\n {\r\n \"id\": \"string (rubric id)\",\r\n \"satisfied\": boolean,\r\n \"reasoning\": \"string (brief explanation)\"\r\n }\r\n ],\r\n \"overall_reasoning\": \"string (summary)\"\r\n}`;\r\n}\r\n\r\nfunction scoreToVerdict(score: number): EvaluationVerdict {\r\n if (score >= 0.8) {\r\n return 'pass';\r\n }\r\n if (score >= 0.6) {\r\n return 'borderline';\r\n }\r\n return 'fail';\r\n}\r\n\r\nfunction clampScore(value: number): number {\r\n if (Number.isNaN(value) || !Number.isFinite(value)) {\r\n return 0;\r\n }\r\n if (value < 0) {\r\n return 0;\r\n }\r\n if (value > 1) {\r\n return 1;\r\n }\r\n return value;\r\n}\r\n\r\nfunction extractJsonBlob(text: string): string | undefined {\r\n const match = text.match(/\\{[\\s\\S]*\\}/);\r\n return match?.[0];\r\n}\r\n\r\nfunction parseJsonFromText(text: string): unknown {\r\n const cleaned = typeof text === 'string' ? text.replace(/```json\\n?|```/g, '').trim() : '';\r\n const blob = extractJsonBlob(cleaned) ?? cleaned;\r\n return JSON.parse(blob);\r\n}\r\n\r\nfunction isNonEmptyString(value: unknown): value is string {\r\n return typeof value === 'string' && value.trim().length > 0;\r\n}\r\n\r\n// Code Evaluator\r\n\r\nexport interface CodeEvaluatorOptions {\r\n readonly script: string;\r\n readonly cwd?: string;\r\n readonly agentTimeoutMs?: number;\r\n}\r\n\r\nexport class CodeEvaluator implements Evaluator {\r\n readonly kind = 'code';\r\n\r\n private readonly script: string;\r\n private readonly cwd?: string;\r\n private readonly agentTimeoutMs?: number;\r\n\r\n constructor(options: CodeEvaluatorOptions) {\r\n this.script = options.script;\r\n this.cwd = options.cwd;\r\n this.agentTimeoutMs = options.agentTimeoutMs;\r\n }\r\n\r\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\r\n const inputPayload = JSON.stringify(\r\n {\r\n question: context.evalCase.question,\r\n expected_outcome: context.evalCase.expected_outcome,\r\n reference_answer: context.evalCase.reference_answer,\r\n candidate_answer: context.candidate,\r\n guideline_files: context.evalCase.guideline_paths,\r\n input_files: context.evalCase.file_paths.filter(\r\n (path) => !context.evalCase.guideline_paths.includes(path),\r\n ),\r\n input_messages: context.evalCase.input_messages,\r\n },\r\n null,\r\n 2,\r\n );\r\n\r\n try {\r\n const stdout = await executeScript(this.script, inputPayload, this.agentTimeoutMs, this.cwd);\r\n const parsed = parseJsonSafe(stdout);\r\n const score = clampScore(typeof parsed?.score === 'number' ? parsed.score : 0);\r\n const hits = Array.isArray(parsed?.hits) ? parsed.hits.filter(isNonEmptyString) : [];\r\n const misses = Array.isArray(parsed?.misses) ? parsed.misses.filter(isNonEmptyString) : [];\r\n const reasoning = typeof parsed?.reasoning === 'string' ? parsed.reasoning : undefined;\r\n\r\n return {\r\n score,\r\n verdict: scoreToVerdict(score),\r\n hits,\r\n misses,\r\n expectedAspectCount: hits.length + misses.length || 1,\r\n reasoning,\r\n evaluatorRawRequest: {\r\n script: this.script,\r\n ...(this.cwd ? { cwd: this.cwd } : {}),\r\n },\r\n };\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n return {\r\n score: 0,\r\n verdict: 'fail',\r\n hits: [],\r\n misses: [`Code evaluator failed: ${message}`],\r\n expectedAspectCount: 1,\r\n reasoning: message,\r\n evaluatorRawRequest: {\r\n script: this.script,\r\n ...(this.cwd ? { cwd: this.cwd } : {}),\r\n error: message,\r\n },\r\n };\r\n }\r\n }\r\n}\r\n\r\nfunction calculateRubricScore(\r\n result: z.infer<typeof rubricEvaluationSchema>,\r\n rubrics: readonly RubricItem[],\r\n): {\r\n score: number;\r\n verdict: EvaluationVerdict;\r\n hits: string[];\r\n misses: string[];\r\n} {\r\n const rubricMap = new Map(rubrics.map((rubric) => [rubric.id, rubric]));\r\n const hits: string[] = [];\r\n const misses: string[] = [];\r\n let totalWeight = 0;\r\n let earnedWeight = 0;\r\n let failedRequired = false;\r\n\r\n for (const check of result.checks) {\r\n const rubric = rubricMap.get(check.id);\r\n if (!rubric) {\r\n continue;\r\n }\r\n\r\n totalWeight += rubric.weight;\r\n\r\n if (check.satisfied) {\r\n earnedWeight += rubric.weight;\r\n hits.push(`[${rubric.id}] ${rubric.description}: ${check.reasoning}`);\r\n } else {\r\n misses.push(`[${rubric.id}] ${rubric.description}: ${check.reasoning}`);\r\n if (rubric.required) {\r\n failedRequired = true;\r\n }\r\n }\r\n }\r\n\r\n const score = totalWeight > 0 ? Math.min(1, Math.max(0, earnedWeight / totalWeight)) : 0;\r\n const verdict = failedRequired ? 'fail' : scoreToVerdict(score);\r\n return { score, verdict, hits, misses };\r\n}\r\n\r\n// Helper functions for CodeEvaluator\r\n\r\nasync function executeScript(\r\n scriptPath: string,\r\n input: string,\r\n agentTimeoutMs?: number,\r\n cwd?: string,\r\n): Promise<string> {\r\n const { spawn } = await import('node:child_process');\r\n\r\n return await new Promise<string>((resolve, reject) => {\r\n const child = spawn(scriptPath, {\r\n shell: true,\r\n cwd,\r\n });\r\n\r\n let stdout = '';\r\n let stderr = '';\r\n\r\n const timeout = agentTimeoutMs\r\n ? setTimeout(() => {\r\n child.kill();\r\n reject(new Error(`Code evaluator timed out after ${agentTimeoutMs}ms`));\r\n }, agentTimeoutMs)\r\n : undefined;\r\n\r\n child.stdout?.on('data', (data) => {\r\n stdout += data.toString();\r\n });\r\n child.stderr?.on('data', (data) => {\r\n stderr += data.toString();\r\n });\r\n child.on('error', (error) => {\r\n if (timeout !== undefined) {\r\n clearTimeout(timeout);\r\n }\r\n reject(error);\r\n });\r\n child.on('exit', (code) => {\r\n if (timeout !== undefined) {\r\n clearTimeout(timeout);\r\n }\r\n if (code && code !== 0 && stderr.length > 0) {\r\n reject(new Error(`Code evaluator exited with code ${code}: ${stderr.trim()}`));\r\n return;\r\n }\r\n resolve(stdout.trim());\r\n });\r\n\r\n child.stdin?.write(input);\r\n child.stdin?.end();\r\n });\r\n}\r\n\r\nfunction parseJsonSafe(payload: string): Record<string, unknown> | undefined {\r\n try {\r\n return JSON.parse(payload) as Record<string, unknown>;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction substituteVariables(template: string, variables: Record<string, string>): string {\r\n return template.replace(/\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g, (match, varName) => {\r\n return variables[varName] ?? match;\r\n });\r\n}\r\n\r\n// Tool Trajectory Evaluator\r\n\r\nexport interface ToolTrajectoryEvaluatorOptions {\r\n readonly config: ToolTrajectoryEvaluatorConfig;\r\n}\r\n\r\nexport class ToolTrajectoryEvaluator implements Evaluator {\r\n readonly kind = 'tool_trajectory';\r\n\r\n private readonly config: ToolTrajectoryEvaluatorConfig;\r\n\r\n constructor(options: ToolTrajectoryEvaluatorOptions) {\r\n this.config = options.config;\r\n }\r\n\r\n evaluate(context: EvaluationContext): EvaluationScore {\r\n const { candidateTrace, candidateTraceSummary } = context;\r\n\r\n // Handle missing trace\r\n if (!candidateTrace || !candidateTraceSummary) {\r\n return {\r\n score: 0,\r\n verdict: 'fail',\r\n hits: [],\r\n misses: ['No trace available for evaluation'],\r\n expectedAspectCount: 1,\r\n };\r\n }\r\n\r\n switch (this.config.mode) {\r\n case 'any_order':\r\n return this.evaluateAnyOrder(candidateTraceSummary);\r\n case 'in_order':\r\n return this.evaluateInOrder(candidateTrace);\r\n case 'exact':\r\n return this.evaluateExact(candidateTrace);\r\n default:\r\n return {\r\n score: 0,\r\n verdict: 'fail',\r\n hits: [],\r\n misses: [`Unknown mode: ${this.config.mode}`],\r\n expectedAspectCount: 1,\r\n };\r\n }\r\n }\r\n\r\n private evaluateAnyOrder(summary: TraceSummary): EvaluationScore {\r\n const minimums = this.config.minimums ?? {};\r\n const toolNames = Object.keys(minimums);\r\n\r\n if (toolNames.length === 0) {\r\n return {\r\n score: 1,\r\n verdict: 'pass',\r\n hits: ['No tool requirements specified'],\r\n misses: [],\r\n expectedAspectCount: 0,\r\n };\r\n }\r\n\r\n const hits: string[] = [];\r\n const misses: string[] = [];\r\n\r\n for (const toolName of toolNames) {\r\n const required = minimums[toolName];\r\n const actual = summary.toolCallsByName[toolName] ?? 0;\r\n if (actual >= required) {\r\n hits.push(`${toolName}: called ${actual} times (required ≥${required})`);\r\n } else {\r\n misses.push(`${toolName}: called ${actual} times (required ≥${required})`);\r\n }\r\n }\r\n\r\n const score = hits.length / toolNames.length;\r\n\r\n return {\r\n score,\r\n verdict: scoreToVerdict(score),\r\n hits,\r\n misses,\r\n expectedAspectCount: toolNames.length,\r\n };\r\n }\r\n\r\n private evaluateInOrder(trace: readonly TraceEvent[]): EvaluationScore {\r\n const expected = this.config.expected ?? [];\r\n\r\n if (expected.length === 0) {\r\n return {\r\n score: 1,\r\n verdict: 'pass',\r\n hits: ['No tool sequence specified'],\r\n misses: [],\r\n expectedAspectCount: 0,\r\n };\r\n }\r\n\r\n const actualToolCalls = trace.filter((e) => e.type === 'tool_call' && e.name);\r\n\r\n const hits: string[] = [];\r\n const misses: string[] = [];\r\n let actualIndex = 0;\r\n\r\n for (let i = 0; i < expected.length; i++) {\r\n const expectedTool = expected[i].tool;\r\n let found = false;\r\n\r\n while (actualIndex < actualToolCalls.length) {\r\n if (actualToolCalls[actualIndex].name === expectedTool) {\r\n hits.push(`Found ${expectedTool} at position ${actualIndex}`);\r\n actualIndex++;\r\n found = true;\r\n break;\r\n }\r\n actualIndex++;\r\n }\r\n\r\n if (!found) {\r\n misses.push(`Expected ${expectedTool} at position ${i}, not found in remaining trace`);\r\n }\r\n }\r\n\r\n const score = hits.length / expected.length;\r\n\r\n return {\r\n score,\r\n verdict: scoreToVerdict(score),\r\n hits,\r\n misses,\r\n expectedAspectCount: expected.length,\r\n };\r\n }\r\n\r\n private evaluateExact(trace: readonly TraceEvent[]): EvaluationScore {\r\n const expected = this.config.expected ?? [];\r\n\r\n if (expected.length === 0) {\r\n return {\r\n score: 1,\r\n verdict: 'pass',\r\n hits: ['No tool sequence specified'],\r\n misses: [],\r\n expectedAspectCount: 0,\r\n };\r\n }\r\n\r\n const actualToolCalls = trace.filter((e) => e.type === 'tool_call' && e.name);\r\n\r\n const hits: string[] = [];\r\n const misses: string[] = [];\r\n\r\n if (actualToolCalls.length !== expected.length) {\r\n misses.push(`Expected ${expected.length} tool calls, got ${actualToolCalls.length}`);\r\n }\r\n\r\n const checkLength = Math.min(expected.length, actualToolCalls.length);\r\n for (let i = 0; i < checkLength; i++) {\r\n const expectedTool = expected[i].tool;\r\n const actualTool = actualToolCalls[i].name;\r\n if (actualTool === expectedTool) {\r\n hits.push(`Position ${i}: ${expectedTool} ✓`);\r\n } else {\r\n misses.push(`Position ${i}: expected ${expectedTool}, got ${actualTool}`);\r\n }\r\n }\r\n\r\n for (let i = checkLength; i < expected.length; i++) {\r\n misses.push(`Position ${i}: expected ${expected[i].tool}, got nothing`);\r\n }\r\n\r\n const score = hits.length / expected.length;\r\n\r\n return {\r\n score,\r\n verdict: scoreToVerdict(score),\r\n hits,\r\n misses,\r\n expectedAspectCount: expected.length,\r\n };\r\n }\r\n}\r\n\r\n// Expected Messages Tool Calls Evaluator\r\n\r\n/**\r\n * Evaluator that validates tool_calls in expected_messages against the actual trace.\r\n * Extracts tool_calls from assistant messages in expected_messages and compares them\r\n * sequentially against tool_call events in the trace.\r\n */\r\nexport class ExpectedMessagesEvaluator implements Evaluator {\r\n readonly kind = 'expected_messages';\r\n\r\n evaluate(context: EvaluationContext): EvaluationScore {\r\n const { candidateTrace, evalCase } = context;\r\n const expectedSegments = evalCase.expected_segments;\r\n\r\n // Extract tool_calls from expected_messages (assistant messages only)\r\n const expectedToolCalls = this.extractExpectedToolCalls(expectedSegments);\r\n\r\n if (expectedToolCalls.length === 0) {\r\n // No tool_calls to validate - pass by default\r\n return {\r\n score: 1,\r\n verdict: 'pass',\r\n hits: ['No tool_calls specified in expected_messages'],\r\n misses: [],\r\n expectedAspectCount: 1,\r\n };\r\n }\r\n\r\n // Handle missing trace\r\n if (!candidateTrace || candidateTrace.length === 0) {\r\n return {\r\n score: 0,\r\n verdict: 'fail',\r\n hits: [],\r\n misses: ['No trace available to validate tool_calls'],\r\n expectedAspectCount: expectedToolCalls.length,\r\n };\r\n }\r\n\r\n // Extract actual tool_call events from trace\r\n const actualToolCalls = candidateTrace.filter((e) => e.type === 'tool_call');\r\n\r\n // Validate sequentially\r\n return this.validateToolCalls(expectedToolCalls, actualToolCalls);\r\n }\r\n\r\n private extractExpectedToolCalls(\r\n segments: readonly JsonObject[] | undefined,\r\n ): readonly { tool: string; input?: unknown }[] {\r\n if (!segments) {\r\n return [];\r\n }\r\n\r\n const toolCalls: { tool: string; input?: unknown }[] = [];\r\n for (const segment of segments) {\r\n const role = segment.role;\r\n const segmentToolCalls = segment.tool_calls;\r\n if (role === 'assistant' && Array.isArray(segmentToolCalls)) {\r\n for (const tc of segmentToolCalls) {\r\n if (\r\n typeof tc === 'object' &&\r\n tc !== null &&\r\n typeof (tc as { tool?: unknown }).tool === 'string'\r\n ) {\r\n const toolCall = tc as { tool: string; input?: unknown };\r\n toolCalls.push({ tool: toolCall.tool, input: toolCall.input });\r\n }\r\n }\r\n }\r\n }\r\n return toolCalls;\r\n }\r\n\r\n private validateToolCalls(\r\n expected: readonly { tool: string; input?: unknown }[],\r\n actual: readonly TraceEvent[],\r\n ): EvaluationScore {\r\n const hits: string[] = [];\r\n const misses: string[] = [];\r\n\r\n for (let i = 0; i < expected.length; i++) {\r\n const expectedCall = expected[i];\r\n const actualCall = actual[i];\r\n\r\n if (!actualCall) {\r\n misses.push(\r\n `tool_calls[${i}]: expected ${expectedCall.tool}, but no more tool calls in trace`,\r\n );\r\n continue;\r\n }\r\n\r\n // Check tool name\r\n if (actualCall.name !== expectedCall.tool) {\r\n misses.push(\r\n `tool_calls[${i}]: expected ${expectedCall.tool}, got ${actualCall.name ?? 'unknown'}`,\r\n );\r\n continue;\r\n }\r\n\r\n // Check input if specified\r\n if (expectedCall.input !== undefined) {\r\n if (!this.deepEquals(expectedCall.input, actualCall.input)) {\r\n misses.push(`tool_calls[${i}]: ${expectedCall.tool} input mismatch`);\r\n continue;\r\n }\r\n }\r\n\r\n hits.push(`tool_calls[${i}]: ${expectedCall.tool} matched`);\r\n }\r\n\r\n const totalChecks = expected.length || 1;\r\n const score = hits.length / totalChecks;\r\n\r\n return {\r\n score,\r\n verdict: score >= 0.8 ? 'pass' : score >= 0.6 ? 'borderline' : 'fail',\r\n hits,\r\n misses,\r\n expectedAspectCount: totalChecks,\r\n };\r\n }\r\n\r\n private deepEquals(a: unknown, b: unknown): boolean {\r\n if (a === b) return true;\r\n if (typeof a !== typeof b) return false;\r\n if (typeof a !== 'object' || a === null || b === null) return false;\r\n\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n if (a.length !== b.length) return false;\r\n return a.every((val, i) => this.deepEquals(val, b[i]));\r\n }\r\n\r\n if (Array.isArray(a) || Array.isArray(b)) return false;\r\n\r\n const aObj = a as Record<string, unknown>;\r\n const bObj = b as Record<string, unknown>;\r\n const aKeys = Object.keys(aObj);\r\n const bKeys = Object.keys(bObj);\r\n\r\n if (aKeys.length !== bKeys.length) return false;\r\n return aKeys.every((key) => this.deepEquals(aObj[key], bObj[key]));\r\n }\r\n}\r\n\r\n// Composite Evaluator\r\n\r\nexport interface EvaluatorFactory {\r\n create(config: EvaluatorConfig, context: EvaluationContext): Evaluator;\r\n}\r\n\r\ninterface MemberResult {\r\n readonly id: string;\r\n readonly type: string;\r\n readonly result: EvaluationScore;\r\n}\r\n\r\nconst DEFAULT_COMPOSITE_AGGREGATOR_PROMPT = `Review the following evaluation results:\r\n{{EVALUATOR_RESULTS_JSON}}\r\n\r\nDecide the final score and verdict based on all evaluator results.\r\nReturn a JSON object with: score (0.0-1.0), verdict (pass/fail/borderline), and reasoning.`;\r\n\r\nexport interface CompositeEvaluatorOptions {\r\n readonly config: import('./types.js').CompositeEvaluatorConfig;\r\n readonly evaluatorFactory: EvaluatorFactory;\r\n readonly cwd?: string;\r\n}\r\n\r\nexport class CompositeEvaluator implements Evaluator {\r\n readonly kind = 'composite';\r\n\r\n private readonly config: import('./types.js').CompositeEvaluatorConfig;\r\n private readonly evaluatorFactory: EvaluatorFactory;\r\n private readonly cwd?: string;\r\n\r\n constructor(options: CompositeEvaluatorOptions) {\r\n this.config = options.config;\r\n this.evaluatorFactory = options.evaluatorFactory;\r\n this.cwd = options.cwd;\r\n }\r\n\r\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\r\n // 1. Instantiate and run evaluators in parallel\r\n const memberResults = await Promise.all(\r\n this.config.evaluators.map(async (memberConfig) => {\r\n const evaluator = this.evaluatorFactory.create(memberConfig, context);\r\n return {\r\n id: memberConfig.name,\r\n type: memberConfig.type,\r\n result: await evaluator.evaluate(context),\r\n };\r\n }),\r\n );\r\n\r\n // 2. Aggregate results\r\n return this.aggregate(memberResults, context);\r\n }\r\n\r\n private async aggregate(\r\n results: readonly MemberResult[],\r\n context: EvaluationContext,\r\n ): Promise<EvaluationScore> {\r\n const aggregator = this.config.aggregator;\r\n\r\n switch (aggregator.type) {\r\n case 'code_judge':\r\n return this.runCodeAggregator(results, aggregator.path, aggregator.cwd ?? this.cwd);\r\n case 'llm_judge':\r\n return this.runLlmAggregator(results, context, aggregator);\r\n default:\r\n return this.runWeightedAverage(results, aggregator.weights);\r\n }\r\n }\r\n\r\n private runWeightedAverage(\r\n results: readonly MemberResult[],\r\n weights?: Record<string, number>,\r\n ): EvaluationScore {\r\n let totalWeight = 0;\r\n let weightedSum = 0;\r\n const allHits: string[] = [];\r\n const allMisses: string[] = [];\r\n const reasoningParts: string[] = [];\r\n const evaluatorResults: ChildEvaluatorResult[] = [];\r\n\r\n for (const member of results) {\r\n const weight = weights?.[member.id] ?? 1.0;\r\n totalWeight += weight;\r\n weightedSum += member.result.score * weight;\r\n allHits.push(...member.result.hits.map((h) => `[${member.id}] ${h}`));\r\n allMisses.push(...member.result.misses.map((m) => `[${member.id}] ${m}`));\r\n if (member.result.reasoning) {\r\n reasoningParts.push(`${member.id}: ${member.result.reasoning}`);\r\n }\r\n\r\n // Build child result entry\r\n evaluatorResults.push({\r\n name: member.id,\r\n type: member.type,\r\n score: member.result.score,\r\n weight,\r\n verdict: member.result.verdict,\r\n hits: [...member.result.hits],\r\n misses: [...member.result.misses],\r\n reasoning: member.result.reasoning,\r\n evaluatorRawRequest: member.result.evaluatorRawRequest,\r\n evaluatorResults: member.result.evaluatorResults,\r\n });\r\n }\r\n\r\n const finalScore = totalWeight > 0 ? weightedSum / totalWeight : 0;\r\n\r\n return {\r\n score: clampScore(finalScore),\r\n verdict: scoreToVerdict(finalScore),\r\n hits: allHits,\r\n misses: allMisses,\r\n expectedAspectCount: Math.max(allHits.length + allMisses.length, 1),\r\n reasoning: reasoningParts.length > 0 ? reasoningParts.join('; ') : undefined,\r\n evaluatorRawRequest: {\r\n aggregator: 'weighted_average',\r\n ...(weights ? { weights } : {}),\r\n },\r\n evaluatorResults,\r\n };\r\n }\r\n\r\n private async runCodeAggregator(\r\n results: readonly MemberResult[],\r\n scriptPath: string,\r\n cwd?: string,\r\n weights?: Record<string, number>,\r\n ): Promise<EvaluationScore> {\r\n const resultsObject = Object.fromEntries(results.map((r) => [r.id, r.result]));\r\n const inputPayload = JSON.stringify({ results: resultsObject }, null, 2);\r\n\r\n // Build child results for output\r\n const evaluatorResults: ChildEvaluatorResult[] = results.map((member) => ({\r\n name: member.id,\r\n type: member.type,\r\n score: member.result.score,\r\n weight: weights?.[member.id] ?? 1.0,\r\n verdict: member.result.verdict,\r\n hits: [...member.result.hits],\r\n misses: [...member.result.misses],\r\n reasoning: member.result.reasoning,\r\n evaluatorRawRequest: member.result.evaluatorRawRequest,\r\n evaluatorResults: member.result.evaluatorResults,\r\n }));\r\n\r\n try {\r\n const stdout = await executeScript(scriptPath, inputPayload, undefined, cwd);\r\n const parsed = parseJsonSafe(stdout);\r\n const score = clampScore(typeof parsed?.score === 'number' ? parsed.score : 0);\r\n const hits = Array.isArray(parsed?.hits) ? parsed.hits.filter(isNonEmptyString) : [];\r\n const misses = Array.isArray(parsed?.misses) ? parsed.misses.filter(isNonEmptyString) : [];\r\n const reasoning = typeof parsed?.reasoning === 'string' ? parsed.reasoning : undefined;\r\n const verdict =\r\n typeof parsed?.verdict === 'string' &&\r\n (parsed.verdict === 'pass' || parsed.verdict === 'fail' || parsed.verdict === 'borderline')\r\n ? parsed.verdict\r\n : scoreToVerdict(score);\r\n\r\n return {\r\n score,\r\n verdict,\r\n hits,\r\n misses,\r\n expectedAspectCount: hits.length + misses.length || 1,\r\n reasoning,\r\n evaluatorRawRequest: {\r\n aggregator: 'code_judge',\r\n script: scriptPath,\r\n },\r\n evaluatorResults,\r\n };\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n return {\r\n score: 0,\r\n verdict: 'fail',\r\n hits: [],\r\n misses: [`Code aggregator failed: ${message}`],\r\n expectedAspectCount: 1,\r\n reasoning: message,\r\n evaluatorRawRequest: {\r\n aggregator: 'code_judge',\r\n script: scriptPath,\r\n error: message,\r\n },\r\n evaluatorResults,\r\n };\r\n }\r\n }\r\n\r\n private async runLlmAggregator(\r\n results: readonly MemberResult[],\r\n context: EvaluationContext,\r\n config: Extract<import('./types.js').CompositeAggregatorConfig, { type: 'llm_judge' }>,\r\n ): Promise<EvaluationScore> {\r\n const judgeProvider = context.judgeProvider;\r\n if (!judgeProvider) {\r\n throw new Error('No judge provider available for LLM aggregation');\r\n }\r\n\r\n const resultsObject = Object.fromEntries(results.map((r) => [r.id, r.result]));\r\n const resultsJson = JSON.stringify(resultsObject, null, 2);\r\n\r\n // Build child results for output\r\n const evaluatorResults: ChildEvaluatorResult[] = results.map((member) => ({\r\n name: member.id,\r\n type: member.type,\r\n score: member.result.score,\r\n verdict: member.result.verdict,\r\n hits: [...member.result.hits],\r\n misses: [...member.result.misses],\r\n reasoning: member.result.reasoning,\r\n evaluatorRawRequest: member.result.evaluatorRawRequest,\r\n evaluatorResults: member.result.evaluatorResults,\r\n }));\r\n\r\n // Use custom prompt if provided, otherwise use default\r\n const promptTemplate = config.prompt ?? DEFAULT_COMPOSITE_AGGREGATOR_PROMPT;\r\n const userPrompt = promptTemplate.replace(/\\{\\{EVALUATOR_RESULTS_JSON\\}\\}/g, resultsJson);\r\n\r\n const systemPrompt = buildOutputSchema();\r\n\r\n const evaluatorRawRequest: JsonObject = {\r\n aggregator: 'llm_judge',\r\n userPrompt,\r\n systemPrompt,\r\n target: judgeProvider.targetName,\r\n };\r\n\r\n try {\r\n const model = judgeProvider.asLanguageModel?.();\r\n if (model) {\r\n const { text } = await generateText({\r\n model,\r\n system: systemPrompt,\r\n prompt: userPrompt,\r\n });\r\n\r\n const data = freeformEvaluationSchema.parse(parseJsonFromText(text));\r\n const score = clampScore(data.score);\r\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\r\n const misses = Array.isArray(data.misses)\r\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\r\n : [];\r\n const reasoning = data.reasoning;\r\n\r\n return {\r\n score,\r\n verdict: scoreToVerdict(score),\r\n hits,\r\n misses,\r\n expectedAspectCount: Math.max(hits.length + misses.length, 1),\r\n reasoning,\r\n evaluatorRawRequest,\r\n evaluatorResults,\r\n };\r\n }\r\n\r\n const response = await judgeProvider.invoke({\r\n question: userPrompt,\r\n systemPrompt,\r\n evalCaseId: context.evalCase.id,\r\n attempt: context.attempt,\r\n });\r\n\r\n const data = freeformEvaluationSchema.parse(parseJsonFromText(response.text ?? ''));\r\n const score = clampScore(data.score);\r\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\r\n const misses = Array.isArray(data.misses)\r\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\r\n : [];\r\n const reasoning = data.reasoning ?? response.reasoning;\r\n\r\n return {\r\n score,\r\n verdict: scoreToVerdict(score),\r\n hits,\r\n misses,\r\n expectedAspectCount: Math.max(hits.length + misses.length, 1),\r\n reasoning,\r\n evaluatorRawRequest,\r\n evaluatorResults,\r\n };\r\n } catch {\r\n return {\r\n score: 0,\r\n verdict: 'fail',\r\n hits: [],\r\n misses: [],\r\n expectedAspectCount: 1,\r\n evaluatorRawRequest,\r\n evaluatorResults,\r\n };\r\n }\r\n }\r\n}\r\n","import { createHash, randomUUID } from 'node:crypto';\r\nimport { mkdir, writeFile } from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport pLimit from 'p-limit';\r\n\r\nimport {\r\n type ChildEvaluatorResult,\r\n CodeEvaluator,\r\n CompositeEvaluator,\r\n type EvaluationScore,\r\n type Evaluator,\r\n ExpectedMessagesEvaluator,\r\n LlmJudgeEvaluator,\r\n ToolTrajectoryEvaluator,\r\n} from './evaluators.js';\r\nimport { readJsonFile, readTextFile } from './file-utils.js';\r\nimport { createProvider } from './providers/index.js';\r\nimport { type ResolvedTarget, resolveTargetDefinition } from './providers/targets.js';\r\nimport type {\r\n EnvLookup,\r\n Provider,\r\n ProviderRequest,\r\n ProviderResponse,\r\n TargetDefinition,\r\n} from './providers/types.js';\r\nimport { isAgentProvider } from './providers/types.js';\r\nimport {\r\n type ToolTrajectoryEvaluatorConfig,\r\n type TraceEvent,\r\n type TraceSummary,\r\n computeTraceSummary,\r\n isTraceEvent,\r\n} from './trace.js';\r\nimport type {\r\n EvalCase,\r\n EvaluationResult,\r\n EvaluationVerdict,\r\n EvaluatorConfig,\r\n EvaluatorKind,\r\n EvaluatorResult,\r\n JsonObject,\r\n JsonValue,\r\n} from './types.js';\r\nimport { type PromptInputs, buildPromptInputs, loadEvalCases } from './yaml-parser.js';\r\n\r\ntype MaybePromise<T> = T | Promise<T>;\r\n\r\nexport interface EvaluationCache {\r\n get(key: string): MaybePromise<ProviderResponse | undefined>;\r\n set(key: string, value: ProviderResponse): MaybePromise<void>;\r\n}\r\n\r\nexport interface RunEvalCaseOptions {\r\n readonly evalCase: EvalCase;\r\n readonly provider: Provider;\r\n readonly target: ResolvedTarget;\r\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\r\n readonly now?: () => Date;\r\n readonly maxRetries?: number;\r\n readonly agentTimeoutMs?: number;\r\n readonly promptDumpDir?: string;\r\n readonly cache?: EvaluationCache;\r\n readonly useCache?: boolean;\r\n readonly signal?: AbortSignal;\r\n readonly judgeProvider?: Provider;\r\n}\r\n\r\nexport interface ProgressEvent {\r\n readonly workerId: number;\r\n readonly evalId: string;\r\n readonly status: 'pending' | 'running' | 'completed' | 'failed';\r\n readonly startedAt?: number;\r\n readonly completedAt?: number;\r\n readonly error?: string;\r\n}\r\n\r\nexport interface RunEvaluationOptions {\r\n readonly testFilePath: string;\r\n readonly repoRoot: URL | string;\r\n readonly target: ResolvedTarget;\r\n readonly targets?: readonly TargetDefinition[];\r\n readonly env?: EnvLookup;\r\n readonly providerFactory?: (target: ResolvedTarget) => Provider;\r\n readonly evaluators?: Partial<Record<string, Evaluator>>;\r\n readonly maxRetries?: number;\r\n readonly agentTimeoutMs?: number;\r\n readonly promptDumpDir?: string;\r\n readonly cache?: EvaluationCache;\r\n readonly useCache?: boolean;\r\n readonly now?: () => Date;\r\n readonly evalId?: string;\r\n readonly verbose?: boolean;\r\n readonly maxConcurrency?: number;\r\n readonly evalCases?: readonly EvalCase[];\r\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\r\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\r\n}\r\n\r\nexport async function runEvaluation(\r\n options: RunEvaluationOptions,\r\n): Promise<readonly EvaluationResult[]> {\r\n const {\r\n testFilePath: evalFilePath,\r\n repoRoot,\r\n target,\r\n targets,\r\n env,\r\n providerFactory,\r\n evaluators,\r\n maxRetries,\r\n agentTimeoutMs,\r\n promptDumpDir,\r\n cache,\r\n useCache,\r\n now,\r\n evalId,\r\n verbose,\r\n evalCases: preloadedEvalCases,\r\n onResult,\r\n onProgress,\r\n } = options;\r\n\r\n // Use pre-loaded eval cases if provided, otherwise load them\r\n const evalCases =\r\n preloadedEvalCases ?? (await loadEvalCases(evalFilePath, repoRoot, { verbose, evalId }));\r\n\r\n const filteredEvalCases = filterEvalCases(evalCases, evalId);\r\n if (filteredEvalCases.length === 0) {\r\n if (evalId) {\r\n throw new Error(`Eval case with id '${evalId}' not found in ${evalFilePath}`);\r\n }\r\n return [];\r\n }\r\n\r\n const resolvedTargetsByName = new Map<string, ResolvedTarget>();\r\n resolvedTargetsByName.set(target.name, target);\r\n\r\n const targetDefinitions = new Map<string, TargetDefinition>();\r\n for (const definition of targets ?? []) {\r\n targetDefinitions.set(definition.name, definition);\r\n }\r\n\r\n const envLookup: EnvLookup = env ?? process.env;\r\n const providerCache = new Map<string, Provider>();\r\n\r\n const getOrCreateProvider = (resolved: ResolvedTarget): Provider => {\r\n const existing = providerCache.get(resolved.name);\r\n if (existing) {\r\n return existing;\r\n }\r\n const factory = providerFactory ?? createProvider;\r\n const instance = factory(resolved);\r\n providerCache.set(resolved.name, instance);\r\n return instance;\r\n };\r\n\r\n const resolveTargetByName = (name: string): ResolvedTarget | undefined => {\r\n if (resolvedTargetsByName.has(name)) {\r\n return resolvedTargetsByName.get(name);\r\n }\r\n const definition = targetDefinitions.get(name);\r\n if (!definition) {\r\n return undefined;\r\n }\r\n const resolved = resolveTargetDefinition(definition, envLookup, evalFilePath);\r\n resolvedTargetsByName.set(name, resolved);\r\n return resolved;\r\n };\r\n\r\n const resolveJudgeProvider = async (\r\n targetContext: ResolvedTarget,\r\n ): Promise<Provider | undefined> => {\r\n const judgeName = targetContext.judgeTarget ?? targetContext.name;\r\n const resolvedJudge = resolveTargetByName(judgeName);\r\n if (!resolvedJudge) {\r\n return getOrCreateProvider(targetContext);\r\n }\r\n return getOrCreateProvider(resolvedJudge);\r\n };\r\n\r\n const evaluatorRegistry = buildEvaluatorRegistry(evaluators, resolveJudgeProvider);\r\n\r\n const primaryProvider = getOrCreateProvider(target);\r\n const providerSupportsBatch =\r\n target.providerBatching === true &&\r\n primaryProvider.supportsBatch === true &&\r\n typeof primaryProvider.invokeBatch === 'function';\r\n if (target.providerBatching && !providerSupportsBatch && verbose) {\r\n console.warn(\r\n `Provider batching requested for target '${target.name}', but provider does not advertise batch support. Using per-case dispatch.`,\r\n );\r\n }\r\n\r\n // Notify about total test count before starting\r\n if (onProgress && filteredEvalCases.length > 0) {\r\n // Emit initial pending events for all tests\r\n for (let i = 0; i < filteredEvalCases.length; i++) {\r\n await onProgress({\r\n workerId: i + 1,\r\n evalId: filteredEvalCases[i].id,\r\n status: 'pending',\r\n });\r\n }\r\n }\r\n\r\n if (providerSupportsBatch) {\r\n try {\r\n return await runBatchEvaluation({\r\n evalCases: filteredEvalCases,\r\n provider: primaryProvider,\r\n target,\r\n evaluatorRegistry,\r\n promptDumpDir,\r\n nowFn: now ?? (() => new Date()),\r\n onProgress,\r\n onResult,\r\n verbose,\r\n resolveJudgeProvider,\r\n agentTimeoutMs,\r\n });\r\n } catch (error) {\r\n if (verbose) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n console.warn(\r\n `Provider batch execution failed, falling back to per-case dispatch: ${message}`,\r\n );\r\n }\r\n }\r\n }\r\n\r\n // Resolve worker count: CLI option > target setting > default (1)\r\n const workers = options.maxConcurrency ?? target.workers ?? 1;\r\n const limit = pLimit(workers);\r\n\r\n // Track worker assignments for progress reporting\r\n let nextWorkerId = 1;\r\n const workerIdByEvalId = new Map<string, number>();\r\n\r\n // Map test cases to limited promises for parallel execution\r\n const promises = filteredEvalCases.map((evalCase) =>\r\n limit(async () => {\r\n // Assign worker ID when test starts executing\r\n const workerId = nextWorkerId++;\r\n workerIdByEvalId.set(evalCase.id, workerId);\r\n\r\n if (onProgress) {\r\n await onProgress({\r\n workerId,\r\n evalId: evalCase.id,\r\n status: 'running',\r\n startedAt: Date.now(),\r\n });\r\n }\r\n\r\n try {\r\n const judgeProvider = await resolveJudgeProvider(target);\r\n const result = await runEvalCase({\r\n evalCase: evalCase,\r\n provider: primaryProvider,\r\n target,\r\n evaluators: evaluatorRegistry,\r\n maxRetries,\r\n agentTimeoutMs,\r\n promptDumpDir,\r\n cache,\r\n useCache,\r\n now,\r\n judgeProvider,\r\n });\r\n\r\n if (onProgress) {\r\n await onProgress({\r\n workerId,\r\n evalId: evalCase.id,\r\n status: result.error ? 'failed' : 'completed',\r\n startedAt: 0, // Not used for completed status\r\n completedAt: Date.now(),\r\n error: result.error,\r\n });\r\n }\r\n\r\n if (onResult) {\r\n await onResult(result);\r\n }\r\n return result;\r\n } catch (error) {\r\n if (onProgress) {\r\n await onProgress({\r\n workerId,\r\n evalId: evalCase.id,\r\n status: 'failed',\r\n completedAt: Date.now(),\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n }\r\n throw error;\r\n }\r\n }),\r\n );\r\n\r\n // Wait for all workers to complete\r\n const settled = await Promise.allSettled(promises);\r\n\r\n // Extract results, handling both fulfilled and rejected promises\r\n const results: EvaluationResult[] = [];\r\n for (let i = 0; i < settled.length; i++) {\r\n const outcome = settled[i];\r\n if (outcome.status === 'fulfilled') {\r\n results.push(outcome.value);\r\n } else {\r\n // Build error result for rejected promise\r\n const evalCase = filteredEvalCases[i];\r\n const promptInputs = await buildPromptInputs(evalCase);\r\n const errorResult = buildErrorResult(\r\n evalCase,\r\n target.name,\r\n (now ?? (() => new Date()))(),\r\n outcome.reason,\r\n promptInputs,\r\n primaryProvider,\r\n );\r\n results.push(errorResult);\r\n if (onResult) {\r\n await onResult(errorResult);\r\n }\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\nasync function runBatchEvaluation(options: {\r\n readonly evalCases: readonly EvalCase[];\r\n readonly provider: Provider;\r\n readonly target: ResolvedTarget;\r\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\r\n readonly llm_judge: Evaluator;\r\n };\r\n readonly promptDumpDir?: string;\r\n readonly nowFn: () => Date;\r\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\r\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\r\n readonly verbose?: boolean;\r\n readonly resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>;\r\n readonly agentTimeoutMs?: number;\r\n}): Promise<readonly EvaluationResult[]> {\r\n const {\r\n evalCases,\r\n provider,\r\n target,\r\n evaluatorRegistry,\r\n promptDumpDir,\r\n nowFn,\r\n onProgress,\r\n onResult,\r\n resolveJudgeProvider,\r\n agentTimeoutMs,\r\n } = options;\r\n\r\n // Prepare prompt inputs up front so we can reuse them for grading.\r\n const promptInputsList: PromptInputs[] = [];\r\n const formattingMode = isAgentProvider(provider) ? 'agent' : 'lm';\r\n\r\n for (const evalCase of evalCases) {\r\n const promptInputs = await buildPromptInputs(evalCase, formattingMode);\r\n if (promptDumpDir) {\r\n await dumpPrompt(promptDumpDir, evalCase, promptInputs);\r\n }\r\n promptInputsList.push(promptInputs);\r\n }\r\n\r\n const batchRequests: ProviderRequest[] = evalCases.map((evalCase, index) => {\r\n const promptInputs = promptInputsList[index];\r\n return {\r\n question: promptInputs.question,\r\n guidelines: promptInputs.guidelines,\r\n guideline_patterns: evalCase.guideline_patterns,\r\n inputFiles: evalCase.file_paths,\r\n evalCaseId: evalCase.id,\r\n metadata: {\r\n systemPrompt: promptInputs.systemMessage ?? '',\r\n },\r\n };\r\n });\r\n\r\n const batchResponse = await provider.invokeBatch?.(batchRequests);\r\n if (!Array.isArray(batchResponse)) {\r\n throw new Error('Provider batching failed: invokeBatch did not return an array');\r\n }\r\n if (batchResponse.length !== evalCases.length) {\r\n throw new Error(\r\n `Provider batching failed: expected ${evalCases.length} responses, received ${batchResponse.length}`,\r\n );\r\n }\r\n\r\n if (onProgress) {\r\n const startedAt = Date.now();\r\n for (let i = 0; i < evalCases.length; i++) {\r\n await onProgress({\r\n workerId: 1,\r\n evalId: evalCases[i].id,\r\n status: 'running',\r\n startedAt,\r\n });\r\n }\r\n }\r\n\r\n const results: EvaluationResult[] = [];\r\n for (let i = 0; i < evalCases.length; i++) {\r\n const evalCase = evalCases[i];\r\n const promptInputs = promptInputsList[i];\r\n const providerResponse = batchResponse[i];\r\n let result: EvaluationResult;\r\n try {\r\n result = await evaluateCandidate({\r\n evalCase,\r\n candidate: providerResponse.text ?? '',\r\n target,\r\n provider,\r\n evaluators: evaluatorRegistry,\r\n promptInputs,\r\n nowFn,\r\n attempt: 0,\r\n judgeProvider: await resolveJudgeProvider(target),\r\n agentTimeoutMs,\r\n });\r\n } catch (error) {\r\n const errorResult = buildErrorResult(\r\n evalCase,\r\n target.name,\r\n nowFn(),\r\n error,\r\n promptInputs,\r\n provider,\r\n );\r\n results.push(errorResult);\r\n if (onResult) {\r\n await onResult(errorResult);\r\n }\r\n if (onProgress) {\r\n await onProgress({\r\n workerId: 1,\r\n evalId: evalCase.id,\r\n status: 'failed',\r\n completedAt: Date.now(),\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n }\r\n continue;\r\n }\r\n\r\n results.push(result);\r\n if (onResult) {\r\n await onResult(result);\r\n }\r\n\r\n if (onProgress) {\r\n await onProgress({\r\n workerId: 1,\r\n evalId: evalCase.id,\r\n status: 'completed',\r\n startedAt: 0,\r\n completedAt: Date.now(),\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\nexport async function runEvalCase(options: RunEvalCaseOptions): Promise<EvaluationResult> {\r\n const {\r\n evalCase,\r\n provider,\r\n target,\r\n evaluators,\r\n now,\r\n maxRetries,\r\n agentTimeoutMs,\r\n promptDumpDir,\r\n cache,\r\n useCache,\r\n signal,\r\n judgeProvider,\r\n } = options;\r\n\r\n const formattingMode = isAgentProvider(provider) ? 'agent' : 'lm';\r\n const promptInputs = await buildPromptInputs(evalCase, formattingMode);\r\n if (promptDumpDir) {\r\n await dumpPrompt(promptDumpDir, evalCase, promptInputs);\r\n }\r\n\r\n const cacheKey = useCache ? createCacheKey(provider, target, evalCase, promptInputs) : undefined;\r\n let cachedResponse: ProviderResponse | undefined;\r\n if (cacheKey && cache) {\r\n cachedResponse = await cache.get(cacheKey);\r\n }\r\n\r\n const nowFn = now ?? (() => new Date());\r\n\r\n const attemptBudget = (maxRetries ?? 0) + 1;\r\n let attempt = 0;\r\n let providerResponse: ProviderResponse | undefined = cachedResponse;\r\n let lastError: unknown;\r\n\r\n while (!providerResponse && attempt < attemptBudget) {\r\n try {\r\n providerResponse = await invokeProvider(provider, {\r\n evalCase: evalCase,\r\n target,\r\n promptInputs,\r\n attempt,\r\n agentTimeoutMs,\r\n signal,\r\n });\r\n } catch (error) {\r\n lastError = error;\r\n if (isTimeoutLike(error) && attempt + 1 < attemptBudget) {\r\n attempt += 1;\r\n continue;\r\n }\r\n return buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs, provider);\r\n }\r\n }\r\n\r\n if (!providerResponse) {\r\n return buildErrorResult(\r\n evalCase,\r\n target.name,\r\n nowFn(),\r\n lastError ?? new Error('Provider did not return a response'),\r\n promptInputs,\r\n provider,\r\n );\r\n }\r\n\r\n if (cacheKey && cache && !cachedResponse) {\r\n await cache.set(cacheKey, providerResponse);\r\n }\r\n\r\n // Extract trace from provider response (inline or from traceRef file)\r\n let candidateTrace: readonly TraceEvent[] | undefined = providerResponse.trace;\r\n if (!candidateTrace && providerResponse.traceRef) {\r\n try {\r\n const rawTrace = await readJsonFile<unknown[]>(providerResponse.traceRef);\r\n if (Array.isArray(rawTrace) && rawTrace.every(isTraceEvent)) {\r\n candidateTrace = rawTrace as TraceEvent[];\r\n }\r\n } catch {\r\n // Silently ignore trace load failures - trace is optional\r\n }\r\n }\r\n\r\n // Compute trace summary if trace is available\r\n const candidateTraceSummary = candidateTrace ? computeTraceSummary(candidateTrace) : undefined;\r\n\r\n try {\r\n return await evaluateCandidate({\r\n evalCase,\r\n candidate: providerResponse.text ?? '',\r\n target,\r\n provider,\r\n evaluators,\r\n promptInputs,\r\n nowFn,\r\n attempt,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n candidateTrace,\r\n candidateTraceSummary,\r\n });\r\n } catch (error) {\r\n return buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs, provider);\r\n }\r\n}\r\n\r\nasync function evaluateCandidate(options: {\r\n readonly evalCase: EvalCase;\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\r\n readonly promptInputs: PromptInputs;\r\n readonly nowFn: () => Date;\r\n readonly attempt: number;\r\n readonly judgeProvider?: Provider;\r\n readonly agentTimeoutMs?: number;\r\n readonly candidateTrace?: readonly TraceEvent[];\r\n readonly candidateTraceSummary?: TraceSummary;\r\n}): Promise<EvaluationResult> {\r\n const {\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n evaluators,\r\n promptInputs,\r\n nowFn,\r\n attempt,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n candidateTrace,\r\n candidateTraceSummary,\r\n } = options;\r\n\r\n const gradeTimestamp = nowFn();\r\n const { score, evaluatorResults } = await runEvaluatorsForCase({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n evaluators,\r\n attempt,\r\n promptInputs,\r\n now: gradeTimestamp,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n candidateTrace,\r\n candidateTraceSummary,\r\n });\r\n\r\n const completedAt = nowFn();\r\n\r\n let agentProviderRequest: JsonObject | undefined;\r\n let lmProviderRequest: JsonObject | undefined;\r\n\r\n if (isAgentProvider(provider)) {\r\n agentProviderRequest = {\r\n question: promptInputs.question,\r\n guideline_paths: evalCase.guideline_paths,\r\n } as JsonObject;\r\n } else {\r\n if (promptInputs.chatPrompt) {\r\n lmProviderRequest = {\r\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\r\n } as JsonObject;\r\n } else {\r\n lmProviderRequest = {\r\n question: promptInputs.question,\r\n guidelines: promptInputs.guidelines,\r\n } as JsonObject;\r\n }\r\n }\r\n\r\n return {\r\n timestamp: completedAt.toISOString(),\r\n eval_id: evalCase.id,\r\n dataset: evalCase.dataset,\r\n conversation_id: evalCase.conversation_id,\r\n score: score.score,\r\n hits: score.hits,\r\n misses: score.misses,\r\n candidate_answer: candidate,\r\n target: target.name,\r\n reasoning: score.reasoning,\r\n raw_aspects: score.rawAspects,\r\n agent_provider_request: agentProviderRequest,\r\n lm_provider_request: lmProviderRequest,\r\n evaluator_provider_request: evaluatorResults ? undefined : score.evaluatorRawRequest,\r\n evaluator_results: evaluatorResults,\r\n trace_summary: candidateTraceSummary,\r\n };\r\n}\r\n\r\nasync function runEvaluatorsForCase(options: {\r\n readonly evalCase: EvalCase;\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\r\n readonly attempt: number;\r\n readonly promptInputs: PromptInputs;\r\n readonly now: Date;\r\n readonly judgeProvider?: Provider;\r\n readonly agentTimeoutMs?: number;\r\n readonly candidateTrace?: readonly TraceEvent[];\r\n readonly candidateTraceSummary?: TraceSummary;\r\n}): Promise<{ score: EvaluationScore; evaluatorResults?: EvaluatorResult[] }> {\r\n const {\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n evaluators,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n candidateTrace,\r\n candidateTraceSummary,\r\n } = options;\r\n\r\n if (evalCase.evaluators && evalCase.evaluators.length > 0) {\r\n return runEvaluatorList({\r\n evalCase,\r\n evaluators: evalCase.evaluators,\r\n candidate,\r\n target,\r\n provider,\r\n evaluatorRegistry: evaluators,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n candidateTrace,\r\n candidateTraceSummary,\r\n });\r\n }\r\n\r\n const evaluatorKind = evalCase.evaluator ?? 'llm_judge';\r\n const activeEvaluator = evaluators[evaluatorKind] ?? evaluators.llm_judge;\r\n if (!activeEvaluator) {\r\n throw new Error(`No evaluator registered for kind '${evaluatorKind}'`);\r\n }\r\n\r\n const score = await activeEvaluator.evaluate({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n candidateTrace,\r\n candidateTraceSummary,\r\n });\r\n\r\n return { score };\r\n}\r\n\r\nasync function runEvaluatorList(options: {\r\n readonly evalCase: EvalCase;\r\n readonly evaluators: readonly EvaluatorConfig[];\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\r\n readonly llm_judge: Evaluator;\r\n };\r\n readonly attempt: number;\r\n readonly promptInputs: PromptInputs;\r\n readonly now: Date;\r\n readonly judgeProvider?: Provider;\r\n readonly agentTimeoutMs?: number;\r\n readonly candidateTrace?: readonly TraceEvent[];\r\n readonly candidateTraceSummary?: TraceSummary;\r\n}): Promise<{ score: EvaluationScore; evaluatorResults: EvaluatorResult[] }> {\r\n const {\r\n evalCase,\r\n evaluators,\r\n candidate,\r\n target,\r\n provider,\r\n evaluatorRegistry,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n candidateTrace,\r\n candidateTraceSummary,\r\n } = options;\r\n\r\n const scored: Array<{\r\n readonly score: EvaluationScore;\r\n readonly name: string;\r\n readonly type: string;\r\n readonly weight?: number;\r\n }> = [];\r\n const evaluatorResults: EvaluatorResult[] = [];\r\n\r\n for (const evaluator of evaluators ?? []) {\r\n try {\r\n if (evaluator.type === 'llm_judge') {\r\n const score = await runLlmJudgeEvaluator({\r\n config: evaluator,\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n evaluatorRegistry,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n });\r\n const weight = evaluator.weight ?? 1.0;\r\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\r\n evaluatorResults.push({\r\n name: evaluator.name,\r\n type: evaluator.type,\r\n score: score.score,\r\n weight,\r\n verdict: score.verdict,\r\n hits: score.hits,\r\n misses: score.misses,\r\n reasoning: score.reasoning,\r\n evaluator_provider_request: score.evaluatorRawRequest,\r\n });\r\n }\r\n\r\n if (evaluator.type === 'code') {\r\n const codeEvaluator = new CodeEvaluator({\r\n script: evaluator.script,\r\n cwd: evaluator.resolvedCwd ?? evaluator.cwd,\r\n agentTimeoutMs,\r\n });\r\n const score = await codeEvaluator.evaluate({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n attempt,\r\n promptInputs,\r\n now,\r\n });\r\n const weight = evaluator.weight ?? 1.0;\r\n scored.push({ score, name: evaluator.name, type: 'code_judge', weight });\r\n evaluatorResults.push({\r\n name: evaluator.name,\r\n type: 'code_judge',\r\n score: score.score,\r\n weight,\r\n verdict: score.verdict,\r\n hits: score.hits,\r\n misses: score.misses,\r\n reasoning: score.reasoning,\r\n evaluator_provider_request: score.evaluatorRawRequest,\r\n });\r\n }\r\n\r\n if (evaluator.type === 'composite') {\r\n const evalFileDir = evalCase.guideline_paths[0]\r\n ? path.dirname(evalCase.guideline_paths[0])\r\n : process.cwd();\r\n\r\n const createEvaluator = (memberConfig: import('./types.js').EvaluatorConfig): Evaluator => {\r\n switch (memberConfig.type) {\r\n case 'llm_judge':\r\n return evaluatorRegistry.llm_judge;\r\n case 'code':\r\n return new CodeEvaluator({\r\n script: memberConfig.script,\r\n cwd: memberConfig.resolvedCwd ?? memberConfig.cwd,\r\n agentTimeoutMs,\r\n });\r\n case 'composite':\r\n return new CompositeEvaluator({\r\n config: memberConfig,\r\n cwd: evalFileDir,\r\n evaluatorFactory: { create: createEvaluator },\r\n });\r\n case 'tool_trajectory':\r\n return new ToolTrajectoryEvaluator({\r\n config: memberConfig as ToolTrajectoryEvaluatorConfig,\r\n });\r\n case 'expected_messages':\r\n return new ExpectedMessagesEvaluator();\r\n default: {\r\n const unknownConfig = memberConfig as { type: string };\r\n throw new Error(`Unsupported evaluator type in composite: ${unknownConfig.type}`);\r\n }\r\n }\r\n };\r\n\r\n const compositeEvaluator = new CompositeEvaluator({\r\n config: evaluator,\r\n cwd: evalFileDir,\r\n evaluatorFactory: { create: createEvaluator },\r\n });\r\n const score = await compositeEvaluator.evaluate({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n });\r\n const weight = evaluator.weight ?? 1.0;\r\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\r\n evaluatorResults.push({\r\n name: evaluator.name,\r\n type: evaluator.type,\r\n score: score.score,\r\n weight,\r\n verdict: score.verdict,\r\n hits: score.hits,\r\n misses: score.misses,\r\n reasoning: score.reasoning,\r\n evaluator_provider_request: score.evaluatorRawRequest,\r\n evaluator_results: mapChildResults(score.evaluatorResults),\r\n });\r\n }\r\n\r\n if (evaluator.type === 'tool_trajectory') {\r\n const trajectoryEvaluator = new ToolTrajectoryEvaluator({\r\n config: evaluator as ToolTrajectoryEvaluatorConfig,\r\n });\r\n const score = trajectoryEvaluator.evaluate({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n attempt,\r\n promptInputs,\r\n now,\r\n candidateTrace,\r\n candidateTraceSummary,\r\n });\r\n const weight = evaluator.weight ?? 1.0;\r\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\r\n evaluatorResults.push({\r\n name: evaluator.name,\r\n type: evaluator.type,\r\n score: score.score,\r\n weight,\r\n verdict: score.verdict,\r\n hits: score.hits,\r\n misses: score.misses,\r\n reasoning: score.reasoning,\r\n });\r\n }\r\n\r\n if (evaluator.type === 'expected_messages') {\r\n const expectedMessagesEvaluator = new ExpectedMessagesEvaluator();\r\n const score = expectedMessagesEvaluator.evaluate({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n attempt,\r\n promptInputs,\r\n now,\r\n candidateTrace,\r\n candidateTraceSummary,\r\n });\r\n const weight = evaluator.weight ?? 1.0;\r\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\r\n evaluatorResults.push({\r\n name: evaluator.name,\r\n type: evaluator.type,\r\n score: score.score,\r\n weight,\r\n verdict: score.verdict,\r\n hits: score.hits,\r\n misses: score.misses,\r\n reasoning: score.reasoning,\r\n });\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const fallbackScore: EvaluationScore = {\r\n score: 0,\r\n verdict: 'fail',\r\n hits: [],\r\n misses: [`Evaluator '${evaluator.name}' failed: ${message}`],\r\n expectedAspectCount: 1,\r\n reasoning: message,\r\n };\r\n const resultType = evaluator.type === 'code' ? 'code_judge' : evaluator.type;\r\n const weight = evaluator.weight ?? 1.0;\r\n scored.push({\r\n score: fallbackScore,\r\n name: evaluator.name ?? 'unknown',\r\n type: resultType ?? 'llm_judge',\r\n weight,\r\n });\r\n evaluatorResults.push({\r\n name: evaluator.name ?? 'unknown',\r\n type: resultType ?? 'llm_judge',\r\n score: 0,\r\n weight,\r\n verdict: 'fail',\r\n hits: [],\r\n misses: [`Evaluator '${evaluator.name ?? 'unknown'}' failed: ${message}`],\r\n reasoning: message,\r\n });\r\n }\r\n }\r\n\r\n const aggregateScore =\r\n scored.length > 0\r\n ? computeWeightedMean(\r\n scored.map((entry) => ({ score: entry.score.score, weight: entry.weight })),\r\n )\r\n : 0;\r\n const hits = scored.flatMap((entry) => entry.score.hits);\r\n const misses = scored.flatMap((entry) => entry.score.misses);\r\n const expectedAspectCount = scored.reduce(\r\n (total, entry) => total + (entry.score.expectedAspectCount ?? 0),\r\n 0,\r\n );\r\n const rawAspects = scored.flatMap((entry) => entry.score.rawAspects ?? []);\r\n const reasoningParts = scored\r\n .map((entry) => (entry.score.reasoning ? `${entry.name}: ${entry.score.reasoning}` : undefined))\r\n .filter(isNonEmptyString);\r\n const reasoning = reasoningParts.length > 0 ? reasoningParts.join(' | ') : undefined;\r\n\r\n const score: EvaluationScore = {\r\n score: aggregateScore,\r\n verdict: scoreToVerdict(aggregateScore),\r\n hits,\r\n misses,\r\n expectedAspectCount,\r\n reasoning,\r\n rawAspects: rawAspects.length > 0 ? rawAspects : undefined,\r\n };\r\n\r\n return { score, evaluatorResults };\r\n}\r\n\r\nasync function runLlmJudgeEvaluator(options: {\r\n readonly config: import('./types.js').LlmJudgeEvaluatorConfig;\r\n readonly evalCase: EvalCase;\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\r\n readonly llm_judge: Evaluator;\r\n };\r\n readonly attempt: number;\r\n readonly promptInputs: PromptInputs;\r\n readonly now: Date;\r\n readonly judgeProvider?: Provider;\r\n}): Promise<EvaluationScore> {\r\n const {\r\n config,\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n evaluatorRegistry,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n } = options;\r\n const customPrompt = await resolveCustomPrompt(config);\r\n\r\n return evaluatorRegistry.llm_judge.evaluate({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n evaluatorTemplateOverride: customPrompt,\r\n evaluator: config,\r\n });\r\n}\r\n\r\nasync function resolveCustomPrompt(config: {\r\n readonly prompt?: string;\r\n readonly promptPath?: string;\r\n}): Promise<string | undefined> {\r\n if (config.promptPath) {\r\n try {\r\n const content = await readTextFile(config.promptPath);\r\n return content;\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n console.warn(`Could not read custom prompt at ${config.promptPath}: ${message}`);\r\n }\r\n }\r\n return config.prompt;\r\n}\r\n\r\nfunction isNonEmptyString(value: unknown): value is string {\r\n return typeof value === 'string' && value.trim().length > 0;\r\n}\r\n\r\nfunction scoreToVerdict(score: number): EvaluationVerdict {\r\n if (score >= 0.8) {\r\n return 'pass';\r\n }\r\n if (score >= 0.6) {\r\n return 'borderline';\r\n }\r\n return 'fail';\r\n}\r\n\r\nfunction filterEvalCases(evalCases: readonly EvalCase[], evalId?: string): readonly EvalCase[] {\r\n if (!evalId) {\r\n return evalCases;\r\n }\r\n return evalCases.filter((evalCase) => evalCase.id === evalId);\r\n}\r\n\r\nfunction buildEvaluatorRegistry(\r\n overrides: Partial<Record<string, Evaluator>> | undefined,\r\n resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>,\r\n): Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator } {\r\n const llmJudge =\r\n overrides?.llm_judge ??\r\n new LlmJudgeEvaluator({\r\n resolveJudgeProvider: async (context) => {\r\n if (context.judgeProvider) {\r\n return context.judgeProvider;\r\n }\r\n return resolveJudgeProvider(context.target);\r\n },\r\n });\r\n\r\n return {\r\n ...overrides,\r\n llm_judge: llmJudge,\r\n };\r\n}\r\n\r\nasync function dumpPrompt(\r\n directory: string,\r\n evalCase: EvalCase,\r\n promptInputs: PromptInputs,\r\n): Promise<void> {\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\r\n const filename = `${timestamp}_${sanitizeFilename(evalCase.id)}.json`;\r\n const filePath = path.resolve(directory, filename);\r\n\r\n await mkdir(path.dirname(filePath), { recursive: true });\r\n const payload = {\r\n eval_id: evalCase.id,\r\n question: promptInputs.question,\r\n guidelines: promptInputs.guidelines,\r\n guideline_paths: evalCase.guideline_paths,\r\n } satisfies Record<string, unknown>;\r\n\r\n await writeFile(filePath, JSON.stringify(payload, null, 2), 'utf8');\r\n}\r\n\r\nfunction sanitizeFilename(value: string): string {\r\n if (!value) {\r\n return 'prompt';\r\n }\r\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\r\n return sanitized.length > 0 ? sanitized : randomUUID();\r\n}\r\n\r\nasync function invokeProvider(\r\n provider: Provider,\r\n options: {\r\n readonly evalCase: EvalCase;\r\n readonly target: ResolvedTarget;\r\n readonly promptInputs: PromptInputs;\r\n readonly attempt: number;\r\n readonly agentTimeoutMs?: number;\r\n readonly signal?: AbortSignal;\r\n },\r\n): Promise<ProviderResponse> {\r\n const { evalCase, promptInputs, attempt, agentTimeoutMs, signal } = options;\r\n\r\n const controller = new AbortController();\r\n const timeout = agentTimeoutMs ? setTimeout(() => controller.abort(), agentTimeoutMs) : undefined;\r\n\r\n if (signal) {\r\n signal.addEventListener('abort', () => controller.abort(), { once: true });\r\n }\r\n\r\n try {\r\n return await provider.invoke({\r\n question: promptInputs.question,\r\n guidelines: promptInputs.guidelines,\r\n guideline_patterns: evalCase.guideline_patterns,\r\n chatPrompt: promptInputs.chatPrompt,\r\n inputFiles: evalCase.file_paths,\r\n evalCaseId: evalCase.id,\r\n attempt,\r\n metadata: {\r\n systemPrompt: promptInputs.systemMessage ?? '',\r\n },\r\n signal: controller.signal,\r\n });\r\n } finally {\r\n if (timeout !== undefined) {\r\n clearTimeout(timeout);\r\n }\r\n }\r\n}\r\n\r\nfunction buildErrorResult(\r\n evalCase: EvalCase,\r\n targetName: string,\r\n timestamp: Date,\r\n error: unknown,\r\n promptInputs: PromptInputs,\r\n provider?: Provider,\r\n): EvaluationResult {\r\n const message = error instanceof Error ? error.message : String(error);\r\n\r\n let agentProviderRequest: JsonObject | undefined;\r\n let lmProviderRequest: JsonObject | undefined;\r\n\r\n if (isAgentProvider(provider)) {\r\n agentProviderRequest = {\r\n question: promptInputs.question,\r\n guideline_paths: evalCase.guideline_paths,\r\n error: message,\r\n } as JsonObject;\r\n } else {\r\n if (promptInputs.chatPrompt) {\r\n lmProviderRequest = {\r\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\r\n guideline_paths: evalCase.guideline_paths,\r\n error: message,\r\n } as JsonObject;\r\n } else {\r\n lmProviderRequest = {\r\n question: promptInputs.question,\r\n guidelines: promptInputs.guidelines,\r\n guideline_paths: evalCase.guideline_paths,\r\n error: message,\r\n } as JsonObject;\r\n }\r\n }\r\n\r\n return {\r\n timestamp: timestamp.toISOString(),\r\n eval_id: evalCase.id,\r\n dataset: evalCase.dataset,\r\n conversation_id: evalCase.conversation_id,\r\n score: 0,\r\n hits: [],\r\n misses: [`Error: ${message}`],\r\n candidate_answer: `Error occurred: ${message}`,\r\n target: targetName,\r\n raw_aspects: [],\r\n agent_provider_request: agentProviderRequest,\r\n lm_provider_request: lmProviderRequest,\r\n error: message,\r\n } satisfies EvaluationResult;\r\n}\r\n\r\nfunction createCacheKey(\r\n provider: Provider,\r\n target: ResolvedTarget,\r\n evalCase: EvalCase,\r\n promptInputs: PromptInputs,\r\n): string {\r\n const hash = createHash('sha256');\r\n hash.update(provider.id);\r\n hash.update(target.name);\r\n hash.update(evalCase.id);\r\n hash.update(promptInputs.question);\r\n hash.update(promptInputs.guidelines);\r\n hash.update(promptInputs.systemMessage ?? '');\r\n if (promptInputs.chatPrompt) {\r\n hash.update(JSON.stringify(promptInputs.chatPrompt));\r\n }\r\n return hash.digest('hex');\r\n}\r\n\r\nfunction isTimeoutLike(error: unknown): boolean {\r\n if (!error) {\r\n return false;\r\n }\r\n if (\r\n typeof DOMException !== 'undefined' &&\r\n error instanceof DOMException &&\r\n error.name === 'AbortError'\r\n ) {\r\n return true;\r\n }\r\n if (error instanceof Error) {\r\n const name = error.name?.toLowerCase();\r\n const message = error.message?.toLowerCase();\r\n return name.includes('timeout') || message.includes('timeout');\r\n }\r\n const value = String(error).toLowerCase();\r\n return value.includes('timeout');\r\n}\r\n\r\nfunction mapChildResults(\r\n children?: readonly ChildEvaluatorResult[],\r\n): readonly EvaluatorResult[] | undefined {\r\n if (!children || children.length === 0) {\r\n return undefined;\r\n }\r\n\r\n return children.map((child) => ({\r\n name: child.name,\r\n type: child.type as EvaluatorKind,\r\n score: child.score,\r\n weight: child.weight,\r\n verdict: child.verdict,\r\n hits: child.hits,\r\n misses: child.misses,\r\n reasoning: child.reasoning,\r\n evaluator_provider_request: child.evaluatorRawRequest,\r\n evaluator_results: mapChildResults(child.evaluatorResults),\r\n }));\r\n}\r\n\r\n/**\r\n * Compute weighted mean of scores, defaulting missing weights to 1.0.\r\n * Returns 0 if total weight is 0.\r\n */\r\nfunction computeWeightedMean(\r\n entries: readonly { readonly score: number; readonly weight?: number }[],\r\n): number {\r\n let totalWeight = 0;\r\n let weightedSum = 0;\r\n\r\n for (const entry of entries) {\r\n const weight = entry.weight ?? 1.0;\r\n totalWeight += weight;\r\n weightedSum += entry.score * weight;\r\n }\r\n\r\n return totalWeight > 0 ? weightedSum / totalWeight : 0;\r\n}\r\n","/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\n\t\t// Clean up tail reference when queue becomes empty\n\t\tif (!this.#head) {\n\t\t\tthis.#tail = undefined;\n\t\t}\n\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t\t// Since `pendingCount` has been decreased by one, increase `activeCount` by one.\n\t\t\tactiveCount++;\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue `internalResolve` instead of the `run` function\n\t\t// to preserve asynchronous context.\n\t\tnew Promise(internalResolve => {\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(\n\t\t\trun.bind(undefined, function_, resolve, arguments_),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// after the `internalResolve` function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency) {\n\t\t\t\tresumeNext();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nexport function limitFunction(function_, option) {\n\tconst {concurrency} = option;\n\tconst limit = pLimit(concurrency);\n\n\treturn (...arguments_) => limit(() => function_(...arguments_));\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n","import type { TraceEvent } from '../trace.js';\r\nimport 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 /** Normalized trace events from agent execution */\r\n readonly trace?: readonly TraceEvent[];\r\n /** Reference to external trace file (alternative to inline trace) */\r\n readonly traceRef?: string;\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","import { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport type { Provider } from '../providers/types.js';\nimport type { RubricItem } from '../types.js';\n\nconst rubricItemSchema = z.object({\n id: z.string().describe('Short identifier for this rubric (e.g., clarity, completeness)'),\n description: z.string().describe('What this rubric checks for'),\n weight: z.number().default(1.0).describe('Relative importance (default 1.0)'),\n required: z.boolean().default(true).describe('Whether this is a mandatory requirement'),\n});\n\nconst rubricGenerationSchema = z.object({\n rubrics: z.array(rubricItemSchema).describe('List of evaluation rubrics'),\n});\n\nexport interface GenerateRubricsOptions {\n readonly expectedOutcome: string;\n readonly question?: string;\n readonly referenceAnswer?: string;\n readonly provider: Provider;\n}\n\n/**\n * Generate rubrics from expected outcome using an LLM.\n */\nexport async function generateRubrics(\n options: GenerateRubricsOptions,\n): Promise<readonly RubricItem[]> {\n const { expectedOutcome, question, referenceAnswer, provider } = options;\n\n const prompt = buildPrompt(expectedOutcome, question, referenceAnswer);\n\n const model = provider.asLanguageModel?.();\n if (!model) {\n throw new Error('Provider does not support language model interface');\n }\n\n const system = `You are an expert at creating evaluation rubrics.\nYou must return a valid JSON object matching this schema:\n{\n \"rubrics\": [\n {\n \"id\": \"string (short identifier)\",\n \"description\": \"string (what to check)\",\n \"weight\": number (default 1.0),\n \"required\": boolean (default true)\n }\n ]\n}`;\n\n let result: z.infer<typeof rubricGenerationSchema> | undefined;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const { text } = await generateText({\n model,\n system,\n prompt,\n });\n\n const cleaned = text.replace(/```json\\n?|```/g, '').trim();\n result = rubricGenerationSchema.parse(JSON.parse(cleaned));\n break;\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n // Continue to next attempt\n }\n }\n\n if (!result) {\n throw new Error(`Failed to parse generated rubrics after 3 attempts: ${lastError?.message}`);\n }\n\n return result.rubrics;\n}\n\nfunction buildPrompt(expectedOutcome: string, question?: string, referenceAnswer?: string): string {\n const parts: string[] = [\n 'You are an expert at creating evaluation rubrics.',\n 'Given the expected outcome (and optionally the question and reference answer),',\n 'generate a list of specific, measurable rubric items to evaluate whether an answer meets the expected outcome.',\n '',\n 'Each rubric should:',\n '- Be specific and testable',\n '- Have a short, descriptive ID',\n '- Include a clear description of what to check',\n '- Indicate if it is required (mandatory) or optional',\n '- Have an appropriate weight (default 1.0, use higher values for more important aspects)',\n '',\n 'Generate 3-7 rubric items that comprehensively cover the expected outcome.',\n '',\n '[[ ## expected_outcome ## ]]',\n expectedOutcome,\n '',\n ];\n\n if (question && question.trim().length > 0) {\n parts.push('[[ ## question ## ]]', question, '');\n }\n\n if (referenceAnswer && referenceAnswer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', referenceAnswer, '');\n }\n\n return parts.join('\\n');\n}\n"],"mappings":"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","names":["buildDirectoryChain","buildSearchRoots","fileExists","resolveFileReference","import_promises","import_node_path","import_yaml","import_promises","import_node_path","path","path","micromatch","import_node_path","import_promises","ANSI_YELLOW","ANSI_RESET","ANSI_YELLOW","ANSI_RESET","isJsonObject","logWarning","asString","weight","path","promptPath","import_promises","import_node_path","ANSI_YELLOW","ANSI_RESET","asString","logWarning","path","import_promises","import_node_path","ANSI_YELLOW","ANSI_RESET","path","logWarning","asString","ANSI_YELLOW","ANSI_RESET","path","asString","logWarning","import_node_fs","import_promises","import_node_path","fileExists","path","buildDirectoryChain","buildSearchRoots","trimLeadingSeparators","resolveFileReference","systemContent","import_promises","import_node_path","execWithCallback","fs","path","os","import_node_child_process","import_node_fs","import_promises","import_node_os","import_node_path","import_node_util","import_node_path","normalizeInputFiles","path","execAsync","execCallback","normalizeInputFiles","path","formatTimeoutSuffix","import_node_path","path","import_node_path","buildPromptDocument","collectGuidelineFiles","buildMandatoryPrereadBlock","path","pathToFileUri","path","import_node_fs","import_promises","import_node_path","import_yaml","fileExists","path","import_ai","import_zod","data","path","spawn","score","hits","misses","reasoning","import_node_crypto","import_promises","import_node_path","score","path","isNonEmptyString","scoreToVerdict","import_ai","import_zod"]}