@agentv/core 0.7.5 → 0.9.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.
@@ -115,10 +115,9 @@ var CLI_PLACEHOLDERS = /* @__PURE__ */ new Set(["PROMPT", "GUIDELINES", "EVAL_ID
115
115
  var BASE_TARGET_SCHEMA = z.object({
116
116
  name: z.string().min(1, "target name is required"),
117
117
  provider: z.string().min(1, "provider is required"),
118
- settings: z.record(z.unknown()).optional(),
119
118
  judge_target: z.string().optional(),
120
119
  workers: z.number().int().min(1).optional()
121
- });
120
+ }).passthrough();
122
121
  var DEFAULT_AZURE_API_VERSION = "2024-10-01-preview";
123
122
  function normalizeAzureApiVersion(value) {
124
123
  if (!value) {
@@ -131,11 +130,43 @@ function normalizeAzureApiVersion(value) {
131
130
  const withoutPrefix = trimmed.replace(/^api[-_]?version\s*=\s*/i, "").trim();
132
131
  return withoutPrefix.length > 0 ? withoutPrefix : DEFAULT_AZURE_API_VERSION;
133
132
  }
133
+ function resolveRetryConfig(target) {
134
+ const maxRetries = resolveOptionalNumber(
135
+ target.max_retries ?? target.maxRetries,
136
+ `${target.name} max retries`
137
+ );
138
+ const initialDelayMs = resolveOptionalNumber(
139
+ target.retry_initial_delay_ms ?? target.retryInitialDelayMs,
140
+ `${target.name} retry initial delay`
141
+ );
142
+ const maxDelayMs = resolveOptionalNumber(
143
+ target.retry_max_delay_ms ?? target.retryMaxDelayMs,
144
+ `${target.name} retry max delay`
145
+ );
146
+ const backoffFactor = resolveOptionalNumber(
147
+ target.retry_backoff_factor ?? target.retryBackoffFactor,
148
+ `${target.name} retry backoff factor`
149
+ );
150
+ const retryableStatusCodes = resolveOptionalNumberArray(
151
+ target.retry_status_codes ?? target.retryStatusCodes,
152
+ `${target.name} retry status codes`
153
+ );
154
+ if (maxRetries === void 0 && initialDelayMs === void 0 && maxDelayMs === void 0 && backoffFactor === void 0 && retryableStatusCodes === void 0) {
155
+ return void 0;
156
+ }
157
+ return {
158
+ maxRetries,
159
+ initialDelayMs,
160
+ maxDelayMs,
161
+ backoffFactor,
162
+ retryableStatusCodes
163
+ };
164
+ }
134
165
  function resolveTargetDefinition(definition, env = process.env) {
135
166
  const parsed = BASE_TARGET_SCHEMA.parse(definition);
136
167
  const provider = parsed.provider.toLowerCase();
137
168
  const providerBatching = resolveOptionalBoolean(
138
- parsed.settings?.provider_batching ?? parsed.settings?.providerBatching
169
+ parsed.provider_batching ?? parsed.providerBatching
139
170
  );
140
171
  switch (provider) {
141
172
  case "azure":
@@ -211,13 +242,12 @@ function resolveTargetDefinition(definition, env = process.env) {
211
242
  }
212
243
  }
213
244
  function resolveAzureConfig(target, env) {
214
- const settings = target.settings ?? {};
215
- const endpointSource = settings.endpoint ?? settings.resource ?? settings.resourceName;
216
- const apiKeySource = settings.api_key ?? settings.apiKey;
217
- const deploymentSource = settings.deployment ?? settings.deploymentName ?? settings.model;
218
- const versionSource = settings.version ?? settings.api_version;
219
- const temperatureSource = settings.temperature;
220
- const maxTokensSource = settings.max_output_tokens ?? settings.maxTokens;
245
+ const endpointSource = target.endpoint ?? target.resource ?? target.resourceName;
246
+ const apiKeySource = target.api_key ?? target.apiKey;
247
+ const deploymentSource = target.deployment ?? target.deploymentName ?? target.model;
248
+ const versionSource = target.version ?? target.api_version;
249
+ const temperatureSource = target.temperature;
250
+ const maxTokensSource = target.max_output_tokens ?? target.maxTokens;
221
251
  const resourceName = resolveString(endpointSource, env, `${target.name} endpoint`);
222
252
  const apiKey = resolveString(apiKeySource, env, `${target.name} api key`);
223
253
  const deploymentName = resolveString(deploymentSource, env, `${target.name} deployment`);
@@ -229,58 +259,61 @@ function resolveAzureConfig(target, env) {
229
259
  maxTokensSource,
230
260
  `${target.name} max output tokens`
231
261
  );
262
+ const retry = resolveRetryConfig(target);
232
263
  return {
233
264
  resourceName,
234
265
  deploymentName,
235
266
  apiKey,
236
267
  version,
237
268
  temperature,
238
- maxOutputTokens
269
+ maxOutputTokens,
270
+ retry
239
271
  };
240
272
  }
241
273
  function resolveAnthropicConfig(target, env) {
242
- const settings = target.settings ?? {};
243
- const apiKeySource = settings.api_key ?? settings.apiKey;
244
- const modelSource = settings.model ?? settings.deployment ?? settings.variant;
245
- const temperatureSource = settings.temperature;
246
- const maxTokensSource = settings.max_output_tokens ?? settings.maxTokens;
247
- const thinkingBudgetSource = settings.thinking_budget ?? settings.thinkingBudget;
274
+ const apiKeySource = target.api_key ?? target.apiKey;
275
+ const modelSource = target.model ?? target.deployment ?? target.variant;
276
+ const temperatureSource = target.temperature;
277
+ const maxTokensSource = target.max_output_tokens ?? target.maxTokens;
278
+ const thinkingBudgetSource = target.thinking_budget ?? target.thinkingBudget;
248
279
  const apiKey = resolveString(apiKeySource, env, `${target.name} Anthropic api key`);
249
280
  const model = resolveString(modelSource, env, `${target.name} Anthropic model`);
281
+ const retry = resolveRetryConfig(target);
250
282
  return {
251
283
  apiKey,
252
284
  model,
253
285
  temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),
254
286
  maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),
255
- thinkingBudget: resolveOptionalNumber(thinkingBudgetSource, `${target.name} thinking budget`)
287
+ thinkingBudget: resolveOptionalNumber(thinkingBudgetSource, `${target.name} thinking budget`),
288
+ retry
256
289
  };
257
290
  }
258
291
  function resolveGeminiConfig(target, env) {
259
- const settings = target.settings ?? {};
260
- const apiKeySource = settings.api_key ?? settings.apiKey;
261
- const modelSource = settings.model ?? settings.deployment ?? settings.variant;
262
- const temperatureSource = settings.temperature;
263
- const maxTokensSource = settings.max_output_tokens ?? settings.maxTokens;
292
+ const apiKeySource = target.api_key ?? target.apiKey;
293
+ const modelSource = target.model ?? target.deployment ?? target.variant;
294
+ const temperatureSource = target.temperature;
295
+ const maxTokensSource = target.max_output_tokens ?? target.maxTokens;
264
296
  const apiKey = resolveString(apiKeySource, env, `${target.name} Google API key`);
265
297
  const model = resolveOptionalString(modelSource, env, `${target.name} Gemini model`, {
266
298
  allowLiteral: true,
267
299
  optionalEnv: true
268
300
  }) ?? "gemini-2.5-flash";
301
+ const retry = resolveRetryConfig(target);
269
302
  return {
270
303
  apiKey,
271
304
  model,
272
305
  temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),
273
- maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`)
306
+ maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),
307
+ retry
274
308
  };
275
309
  }
276
310
  function resolveCodexConfig(target, env) {
277
- const settings = target.settings ?? {};
278
- const executableSource = settings.executable ?? settings.command ?? settings.binary;
279
- const argsSource = settings.args ?? settings.arguments;
280
- const cwdSource = settings.cwd;
281
- const timeoutSource = settings.timeout_seconds ?? settings.timeoutSeconds;
282
- const logDirSource = settings.log_dir ?? settings.logDir ?? settings.log_directory ?? settings.logDirectory;
283
- const logFormatSource = settings.log_format ?? settings.logFormat ?? settings.log_output_format ?? settings.logOutputFormat ?? env.AGENTV_CODEX_LOG_FORMAT;
311
+ const executableSource = target.executable ?? target.command ?? target.binary;
312
+ const argsSource = target.args ?? target.arguments;
313
+ const cwdSource = target.cwd;
314
+ const timeoutSource = target.timeout_seconds ?? target.timeoutSeconds;
315
+ const logDirSource = target.log_dir ?? target.logDir ?? target.log_directory ?? target.logDirectory;
316
+ const logFormatSource = target.log_format ?? target.logFormat ?? target.log_output_format ?? target.logOutputFormat ?? env.AGENTV_CODEX_LOG_FORMAT;
284
317
  const executable = resolveOptionalString(executableSource, env, `${target.name} codex executable`, {
285
318
  allowLiteral: true,
286
319
  optionalEnv: true
@@ -319,21 +352,19 @@ function normalizeCodexLogFormat(value) {
319
352
  throw new Error("codex log format must be 'summary' or 'json'");
320
353
  }
321
354
  function resolveMockConfig(target) {
322
- const settings = target.settings ?? {};
323
- const response = typeof settings.response === "string" ? settings.response : void 0;
355
+ const response = typeof target.response === "string" ? target.response : void 0;
324
356
  return { response };
325
357
  }
326
358
  function resolveVSCodeConfig(target, env, insiders) {
327
- const settings = target.settings ?? {};
328
- const workspaceTemplateEnvVar = resolveOptionalLiteralString(settings.workspace_template ?? settings.workspaceTemplate);
359
+ const workspaceTemplateEnvVar = resolveOptionalLiteralString(target.workspace_template ?? target.workspaceTemplate);
329
360
  const workspaceTemplate = workspaceTemplateEnvVar ? resolveOptionalString(workspaceTemplateEnvVar, env, `${target.name} workspace template path`, {
330
361
  allowLiteral: false,
331
362
  optionalEnv: true
332
363
  }) : void 0;
333
- const commandSource = settings.vscode_cmd ?? settings.command;
334
- const waitSource = settings.wait;
335
- const dryRunSource = settings.dry_run ?? settings.dryRun;
336
- const subagentRootSource = settings.subagent_root ?? settings.subagentRoot;
364
+ const commandSource = target.vscode_cmd ?? target.command;
365
+ const waitSource = target.wait;
366
+ const dryRunSource = target.dry_run ?? target.dryRun;
367
+ const subagentRootSource = target.subagent_root ?? target.subagentRoot;
337
368
  const defaultCommand = insiders ? "code-insiders" : "code";
338
369
  const command = resolveOptionalLiteralString(commandSource) ?? defaultCommand;
339
370
  return {
@@ -348,18 +379,16 @@ function resolveVSCodeConfig(target, env, insiders) {
348
379
  };
349
380
  }
350
381
  function resolveCliConfig(target, env) {
351
- const settings = target.settings ?? {};
352
- const commandTemplateSource = settings.command_template ?? settings.commandTemplate;
382
+ const commandTemplateSource = target.command_template ?? target.commandTemplate;
353
383
  const filesFormat = resolveOptionalLiteralString(
354
- settings.files_format ?? settings.filesFormat ?? settings.attachments_format ?? settings.attachmentsFormat
384
+ target.files_format ?? target.filesFormat ?? target.attachments_format ?? target.attachmentsFormat
355
385
  );
356
- const cwd = resolveOptionalString(settings.cwd, env, `${target.name} working directory`, {
386
+ const cwd = resolveOptionalString(target.cwd, env, `${target.name} working directory`, {
357
387
  allowLiteral: true,
358
388
  optionalEnv: true
359
389
  });
360
- const envOverrides = resolveEnvOverrides(settings.env, env, target.name);
361
- const timeoutMs = resolveTimeoutMs(settings.timeout_seconds ?? settings.timeoutSeconds, `${target.name} timeout`);
362
- const healthcheck = resolveCliHealthcheck(settings.healthcheck, env, target.name);
390
+ const timeoutMs = resolveTimeoutMs(target.timeout_seconds ?? target.timeoutSeconds, `${target.name} timeout`);
391
+ const healthcheck = resolveCliHealthcheck(target.healthcheck, env, target.name);
363
392
  const commandTemplate = resolveString(
364
393
  commandTemplateSource,
365
394
  env,
@@ -371,29 +400,10 @@ function resolveCliConfig(target, env) {
371
400
  commandTemplate,
372
401
  filesFormat,
373
402
  cwd,
374
- env: envOverrides,
375
403
  timeoutMs,
376
404
  healthcheck
377
405
  };
378
406
  }
379
- function resolveEnvOverrides(source, env, targetName) {
380
- if (source === void 0 || source === null) {
381
- return void 0;
382
- }
383
- if (typeof source !== "object" || Array.isArray(source)) {
384
- throw new Error(`${targetName} env overrides must be an object map of strings`);
385
- }
386
- const entries = Object.entries(source);
387
- const resolved = {};
388
- for (const [key, value] of entries) {
389
- if (typeof value !== "string") {
390
- throw new Error(`${targetName} env override '${key}' must be a string`);
391
- }
392
- const resolvedValue = resolveString(value, env, `${targetName} env override '${key}'`);
393
- resolved[key] = resolvedValue;
394
- }
395
- return Object.keys(resolved).length > 0 ? resolved : void 0;
396
- }
397
407
  function resolveTimeoutMs(source, description) {
398
408
  const seconds = resolveOptionalNumber(source, `${description} (seconds)`);
399
409
  if (seconds === void 0) {
@@ -589,6 +599,26 @@ function resolveOptionalStringArray(source, env, description) {
589
599
  }
590
600
  return resolved.length > 0 ? resolved : void 0;
591
601
  }
602
+ function resolveOptionalNumberArray(source, description) {
603
+ if (source === void 0 || source === null) {
604
+ return void 0;
605
+ }
606
+ if (!Array.isArray(source)) {
607
+ throw new Error(`${description} must be an array of numbers`);
608
+ }
609
+ if (source.length === 0) {
610
+ return void 0;
611
+ }
612
+ const resolved = [];
613
+ for (let i = 0; i < source.length; i++) {
614
+ const item = source[i];
615
+ if (typeof item !== "number" || !Number.isFinite(item)) {
616
+ throw new Error(`${description}[${i}] must be a number`);
617
+ }
618
+ resolved.push(item);
619
+ }
620
+ return resolved.length > 0 ? resolved : void 0;
621
+ }
592
622
 
593
623
  // src/evaluation/providers/types.ts
594
624
  var AGENT_PROVIDER_KINDS = [
@@ -622,7 +652,7 @@ var PROVIDER_ALIASES = [
622
652
  "vertex"
623
653
  // legacy/future support
624
654
  ];
625
- var TARGETS_SCHEMA_V2 = "agentv-targets-v2.1";
655
+ var TARGETS_SCHEMA_V2 = "agentv-targets-v2.2";
626
656
  function isAgentProvider(provider) {
627
657
  return provider ? AGENT_PROVIDER_KINDS.includes(provider.kind) : false;
628
658
  }
@@ -642,4 +672,4 @@ export {
642
672
  TARGETS_SCHEMA_V2,
643
673
  isAgentProvider
644
674
  };
645
- //# sourceMappingURL=chunk-7XM7HYRS.js.map
675
+ //# sourceMappingURL=chunk-SNTZFB24.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 * 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 { z } from \"zod\";\r\n\r\nimport type { EnvLookup, TargetDefinition } from \"./types.js\";\r\n\r\nexport const CLI_PLACEHOLDERS = new Set([\"PROMPT\", \"GUIDELINES\", \"EVAL_ID\", \"ATTEMPT\", \"FILES\", \"OUTPUT_FILE\"]);\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\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\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\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}\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}\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.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}).passthrough();\r\n\r\nconst DEFAULT_AZURE_API_VERSION = \"2024-10-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): 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),\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 = 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 return { response };\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(target.workspace_template ?? target.workspaceTemplate);\r\n const workspaceTemplate = workspaceTemplateEnvVar\r\n ? resolveOptionalString(workspaceTemplateEnvVar, env, `${target.name} workspace template path`, {\r\n allowLiteral: false,\r\n optionalEnv: true,\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): 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 const cwd = resolveOptionalString(target.cwd, env, `${target.name} working directory`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n });\r\n const timeoutMs = resolveTimeoutMs(target.timeout_seconds ?? target.timeoutSeconds, `${target.name} timeout`);\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 if (envValue !== undefined) {\r\n if (envValue.trim().length === 0) {\r\n throw new Error(`Environment variable '${varName}' for ${description} is empty`);\r\n }\r\n return envValue;\r\n }\r\n const optionalEnv = options?.optionalEnv ?? false;\r\n if (optionalEnv) {\r\n return undefined;\r\n }\r\n throw new Error(`Environment variable '${varName}' required for ${description} is not set`);\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(`${description} must use \\${{ VARIABLE_NAME }} syntax for environment variables or be marked as allowing literals`);\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 { AxChatRequest, AxAI } from \"@ax-llm/ax\";\r\n\r\nimport type { JsonObject } from \"../types.js\";\r\n\r\ntype ChatPrompt = AxChatRequest[\"chatPrompt\"];\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 guidelines?: string;\r\n readonly guideline_patterns?: readonly string[];\r\n readonly chatPrompt?: ChatPrompt;\r\n readonly inputFiles?: readonly string[];\r\n readonly evalCaseId?: string;\r\n readonly attempt?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly temperature?: number;\r\n readonly metadata?: JsonObject;\r\n readonly signal?: AbortSignal;\r\n}\r\n\r\nexport interface ProviderResponse {\r\n readonly text: string;\r\n readonly reasoning?: string;\r\n readonly raw?: unknown;\r\n readonly usage?: JsonObject;\r\n}\r\n\r\n/**\r\n * Type guard to check if a provider is an agent provider with filesystem access.\r\n * Agent providers read files directly and don't need unwrapped guideline content.\r\n */\r\nexport function isAgentProvider(provider: Provider | undefined): boolean {\r\n return provider ? AGENT_PROVIDER_KINDS.includes(provider.kind) : false;\r\n}\r\n\r\nexport interface Provider {\r\n readonly id: string;\r\n readonly kind: ProviderKind;\r\n readonly targetName: string;\r\n invoke(request: ProviderRequest): Promise<ProviderResponse>;\r\n /**\r\n * Optional capability marker for provider-managed batching (single session handling multiple requests).\r\n */\r\n readonly supportsBatch?: boolean;\r\n /**\r\n * Optional batch invocation hook. When defined alongside supportsBatch=true,\r\n * the orchestrator may send multiple requests in a single provider session.\r\n */\r\n invokeBatch?(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]>;\r\n /**\r\n * Optional access to the underlying AxAI instance.\r\n * This enables using advanced Ax features like structured output signatures.\r\n */\r\n getAxAI?(): AxAI;\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":[]}
@@ -44,7 +44,7 @@ module.exports = __toCommonJS(validation_exports);
44
44
  var import_promises = require("fs/promises");
45
45
  var import_yaml = require("yaml");
46
46
  var SCHEMA_EVAL_V2 = "agentv-eval-v2";
47
- var SCHEMA_TARGETS_V2 = "agentv-targets-v2.1";
47
+ var SCHEMA_TARGETS_V2 = "agentv-targets-v2.2";
48
48
  var SCHEMA_CONFIG_V2 = "agentv-config-v2";
49
49
  async function detectFileType(filePath) {
50
50
  try {
@@ -317,7 +317,7 @@ var PROVIDER_ALIASES = [
317
317
  "vertex"
318
318
  // legacy/future support
319
319
  ];
320
- var TARGETS_SCHEMA_V2 = "agentv-targets-v2.1";
320
+ var TARGETS_SCHEMA_V2 = "agentv-targets-v2.2";
321
321
 
322
322
  // src/evaluation/providers/targets.ts
323
323
  var import_zod = require("zod");
@@ -325,10 +325,9 @@ var CLI_PLACEHOLDERS = /* @__PURE__ */ new Set(["PROMPT", "GUIDELINES", "EVAL_ID
325
325
  var BASE_TARGET_SCHEMA = import_zod.z.object({
326
326
  name: import_zod.z.string().min(1, "target name is required"),
327
327
  provider: import_zod.z.string().min(1, "provider is required"),
328
- settings: import_zod.z.record(import_zod.z.unknown()).optional(),
329
328
  judge_target: import_zod.z.string().optional(),
330
329
  workers: import_zod.z.number().int().min(1).optional()
331
- });
330
+ }).passthrough();
332
331
 
333
332
  // src/evaluation/validation/targets-validator.ts
334
333
  function isObject2(value) {
@@ -338,8 +337,21 @@ var COMMON_SETTINGS = /* @__PURE__ */ new Set([
338
337
  "provider_batching",
339
338
  "providerBatching"
340
339
  ]);
340
+ var RETRY_SETTINGS = /* @__PURE__ */ new Set([
341
+ "max_retries",
342
+ "maxRetries",
343
+ "retry_initial_delay_ms",
344
+ "retryInitialDelayMs",
345
+ "retry_max_delay_ms",
346
+ "retryMaxDelayMs",
347
+ "retry_backoff_factor",
348
+ "retryBackoffFactor",
349
+ "retry_status_codes",
350
+ "retryStatusCodes"
351
+ ]);
341
352
  var AZURE_SETTINGS = /* @__PURE__ */ new Set([
342
353
  ...COMMON_SETTINGS,
354
+ ...RETRY_SETTINGS,
343
355
  "endpoint",
344
356
  "resource",
345
357
  "resourceName",
@@ -356,6 +368,7 @@ var AZURE_SETTINGS = /* @__PURE__ */ new Set([
356
368
  ]);
357
369
  var ANTHROPIC_SETTINGS = /* @__PURE__ */ new Set([
358
370
  ...COMMON_SETTINGS,
371
+ ...RETRY_SETTINGS,
359
372
  "api_key",
360
373
  "apiKey",
361
374
  "model",
@@ -369,6 +382,7 @@ var ANTHROPIC_SETTINGS = /* @__PURE__ */ new Set([
369
382
  ]);
370
383
  var GEMINI_SETTINGS = /* @__PURE__ */ new Set([
371
384
  ...COMMON_SETTINGS,
385
+ ...RETRY_SETTINGS,
372
386
  "api_key",
373
387
  "apiKey",
374
388
  "model",
@@ -456,13 +470,14 @@ function getKnownSettings(provider) {
456
470
  return null;
457
471
  }
458
472
  }
459
- function validateUnknownSettings(settings, provider, absolutePath, location, errors) {
473
+ function validateUnknownSettings(target, provider, absolutePath, location, errors) {
460
474
  const knownSettings = getKnownSettings(provider);
461
475
  if (!knownSettings) {
462
476
  return;
463
477
  }
464
- for (const key of Object.keys(settings)) {
465
- if (!knownSettings.has(key)) {
478
+ const baseFields = /* @__PURE__ */ new Set(["name", "provider", "judge_target", "workers", "$schema", "targets"]);
479
+ for (const key of Object.keys(target)) {
480
+ if (!baseFields.has(key) && !knownSettings.has(key)) {
466
481
  errors.push({
467
482
  severity: "warning",
468
483
  filePath: absolutePath,
@@ -492,17 +507,8 @@ async function validateTargetsFile(filePath) {
492
507
  errors
493
508
  };
494
509
  }
495
- function validateCliSettings(settings, absolutePath2, location, errors2) {
496
- if (!isObject2(settings)) {
497
- errors2.push({
498
- severity: "error",
499
- filePath: absolutePath2,
500
- location,
501
- message: "CLI provider requires a 'settings' object"
502
- });
503
- return;
504
- }
505
- const commandTemplate = settings["command_template"] ?? settings["commandTemplate"];
510
+ function validateCliSettings(target, absolutePath2, location, errors2) {
511
+ const commandTemplate = target["command_template"] ?? target["commandTemplate"];
506
512
  if (typeof commandTemplate !== "string" || commandTemplate.trim().length === 0) {
507
513
  errors2.push({
508
514
  severity: "error",
@@ -513,7 +519,7 @@ async function validateTargetsFile(filePath) {
513
519
  } else {
514
520
  recordUnknownPlaceholders(commandTemplate, absolutePath2, `${location}.commandTemplate`, errors2);
515
521
  }
516
- const attachmentsFormat = settings["attachments_format"] ?? settings["attachmentsFormat"];
522
+ const attachmentsFormat = target["attachments_format"] ?? target["attachmentsFormat"];
517
523
  if (attachmentsFormat !== void 0 && typeof attachmentsFormat !== "string") {
518
524
  errors2.push({
519
525
  severity: "error",
@@ -522,7 +528,7 @@ async function validateTargetsFile(filePath) {
522
528
  message: "'attachmentsFormat' must be a string when provided"
523
529
  });
524
530
  }
525
- const filesFormat = settings["files_format"] ?? settings["filesFormat"];
531
+ const filesFormat = target["files_format"] ?? target["filesFormat"];
526
532
  if (filesFormat !== void 0 && typeof filesFormat !== "string") {
527
533
  errors2.push({
528
534
  severity: "error",
@@ -531,7 +537,7 @@ async function validateTargetsFile(filePath) {
531
537
  message: "'filesFormat' must be a string when provided"
532
538
  });
533
539
  }
534
- const cwd = settings["cwd"];
540
+ const cwd = target["cwd"];
535
541
  if (cwd !== void 0 && typeof cwd !== "string") {
536
542
  errors2.push({
537
543
  severity: "error",
@@ -540,7 +546,7 @@ async function validateTargetsFile(filePath) {
540
546
  message: "'cwd' must be a string when provided"
541
547
  });
542
548
  }
543
- const timeoutSeconds = settings["timeout_seconds"] ?? settings["timeoutSeconds"];
549
+ const timeoutSeconds = target["timeout_seconds"] ?? target["timeoutSeconds"];
544
550
  if (timeoutSeconds !== void 0) {
545
551
  const numericTimeout = Number(timeoutSeconds);
546
552
  if (!Number.isFinite(numericTimeout) || numericTimeout <= 0) {
@@ -552,29 +558,7 @@ async function validateTargetsFile(filePath) {
552
558
  });
553
559
  }
554
560
  }
555
- const envOverrides = settings["env"];
556
- if (envOverrides !== void 0) {
557
- if (!isObject2(envOverrides)) {
558
- errors2.push({
559
- severity: "error",
560
- filePath: absolutePath2,
561
- location: `${location}.env`,
562
- message: "'env' must be an object with string values"
563
- });
564
- } else {
565
- for (const [key, value] of Object.entries(envOverrides)) {
566
- if (typeof value !== "string" || value.trim().length === 0) {
567
- errors2.push({
568
- severity: "error",
569
- filePath: absolutePath2,
570
- location: `${location}.env.${key}`,
571
- message: `Environment override '${key}' must be a non-empty string`
572
- });
573
- }
574
- }
575
- }
576
- }
577
- const healthcheck = settings["healthcheck"];
561
+ const healthcheck = target["healthcheck"];
578
562
  if (healthcheck !== void 0) {
579
563
  validateCliHealthcheck(healthcheck, absolutePath2, `${location}.healthcheck`, errors2);
580
564
  }
@@ -745,20 +729,11 @@ async function validateTargetsFile(filePath) {
745
729
  message: `Unknown provider '${provider}'. Known providers: ${knownProviders.join(", ")}`
746
730
  });
747
731
  }
748
- const settings = target["settings"];
749
- if (providerValue !== "cli" && settings !== void 0 && !isObject2(settings)) {
750
- errors.push({
751
- severity: "error",
752
- filePath: absolutePath,
753
- location: `${location}.settings`,
754
- message: "Invalid 'settings' field (must be an object)"
755
- });
756
- }
757
732
  if (providerValue === "cli") {
758
- validateCliSettings(settings, absolutePath, `${location}.settings`, errors);
733
+ validateCliSettings(target, absolutePath, location, errors);
759
734
  }
760
- if (settings !== void 0 && isObject2(settings) && typeof provider === "string") {
761
- validateUnknownSettings(settings, provider, absolutePath, `${location}.settings`, errors);
735
+ if (typeof provider === "string") {
736
+ validateUnknownSettings(target, provider, absolutePath, location, errors);
762
737
  }
763
738
  const judgeTarget = target["judge_target"];
764
739
  if (judgeTarget !== void 0 && typeof judgeTarget !== "string") {