@agentv/core 0.23.0 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-B2J23S7D.js → chunk-OYTL3LNN.js} +24 -16
- package/dist/chunk-OYTL3LNN.js.map +1 -0
- package/dist/evaluation/validation/index.cjs +64 -17
- package/dist/evaluation/validation/index.cjs.map +1 -1
- package/dist/evaluation/validation/index.js +48 -2
- package/dist/evaluation/validation/index.js.map +1 -1
- package/dist/index.cjs +596 -45
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +151 -4
- package/dist/index.d.ts +151 -4
- package/dist/index.js +555 -17
- package/dist/index.js.map +1 -1
- package/package.json +5 -2
- package/dist/chunk-B2J23S7D.js.map +0 -1
|
@@ -17,6 +17,10 @@ async function readTextFile(filePath) {
|
|
|
17
17
|
const content = await readFile(filePath, "utf8");
|
|
18
18
|
return normalizeLineEndings(content);
|
|
19
19
|
}
|
|
20
|
+
async function readJsonFile(filePath) {
|
|
21
|
+
const content = await readFile(filePath, "utf8");
|
|
22
|
+
return JSON.parse(content);
|
|
23
|
+
}
|
|
20
24
|
async function findGitRoot(startPath) {
|
|
21
25
|
let currentDir = path.dirname(path.resolve(startPath));
|
|
22
26
|
const root = path.parse(currentDir).root;
|
|
@@ -110,6 +114,7 @@ async function resolveFileReference(rawValue, searchRoots) {
|
|
|
110
114
|
}
|
|
111
115
|
|
|
112
116
|
// src/evaluation/providers/targets.ts
|
|
117
|
+
import path2 from "node:path";
|
|
113
118
|
import { z } from "zod";
|
|
114
119
|
var CLI_PLACEHOLDERS = /* @__PURE__ */ new Set([
|
|
115
120
|
"PROMPT",
|
|
@@ -125,7 +130,7 @@ var BASE_TARGET_SCHEMA = z.object({
|
|
|
125
130
|
judge_target: z.string().optional(),
|
|
126
131
|
workers: z.number().int().min(1).optional()
|
|
127
132
|
}).passthrough();
|
|
128
|
-
var DEFAULT_AZURE_API_VERSION = "2024-
|
|
133
|
+
var DEFAULT_AZURE_API_VERSION = "2024-12-01-preview";
|
|
129
134
|
function normalizeAzureApiVersion(value) {
|
|
130
135
|
if (!value) {
|
|
131
136
|
return DEFAULT_AZURE_API_VERSION;
|
|
@@ -169,7 +174,7 @@ function resolveRetryConfig(target) {
|
|
|
169
174
|
retryableStatusCodes
|
|
170
175
|
};
|
|
171
176
|
}
|
|
172
|
-
function resolveTargetDefinition(definition, env = process.env) {
|
|
177
|
+
function resolveTargetDefinition(definition, env = process.env, evalFilePath) {
|
|
173
178
|
const parsed = BASE_TARGET_SCHEMA.parse(definition);
|
|
174
179
|
const provider = parsed.provider.toLowerCase();
|
|
175
180
|
const providerBatching = resolveOptionalBoolean(
|
|
@@ -242,7 +247,7 @@ function resolveTargetDefinition(definition, env = process.env) {
|
|
|
242
247
|
judgeTarget: parsed.judge_target,
|
|
243
248
|
workers: parsed.workers,
|
|
244
249
|
providerBatching,
|
|
245
|
-
config: resolveCliConfig(parsed, env)
|
|
250
|
+
config: resolveCliConfig(parsed, env, evalFilePath)
|
|
246
251
|
};
|
|
247
252
|
default:
|
|
248
253
|
throw new Error(`Unsupported provider '${parsed.provider}' in target '${parsed.name}'`);
|
|
@@ -360,7 +365,8 @@ function normalizeCodexLogFormat(value) {
|
|
|
360
365
|
}
|
|
361
366
|
function resolveMockConfig(target) {
|
|
362
367
|
const response = typeof target.response === "string" ? target.response : void 0;
|
|
363
|
-
|
|
368
|
+
const trace = Array.isArray(target.trace) ? target.trace : void 0;
|
|
369
|
+
return { response, trace };
|
|
364
370
|
}
|
|
365
371
|
function resolveVSCodeConfig(target, env, insiders) {
|
|
366
372
|
const workspaceTemplateEnvVar = resolveOptionalLiteralString(
|
|
@@ -392,15 +398,18 @@ function resolveVSCodeConfig(target, env, insiders) {
|
|
|
392
398
|
workspaceTemplate
|
|
393
399
|
};
|
|
394
400
|
}
|
|
395
|
-
function resolveCliConfig(target, env) {
|
|
401
|
+
function resolveCliConfig(target, env, evalFilePath) {
|
|
396
402
|
const commandTemplateSource = target.command_template ?? target.commandTemplate;
|
|
397
403
|
const filesFormat = resolveOptionalLiteralString(
|
|
398
404
|
target.files_format ?? target.filesFormat ?? target.attachments_format ?? target.attachmentsFormat
|
|
399
405
|
);
|
|
400
|
-
|
|
406
|
+
let cwd = resolveOptionalString(target.cwd, env, `${target.name} working directory`, {
|
|
401
407
|
allowLiteral: true,
|
|
402
408
|
optionalEnv: true
|
|
403
409
|
});
|
|
410
|
+
if (!cwd && evalFilePath) {
|
|
411
|
+
cwd = path2.dirname(path2.resolve(evalFilePath));
|
|
412
|
+
}
|
|
404
413
|
const timeoutMs = resolveTimeoutMs(
|
|
405
414
|
target.timeout_seconds ?? target.timeoutSeconds,
|
|
406
415
|
`${target.name} timeout`
|
|
@@ -518,17 +527,15 @@ function resolveOptionalString(source, env, description, options) {
|
|
|
518
527
|
if (envVarMatch) {
|
|
519
528
|
const varName = envVarMatch[1];
|
|
520
529
|
const envValue = env[varName];
|
|
521
|
-
if (envValue !== void 0) {
|
|
522
|
-
if (envValue.trim().length === 0) {
|
|
523
|
-
throw new Error(`Environment variable '${varName}' for ${description} is empty`);
|
|
524
|
-
}
|
|
525
|
-
return envValue;
|
|
526
|
-
}
|
|
527
530
|
const optionalEnv = options?.optionalEnv ?? false;
|
|
528
|
-
if (
|
|
529
|
-
|
|
531
|
+
if (envValue === void 0 || envValue.trim().length === 0) {
|
|
532
|
+
if (optionalEnv) {
|
|
533
|
+
return void 0;
|
|
534
|
+
}
|
|
535
|
+
const status = envValue === void 0 ? "is not set" : "is empty";
|
|
536
|
+
throw new Error(`Environment variable '${varName}' required for ${description} ${status}`);
|
|
530
537
|
}
|
|
531
|
-
|
|
538
|
+
return envValue;
|
|
532
539
|
}
|
|
533
540
|
const allowLiteral = options?.allowLiteral ?? false;
|
|
534
541
|
if (!allowLiteral) {
|
|
@@ -679,6 +686,7 @@ export {
|
|
|
679
686
|
fileExists,
|
|
680
687
|
normalizeLineEndings,
|
|
681
688
|
readTextFile,
|
|
689
|
+
readJsonFile,
|
|
682
690
|
findGitRoot,
|
|
683
691
|
buildDirectoryChain,
|
|
684
692
|
buildSearchRoots,
|
|
@@ -689,4 +697,4 @@ export {
|
|
|
689
697
|
PROVIDER_ALIASES,
|
|
690
698
|
isAgentProvider
|
|
691
699
|
};
|
|
692
|
-
//# sourceMappingURL=chunk-
|
|
700
|
+
//# sourceMappingURL=chunk-OYTL3LNN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/evaluation/file-utils.ts","../src/evaluation/providers/targets.ts","../src/evaluation/providers/types.ts"],"sourcesContent":["import { constants } from 'node:fs';\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 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 );\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 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"],"mappings":"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","names":["path"]}
|
|
@@ -240,6 +240,26 @@ function validateMessages(messages, location, filePath, errors) {
|
|
|
240
240
|
message: `Invalid role '${role}'. Must be one of: ${validRoles.join(", ")}`
|
|
241
241
|
});
|
|
242
242
|
}
|
|
243
|
+
const toolCalls = message.tool_calls;
|
|
244
|
+
if (toolCalls !== void 0) {
|
|
245
|
+
if (role !== "assistant") {
|
|
246
|
+
errors.push({
|
|
247
|
+
severity: "error",
|
|
248
|
+
filePath,
|
|
249
|
+
location: `${msgLocation}.tool_calls`,
|
|
250
|
+
message: "tool_calls can only be specified on assistant messages"
|
|
251
|
+
});
|
|
252
|
+
} else if (!Array.isArray(toolCalls)) {
|
|
253
|
+
errors.push({
|
|
254
|
+
severity: "error",
|
|
255
|
+
filePath,
|
|
256
|
+
location: `${msgLocation}.tool_calls`,
|
|
257
|
+
message: "tool_calls must be an array"
|
|
258
|
+
});
|
|
259
|
+
} else {
|
|
260
|
+
validateToolCalls(toolCalls, `${msgLocation}.tool_calls`, filePath, errors);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
243
263
|
const content = message.content;
|
|
244
264
|
if (typeof content === "string") {
|
|
245
265
|
validateContentForRoleMarkers(content, `${msgLocation}.content`, filePath, errors);
|
|
@@ -304,13 +324,38 @@ function validateContentForRoleMarkers(content, location, filePath, errors) {
|
|
|
304
324
|
}
|
|
305
325
|
}
|
|
306
326
|
}
|
|
327
|
+
function validateToolCalls(toolCalls, location, filePath, errors) {
|
|
328
|
+
for (let i = 0; i < toolCalls.length; i++) {
|
|
329
|
+
const toolCall = toolCalls[i];
|
|
330
|
+
const callLocation = `${location}[${i}]`;
|
|
331
|
+
if (!isObject(toolCall)) {
|
|
332
|
+
errors.push({
|
|
333
|
+
severity: "error",
|
|
334
|
+
filePath,
|
|
335
|
+
location: callLocation,
|
|
336
|
+
message: "Tool call must be an object"
|
|
337
|
+
});
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
const tool = toolCall.tool;
|
|
341
|
+
if (typeof tool !== "string" || tool.trim().length === 0) {
|
|
342
|
+
errors.push({
|
|
343
|
+
severity: "error",
|
|
344
|
+
filePath,
|
|
345
|
+
location: `${callLocation}.tool`,
|
|
346
|
+
message: "Missing or invalid 'tool' field (must be a non-empty string)"
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
307
351
|
|
|
308
352
|
// src/evaluation/validation/targets-validator.ts
|
|
309
353
|
var import_promises3 = require("fs/promises");
|
|
310
|
-
var
|
|
354
|
+
var import_node_path4 = __toESM(require("path"), 1);
|
|
311
355
|
var import_yaml3 = require("yaml");
|
|
312
356
|
|
|
313
357
|
// src/evaluation/providers/targets.ts
|
|
358
|
+
var import_node_path3 = __toESM(require("path"), 1);
|
|
314
359
|
var import_zod = require("zod");
|
|
315
360
|
var CLI_PLACEHOLDERS = /* @__PURE__ */ new Set([
|
|
316
361
|
"PROMPT",
|
|
@@ -451,7 +496,9 @@ var MOCK_SETTINGS = /* @__PURE__ */ new Set([
|
|
|
451
496
|
"response",
|
|
452
497
|
"delayMs",
|
|
453
498
|
"delayMinMs",
|
|
454
|
-
"delayMaxMs"
|
|
499
|
+
"delayMaxMs",
|
|
500
|
+
"trace"
|
|
501
|
+
// For testing tool_trajectory evaluator
|
|
455
502
|
]);
|
|
456
503
|
var CLI_SETTINGS = /* @__PURE__ */ new Set([
|
|
457
504
|
...COMMON_SETTINGS,
|
|
@@ -512,7 +559,7 @@ function validateUnknownSettings(target, provider, absolutePath, location, error
|
|
|
512
559
|
}
|
|
513
560
|
async function validateTargetsFile(filePath) {
|
|
514
561
|
const errors = [];
|
|
515
|
-
const absolutePath =
|
|
562
|
+
const absolutePath = import_node_path4.default.resolve(filePath);
|
|
516
563
|
let parsed;
|
|
517
564
|
try {
|
|
518
565
|
const content = await (0, import_promises3.readFile)(absolutePath, "utf8");
|
|
@@ -856,13 +903,13 @@ async function validateConfigFile(filePath) {
|
|
|
856
903
|
|
|
857
904
|
// src/evaluation/validation/file-reference-validator.ts
|
|
858
905
|
var import_promises6 = require("fs/promises");
|
|
859
|
-
var
|
|
906
|
+
var import_node_path6 = __toESM(require("path"), 1);
|
|
860
907
|
var import_yaml5 = require("yaml");
|
|
861
908
|
|
|
862
909
|
// src/evaluation/file-utils.ts
|
|
863
910
|
var import_node_fs = require("fs");
|
|
864
911
|
var import_promises5 = require("fs/promises");
|
|
865
|
-
var
|
|
912
|
+
var import_node_path5 = __toESM(require("path"), 1);
|
|
866
913
|
async function fileExists(filePath) {
|
|
867
914
|
try {
|
|
868
915
|
await (0, import_promises5.access)(filePath, import_node_fs.constants.F_OK);
|
|
@@ -872,14 +919,14 @@ async function fileExists(filePath) {
|
|
|
872
919
|
}
|
|
873
920
|
}
|
|
874
921
|
async function findGitRoot(startPath) {
|
|
875
|
-
let currentDir =
|
|
876
|
-
const root =
|
|
922
|
+
let currentDir = import_node_path5.default.dirname(import_node_path5.default.resolve(startPath));
|
|
923
|
+
const root = import_node_path5.default.parse(currentDir).root;
|
|
877
924
|
while (currentDir !== root) {
|
|
878
|
-
const gitPath =
|
|
925
|
+
const gitPath = import_node_path5.default.join(currentDir, ".git");
|
|
879
926
|
if (await fileExists(gitPath)) {
|
|
880
927
|
return currentDir;
|
|
881
928
|
}
|
|
882
|
-
const parentDir =
|
|
929
|
+
const parentDir = import_node_path5.default.dirname(currentDir);
|
|
883
930
|
if (parentDir === currentDir) {
|
|
884
931
|
break;
|
|
885
932
|
}
|
|
@@ -890,16 +937,16 @@ async function findGitRoot(startPath) {
|
|
|
890
937
|
function buildSearchRoots(evalPath, repoRoot) {
|
|
891
938
|
const uniqueRoots = [];
|
|
892
939
|
const addRoot = (root) => {
|
|
893
|
-
const normalized =
|
|
940
|
+
const normalized = import_node_path5.default.resolve(root);
|
|
894
941
|
if (!uniqueRoots.includes(normalized)) {
|
|
895
942
|
uniqueRoots.push(normalized);
|
|
896
943
|
}
|
|
897
944
|
};
|
|
898
|
-
let currentDir =
|
|
945
|
+
let currentDir = import_node_path5.default.dirname(evalPath);
|
|
899
946
|
let reachedBoundary = false;
|
|
900
947
|
while (!reachedBoundary) {
|
|
901
948
|
addRoot(currentDir);
|
|
902
|
-
const parentDir =
|
|
949
|
+
const parentDir = import_node_path5.default.dirname(currentDir);
|
|
903
950
|
if (currentDir === repoRoot || parentDir === currentDir) {
|
|
904
951
|
reachedBoundary = true;
|
|
905
952
|
} else {
|
|
@@ -917,16 +964,16 @@ function trimLeadingSeparators(value) {
|
|
|
917
964
|
async function resolveFileReference(rawValue, searchRoots) {
|
|
918
965
|
const displayPath = trimLeadingSeparators(rawValue);
|
|
919
966
|
const potentialPaths = [];
|
|
920
|
-
if (
|
|
921
|
-
potentialPaths.push(
|
|
967
|
+
if (import_node_path5.default.isAbsolute(rawValue)) {
|
|
968
|
+
potentialPaths.push(import_node_path5.default.normalize(rawValue));
|
|
922
969
|
}
|
|
923
970
|
for (const base of searchRoots) {
|
|
924
|
-
potentialPaths.push(
|
|
971
|
+
potentialPaths.push(import_node_path5.default.resolve(base, displayPath));
|
|
925
972
|
}
|
|
926
973
|
const attempted = [];
|
|
927
974
|
const seen = /* @__PURE__ */ new Set();
|
|
928
975
|
for (const candidate of potentialPaths) {
|
|
929
|
-
const absoluteCandidate =
|
|
976
|
+
const absoluteCandidate = import_node_path5.default.resolve(candidate);
|
|
930
977
|
if (seen.has(absoluteCandidate)) {
|
|
931
978
|
continue;
|
|
932
979
|
}
|
|
@@ -945,7 +992,7 @@ function isObject3(value) {
|
|
|
945
992
|
}
|
|
946
993
|
async function validateFileReferences(evalFilePath) {
|
|
947
994
|
const errors = [];
|
|
948
|
-
const absolutePath =
|
|
995
|
+
const absolutePath = import_node_path6.default.resolve(evalFilePath);
|
|
949
996
|
const gitRoot = await findGitRoot(absolutePath);
|
|
950
997
|
if (!gitRoot) {
|
|
951
998
|
errors.push({
|