@agentv/core 4.27.0 → 4.28.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/agentv-provider-AYXH7WLW.js +7 -0
- package/dist/{chunk-JNBHD34F.js → chunk-SCC35F3L.js} +36 -21
- package/dist/chunk-SCC35F3L.js.map +1 -0
- package/dist/{chunk-M5X2KMEA.js → chunk-YDFZ7XN3.js} +2 -2
- package/dist/chunk-YDFZ7XN3.js.map +1 -0
- package/dist/{chunk-7LQI7772.js → chunk-YFXMMBUG.js} +4 -2
- package/dist/chunk-YFXMMBUG.js.map +1 -0
- package/dist/evaluation/validation/index.cjs.map +1 -1
- package/dist/evaluation/validation/index.js +1 -1
- package/dist/index.cjs +85 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +43 -1
- package/dist/index.d.ts +43 -1
- package/dist/index.js +50 -8
- package/dist/index.js.map +1 -1
- package/dist/ts-eval-loader-EMSGL2BQ.js +12 -0
- package/package.json +4 -4
- package/dist/agentv-provider-7AMUD2GX.js +0 -7
- package/dist/chunk-7LQI7772.js.map +0 -1
- package/dist/chunk-JNBHD34F.js.map +0 -1
- package/dist/chunk-M5X2KMEA.js.map +0 -1
- package/dist/ts-eval-loader-BZ54W52K.js +0 -12
- /package/dist/{agentv-provider-7AMUD2GX.js.map → agentv-provider-AYXH7WLW.js.map} +0 -0
- /package/dist/{ts-eval-loader-BZ54W52K.js.map → ts-eval-loader-EMSGL2BQ.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/evaluation/loaders/ts-eval-loader.ts","../src/evaluation/evaluate.ts","../src/evaluation/graders/scoring.ts","../src/evaluation/orchestrator.ts","../../../node_modules/.bun/yocto-queue@1.2.2/node_modules/yocto-queue/index.js","../../../node_modules/.bun/p-limit@6.2.0/node_modules/p-limit/index.js","../src/paths.ts","../src/evaluation/graders/code-grader.ts","../src/runtime/target-proxy.ts","../src/evaluation/case-conversion.ts","../src/evaluation/workspace/repo-checkout.ts","../src/evaluation/graders/llm-grader.ts","../src/evaluation/content-preprocessor.ts","../src/evaluation/template-variables.ts","../src/evaluation/graders/composite.ts","../src/evaluation/graders/cost.ts","../src/evaluation/trace.ts","../src/evaluation/graders/execution-metrics.ts","../src/evaluation/graders/field-accuracy.ts","../src/evaluation/graders/latency.ts","../src/evaluation/graders/format-tool-calls.ts","../src/evaluation/graders/skill-trigger.ts","../src/evaluation/graders/llm-grader-prompt.ts","../src/evaluation/graders/token-usage.ts","../src/evaluation/graders/tool-trajectory.ts","../src/evaluation/graders/assertions.ts","../src/evaluation/providers/claude-cli.ts","../src/runtime/child-tracker.ts","../src/evaluation/providers/claude-content.ts","../src/evaluation/providers/claude-log-tracker.ts","../src/evaluation/providers/normalize-tool-call.ts","../src/evaluation/providers/preread.ts","../src/evaluation/providers/claude-sdk.ts","../src/evaluation/providers/cli.ts","../src/evaluation/providers/codex.ts","../src/evaluation/providers/codex-log-tracker.ts","../src/evaluation/providers/copilot-cli.ts","../src/evaluation/workspace/file-changes.ts","../src/evaluation/providers/copilot-cli-log-tracker.ts","../src/evaluation/providers/copilot-utils.ts","../src/evaluation/providers/copilot-log.ts","../src/evaluation/providers/copilot-log-parser.ts","../src/evaluation/providers/copilot-session-discovery.ts","../src/evaluation/providers/copilot-sdk.ts","../src/evaluation/providers/copilot-sdk-log-tracker.ts","../src/evaluation/providers/mock.ts","../src/evaluation/providers/pi-cli.ts","../src/evaluation/providers/pi-log-tracker.ts","../src/evaluation/providers/pi-provider-aliases.ts","../src/evaluation/providers/pi-utils.ts","../src/evaluation/providers/pi-coding-agent.ts","../src/evaluation/providers/provider-registry.ts","../src/evaluation/providers/vscode-provider.ts","../src/evaluation/providers/vscode/dispatch/agentDispatch.ts","../src/evaluation/providers/vscode/utils/fs.ts","../src/evaluation/providers/vscode/utils/path.ts","../src/evaluation/providers/vscode/dispatch/promptBuilder.ts","../src/evaluation/providers/vscode/utils/template.ts","../src/evaluation/providers/vscode/dispatch/templates.ts","../src/evaluation/providers/vscode/dispatch/responseWaiter.ts","../src/evaluation/providers/vscode/utils/time.ts","../src/evaluation/providers/vscode/dispatch/vscodeProcess.ts","../src/evaluation/providers/vscode/dispatch/constants.ts","../src/evaluation/providers/vscode/dispatch/workspaceManager.ts","../src/evaluation/providers/vscode/utils/workspace.ts","../src/evaluation/providers/vscode/dispatch/provision.ts","../src/evaluation/providers/vscode-templates.ts","../src/evaluation/providers/targets-file.ts","../src/evaluation/providers/provider-discovery.ts","../src/evaluation/providers/index.ts","../src/evaluation/registry/grader-registry.ts","../src/evaluation/graders/inline-assert.ts","../src/evaluation/graders/prompt-resolution.ts","../src/evaluation/registry/builtin-graders.ts","../src/evaluation/registry/assertion-discovery.ts","../src/evaluation/registry/grader-discovery.ts","../src/evaluation/trials.ts","../src/evaluation/workspace/manager.ts","../src/evaluation/workspace/pool-manager.ts","../src/evaluation/workspace/repo-manager.ts","../src/evaluation/workspace/resolve.ts","../src/evaluation/workspace/script-executor.ts","../src/evaluation/yaml-parser.ts","../src/evaluation/input-message-utils.ts","../src/evaluation/loaders/agent-skills-parser.ts","../src/evaluation/loaders/config-loader.ts","../src/evaluation/loaders/file-resolver.ts","../src/evaluation/loaders/grader-parser.ts","../src/evaluation/validation/prompt-validator.ts","../src/evaluation/loaders/jsonl-parser.ts","../src/evaluation/loaders/message-processor.ts","../src/evaluation/formatting/segment-formatter.ts","../src/evaluation/loaders/shorthand-expansion.ts","../src/evaluation/metadata.ts","../src/evaluation/workspace/repo-config-parser.ts","../src/evaluation/formatting/prompt-builder.ts","../src/evaluation/providers/function-provider.ts"],"sourcesContent":["/**\n * Loads an eval suite from a TypeScript *.eval.ts file.\n *\n * Each TS eval file must export an EvalConfig as its default export or\n * as a named export called `config` or `evalConfig`.\n *\n * The file is loaded via dynamic import() which works natively in Bun\n * and requires tsx/jiti for Node.js.\n *\n * To add a new export convention: add the name to EXPORT_NAMES below.\n */\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { type EvalConfig, materializeEvalConfig } from '../evaluate.js';\nimport { createFunctionProvider } from '../providers/function-provider.js';\nimport type { ProviderFactoryFn } from '../providers/provider-registry.js';\nimport type { TargetDefinition } from '../providers/types.js';\nimport type { EvalSuiteResult } from '../yaml-parser.js';\n\nconst EXPORT_NAMES = ['default', 'config', 'evalConfig'] as const;\n\nexport interface TsEvalResult {\n readonly config: EvalConfig;\n readonly filePath: string;\n}\n\nexport interface TsEvalSuiteResult extends EvalSuiteResult {\n readonly inlineTarget?: TargetDefinition;\n readonly providerFactory?: ProviderFactoryFn;\n}\n\n/**\n * Import a *.eval.ts file and extract the EvalConfig export.\n * Tries default, `config`, and `evalConfig` named exports in priority order.\n */\nexport async function loadTsEvalFile(filePath: string): Promise<TsEvalResult> {\n const absolutePath = path.resolve(filePath);\n const moduleUrl = pathToFileURL(absolutePath).href;\n const module = await import(moduleUrl);\n\n let config: EvalConfig | undefined;\n for (const name of EXPORT_NAMES) {\n const candidate = module[name];\n if (isEvalConfigLike(candidate)) {\n config = candidate;\n break;\n }\n }\n\n if (!config) {\n throw new Error(\n `${filePath}: no EvalConfig export found. Export an EvalConfig as default, 'config', or 'evalConfig'.`,\n );\n }\n\n return { config, filePath: absolutePath };\n}\n\nexport async function loadTsEvalSuite(\n filePath: string,\n repoRoot: string,\n options?: {\n readonly verbose?: boolean;\n readonly filter?: string | readonly string[];\n readonly category?: string;\n },\n): Promise<TsEvalSuiteResult> {\n const { config, filePath: absolutePath } = await loadTsEvalFile(filePath);\n const materialized = await materializeEvalConfig(config, {\n repoRoot,\n baseDir: path.dirname(absolutePath),\n filter: options?.filter,\n category: options?.category,\n });\n\n return {\n tests: materialized.tests,\n ...(materialized.workers !== undefined && { workers: materialized.workers }),\n ...(materialized.cache !== undefined && { cacheConfig: { enabled: materialized.cache } }),\n ...(materialized.budgetUsd !== undefined && { budgetUsd: materialized.budgetUsd }),\n ...(materialized.threshold !== undefined && { threshold: materialized.threshold }),\n ...(materialized.metadata !== undefined && { metadata: materialized.metadata }),\n ...(materialized.target !== undefined && { inlineTarget: materialized.target }),\n ...(materialized.task !== undefined && {\n providerFactory: (() => {\n const task = materialized.task;\n if (!task) {\n throw new Error(`${filePath}: missing task function for providerFactory`);\n }\n return createFunctionProvider(task);\n }) as ProviderFactoryFn,\n }),\n };\n}\n\n/**\n * Duck-type check for EvalConfig-like objects.\n * An EvalConfig must have at least one of: tests, specFile, or target.\n */\nfunction isEvalConfigLike(value: unknown): value is EvalConfig {\n if (!value || typeof value !== 'object') return false;\n const obj = value as Record<string, unknown>;\n return 'tests' in obj || 'specFile' in obj || 'target' in obj || 'task' in obj;\n}\n","/**\n * Programmatic API for running evaluations.\n *\n * Provides `evaluate()` — a high-level function for using AgentV as a library\n * instead of a CLI. The config shape mirrors the YAML structure for easy\n * translation between file-based and programmatic usage.\n *\n * @example Inline tests with config objects\n * ```typescript\n * import { evaluate } from '@agentv/core';\n *\n * const results = await evaluate({\n * tests: [\n * {\n * id: 'capital',\n * input: 'What is the capital of France?',\n * expectedOutput: 'Paris',\n * assert: [{ type: 'contains', value: 'Paris' }],\n * },\n * ],\n * target: { provider: 'mock_agent' },\n * });\n *\n * console.log(results.summary.passed, 'passed');\n * ```\n *\n * @example Inline tests with task function and custom assertion\n * ```typescript\n * import { evaluate } from '@agentv/core';\n *\n * const { summary } = await evaluate({\n * tests: [\n * {\n * id: 'echo',\n * input: 'hello',\n * expectedOutput: 'Echo: hello',\n * assert: [\n * { type: 'contains', value: 'hello' },\n * { type: 'equals' },\n * ({ output }) => ({ name: 'custom', score: output.length > 0 ? 1 : 0 }),\n * ],\n * },\n * ],\n * task: async (input) => `Echo: ${input}`,\n * });\n * ```\n *\n * @example File-based\n * ```typescript\n * const results = await evaluate({\n * specFile: './evals/EVAL.yaml',\n * target: { provider: 'claude_agent' },\n * });\n * ```\n *\n * @module\n */\n\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\nimport { buildDirectoryChain, findGitRoot } from './file-utils.js';\n\nimport type { AssertFn } from './assertions.js';\nimport { DEFAULT_THRESHOLD } from './graders/scoring.js';\nimport type { EvalMetadata } from './metadata.js';\nimport { runEvaluation } from './orchestrator.js';\nimport { createFunctionProvider } from './providers/function-provider.js';\nimport type { ProviderFactoryFn } from './providers/provider-registry.js';\nimport { readTargetDefinitions } from './providers/targets-file.js';\nimport { type ResolvedTarget, resolveTargetDefinition } from './providers/targets.js';\nimport type { TargetDefinition } from './providers/types.js';\nimport { INLINE_ASSERT_FN } from './registry/builtin-graders.js';\nimport type {\n ConversationAggregation,\n ConversationTurn,\n EvalTest,\n EvaluationResult,\n GraderConfig,\n InlineAssertEvaluatorConfig,\n WorkspaceHookConfig,\n} from './types.js';\nimport { loadTestSuite } from './yaml-parser.js';\n\n/**\n * Inline test definition for the programmatic API.\n * Mirrors the YAML test structure.\n */\nexport interface EvalTestInput {\n /** Unique test identifier */\n readonly id: string;\n /** What the response should accomplish */\n readonly criteria?: string;\n /** Input to the agent (string or message array). Omit when using turns[]. */\n readonly input?: string | readonly { role: string; content: string }[];\n /** Expected reference output (camelCase preferred) */\n readonly expectedOutput?: string;\n /** @deprecated Use `expectedOutput` instead */\n readonly expected_output?: string;\n /** Assertion graders — accepts factory functions, config objects, or inline functions */\n readonly assert?: readonly AssertEntry[];\n /** Arbitrary metadata */\n readonly metadata?: Record<string, unknown>;\n /** Enable multi-turn conversation mode. Inferred automatically when turns[] is provided. */\n readonly mode?: 'conversation';\n /** Ordered turns for conversation evaluation. Each turn generates a fresh LLM call. */\n readonly turns?: readonly ConversationTurnInput[];\n /** Score aggregation across turns: 'mean' (default), 'min', or 'max'. */\n readonly aggregation?: ConversationAggregation;\n}\n\n/**\n * A single turn in a multi-turn conversation evaluation (programmatic API).\n * Mirrors the YAML `turns` structure with camelCase naming.\n */\nexport interface ConversationTurnInput {\n /** Input for this turn (string or message array) */\n readonly input: string | readonly { role: string; content: string }[];\n /** Expected reference output for this turn */\n readonly expectedOutput?: string;\n /** @deprecated Use `expectedOutput` instead */\n readonly expected_output?: string;\n /** Per-turn assertions (string criteria or grader config) */\n readonly assert?: readonly AssertEntry[];\n}\n\n/**\n * Inline assertion definition for the programmatic API.\n * Matches the YAML `assert` block structure.\n */\nexport interface EvalAssertionInput {\n /** Assertion type (e.g., 'contains', 'llm-grader', 'code-grader') */\n readonly type: string;\n /** Display name */\n readonly name?: string;\n /** Value for deterministic assertions (contains, equals, regex) */\n readonly value?: string;\n /** Weight for scoring */\n readonly weight?: number;\n /** Whether this assertion is required to pass */\n readonly required?: boolean | number;\n /** Minimum score (0-1) for this evaluator to pass. Independent of `required` gate. */\n readonly min_score?: number;\n /** Prompt file for llm_grader */\n readonly prompt?: string;\n /** Script for code_grader */\n readonly script?: string | readonly string[];\n /** Additional config passed to the assertion */\n readonly config?: Record<string, unknown>;\n /** Nested assertions for composite type */\n readonly assert?: readonly EvalAssertionInput[];\n /** Rubric criteria for rubrics type */\n readonly criteria?: readonly (string | { id?: string; outcome: string; weight?: number })[];\n /** Additional properties */\n readonly [key: string]: unknown;\n}\n\n/** Assert entry: inline function or config object */\nexport type AssertEntry = AssertFn | EvalAssertionInput;\n\n/**\n * Configuration for `evaluate()`.\n * Accepts either inline tests or a spec file path.\n */\nexport interface EvalConfig {\n /** Inline test definitions (mutually exclusive with specFile) */\n readonly tests?: readonly EvalTestInput[];\n /** Path to an EVAL.yaml spec file (mutually exclusive with tests) */\n readonly specFile?: string;\n /** Target provider configuration */\n readonly target?: TargetDefinition;\n /** Custom task function — mutually exclusive with target */\n readonly task?: (input: string) => string | Promise<string>;\n /** Suite-level assertions applied to all tests */\n readonly assert?: readonly AssertEntry[];\n /** Optional suite metadata used by CLI discovery, tagging, and reporting. */\n readonly metadata?: EvalMetadata;\n /** Filter tests by ID pattern(s) (glob supported). Arrays use OR logic. */\n readonly filter?: string | readonly string[];\n /** Maximum concurrent workers (default: 3) */\n readonly workers?: number;\n /** Maximum retries on failure (default: 2) */\n readonly maxRetries?: number;\n /** Agent timeout in milliseconds. No timeout if not set. */\n readonly agentTimeoutMs?: number;\n /** Enable response caching */\n readonly cache?: boolean;\n /** Verbose logging */\n readonly verbose?: boolean;\n /** Callback for each completed result */\n readonly onResult?: (result: EvaluationResult) => void;\n /** Score threshold for pass/fail (0-1). Default: 0.8 (DEFAULT_THRESHOLD). */\n readonly threshold?: number;\n /** Command(s) to run once before the suite starts. Same semantics as YAML before_all. */\n readonly beforeAll?: string | readonly string[];\n /** Suite-level cost cap in USD. Stops dispatching new tests when exceeded. */\n readonly budgetUsd?: number;\n}\n\nexport interface MaterializedEvalConfig {\n readonly testFilePath: string;\n readonly tests: readonly EvalTest[];\n readonly workers?: number;\n readonly cache?: boolean;\n readonly budgetUsd?: number;\n readonly threshold?: number;\n readonly metadata?: EvalMetadata;\n readonly target?: TargetDefinition;\n readonly task?: (input: string) => string | Promise<string>;\n readonly providerFactory?: ProviderFactoryFn;\n}\n\n/**\n * Summary statistics for an evaluation run.\n */\nexport interface EvalSummary {\n /** Total number of test cases */\n readonly total: number;\n /** Number of passing test cases (score >= threshold) */\n readonly passed: number;\n /** Number of failing test cases (score < threshold) */\n readonly failed: number;\n /** Total duration in milliseconds */\n readonly durationMs: number;\n /** Mean score across all cases */\n readonly meanScore: number;\n}\n\n/**\n * Result of an `evaluate()` call.\n */\nexport interface EvalRunResult {\n /** Individual test case results */\n readonly results: readonly EvaluationResult[];\n /** Aggregate summary statistics */\n readonly summary: EvalSummary;\n}\n\n/**\n * Run an evaluation suite against a target provider.\n *\n * Accepts either inline test definitions or a path to an EVAL.yaml spec file.\n * The config shape mirrors the YAML structure — users can translate between\n * file-based and programmatic usage 1:1.\n *\n * @param config - Evaluation configuration\n * @returns Typed evaluation results with summary statistics\n *\n * @example Inline tests with assertions\n * ```typescript\n * const { results, summary } = await evaluate({\n * tests: [\n * {\n * id: 'greeting',\n * input: 'Say hello',\n * assert: [{ type: 'contains', value: 'hello' }],\n * },\n * ],\n * target: { provider: 'mock_agent' },\n * });\n * console.log(`${summary.passed}/${summary.total} passed`);\n * ```\n *\n * @example Load from YAML\n * ```typescript\n * const { summary } = await evaluate({\n * specFile: './evals/my-eval.yaml',\n * filter: 'greeting-*',\n * });\n * ```\n */\nexport async function evaluate(config: EvalConfig): Promise<EvalRunResult> {\n const startTime = Date.now();\n\n if (config.tests && config.specFile) {\n throw new Error('Cannot specify both \"tests\" and \"specFile\" — use one or the other.');\n }\n if (!config.tests && !config.specFile) {\n throw new Error('Must specify either \"tests\" (inline) or \"specFile\" (YAML path).');\n }\n\n if (config.task && config.target) {\n throw new Error('Cannot specify both \"task\" and \"target\" — use one or the other.');\n }\n\n // Resolve repo root\n const gitRoot = await findGitRoot(process.cwd());\n const repoRoot = gitRoot ?? process.cwd();\n\n const materialized = await materializeEvalConfig(config, {\n repoRoot,\n baseDir: process.cwd(),\n });\n const testFilePath = materialized.testFilePath;\n\n // Load .env files from the eval file hierarchy so nested eval-local .env\n // files participate even when the command is launched from a parent folder.\n await loadEnvHierarchy(repoRoot, testFilePath);\n\n let resolvedTarget: ResolvedTarget;\n let providerFactory: ProviderFactoryFn | undefined;\n if (config.task || materialized.providerFactory) {\n providerFactory = config.task\n ? () => createFunctionProvider(config.task as (input: string) => string | Promise<string>)\n : materialized.providerFactory;\n resolvedTarget = {\n kind: 'mock',\n name: 'custom-task',\n config: {},\n };\n } else {\n // Resolve target — inline definition or auto-discover from targets.yaml\n let targetDef: TargetDefinition;\n if (config.target) {\n targetDef = config.target;\n } else if (materialized.target) {\n targetDef = materialized.target;\n } else {\n targetDef = (await discoverDefaultTarget(repoRoot)) ?? { name: 'default', provider: 'mock' };\n }\n resolvedTarget = resolveTargetDefinition(targetDef);\n }\n\n const collectedResults: EvaluationResult[] = [];\n\n const results = await runEvaluation({\n testFilePath,\n repoRoot,\n target: resolvedTarget,\n ...(providerFactory ? { providerFactory } : {}),\n maxRetries: config.maxRetries ?? 2,\n agentTimeoutMs: config.agentTimeoutMs,\n verbose: config.verbose,\n maxConcurrency: config.workers ?? 3,\n filter: config.filter,\n threshold: config.threshold,\n evalCases: materialized.tests,\n ...(materialized.budgetUsd !== undefined && { budgetUsd: materialized.budgetUsd }),\n onResult: async (result) => {\n collectedResults.push(result);\n config.onResult?.(result);\n },\n });\n\n const allResults = collectedResults.length > 0 ? collectedResults : [...results];\n const durationMs = Date.now() - startTime;\n\n return {\n results: allResults,\n summary: computeSummary(allResults, durationMs, config.threshold),\n };\n}\n\nexport async function materializeEvalConfig(\n config: EvalConfig,\n options?: {\n readonly repoRoot?: string;\n readonly baseDir?: string;\n readonly filter?: string | readonly string[];\n readonly category?: string;\n },\n): Promise<MaterializedEvalConfig> {\n const baseDir = options?.baseDir ?? process.cwd();\n const repoRoot = options?.repoRoot ?? (await findGitRoot(baseDir)) ?? baseDir;\n const testFilePath = config.specFile\n ? path.resolve(baseDir, config.specFile)\n : path.join(baseDir, '__programmatic__.yaml');\n const effectiveFilter = options?.filter ?? config.filter;\n\n if (config.specFile) {\n const suite = await loadTestSuite(testFilePath, repoRoot, {\n verbose: config.verbose,\n filter: effectiveFilter,\n category: options?.category,\n });\n const tests = applyProgrammaticSuiteOverrides(suite.tests, config);\n return {\n testFilePath,\n tests,\n workers: config.workers ?? suite.workers,\n cache: config.cache ?? suite.cacheConfig?.enabled,\n budgetUsd: config.budgetUsd ?? suite.budgetUsd,\n threshold: config.threshold ?? suite.threshold,\n metadata: config.metadata ?? suite.metadata,\n target: config.target ?? suite.inlineTarget,\n task: config.task,\n providerFactory: suite.providerFactory,\n };\n }\n\n const tests = buildInlineEvalTests(config, {\n filter: effectiveFilter,\n category: options?.category,\n testFilePath,\n });\n\n return {\n testFilePath,\n tests,\n workers: config.workers,\n cache: config.cache,\n budgetUsd: config.budgetUsd,\n threshold: config.threshold,\n metadata: config.metadata,\n target: config.target,\n task: config.task,\n };\n}\n\n/**\n * Convert a flexible input (string or message array) to the internal TestMessage[] format.\n */\nfunction toMessageArray(\n input: string | readonly { role: string; content: string }[],\n): EvalTest['input'] {\n if (typeof input === 'string') {\n return [{ role: 'user' as const, content: input }] as EvalTest['input'];\n }\n return input as unknown as EvalTest['input'];\n}\n\n/**\n * Extract the user-facing question string from a flexible input.\n */\nfunction extractQuestion(input: string | readonly { role: string; content: string }[]): string {\n if (typeof input === 'string') return input;\n return input.find((m) => m.role === 'user')?.content ?? '';\n}\n\n/**\n * Convert programmatic API beforeAll (string | string[]) to internal WorkspaceHookConfig.\n * Accepts a shell command string or an array of command tokens.\n */\nfunction toBeforeAllHook(beforeAll: string | readonly string[]): WorkspaceHookConfig {\n const command = typeof beforeAll === 'string' ? ['sh', '-c', beforeAll] : [...beforeAll];\n return { command };\n}\n\n/**\n * Convert an array of assert entries (inline functions or config objects) to GraderConfig[].\n */\nfunction convertAssertions(entries: readonly AssertEntry[]): GraderConfig[] {\n return entries.map((entry, i) => {\n if (typeof entry === 'function') {\n const base: InlineAssertEvaluatorConfig = {\n type: 'inline-assert',\n name: `inline-assert-${i}`,\n };\n return Object.assign(base, {\n [INLINE_ASSERT_FN]: entry as AssertFn,\n }) as unknown as GraderConfig;\n }\n const a = entry as EvalAssertionInput;\n const { type: rawType, ...rest } = a;\n return {\n ...rest,\n name: a.name ?? `${rawType}_${i}`,\n type: mapAssertionType(rawType),\n } as unknown as GraderConfig;\n });\n}\n\nfunction buildInlineEvalTests(\n config: EvalConfig,\n options: {\n readonly filter?: string | readonly string[];\n readonly category?: string;\n readonly testFilePath: string;\n },\n): readonly EvalTest[] {\n const suiteWorkspace = config.beforeAll\n ? { hooks: { before_all: toBeforeAllHook(config.beforeAll) } }\n : undefined;\n const derivedSuiteName = path\n .basename(options.testFilePath)\n .replace(/\\.eval\\.[cm]?ts$/i, '')\n .replace(/\\.[cm]?ts$/i, '');\n const suiteName = config.metadata?.name ?? (derivedSuiteName || 'eval');\n\n return (config.tests ?? [])\n .filter((test) => !options.filter || matchesFilter(test.id, options.filter))\n .map((test): EvalTest => {\n const isConversation = test.mode === 'conversation' || (test.turns && test.turns.length > 0);\n\n if (!isConversation && !test.input) {\n throw new Error(`Test '${test.id}': input is required for non-conversation tests`);\n }\n\n const input = isConversation\n ? toMessageArray(test.turns?.[0]?.input ?? '')\n : toMessageArray(test.input ?? '');\n\n const question = isConversation\n ? extractQuestion(test.turns?.[0]?.input ?? '')\n : extractQuestion(test.input ?? '');\n\n const expectedOutputValue = test.expectedOutput ?? test.expected_output;\n const expectedOutput = expectedOutputValue\n ? ([\n { role: 'assistant' as const, content: expectedOutputValue },\n ] as EvalTest['expected_output'])\n : [];\n\n const allAssertions = [...(test.assert ?? []), ...(config.assert ?? [])];\n const assertConfigs = convertAssertions(allAssertions);\n const turns: ConversationTurn[] | undefined = test.turns?.map((turn) => {\n const turnExpected = turn.expectedOutput ?? turn.expected_output;\n return {\n input: turn.input as ConversationTurn['input'],\n ...(turnExpected !== undefined && {\n expected_output: turnExpected as ConversationTurn['expected_output'],\n }),\n assertions: turn.assert ? convertAssertions([...turn.assert]) : undefined,\n };\n });\n\n return {\n id: test.id,\n suite: suiteName,\n category: options.category,\n criteria: test.criteria ?? '',\n question: String(question),\n input,\n expected_output: expectedOutput,\n reference_answer: expectedOutputValue,\n file_paths: [],\n assertions: assertConfigs.length > 0 ? assertConfigs : undefined,\n metadata: test.metadata,\n ...(suiteWorkspace && { workspace: suiteWorkspace }),\n ...(isConversation && { mode: 'conversation' as const }),\n ...(turns && { turns }),\n ...(test.aggregation && { aggregation: test.aggregation }),\n };\n });\n}\n\nfunction applyProgrammaticSuiteOverrides(\n tests: readonly EvalTest[],\n config: EvalConfig,\n): readonly EvalTest[] {\n if (!config.beforeAll && (!config.assert || config.assert.length === 0)) {\n return tests;\n }\n\n const suiteWorkspace = config.beforeAll\n ? { hooks: { before_all: toBeforeAllHook(config.beforeAll) } }\n : undefined;\n const suiteAssertions = config.assert ? convertAssertions(config.assert) : [];\n\n return tests.map((test) => ({\n ...test,\n ...(suiteAssertions.length > 0 && {\n assertions: [...(test.assertions ?? []), ...suiteAssertions],\n }),\n ...(suiteWorkspace && {\n workspace: {\n ...test.workspace,\n hooks: {\n ...test.workspace?.hooks,\n ...(test.workspace?.hooks?.before_all ? {} : suiteWorkspace.hooks),\n },\n },\n }),\n }));\n}\n\nfunction matchesFilter(id: string, filter: string | readonly string[]): boolean {\n return typeof filter === 'string'\n ? micromatch.isMatch(id, filter)\n : filter.some((pattern) => micromatch.isMatch(id, pattern));\n}\n\n/**\n * Map user-facing assertion type names to internal grader type names.\n * Handles snake_case to kebab-case normalization (e.g., 'llm_grader' -> 'llm-grader').\n */\nfunction mapAssertionType(type: string): string {\n return type.replace(/_/g, '-');\n}\n\n/**\n * Compute summary statistics from evaluation results.\n */\nfunction computeSummary(\n results: readonly EvaluationResult[],\n durationMs: number,\n threshold = DEFAULT_THRESHOLD,\n): EvalSummary {\n const total = results.length;\n let passed = 0;\n let scoreSum = 0;\n\n for (const r of results) {\n scoreSum += r.score;\n if (r.score >= threshold) {\n passed++;\n }\n }\n\n return {\n total,\n passed,\n failed: total - passed,\n durationMs,\n meanScore: total > 0 ? scoreSum / total : 0,\n };\n}\n\nconst TARGET_FILE_CANDIDATES = ['.agentv/targets.yaml', '.agentv/targets.yml'] as const;\n\n/**\n * Auto-discover the 'default' target from targets.yaml in the repo tree.\n */\nasync function discoverDefaultTarget(repoRoot: string): Promise<TargetDefinition | null> {\n const cwd = process.cwd();\n const chain = buildDirectoryChain(path.join(cwd, '_placeholder'), repoRoot);\n\n for (const dir of chain) {\n for (const candidate of TARGET_FILE_CANDIDATES) {\n const targetsPath = path.join(dir, candidate);\n if (!existsSync(targetsPath)) continue;\n try {\n const definitions = await readTargetDefinitions(targetsPath);\n const defaultTarget = definitions.find((d) => d.name === 'default');\n if (defaultTarget) return defaultTarget;\n } catch {\n // Skip invalid targets files\n }\n }\n }\n return null;\n}\n\n/**\n * Load .env files from the directory hierarchy so the closest file wins while\n * parent files still contribute missing keys. Existing process.env values are\n * preserved.\n */\nasync function loadEnvHierarchy(repoRoot: string, startPath: string): Promise<void> {\n const { readFileSync } = await import('node:fs');\n const chain = buildDirectoryChain(startPath, repoRoot);\n\n // Collect .env files from closest to root\n const envFiles: string[] = [];\n for (const dir of chain) {\n const envPath = path.join(dir, '.env');\n if (existsSync(envPath)) envFiles.push(envPath);\n }\n\n // buildDirectoryChain returns directories from closest to farthest. Loading in\n // that same order means nearer .env files set shared keys first, while parent\n // .env files loaded afterward only backfill keys that are still missing.\n for (let i = 0; i < envFiles.length; i++) {\n try {\n const content = readFileSync(envFiles[i], 'utf8');\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIdx = trimmed.indexOf('=');\n if (eqIdx <= 0) continue;\n const key = trimmed.slice(0, eqIdx).trim();\n let val = trimmed.slice(eqIdx + 1).trim();\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n if (!(key in process.env)) {\n process.env[key] = val;\n }\n }\n } catch {\n // Skip unreadable .env files\n }\n }\n}\n","/**\n * Scoring primitives for the evaluation engine.\n *\n * Scoring model:\n * score ∈ [0, 1] — continuous quality signal\n * verdict — binary classification derived from score via threshold\n *\n * score >= threshold → 'pass'\n * score < threshold → 'fail'\n * (infrastructure skip) → 'skip'\n *\n * Scoring scale principle:\n * All user-configurable score thresholds use 0-1 scale.\n * The only 0-10 values in YAML are `score_ranges` which define LLM integer output band labels.\n *\n * Default threshold is 0.8. Override via CLI `--threshold`, suite `execution.threshold`,\n * or per-test `execution.threshold`. All verdict derivation flows through scoreToVerdict().\n */\n\nimport type { EvaluationVerdict } from '../types.js';\nimport type { EvaluationScore } from './types.js';\n\n/** Default score threshold for pass verdict (0-1). Scores below this are fail. */\nexport const DEFAULT_THRESHOLD = 0.8;\n\n/** @deprecated Use DEFAULT_THRESHOLD instead. */\nexport const PASS_THRESHOLD = DEFAULT_THRESHOLD;\n\nexport function scoreToVerdict(score: number, threshold = DEFAULT_THRESHOLD): EvaluationVerdict {\n return score >= threshold ? 'pass' : 'fail';\n}\n\nexport function clampScore(value: number): number {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return 0;\n }\n if (value < 0) {\n return 0;\n }\n if (value > 1) {\n return 1;\n }\n return value;\n}\n\nexport function extractJsonBlob(text: string): string | undefined {\n const match = text.match(/\\{[\\s\\S]*\\}/);\n return match?.[0];\n}\n\nfunction repairSchemaNearBooleanFields(text: string): string {\n return text.replace(\n /(\"passed\"\\s*:\\s*)(?:\"([^\"]+)\"|([A-Za-z_][A-Za-z0-9_-]*))/gi,\n (_match, prefix: string, quotedValue?: string, bareValue?: string) => {\n const value = (quotedValue ?? bareValue ?? '').trim().toLowerCase();\n if (value === 'true') {\n return `${prefix}true`;\n }\n if (value === 'false') {\n return `${prefix}false`;\n }\n return `${prefix}false`;\n },\n );\n}\n\nexport function parseJsonFromText(text: string): unknown {\n const cleaned = typeof text === 'string' ? text.replace(/```json\\n?|```/g, '').trim() : '';\n const blob = extractJsonBlob(cleaned) ?? cleaned;\n const repaired = repairSchemaNearBooleanFields(blob);\n return JSON.parse(repaired);\n}\n\nexport function isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nexport function parseJsonSafe(payload: string): Record<string, unknown> | undefined {\n try {\n return JSON.parse(payload) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null) return a === b;\n if (typeof a !== typeof b) return false;\n if (typeof a !== 'object') return a === b;\n\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((val, i) => deepEqual(val, b[i]));\n }\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) => Object.hasOwn(bObj, key) && deepEqual(aObj[key], bObj[key]));\n}\n\n/** Verdict inversion map: pass↔fail, skip stays skip. */\nconst NEGATED_VERDICT: Record<EvaluationVerdict, EvaluationVerdict> = {\n pass: 'fail',\n fail: 'pass',\n skip: 'skip',\n};\n\n/**\n * Negate an evaluation score: inverts score (1 - score), swaps pass/fail verdict,\n * and flips passed on each assertion.\n */\nexport function negateScore(score: EvaluationScore): EvaluationScore {\n return {\n ...score,\n score: clampScore(1 - score.score),\n verdict: NEGATED_VERDICT[score.verdict],\n assertions: score.assertions.map((a) => ({\n ...a,\n passed: !a.passed,\n evidence: a.evidence ? `[Negated] ${a.evidence}` : undefined,\n })),\n };\n}\n","import { execFile } from 'node:child_process';\nimport { createHash, randomUUID } from 'node:crypto';\nimport { existsSync } from 'node:fs';\nimport { copyFile, mkdir, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\nimport micromatch from 'micromatch';\nimport pLimit from 'p-limit';\n\nimport { getWorkspacePoolRoot } from '../paths.js';\nimport { readJsonFile } from './file-utils.js';\nimport {\n type ChildGraderResult,\n DEFAULT_THRESHOLD,\n type EvaluationScore,\n type Grader,\n LlmGrader,\n formatToolCalls,\n negateScore,\n scoreToVerdict,\n} from './graders.js';\nimport { createBuiltinProviderRegistry, createProvider } from './providers/index.js';\nimport { discoverProviders } from './providers/provider-discovery.js';\nimport {\n type ResolvedTarget,\n resolveDelegatedTargetDefinition,\n resolveTargetDefinition,\n} from './providers/targets.js';\nimport type {\n ChatMessage,\n ChatMessageRole,\n EnvLookup,\n Message,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamCallbacks,\n TargetDefinition,\n} from './providers/types.js';\nimport {\n LLM_GRADER_CAPABLE_KINDS,\n extractLastAssistantContent,\n isAgentProvider,\n} from './providers/types.js';\nimport { createBuiltinRegistry, discoverAssertions, discoverGraders } from './registry/index.js';\nimport type { RunBudgetTracker } from './run-budget-tracker.js';\nimport {\n type TokenUsage,\n type TraceSummary,\n computeTraceSummary,\n mergeExecutionMetrics,\n} from './trace.js';\nimport { aggregateTrials } from './trials.js';\nimport type {\n AssertionEntry,\n ConversationAggregation,\n ConversationTurn,\n DependencyResult,\n EvalTest,\n EvaluationResult,\n EvaluationVerdict,\n ExecutionStatus,\n FailOnError,\n FailureStage,\n GraderConfig,\n GraderKind,\n GraderResult,\n JsonObject,\n JsonValue,\n LlmGraderConfig,\n TestMessage,\n TestMessageRole,\n TrialResult,\n TrialsConfig,\n WorkspaceHookConfig,\n WorkspaceScriptConfig,\n} from './types.js';\nimport {\n captureFileChanges as captureWorkspaceFileChanges,\n initializeBaseline,\n} from './workspace/file-changes.js';\nimport {\n cleanupEvalWorkspaces,\n cleanupWorkspace,\n copyDirectoryRecursive,\n createTempWorkspace,\n getWorkspacePath,\n} from './workspace/manager.js';\nimport { WorkspacePoolManager } from './workspace/pool-manager.js';\nimport type { PoolSlot } from './workspace/pool-manager.js';\nimport { RepoManager } from './workspace/repo-manager.js';\nimport { resolveWorkspaceTemplate } from './workspace/resolve.js';\nimport {\n type ScriptExecutionContext,\n executeWorkspaceScript,\n} from './workspace/script-executor.js';\nimport { type PromptInputs, buildPromptInputs, loadTests } from './yaml-parser.js';\n\ntype MaybePromise<T> = T | Promise<T>;\n\nconst execFileAsync = promisify(execFile);\nconst WORKSPACE_GIT_TIMEOUT_MS = 300_000;\n\nfunction classifyQualityStatus(score: number, threshold = DEFAULT_THRESHOLD): ExecutionStatus {\n return score >= threshold ? 'ok' : 'quality_failure';\n}\n\nfunction buildSkippedEvaluatorError(\n scores: readonly GraderResult[] | undefined,\n): string | undefined {\n const skippedScores = scores?.filter((score) => score.verdict === 'skip') ?? [];\n if (skippedScores.length === 0) {\n return undefined;\n }\n\n const messages = skippedScores.map((score) => {\n const label = score.name || score.type;\n const assertionMessage =\n score.assertions.find((assertion) => !assertion.passed)?.text ?? 'Grader skipped';\n return `${label}: ${assertionMessage}`;\n });\n\n return messages.length === 1 ? messages[0] : `Graders skipped: ${messages.join(' | ')}`;\n}\n\nfunction usesFileReferencePrompt(provider: Provider): boolean {\n return isAgentProvider(provider) || provider.kind === 'cli';\n}\n\nfunction toScriptConfig(\n hook: WorkspaceHookConfig,\n hookName: string,\n context: string,\n): WorkspaceScriptConfig {\n const command = hook.command ?? hook.script;\n if (!command || command.length === 0) {\n throw new Error(`${hookName} hook in ${context} requires command or script`);\n }\n return {\n command,\n ...(hook.timeout_ms !== undefined && { timeout_ms: hook.timeout_ms }),\n ...(hook.timeoutMs !== undefined && { timeoutMs: hook.timeoutMs }),\n ...(hook.cwd !== undefined && { cwd: hook.cwd }),\n ...(hook.script !== undefined && { script: hook.script }),\n };\n}\n\nfunction hasHookCommand(hook: WorkspaceHookConfig | undefined): hook is WorkspaceHookConfig {\n return !!((hook?.command && hook.command.length > 0) || (hook?.script && hook.script.length > 0));\n}\n\n/**\n * Check whether hooks are enabled for a workspace config.\n * Returns true when hooks.enabled is undefined (default) or explicitly true.\n */\nfunction hooksEnabled(\n workspace: { readonly hooks?: { readonly enabled?: boolean } } | undefined,\n): boolean {\n return workspace?.hooks?.enabled !== false;\n}\n\nfunction workspaceGitEnv(): Record<string, string | undefined> {\n const env = { ...process.env };\n for (const key of Object.keys(env)) {\n if (key.startsWith('GIT_') && key !== 'GIT_SSH_COMMAND') {\n delete env[key];\n }\n }\n return {\n ...env,\n GIT_TERMINAL_PROMPT: '0',\n GIT_ASKPASS: '',\n GIT_SSH_COMMAND: 'ssh -o BatchMode=yes',\n };\n}\n\nasync function resetWorkspaceRoot(\n workspacePath: string,\n resetMode: 'fast' | 'strict',\n baselineRef?: string,\n): Promise<boolean> {\n if (!existsSync(path.join(workspacePath, '.git'))) {\n return false;\n }\n\n const cleanFlag = resetMode === 'strict' ? '-fdx' : '-fd';\n const opts = {\n cwd: workspacePath,\n timeout: WORKSPACE_GIT_TIMEOUT_MS,\n env: workspaceGitEnv(),\n maxBuffer: 50 * 1024 * 1024,\n };\n\n await execFileAsync('git', ['reset', '--hard', baselineRef ?? 'HEAD'], opts);\n await execFileAsync('git', ['clean', cleanFlag], opts);\n return true;\n}\n\n/**\n * Validate the dependency DAG for a set of eval tests.\n * Rejects circular dependencies and references to missing test IDs.\n * Returns silently when the graph is valid.\n */\nfunction validateDependencyGraph(tests: readonly EvalTest[]): void {\n const ids = new Set<string>();\n for (const test of tests) {\n if (ids.has(test.id)) {\n throw new Error(`Duplicate test ID '${test.id}' — each test must have a unique ID`);\n }\n ids.add(test.id);\n }\n\n // Check for missing dependency IDs\n for (const test of tests) {\n if (!test.depends_on) continue;\n for (const dep of test.depends_on) {\n if (!ids.has(dep)) {\n throw new Error(\n `Test '${test.id}' depends on '${dep}', but no test with that ID exists in this suite`,\n );\n }\n if (dep === test.id) {\n throw new Error(`Test '${test.id}' depends on itself`);\n }\n }\n }\n\n // Detect cycles via DFS\n const depMap = new Map<string, readonly string[]>();\n for (const test of tests) {\n if (test.depends_on && test.depends_on.length > 0) {\n depMap.set(test.id, test.depends_on);\n }\n }\n\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n function visit(id: string, path: string[]): void {\n if (visiting.has(id)) {\n const cycle = [...path.slice(path.indexOf(id)), id];\n throw new Error(`Circular dependency detected: ${cycle.join(' → ')}`);\n }\n if (visited.has(id)) return;\n visiting.add(id);\n path.push(id);\n for (const dep of depMap.get(id) ?? []) {\n visit(dep, path);\n }\n path.pop();\n visiting.delete(id);\n visited.add(id);\n }\n\n for (const test of tests) {\n visit(test.id, []);\n }\n}\n\n/**\n * Compute execution waves via topological sort.\n * Each wave contains tests whose dependencies have all been satisfied by prior waves.\n * Tests without dependencies land in wave 0.\n */\nfunction computeWaves(tests: readonly EvalTest[]): EvalTest[][] {\n const hasDeps = tests.some((t) => t.depends_on && t.depends_on.length > 0);\n if (!hasDeps) {\n // Fast path: no dependencies, single wave with all tests\n return [tests.slice()];\n }\n\n const inDegree = new Map<string, number>();\n const dependents = new Map<string, string[]>();\n const testById = new Map<string, EvalTest>();\n\n for (const test of tests) {\n testById.set(test.id, test);\n inDegree.set(test.id, 0);\n }\n\n for (const test of tests) {\n if (!test.depends_on) continue;\n inDegree.set(test.id, test.depends_on.length);\n for (const dep of test.depends_on) {\n const list = dependents.get(dep) ?? [];\n list.push(test.id);\n dependents.set(dep, list);\n }\n }\n\n const waves: EvalTest[][] = [];\n let ready = tests.filter((t) => (inDegree.get(t.id) ?? 0) === 0);\n\n while (ready.length > 0) {\n waves.push(ready);\n const nextReady: EvalTest[] = [];\n for (const test of ready) {\n for (const depId of dependents.get(test.id) ?? []) {\n const newDeg = (inDegree.get(depId) ?? 1) - 1;\n inDegree.set(depId, newDeg);\n if (newDeg === 0) {\n const depTest = testById.get(depId);\n if (depTest) nextReady.push(depTest);\n }\n }\n }\n ready = nextReady;\n }\n\n // Defensive: if validation missed a cycle, Kahn's algorithm leaves unscheduled nodes\n const totalScheduled = waves.reduce((sum, w) => sum + w.length, 0);\n if (totalScheduled !== tests.length) {\n throw new Error(\n `Internal error: ${tests.length - totalScheduled} tests were not scheduled (possible undetected cycle)`,\n );\n }\n\n return waves;\n}\n\nexport interface EvaluationCache {\n get(key: string): MaybePromise<ProviderResponse | undefined>;\n set(key: string, value: ProviderResponse): MaybePromise<void>;\n}\n\nexport interface RunEvalCaseOptions {\n readonly evalCase: EvalTest;\n readonly provider: Provider;\n readonly target: ResolvedTarget;\n readonly evaluators: Partial<Record<string, Grader>> & { readonly 'llm-grader': Grader };\n readonly now?: () => Date;\n readonly maxRetries?: number;\n readonly agentTimeoutMs?: number;\n readonly cache?: EvaluationCache;\n readonly useCache?: boolean;\n readonly signal?: AbortSignal;\n readonly graderProvider?: Provider;\n /** Resolver for target override in code graders */\n readonly targetResolver?: (name: string) => Provider | undefined;\n /** List of available target names for code graders */\n readonly availableTargets?: readonly string[];\n /** Unique identifier for the evaluation run (used for workspace management) */\n readonly evalRunId?: string;\n /** Keep workspace on success (default: cleanup on success, keep on failure) */\n readonly keepWorkspaces?: boolean;\n /** Force cleanup of workspaces even on failure */\n readonly cleanupWorkspaces?: boolean;\n /** Retention policy for temp workspaces on successful cases */\n readonly retainOnSuccess?: 'keep' | 'cleanup';\n /** Retention policy for temp workspaces on failed cases */\n readonly retainOnFailure?: 'keep' | 'cleanup';\n /** Pre-created shared workspace path (shared across tests in a suite) */\n readonly sharedWorkspacePath?: string;\n /** Pre-initialized baseline commit for shared workspace */\n readonly sharedBaselineCommit?: string;\n /** Suite-level .code-workspace file (resolved from workspace.template) */\n readonly suiteWorkspaceFile?: string;\n /** Real-time observability callbacks passed to the provider */\n readonly streamCallbacks?: ProviderStreamCallbacks;\n /** Grader type registry (with custom assertions discovered) */\n readonly typeRegistry?: import('./registry/grader-registry.js').GraderRegistry;\n /** RepoManager instance for repo lifecycle (shared workspace mode) */\n readonly repoManager?: RepoManager;\n /** Directory containing the eval YAML file. Used as default cwd for workspace scripts. */\n readonly evalDir?: string;\n /** Include verbose request details in results (e.g. agent input text) */\n readonly verbose?: boolean;\n /** Per-test score threshold for pass/fail (default: 0.8) */\n readonly threshold?: number;\n /** Results from dependency tests (only present when the test has depends_on) */\n readonly dependencyResults?: Readonly<Record<string, import('./types.js').DependencyResult>>;\n /** Per-target hooks from eval file (before_all, before_each, after_each, after_all) */\n readonly targetHooks?: import('./types.js').TargetHooksConfig;\n}\n\nexport interface ProgressEvent {\n readonly workerId: number;\n readonly testId: string;\n readonly status: 'pending' | 'running' | 'completed' | 'failed';\n readonly startedAt?: number;\n readonly completedAt?: number;\n readonly error?: string;\n /** Final score for completed/failed tests */\n readonly score?: number;\n /** Execution status classification for completed/failed tests */\n readonly executionStatus?: ExecutionStatus;\n /** Candidate/agent execution duration in milliseconds */\n readonly durationMs?: number;\n /** Full eval duration in milliseconds, including grading/orchestration */\n readonly evalRunDurationMs?: number;\n}\n\nexport interface RunEvaluationOptions {\n readonly testFilePath: string;\n readonly repoRoot: URL | string;\n readonly target: ResolvedTarget;\n readonly targets?: readonly TargetDefinition[];\n readonly env?: EnvLookup;\n readonly providerFactory?: (target: ResolvedTarget) => Provider;\n readonly evaluators?: Partial<Record<string, Grader>>;\n readonly maxRetries?: number;\n readonly agentTimeoutMs?: number;\n readonly cache?: EvaluationCache;\n readonly useCache?: boolean;\n readonly now?: () => Date;\n /** Filter tests by ID pattern(s) (glob supported, e.g., \"summary-*\"). Arrays use OR logic. */\n readonly filter?: string | readonly string[];\n readonly verbose?: boolean;\n readonly maxConcurrency?: number;\n readonly evalCases?: readonly EvalTest[];\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\n /** Keep workspace on success (default: cleanup on success, keep on failure) */\n readonly keepWorkspaces?: boolean;\n /** Force cleanup of workspaces even on failure */\n readonly cleanupWorkspaces?: boolean;\n /** Trial configuration for running eval cases multiple times */\n readonly trials?: TrialsConfig;\n /** Real-time observability callbacks passed to the provider */\n readonly streamCallbacks?: ProviderStreamCallbacks;\n /** Suite-level total cost budget in USD (stops dispatching when exceeded) */\n readonly budgetUsd?: number;\n /** Run-level total cost tracker shared across multiple eval files/targets in one CLI invocation */\n readonly runBudgetTracker?: RunBudgetTracker;\n /** Execution error tolerance: true halts on first error */\n readonly failOnError?: FailOnError;\n /** Workspace pooling: true (default) enables pool, false disables, undefined defaults to true */\n readonly poolWorkspaces?: boolean;\n /** Maximum number of pool slots on disk (default: 10, max: 50) */\n readonly poolMaxSlots?: number;\n /** Pre-existing workspace directory to use directly (skips clone/copy/pool) */\n readonly workspace?: string;\n /** Workspace materialization mode override */\n readonly workspaceMode?: 'pooled' | 'temp' | 'static';\n /** Static workspace path override (used when workspaceMode=static) */\n readonly workspacePath?: string;\n /** Workspace clean policy override for pooled reset */\n readonly workspaceClean?: 'standard' | 'full';\n /** Retention policy override for successful cases */\n readonly retainOnSuccess?: 'keep' | 'cleanup';\n /** Retention policy override for failed cases */\n readonly retainOnFailure?: 'keep' | 'cleanup';\n /** CLI override: grader target name (e.g., \"agentv\" or a target from targets.yaml) */\n readonly graderTarget?: string;\n /** CLI override: model for grader target (e.g., \"openai:gpt-5-mini\") */\n readonly model?: string;\n /** Per-test score threshold for pass/fail (default: 0.8) */\n readonly threshold?: number;\n /** Per-target hooks from eval file (before_all, before_each, after_each, after_all) */\n readonly targetHooks?: import('./types.js').TargetHooksConfig;\n}\n\nexport async function runEvaluation(\n options: RunEvaluationOptions,\n): Promise<readonly EvaluationResult[]> {\n const {\n testFilePath: evalFilePath,\n repoRoot,\n target,\n targets,\n env,\n providerFactory,\n evaluators,\n maxRetries,\n agentTimeoutMs,\n cache,\n now,\n filter,\n verbose,\n evalCases: preloadedEvalCases,\n onResult,\n onProgress,\n keepWorkspaces,\n cleanupWorkspaces,\n trials,\n streamCallbacks,\n budgetUsd,\n runBudgetTracker,\n failOnError,\n poolWorkspaces,\n poolMaxSlots: configPoolMaxSlots,\n workspace: legacyWorkspacePath,\n workspaceMode,\n workspacePath,\n workspaceClean,\n retainOnSuccess,\n retainOnFailure,\n graderTarget: cliGraderTarget,\n model: cliModel,\n threshold: scoreThreshold,\n } = options;\n\n // Disable cache when trials > 1 (cache makes trials deterministic = pointless)\n let useCache = options.useCache;\n if (trials && trials.count > 1 && useCache) {\n console.warn(\n 'Warning: Caching is disabled when trials.count > 1 (cached responses would make trials deterministic).',\n );\n useCache = false;\n }\n\n // Generate unique eval run ID for workspace management\n const evalRunId = randomUUID();\n\n // Use pre-loaded eval cases if provided, otherwise load them\n const evalCases =\n preloadedEvalCases ?? (await loadTests(evalFilePath, repoRoot, { verbose, filter }));\n\n const filteredEvalCases = filterEvalCases(evalCases, filter);\n if (filteredEvalCases.length === 0) {\n if (filter) {\n throw new Error(`No tests matched filter '${formatFilter(filter)}' in ${evalFilePath}`);\n }\n return [];\n }\n\n const resolvedTargetsByName = new Map<string, ResolvedTarget>();\n resolvedTargetsByName.set(target.name, target);\n\n const targetDefinitions = new Map<string, TargetDefinition>();\n for (const definition of targets ?? []) {\n targetDefinitions.set(definition.name, definition);\n }\n\n const envLookup: EnvLookup = env ?? process.env;\n const providerCache = new Map<string, Provider>();\n\n const getOrCreateProvider = (resolved: ResolvedTarget): Provider => {\n const existing = providerCache.get(resolved.name);\n if (existing) {\n return existing;\n }\n const factory = providerFactory ?? createProvider;\n const instance = factory(resolved);\n providerCache.set(resolved.name, instance);\n return instance;\n };\n\n const resolveTargetByName = (name: string): ResolvedTarget | undefined => {\n if (resolvedTargetsByName.has(name)) {\n return resolvedTargetsByName.get(name);\n }\n const definition = resolveDelegatedTargetDefinition(name, targetDefinitions, envLookup);\n if (!definition) {\n return undefined;\n }\n const resolved = resolveTargetDefinition(definition, envLookup, evalFilePath);\n resolvedTargetsByName.set(name, resolved);\n return resolved;\n };\n\n const resolveGraderProvider = async (\n targetContext: ResolvedTarget,\n ): Promise<Provider | undefined> => {\n // CLI --grader-target takes highest priority\n if (cliGraderTarget) {\n if (cliGraderTarget === 'agentv') {\n if (!cliModel) {\n throw new Error('--grader-target \"agentv\" requires --model (e.g., \"openai:gpt-5-mini\")');\n }\n const { AgentvProvider } = await import('./providers/agentv-provider.js');\n return new AgentvProvider('agentv', { model: cliModel, temperature: 0 });\n }\n const overrideTarget = resolveTargetByName(cliGraderTarget);\n if (!overrideTarget) {\n throw new Error(`--grader-target \"${cliGraderTarget}\" not found in targets`);\n }\n return getOrCreateProvider(overrideTarget);\n }\n\n // TODO: When --model is provided without --grader-target, override the model of\n // whichever grader target is resolved. For now, --model only works with --grader-target agentv.\n\n const graderName = targetContext.graderTarget ?? targetContext.name;\n const resolvedGrader = resolveTargetByName(graderName);\n if (!resolvedGrader) {\n // Only use the eval target as its own grader if it can return structured JSON.\n // Agent providers, transcript, cli, and copilot-log cannot grade.\n if (!LLM_GRADER_CAPABLE_KINDS.includes(targetContext.kind)) {\n return undefined;\n }\n return getOrCreateProvider(targetContext);\n }\n return getOrCreateProvider(resolvedGrader);\n };\n\n // Validate grader_target: error if an agent provider would be used as grader.\n // Agent providers can't return structured JSON for grading — they respond with\n // tool calls and markdown, causing silent score-0 failures.\n // CLI --grader-target override also satisfies this requirement.\n if (isAgentProvider(getOrCreateProvider(target)) && !target.graderTarget && !cliGraderTarget) {\n throw new Error(\n `Target \"${target.name}\" is an agent provider (\"${target.kind}\") with no grader_target — agent providers cannot return structured JSON for grading. Set grader_target to an LLM provider (e.g., azure-llm).`,\n );\n }\n\n // Create a target resolver for code graders to support target override\n const targetResolver = (name: string): Provider | undefined => {\n const resolved = resolveTargetByName(name);\n if (!resolved) {\n return undefined;\n }\n return getOrCreateProvider(resolved);\n };\n\n // Build list of available targets for /info endpoint\n const availableTargets: readonly string[] = [\n target.name,\n ...Array.from(targetDefinitions.keys()),\n ];\n\n const evaluatorRegistry = buildEvaluatorRegistry(evaluators, resolveGraderProvider);\n const typeRegistry = createBuiltinRegistry();\n\n // Discover custom assertions and providers from .agentv/ directory\n const discoveryBaseDir = evalFilePath ? path.dirname(path.resolve(evalFilePath)) : process.cwd();\n // Directory containing the eval YAML file, used as default cwd for workspace scripts\n const evalDir = discoveryBaseDir;\n await discoverAssertions(typeRegistry, discoveryBaseDir);\n await discoverGraders(typeRegistry, discoveryBaseDir);\n\n // Discover custom providers from .agentv/providers/ directory\n const providerRegistry = createBuiltinProviderRegistry();\n await discoverProviders(providerRegistry, discoveryBaseDir);\n\n const primaryProvider = getOrCreateProvider(target);\n let providerSupportsBatch =\n target.providerBatching === true &&\n primaryProvider.supportsBatch === true &&\n typeof primaryProvider.invokeBatch === 'function';\n\n // Disable batch mode when trials > 1 (batch processes all cases at once, incompatible with per-case retries)\n if (trials && trials.count > 1 && providerSupportsBatch) {\n console.warn('Warning: Batch mode is disabled when trials.count > 1. Using per-case dispatch.');\n providerSupportsBatch = false;\n }\n\n if (target.providerBatching && !providerSupportsBatch && verbose) {\n console.warn(\n `Provider batching requested for target '${target.name}', but provider does not advertise batch support. Using per-case dispatch.`,\n );\n }\n\n // Notify about total test count before starting\n if (onProgress && filteredEvalCases.length > 0) {\n // Emit initial pending events for all tests\n for (let i = 0; i < filteredEvalCases.length; i++) {\n await onProgress({\n workerId: i + 1,\n testId: filteredEvalCases[i].id,\n status: 'pending',\n });\n }\n }\n\n if (providerSupportsBatch) {\n try {\n return await runBatchEvaluation({\n evalCases: filteredEvalCases,\n provider: primaryProvider,\n target,\n evaluatorRegistry,\n typeRegistry,\n nowFn: now ?? (() => new Date()),\n onProgress,\n onResult,\n verbose,\n resolveGraderProvider,\n agentTimeoutMs,\n targetResolver,\n availableTargets,\n threshold: scoreThreshold,\n });\n } catch (error) {\n if (verbose) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `Provider batch execution failed, falling back to per-case dispatch: ${message}`,\n );\n }\n }\n }\n\n // --- Shared workspace lifecycle ---\n // If any test has workspace config, create shared workspace once.\n // Determine workspace config from first test (suite-level config propagates to all).\n const suiteWorkspace = filteredEvalCases[0]?.workspace;\n const rawTemplate = suiteWorkspace?.template;\n const resolvedTemplate = await resolveWorkspaceTemplate(rawTemplate);\n const workspaceTemplate = resolvedTemplate?.dir;\n let suiteWorkspaceFile = resolvedTemplate?.workspaceFile;\n const setupLog = (message: string): void => {\n if (verbose) {\n console.log(`[setup] ${message}`);\n }\n };\n\n // Validate local repo source paths upfront before any materialization attempt.\n // Collect repos from all test cases (suite-level + per-case) and check that local paths exist.\n const allRepos = new Map<string, import('./types.js').RepoConfig>();\n for (const ec of filteredEvalCases) {\n if (ec.workspace?.repos) {\n for (const repo of ec.workspace.repos) {\n // Deduplicate by repo path + source path (skip source-less Docker repos)\n if (!repo.source) continue;\n const key = `${repo.path ?? ''}::${repo.source.type === 'local' ? repo.source.path : ''}`;\n if (!allRepos.has(key)) {\n allRepos.set(key, repo);\n }\n }\n }\n }\n if (allRepos.size > 0) {\n const localPathErrors = RepoManager.validateLocalPaths([...allRepos.values()]);\n if (localPathErrors.length > 0) {\n const message = RepoManager.formatValidationErrors(localPathErrors);\n console.warn(`Warning: ${message}`);\n // Store invalid repo paths so affected tests can be failed with execution_error\n const invalidLocalRepoPaths = new Set(localPathErrors.map((e) => e.repoPath));\n // If suite-level repos have invalid paths, fail the entire run early\n if (suiteWorkspace?.repos?.some((r) => r.path && invalidLocalRepoPaths.has(r.path))) {\n throw new Error(message);\n }\n }\n }\n\n // Resolve worker count and pool mode\n const isPerTestIsolation = suiteWorkspace?.isolation === 'per_test';\n\n const cliWorkspacePath = workspacePath ?? legacyWorkspacePath;\n const yamlWorkspacePath = suiteWorkspace?.path;\n if (cliWorkspacePath && workspaceMode && workspaceMode !== 'static') {\n throw new Error('--workspace-path requires --workspace-mode static when both are provided');\n }\n let configuredMode = cliWorkspacePath\n ? 'static'\n : (workspaceMode ?? suiteWorkspace?.mode ?? (yamlWorkspacePath ? 'static' : 'pooled'));\n const configuredStaticPath = cliWorkspacePath ?? yamlWorkspacePath;\n\n // When mode=static with no path and no repos, the static mode is a no-op (nothing to\n // skip cloning). Fall back to temp mode so agentv creates a temp directory automatically.\n if (configuredMode === 'static' && !configuredStaticPath) {\n if (!suiteWorkspace?.repos?.length) {\n setupLog('workspace.mode=static with no path and no repos — falling back to temp mode');\n configuredMode = 'temp';\n } else {\n throw new Error('workspace.mode=static requires workspace.path or --workspace-path');\n }\n }\n\n const useStaticWorkspace = configuredMode === 'static';\n\n // static workspace is incompatible with per_test isolation\n if (useStaticWorkspace && isPerTestIsolation) {\n throw new Error(\n 'static workspace mode is incompatible with isolation: per_test. Use isolation: shared (default).',\n );\n }\n if (configuredMode !== 'static' && configuredStaticPath) {\n throw new Error('workspace.path requires workspace.mode=static');\n }\n\n const hasSharedWorkspace = !!(\n useStaticWorkspace ||\n (!isPerTestIsolation &&\n (workspaceTemplate || suiteWorkspace?.hooks || suiteWorkspace?.repos?.length))\n );\n\n // Pool support is mode-based: pooled enables, temp/static disable.\n const poolEnabled = configuredMode === 'pooled';\n const usePool =\n poolEnabled !== false &&\n !!suiteWorkspace?.repos?.length &&\n !isPerTestIsolation &&\n !useStaticWorkspace;\n\n const resolvedRetainOnSuccess = retainOnSuccess ?? (keepWorkspaces ? 'keep' : 'cleanup');\n const resolvedRetainOnFailure = retainOnFailure ?? (cleanupWorkspaces ? 'cleanup' : 'keep');\n\n const workers = options.maxConcurrency ?? target.workers ?? 1;\n setupLog(\n `sharedWorkspace=${hasSharedWorkspace} perTestIsolation=${isPerTestIsolation} usePool=${usePool} workers=${workers}`,\n );\n if (hasSharedWorkspace && !usePool && workers > 1 && filteredEvalCases.length > 1) {\n console.warn(\n [\n `Warning: This eval uses a shared workspace with ${workers} workers.`,\n 'If the agent under test makes file edits, concurrent runs may corrupt each other.',\n 'To limit concurrency, add this to your eval YAML:',\n '',\n ' execution:',\n ' workers: 1',\n '',\n 'Or pass --workers 1 on the command line.',\n ].join('\\n'),\n );\n }\n const limit = pLimit(workers);\n let sharedWorkspacePath: string | undefined;\n let sharedBaselineCommit: string | undefined;\n let beforeAllOutput: string | undefined;\n\n let poolManager: WorkspacePoolManager | undefined;\n // Single-slot pool (workers=1 or non-concurrent fallback)\n let poolSlot: PoolSlot | undefined;\n // Multi-slot pool for concurrent workers\n const poolSlots: PoolSlot[] = [];\n const availablePoolSlots: PoolSlot[] = [];\n const poolSlotBaselines = new Map<string, string>();\n\n // Pool capacity: how many slots can exist on disk (independent of worker count).\n // Workers acquire slots from the pool; the pool itself can be larger than any single run needs.\n const poolMaxSlots = Math.min(configPoolMaxSlots ?? 10, 50);\n\n // Track whether a static workspace was freshly materialised (needs repo clone + hooks)\n let staticMaterialised = false;\n // YAML-configured static paths support auto-materialisation and per-repo checks.\n // CLI-provided paths (--workspace-path) always reuse the directory as-is.\n const isYamlConfiguredPath = !cliWorkspacePath && !!yamlWorkspacePath;\n\n // Static workspace: auto-materialise if path is empty or missing, reuse if populated.\n // Auto-materialisation only applies to YAML-configured paths (workspace.path), not CLI flags\n // (--workspace / --workspace-path), which always reuse the directory as-is.\n if (useStaticWorkspace && configuredStaticPath) {\n const dirExists = await stat(configuredStaticPath).then(\n (s) => s.isDirectory(),\n () => false,\n );\n const isEmpty = dirExists ? (await readdir(configuredStaticPath)).length === 0 : false;\n\n if (isYamlConfiguredPath && (!dirExists || isEmpty)) {\n if (!dirExists) {\n await mkdir(configuredStaticPath, { recursive: true });\n }\n // Copy template contents into the static path\n if (workspaceTemplate) {\n await copyDirectoryRecursive(workspaceTemplate, configuredStaticPath);\n setupLog(`copied template into static workspace: ${configuredStaticPath}`);\n }\n staticMaterialised = true;\n setupLog(`materialised static workspace at: ${configuredStaticPath}`);\n } else {\n setupLog(`reusing existing static workspace: ${configuredStaticPath}`);\n }\n sharedWorkspacePath = configuredStaticPath;\n } else if (!isPerTestIsolation && usePool && suiteWorkspace?.repos) {\n const slotsNeeded = workers;\n setupLog(`acquiring ${slotsNeeded} workspace pool slot(s) (pool capacity: ${poolMaxSlots})`);\n poolManager = new WorkspacePoolManager(getWorkspacePoolRoot());\n const poolRepoManager = new RepoManager(verbose);\n\n for (let i = 0; i < slotsNeeded; i++) {\n const slot = await poolManager.acquireWorkspace({\n templatePath: workspaceTemplate,\n repos: suiteWorkspace.repos,\n maxSlots: poolMaxSlots,\n repoManager: poolRepoManager,\n poolReset:\n (workspaceClean === 'full' ? 'strict' : workspaceClean === 'standard' ? 'fast' : null) ??\n 'fast',\n });\n poolSlots.push(slot);\n setupLog(`pool slot ${i} acquired at: ${slot.path} (existing=${slot.isExisting})`);\n }\n\n if (slotsNeeded === 1) {\n // Single-slot: use shared workspace path (existing behavior)\n poolSlot = poolSlots[0];\n sharedWorkspacePath = poolSlot.path;\n } else {\n // Multi-slot: tests will grab slots dynamically\n availablePoolSlots.push(...poolSlots);\n }\n } else if (!isPerTestIsolation && workspaceTemplate) {\n setupLog(`creating shared workspace from template: ${workspaceTemplate}`);\n try {\n sharedWorkspacePath = await createTempWorkspace(workspaceTemplate, evalRunId, 'shared');\n setupLog(`shared workspace created at: ${sharedWorkspacePath}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to create shared workspace: ${message}`);\n }\n } else if (!isPerTestIsolation && (suiteWorkspace?.hooks || suiteWorkspace?.repos?.length)) {\n // No template but hooks or repos are configured: create empty workspace\n sharedWorkspacePath = getWorkspacePath(evalRunId, 'shared');\n await mkdir(sharedWorkspacePath, { recursive: true });\n setupLog(`created empty shared workspace at: ${sharedWorkspacePath}`);\n }\n\n // Wrap remaining logic in try/finally to ensure pool slot is always released on error\n try {\n // Re-resolve workspaceFile from the pool/temp workspace so relative paths in\n // .code-workspace resolve against where repos are cloned, not the original template.\n if (suiteWorkspaceFile && sharedWorkspacePath) {\n const copiedWorkspaceFile = path.join(sharedWorkspacePath, path.basename(suiteWorkspaceFile));\n try {\n await stat(copiedWorkspaceFile);\n suiteWorkspaceFile = copiedWorkspaceFile;\n } catch {\n // Keep original if copy doesn't exist\n }\n }\n\n // Materialize repos into shared workspace (skip for per_test and pool modes).\n // For static workspaces: materialize only repos whose target path is missing (per-repo reuse).\n // For non-static workspaces: materialize all repos when freshly created.\n const hasReposToMaterialize =\n !!suiteWorkspace?.repos?.length && !usePool && !isPerTestIsolation;\n const needsRepoMaterialisation =\n hasReposToMaterialize && (!useStaticWorkspace || staticMaterialised);\n const needsPerRepoCheck =\n hasReposToMaterialize && useStaticWorkspace && !staticMaterialised && isYamlConfiguredPath;\n const repoManager =\n needsRepoMaterialisation || needsPerRepoCheck ? new RepoManager(verbose) : undefined;\n\n if (repoManager && sharedWorkspacePath && suiteWorkspace?.repos) {\n try {\n if (needsPerRepoCheck) {\n // Static workspace with existing content: materialize only missing repos\n for (const repo of suiteWorkspace.repos) {\n if (!repo.path || !repo.source) continue;\n const targetDir = path.join(sharedWorkspacePath, repo.path);\n if (existsSync(targetDir)) {\n setupLog(`reusing existing repo at: ${targetDir}`);\n continue;\n }\n setupLog(`materializing missing repo: ${repo.path}`);\n await repoManager.materialize(repo, sharedWorkspacePath);\n }\n } else {\n setupLog(\n `materializing ${suiteWorkspace.repos.length} shared repo(s) into ${sharedWorkspacePath}`,\n );\n await repoManager.materializeAll(suiteWorkspace.repos, sharedWorkspacePath);\n }\n setupLog('shared repo materialization complete');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (sharedWorkspacePath && !useStaticWorkspace) {\n await cleanupWorkspace(sharedWorkspacePath).catch(() => {});\n }\n throw new Error(`Failed to materialize repos: ${message}`);\n }\n }\n\n // --- Docker workspace: pull image once at setup ---\n const suiteDockerConfig = suiteWorkspace?.docker;\n if (suiteDockerConfig) {\n setupLog(`pulling Docker image: ${suiteDockerConfig.image}`);\n const { DockerWorkspaceProvider } = await import('./workspace/docker-workspace.js');\n const dockerSetup = new DockerWorkspaceProvider(suiteDockerConfig);\n if (!(await dockerSetup.isDockerAvailable())) {\n throw new Error(\n 'Docker workspace configured but Docker CLI is not available. Install Docker and ensure it is running.',\n );\n }\n await dockerSetup.pullImage();\n setupLog('Docker image pull complete');\n }\n\n // Run preflight environment checks (fail fast before any hooks or test cases)\n if (suiteWorkspace?.env) {\n try {\n await runPreflightChecks(suiteWorkspace.env, sharedWorkspacePath ?? undefined, setupLog);\n setupLog('preflight checks passed');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (sharedWorkspacePath && !useStaticWorkspace) {\n await cleanupWorkspace(sharedWorkspacePath).catch(() => {});\n }\n throw new Error(message);\n }\n }\n\n // Execute before_all (runs ONCE before first test per workspace)\n const suiteHooksEnabled = hooksEnabled(suiteWorkspace);\n const suiteBeforeAllHook = suiteWorkspace?.hooks?.before_all;\n if (sharedWorkspacePath && suiteHooksEnabled && hasHookCommand(suiteBeforeAllHook)) {\n const beforeAllHook = suiteBeforeAllHook;\n const beforeAllCommand = (beforeAllHook.command ?? beforeAllHook.script ?? []).join(' ');\n setupLog(\n `running shared before_all in cwd=${beforeAllHook.cwd ?? evalDir} command=${beforeAllCommand}`,\n );\n const scriptContext: ScriptExecutionContext = {\n workspacePath: sharedWorkspacePath,\n testId: '__before_all__',\n evalRunId,\n evalDir,\n workspaceFileDir: suiteWorkspace?.workspaceFileDir,\n };\n try {\n beforeAllOutput = await executeWorkspaceScript(\n toScriptConfig(beforeAllHook, 'before_all', 'suite workspace'),\n scriptContext,\n );\n setupLog('shared before_all completed');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (sharedWorkspacePath && !useStaticWorkspace) {\n await cleanupWorkspace(sharedWorkspacePath).catch(() => {});\n }\n throw new Error(`before_all script failed: ${message}`);\n }\n }\n\n // Multi-slot pool: run before_all on each slot and initialize baselines\n if (availablePoolSlots.length > 0 && suiteHooksEnabled && hasHookCommand(suiteBeforeAllHook)) {\n const beforeAllHook = suiteBeforeAllHook;\n for (const slot of availablePoolSlots) {\n setupLog(`running before_all on pool slot ${slot.index}`);\n const scriptContext: ScriptExecutionContext = {\n workspacePath: slot.path,\n testId: '__before_all__',\n evalRunId,\n evalDir,\n workspaceFileDir: suiteWorkspace?.workspaceFileDir,\n };\n try {\n const output = await executeWorkspaceScript(\n toScriptConfig(beforeAllHook, 'before_all', 'suite workspace'),\n scriptContext,\n );\n // Capture first slot's output for result attachment\n if (!beforeAllOutput) beforeAllOutput = output;\n setupLog(`before_all completed on pool slot ${slot.index}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`before_all script failed on pool slot ${slot.index}: ${message}`);\n }\n }\n }\n\n // Execute target before_all (runs once per workspace — shared or per pool slot)\n const targetHooks = options.targetHooks;\n const targetBeforeAllHook = targetHooks?.before_all;\n if (sharedWorkspacePath && hasHookCommand(targetBeforeAllHook)) {\n const beforeAllCommand = (targetBeforeAllHook.command ?? []).join(' ');\n setupLog(`running target before_all command=${beforeAllCommand}`);\n const scriptContext: ScriptExecutionContext = {\n workspacePath: sharedWorkspacePath,\n testId: '__target_before_all__',\n evalRunId,\n evalDir,\n workspaceFileDir: suiteWorkspace?.workspaceFileDir,\n };\n try {\n await executeWorkspaceScript(\n toScriptConfig(targetBeforeAllHook, 'before_all', 'target hooks'),\n scriptContext,\n );\n setupLog('target before_all completed');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (sharedWorkspacePath && !useStaticWorkspace) {\n await cleanupWorkspace(sharedWorkspacePath).catch(() => {});\n }\n throw new Error(`target before_all hook failed: ${message}`);\n }\n }\n\n // Run target before_all on pool slots\n if (availablePoolSlots.length > 0 && hasHookCommand(targetBeforeAllHook)) {\n for (const slot of availablePoolSlots) {\n setupLog(`running target before_all on pool slot ${slot.index}`);\n const scriptContext: ScriptExecutionContext = {\n workspacePath: slot.path,\n testId: '__target_before_all__',\n evalRunId,\n evalDir,\n workspaceFileDir: suiteWorkspace?.workspaceFileDir,\n };\n try {\n await executeWorkspaceScript(\n toScriptConfig(targetBeforeAllHook, 'before_all', 'target hooks'),\n scriptContext,\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`target before_all hook failed on pool slot ${slot.index}: ${message}`);\n }\n }\n }\n\n // Initialize git baseline for shared workspace\n if (sharedWorkspacePath) {\n try {\n sharedBaselineCommit = await initializeBaseline(sharedWorkspacePath);\n setupLog(`shared baseline initialized: ${sharedBaselineCommit}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n setupLog(`shared baseline initialization failed (file_changes unavailable): ${message}`);\n }\n }\n\n // Multi-slot pool: initialize git baselines per slot\n if (availablePoolSlots.length > 0) {\n for (const slot of availablePoolSlots) {\n try {\n const baseline = await initializeBaseline(slot.path);\n poolSlotBaselines.set(slot.path, baseline);\n setupLog(`pool slot ${slot.index} baseline initialized: ${baseline}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n setupLog(\n `pool slot ${slot.index} baseline initialization failed (file_changes unavailable): ${message}`,\n );\n }\n }\n }\n\n // Track worker assignments for progress reporting\n let nextWorkerId = 1;\n const workerIdByEvalId = new Map<string, number>();\n let beforeAllOutputAttached = false;\n\n // Suite-level budget tracking\n let cumulativeBudgetCost = 0;\n let budgetExhausted = false;\n\n // fail_on_error tracking (best-effort under concurrency > 1, matching budgetExhausted semantics)\n let failOnErrorTriggered = false;\n\n // --- Validate dependency graph and compute execution waves ---\n validateDependencyGraph(filteredEvalCases);\n const waves = computeWaves(filteredEvalCases);\n\n // Track completed test results for dependency injection\n const completedResults = new Map<string, EvaluationResult>();\n const results: EvaluationResult[] = [];\n\n // Helper: build a DependencyResult from a completed EvaluationResult\n function toDependencyResult(r: EvaluationResult): DependencyResult {\n const outputText = extractLastAssistantContent(r.output);\n return {\n score: r.score,\n output: outputText,\n workspace_path: r.workspacePath,\n details: r.scores\n ? (Object.fromEntries(\n r.scores.map((s) => [s.name, { score: s.score, verdict: s.verdict }]),\n ) as JsonObject)\n : undefined,\n status:\n r.executionStatus === 'ok'\n ? 'passed'\n : r.executionStatus === 'execution_error'\n ? 'error'\n : 'failed',\n };\n }\n\n // Helper: check whether all dependencies passed for a given test\n function checkDependencies(evalCase: EvalTest): {\n ok: boolean;\n depResults: Record<string, DependencyResult>;\n } {\n const depResults: Record<string, DependencyResult> = {};\n if (!evalCase.depends_on || evalCase.depends_on.length === 0) {\n return { ok: true, depResults };\n }\n let allPassed = true;\n for (const depId of evalCase.depends_on) {\n const depResult = completedResults.get(depId);\n if (depResult) {\n depResults[depId] = toDependencyResult(depResult);\n // Only execution errors count as dependency failures — quality failures\n // (low scores) still mean the test ran successfully, just scored poorly.\n if (depResult.executionStatus === 'execution_error') {\n allPassed = false;\n }\n } else {\n // Dependency didn't run (should not happen with valid DAG)\n allPassed = false;\n }\n }\n return { ok: allPassed, depResults };\n }\n\n function extractEvaluationCostUsd(result: EvaluationResult): number | undefined {\n if (result.trials && result.trials.length > 0) {\n const trialCostSum = result.trials.reduce((sum, t) => sum + (t.costUsd ?? 0), 0);\n return trialCostSum > 0 ? trialCostSum : undefined;\n }\n return result.costUsd;\n }\n\n // Worker function: dispatches a single eval case with dependency context\n async function dispatchTest(\n evalCase: EvalTest,\n depResults?: Record<string, DependencyResult>,\n ): Promise<EvaluationResult> {\n const workerId = nextWorkerId++;\n workerIdByEvalId.set(evalCase.id, workerId);\n\n // Check run-level budget before dispatching. This shared tracker spans all\n // eval files/targets in the current CLI invocation, so queued cases stop once\n // cumulative spend reaches the cap while already-running cases are allowed to finish.\n if (runBudgetTracker?.isExceeded()) {\n const budgetResult: EvaluationResult = {\n timestamp: (now ?? (() => new Date()))().toISOString(),\n testId: evalCase.id,\n suite: evalCase.suite,\n category: evalCase.category,\n score: 0,\n assertions: [],\n output: [],\n target: target.name,\n error: `Run budget exceeded ($${runBudgetTracker.currentCostUsd.toFixed(4)} / $${runBudgetTracker.budgetCapUsd.toFixed(4)})`,\n budgetExceeded: true,\n executionStatus: 'execution_error',\n failureStage: 'setup',\n failureReasonCode: 'budget_exceeded',\n executionError: {\n message: `Run budget exceeded ($${runBudgetTracker.currentCostUsd.toFixed(4)} / $${runBudgetTracker.budgetCapUsd.toFixed(4)})`,\n stage: 'setup',\n },\n };\n\n if (onProgress) {\n await onProgress({\n workerId,\n testId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: budgetResult.error,\n score: budgetResult.score,\n executionStatus: budgetResult.executionStatus,\n });\n }\n if (onResult) {\n await onResult(budgetResult);\n }\n return budgetResult;\n }\n\n // Check suite-level budget before dispatching\n if (budgetUsd !== undefined && budgetExhausted) {\n const budgetResult: EvaluationResult = {\n timestamp: (now ?? (() => new Date()))().toISOString(),\n testId: evalCase.id,\n suite: evalCase.suite,\n category: evalCase.category,\n score: 0,\n assertions: [],\n output: [],\n target: target.name,\n error: `Suite budget exceeded ($${cumulativeBudgetCost.toFixed(4)} / $${budgetUsd.toFixed(4)})`,\n budgetExceeded: true,\n executionStatus: 'execution_error',\n failureStage: 'setup',\n failureReasonCode: 'budget_exceeded',\n executionError: {\n message: `Suite budget exceeded ($${cumulativeBudgetCost.toFixed(4)} / $${budgetUsd.toFixed(4)})`,\n stage: 'setup',\n },\n };\n\n if (onProgress) {\n await onProgress({\n workerId,\n testId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: budgetResult.error,\n score: budgetResult.score,\n executionStatus: budgetResult.executionStatus,\n });\n }\n if (onResult) {\n await onResult(budgetResult);\n }\n return budgetResult;\n }\n\n // Check fail_on_error before dispatching\n if (failOnError === true && failOnErrorTriggered) {\n const errorMsg = 'Halted: execution error encountered with fail_on_error enabled';\n const haltResult: EvaluationResult = {\n timestamp: (now ?? (() => new Date()))().toISOString(),\n testId: evalCase.id,\n suite: evalCase.suite,\n category: evalCase.category,\n score: 0,\n assertions: [],\n output: [],\n target: target.name,\n error: errorMsg,\n executionStatus: 'execution_error',\n failureStage: 'setup',\n failureReasonCode: 'error_threshold_exceeded',\n executionError: { message: errorMsg, stage: 'setup' },\n };\n\n if (onProgress) {\n await onProgress({\n workerId,\n testId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: haltResult.error,\n score: haltResult.score,\n executionStatus: haltResult.executionStatus,\n });\n }\n if (onResult) {\n await onResult(haltResult);\n }\n return haltResult;\n }\n\n if (onProgress) {\n await onProgress({\n workerId,\n testId: evalCase.id,\n status: 'running',\n startedAt: Date.now(),\n });\n }\n\n // Multi-slot pool: each test grabs its own pool slot\n const testPoolSlot = availablePoolSlots.length > 0 ? availablePoolSlots.pop() : undefined;\n const testWorkspacePath = testPoolSlot?.path ?? sharedWorkspacePath;\n const testBaselineCommit = testPoolSlot\n ? poolSlotBaselines.get(testPoolSlot.path)\n : sharedBaselineCommit;\n\n try {\n const graderProvider = await resolveGraderProvider(target);\n const runCaseOptions: RunEvalCaseOptions = {\n evalCase: evalCase,\n provider: primaryProvider,\n target,\n evaluators: evaluatorRegistry,\n maxRetries,\n agentTimeoutMs,\n cache,\n useCache,\n now,\n graderProvider,\n targetResolver,\n availableTargets,\n evalRunId,\n keepWorkspaces,\n cleanupWorkspaces,\n retainOnSuccess: resolvedRetainOnSuccess,\n retainOnFailure: resolvedRetainOnFailure,\n sharedWorkspacePath: testWorkspacePath,\n sharedBaselineCommit: testBaselineCommit,\n suiteWorkspaceFile,\n streamCallbacks,\n typeRegistry,\n repoManager,\n evalDir,\n verbose,\n threshold: scoreThreshold,\n targetHooks: options.targetHooks,\n ...(depResults && Object.keys(depResults).length > 0\n ? { dependencyResults: depResults }\n : {}),\n };\n let result =\n trials && trials.count > 1\n ? await runEvalCaseWithTrials(runCaseOptions, trials)\n : await runEvalCase(runCaseOptions);\n\n const caseCost = extractEvaluationCostUsd(result);\n if (caseCost !== undefined) {\n if (budgetUsd !== undefined) {\n cumulativeBudgetCost += caseCost;\n if (cumulativeBudgetCost >= budgetUsd) {\n budgetExhausted = true;\n }\n }\n if (runBudgetTracker) {\n runBudgetTracker.add(caseCost);\n }\n }\n\n // Track fail_on_error\n if (failOnError === true && result.executionStatus === 'execution_error') {\n failOnErrorTriggered = true;\n }\n\n // Attach beforeAllOutput to first result only\n if (beforeAllOutput && !beforeAllOutputAttached) {\n result = { ...result, beforeAllOutput };\n beforeAllOutputAttached = true;\n }\n\n // Surface case-level metadata (e.g. governance taxonomies) on the result so\n // it round-trips into the JSONL artifact and downstream consumers (reports,\n // jq pipelines, attestation exports). Already-set metadata wins.\n if (evalCase.metadata && !result.metadata) {\n result = { ...result, metadata: evalCase.metadata };\n }\n\n if (onProgress) {\n await onProgress({\n workerId,\n testId: evalCase.id,\n status: result.error ? 'failed' : 'completed',\n startedAt: 0, // Not used for completed status\n completedAt: Date.now(),\n error: result.error,\n score: result.score,\n executionStatus: result.executionStatus,\n durationMs: result.durationMs,\n evalRunDurationMs: result.evalRun?.durationMs,\n });\n }\n\n if (onResult) {\n await onResult(result);\n }\n return result;\n } catch (error) {\n if (onProgress) {\n await onProgress({\n workerId,\n testId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: error instanceof Error ? error.message : String(error),\n });\n }\n throw error;\n } finally {\n // Return pool slot for reuse by next test\n if (testPoolSlot) {\n availablePoolSlots.push(testPoolSlot);\n }\n }\n }\n\n // --- DAG-aware wave dispatch ---\n // Dispatch each wave sequentially; tests within a wave run in parallel via pLimit.\n for (const wave of waves) {\n const wavePromises = wave.map((evalCase) =>\n limit(async () => {\n // Check dependency status for tests with depends_on\n if (evalCase.depends_on && evalCase.depends_on.length > 0) {\n const { ok, depResults } = checkDependencies(evalCase);\n if (!ok) {\n const policy = evalCase.on_dependency_failure ?? 'skip';\n if (policy === 'skip' || policy === 'fail') {\n const failedDeps = evalCase.depends_on.filter(\n (d) => completedResults.get(d)?.executionStatus === 'execution_error',\n );\n const prefix = policy === 'skip' ? 'Skipped' : 'Failed';\n const errorMsg = `${prefix}: dependency failed (${failedDeps.join(', ')})`;\n const depFailResult: EvaluationResult = {\n timestamp: (now ?? (() => new Date()))().toISOString(),\n testId: evalCase.id,\n suite: evalCase.suite,\n category: evalCase.category,\n score: 0,\n assertions: [],\n output: [],\n target: target.name,\n error: errorMsg,\n executionStatus: 'execution_error',\n failureStage: 'setup',\n failureReasonCode: 'dependency_failed',\n executionError: { message: errorMsg, stage: 'setup' },\n };\n if (onProgress) {\n await onProgress({\n workerId: nextWorkerId++,\n testId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: depFailResult.error,\n score: 0,\n executionStatus: depFailResult.executionStatus,\n });\n }\n if (onResult) {\n await onResult(depFailResult);\n }\n return depFailResult;\n }\n // policy === 'run': fall through to dispatch with dependency results\n }\n return dispatchTest(evalCase, depResults);\n }\n return dispatchTest(evalCase);\n }),\n );\n\n const settled = await Promise.allSettled(wavePromises);\n\n // Collect wave results\n for (let i = 0; i < settled.length; i++) {\n const outcome = settled[i];\n const evalCase = wave[i];\n if (outcome.status === 'fulfilled') {\n completedResults.set(evalCase.id, outcome.value);\n results.push(outcome.value);\n } else {\n const formattingMode = usesFileReferencePrompt(primaryProvider) ? 'agent' : 'lm';\n const promptInputs = await buildPromptInputs(evalCase, formattingMode);\n const errorResult = buildErrorResult(\n evalCase,\n target.name,\n (now ?? (() => new Date()))(),\n outcome.reason,\n promptInputs,\n primaryProvider,\n 'agent',\n 'provider_error',\n verbose,\n );\n completedResults.set(evalCase.id, errorResult);\n results.push(errorResult);\n if (onResult) {\n await onResult(errorResult);\n }\n }\n }\n }\n\n // --- Shared workspace after_all + cleanup ---\n // For multi-slot pool, run after_all on each slot (symmetric with before_all)\n const afterAllWorkspaces =\n poolSlots.length > 1\n ? poolSlots.map((s) => s.path)\n : sharedWorkspacePath\n ? [sharedWorkspacePath]\n : [];\n\n // Execute target after_all (runs ONCE before workspace after_all)\n const targetAfterAllHook = targetHooks?.after_all;\n if (afterAllWorkspaces.length > 0 && hasHookCommand(targetAfterAllHook)) {\n for (const wsPath of afterAllWorkspaces) {\n const scriptContext: ScriptExecutionContext = {\n workspacePath: wsPath,\n testId: '__target_after_all__',\n evalRunId,\n evalDir,\n workspaceFileDir: suiteWorkspace?.workspaceFileDir,\n };\n try {\n await executeWorkspaceScript(\n toScriptConfig(targetAfterAllHook, 'after_all', 'target hooks'),\n scriptContext,\n 'warn',\n );\n } catch {\n // target after_all failures are non-fatal\n }\n }\n }\n\n const suiteAfterAllHook = suiteWorkspace?.hooks?.after_all;\n if (afterAllWorkspaces.length > 0 && suiteHooksEnabled && hasHookCommand(suiteAfterAllHook)) {\n const afterAllHook = suiteAfterAllHook;\n for (const wsPath of afterAllWorkspaces) {\n const scriptContext: ScriptExecutionContext = {\n workspacePath: wsPath,\n testId: '__after_all__',\n evalRunId,\n evalDir,\n workspaceFileDir: suiteWorkspace?.workspaceFileDir,\n };\n try {\n const afterAllOutput = await executeWorkspaceScript(\n toScriptConfig(afterAllHook, 'after_all', 'suite workspace'),\n scriptContext,\n 'warn',\n );\n // Attach afterAllOutput to last result (first slot only)\n if (afterAllOutput && results.length > 0 && wsPath === afterAllWorkspaces[0]) {\n results[results.length - 1] = { ...results[results.length - 1], afterAllOutput };\n }\n } catch {\n // after_all failures are non-fatal\n }\n }\n }\n\n // Cleanup shared workspace (skip for pooled workspaces and user-provided workspaces)\n if (sharedWorkspacePath && !poolSlot && poolSlots.length === 0 && !useStaticWorkspace) {\n const hasFailure = results.some((r) => !!r.error || r.score < 0.5);\n if (hasFailure) {\n if (resolvedRetainOnFailure === 'cleanup') {\n await cleanupWorkspace(sharedWorkspacePath).catch(() => {});\n }\n } else if (resolvedRetainOnSuccess === 'cleanup') {\n await cleanupWorkspace(sharedWorkspacePath).catch(() => {});\n }\n }\n\n // Fallback cleanup for any per-case workspaces\n if (cleanupWorkspaces) {\n await cleanupEvalWorkspaces(evalRunId).catch(() => {});\n }\n\n return results;\n } finally {\n // Release all workspace pool slots (keep workspaces for future reuse)\n if (poolManager) {\n if (poolSlot) {\n await poolManager.releaseSlot(poolSlot);\n }\n for (const slot of poolSlots) {\n if (slot !== poolSlot) {\n await poolManager.releaseSlot(slot).catch(() => {});\n }\n }\n }\n }\n}\n\nasync function runBatchEvaluation(options: {\n readonly evalCases: readonly EvalTest[];\n readonly provider: Provider;\n readonly target: ResolvedTarget;\n readonly evaluatorRegistry: Partial<Record<string, Grader>> & {\n readonly 'llm-grader': Grader;\n };\n readonly typeRegistry: import('./registry/grader-registry.js').GraderRegistry;\n readonly nowFn: () => Date;\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\n readonly verbose?: boolean;\n readonly resolveGraderProvider: (target: ResolvedTarget) => Promise<Provider | undefined>;\n readonly agentTimeoutMs?: number;\n readonly targetResolver?: (name: string) => Provider | undefined;\n readonly availableTargets?: readonly string[];\n readonly threshold?: number;\n}): Promise<readonly EvaluationResult[]> {\n const {\n evalCases,\n provider,\n target,\n evaluatorRegistry,\n typeRegistry,\n nowFn,\n onProgress,\n onResult,\n verbose,\n resolveGraderProvider,\n agentTimeoutMs,\n targetResolver,\n availableTargets,\n threshold: batchThreshold,\n } = options;\n\n // Prepare prompt inputs up front so we can reuse them for grading.\n const promptInputsList: PromptInputs[] = [];\n const formattingMode = usesFileReferencePrompt(provider) ? 'agent' : 'lm';\n\n for (const evalCase of evalCases) {\n const promptInputs = await buildPromptInputs(evalCase, formattingMode);\n promptInputsList.push(promptInputs);\n }\n\n const batchRequests: ProviderRequest[] = evalCases.map((evalCase, index) => {\n const promptInputs = promptInputsList[index];\n return {\n question: promptInputs.question,\n systemPrompt: promptInputs.systemMessage,\n inputFiles: evalCase.file_paths,\n evalCaseId: evalCase.id,\n };\n });\n\n const batchResponse = await provider.invokeBatch?.(batchRequests);\n if (!Array.isArray(batchResponse)) {\n throw new Error('Provider batching failed: invokeBatch did not return an array');\n }\n if (batchResponse.length !== evalCases.length) {\n throw new Error(\n `Provider batching failed: expected ${evalCases.length} responses, received ${batchResponse.length}`,\n );\n }\n\n if (onProgress) {\n const startedAt = Date.now();\n for (let i = 0; i < evalCases.length; i++) {\n await onProgress({\n workerId: 1,\n testId: evalCases[i].id,\n status: 'running',\n startedAt,\n });\n }\n }\n\n const results: EvaluationResult[] = [];\n for (let i = 0; i < evalCases.length; i++) {\n const evalCase = evalCases[i];\n const promptInputs = promptInputsList[i];\n const providerResponse = batchResponse[i];\n\n // Extract output from batch response\n const output = providerResponse.output;\n const hasExecutionMetrics =\n providerResponse.tokenUsage !== undefined ||\n providerResponse.costUsd !== undefined ||\n providerResponse.durationMs !== undefined;\n\n const computed = output\n ? computeTraceSummary(output)\n : hasExecutionMetrics\n ? { trace: { eventCount: 0, toolCalls: {}, errorCount: 0 } }\n : undefined;\n const merged = computed\n ? mergeExecutionMetrics(computed, {\n tokenUsage: providerResponse.tokenUsage,\n costUsd: providerResponse.costUsd,\n durationMs: providerResponse.durationMs,\n startTime: providerResponse.startTime,\n endTime: providerResponse.endTime,\n })\n : undefined;\n const trace = merged?.trace;\n const costUsd = merged?.costUsd;\n const durationMs = merged?.durationMs;\n const tokenUsage = merged?.tokenUsage;\n const startTime = merged?.startTime;\n const endTime = merged?.endTime;\n\n // Extract candidate from last assistant message in output\n const candidate = extractLastAssistantContent(output);\n\n const providerError = extractProviderError(providerResponse);\n\n let result: EvaluationResult;\n try {\n result = await evaluateCandidate({\n evalCase,\n candidate,\n target,\n provider,\n evaluators: evaluatorRegistry,\n typeRegistry,\n promptInputs,\n nowFn,\n attempt: 0,\n graderProvider: await resolveGraderProvider(target),\n agentTimeoutMs,\n output,\n trace,\n costUsd,\n durationMs,\n tokenUsage,\n startTime,\n endTime,\n targetResolver,\n availableTargets,\n verbose,\n threshold: evalCase.threshold ?? batchThreshold,\n });\n\n if (providerError) {\n result = {\n ...result,\n error: providerError,\n executionStatus: 'execution_error' as const,\n failureStage: 'agent' as const,\n failureReasonCode: 'provider_error',\n executionError: { message: providerError, stage: 'agent' as const },\n };\n }\n } catch (error) {\n const errorResult = buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n error,\n promptInputs,\n provider,\n 'evaluator',\n 'evaluator_error',\n verbose,\n );\n results.push(errorResult);\n if (onResult) {\n await onResult(errorResult);\n }\n if (onProgress) {\n await onProgress({\n workerId: 1,\n testId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: error instanceof Error ? error.message : String(error),\n score: errorResult.score,\n executionStatus: errorResult.executionStatus,\n evalRunDurationMs: errorResult.evalRun?.durationMs,\n });\n }\n continue;\n }\n\n results.push(result);\n if (onResult) {\n await onResult(result);\n }\n\n if (onProgress) {\n await onProgress({\n workerId: 1,\n testId: evalCase.id,\n status: result.error ? 'failed' : 'completed',\n startedAt: 0,\n completedAt: Date.now(),\n error: result.error,\n score: result.score,\n executionStatus: result.executionStatus,\n durationMs: result.durationMs,\n evalRunDurationMs: result.evalRun?.durationMs,\n });\n }\n }\n\n return results;\n}\n\nexport async function runEvalCase(options: RunEvalCaseOptions): Promise<EvaluationResult> {\n const {\n evalCase,\n provider,\n target,\n evaluators,\n now,\n maxRetries,\n agentTimeoutMs,\n cache,\n useCache,\n signal,\n graderProvider,\n targetResolver,\n availableTargets,\n evalRunId,\n keepWorkspaces,\n cleanupWorkspaces: forceCleanup,\n retainOnSuccess,\n retainOnFailure,\n sharedWorkspacePath,\n sharedBaselineCommit,\n suiteWorkspaceFile,\n typeRegistry: providedTypeRegistry,\n repoManager,\n evalDir,\n verbose,\n threshold: caseThreshold,\n dependencyResults,\n } = options;\n const setupDebug = process.env.AGENTV_SETUP_DEBUG === '1';\n\n const formattingMode = usesFileReferencePrompt(provider) ? 'agent' : 'lm';\n const promptInputs = await buildPromptInputs(evalCase, formattingMode);\n const typeRegistry = providedTypeRegistry ?? createBuiltinRegistry();\n\n const cacheKey = useCache ? createCacheKey(provider, target, evalCase, promptInputs) : undefined;\n let cachedResponse: ProviderResponse | undefined;\n if (cacheKey && cache) {\n cachedResponse = await cache.get(cacheKey);\n }\n\n const nowFn = now ?? (() => new Date());\n\n // Use shared workspace if provided, otherwise create per-case workspace\n let workspacePath: string | undefined = sharedWorkspacePath;\n let beforeAllOutput: string | undefined;\n let beforeEachOutput: string | undefined;\n let afterEachOutput: string | undefined;\n const isSharedWorkspace = !!sharedWorkspacePath;\n\n let caseWorkspaceFile: string | undefined;\n const caseHooksEnabled = hooksEnabled(evalCase.workspace);\n\n if (!workspacePath) {\n // Per-case workspace creation (backwards compat for tests without shared workspace)\n const rawCaseTemplate = evalCase.workspace?.template;\n const resolvedCaseTemplate = await resolveWorkspaceTemplate(rawCaseTemplate);\n const caseWorkspaceTemplate = resolvedCaseTemplate?.dir;\n caseWorkspaceFile = resolvedCaseTemplate?.workspaceFile;\n if (caseWorkspaceTemplate && evalRunId) {\n try {\n workspacePath = await createTempWorkspace(caseWorkspaceTemplate, evalRunId, evalCase.id);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n new Error(`Failed to create workspace: ${message}`),\n promptInputs,\n provider,\n 'setup',\n 'template_error',\n verbose,\n );\n }\n\n // Re-resolve workspaceFile from the temp workspace\n if (caseWorkspaceFile && workspacePath) {\n const copiedFile = path.join(workspacePath, path.basename(caseWorkspaceFile));\n try {\n await stat(copiedFile);\n caseWorkspaceFile = copiedFile;\n } catch {\n // Keep original if copy doesn't exist\n }\n }\n }\n\n // If no template but hooks or repos are configured per-case, create empty workspace\n if (\n !workspacePath &&\n (evalCase.workspace?.hooks || evalCase.workspace?.repos?.length) &&\n evalRunId\n ) {\n workspacePath = getWorkspacePath(evalRunId, evalCase.id);\n await mkdir(workspacePath, { recursive: true });\n }\n\n // Validate local repo paths before per-case materialization\n if (evalCase.workspace?.repos?.length && workspacePath) {\n const localPathErrors = RepoManager.validateLocalPaths(evalCase.workspace.repos);\n if (localPathErrors.length > 0) {\n const message = RepoManager.formatValidationErrors(localPathErrors);\n console.warn(`Warning: test=${evalCase.id} ${message}`);\n return buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n new Error(message),\n promptInputs,\n provider,\n 'repo_setup',\n 'local_path_not_found',\n verbose,\n );\n }\n }\n\n // Materialize repos into per-case workspace\n if (evalCase.workspace?.repos?.length && workspacePath) {\n const perCaseRepoManager = new RepoManager(setupDebug);\n try {\n if (setupDebug) {\n console.log(\n `[setup] test=${evalCase.id} materializing ${evalCase.workspace.repos.length} per-test repo(s) into ${workspacePath}`,\n );\n }\n await perCaseRepoManager.materializeAll(evalCase.workspace.repos, workspacePath);\n if (setupDebug) {\n console.log(`[setup] test=${evalCase.id} per-test repo materialization complete`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n new Error(`Failed to materialize repos: ${message}`),\n promptInputs,\n provider,\n 'repo_setup',\n 'clone_error',\n verbose,\n );\n }\n }\n\n // Copy Agent Skills files into workspace\n if (workspacePath && evalCase.metadata?.agent_skills_files) {\n const baseDir = evalCase.metadata.agent_skills_base_dir as string | undefined;\n const files = evalCase.metadata.agent_skills_files as readonly string[];\n if (baseDir && files.length > 0) {\n for (const relPath of files) {\n const srcPath = path.resolve(baseDir, relPath);\n const destPath = path.resolve(workspacePath, relPath);\n try {\n await mkdir(path.dirname(destPath), { recursive: true });\n await copyFile(srcPath, destPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n new Error(\n `Agent Skills eval file not found: ${relPath} (resolved from ${baseDir}): ${message}`,\n ),\n promptInputs,\n provider,\n 'setup',\n 'file_copy_error',\n verbose,\n );\n }\n }\n }\n }\n\n // Execute per-case before_all (only when not using shared workspace)\n const caseBeforeAllHook = evalCase.workspace?.hooks?.before_all;\n if (workspacePath && caseHooksEnabled && hasHookCommand(caseBeforeAllHook)) {\n const beforeAllHook = caseBeforeAllHook;\n const beforeAllCommand = (beforeAllHook.command ?? beforeAllHook.script ?? []).join(' ');\n if (setupDebug) {\n console.log(\n `[setup] test=${evalCase.id} running before_all in cwd=${beforeAllHook.cwd ?? evalDir} command=${beforeAllCommand}`,\n );\n }\n const scriptContext: ScriptExecutionContext = {\n workspacePath,\n testId: evalCase.id,\n evalRunId: evalRunId ?? '',\n caseInput: evalCase.question,\n caseMetadata: evalCase.metadata,\n evalDir,\n workspaceFileDir: evalCase.workspace?.workspaceFileDir,\n };\n try {\n beforeAllOutput = await executeWorkspaceScript(\n toScriptConfig(beforeAllHook, 'before_all', `test '${evalCase.id}'`),\n scriptContext,\n );\n if (setupDebug) {\n console.log(`[setup] test=${evalCase.id} before_all completed`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (forceCleanup && workspacePath) {\n await cleanupWorkspace(workspacePath).catch(() => {});\n }\n return buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n new Error(`before_all script failed: ${message}`),\n promptInputs,\n provider,\n 'setup',\n 'script_error',\n verbose,\n );\n }\n }\n }\n\n let beforeEachNeedsFreshBaseline = false;\n\n // Apply before_each reset before any setup scripts run.\n if (\n caseHooksEnabled &&\n workspacePath &&\n evalCase.workspace?.hooks?.before_each?.reset &&\n evalCase.workspace.hooks.before_each.reset !== 'none'\n ) {\n try {\n if (repoManager && evalCase.workspace.repos?.length) {\n await repoManager.reset(\n evalCase.workspace.repos,\n workspacePath,\n evalCase.workspace.hooks.before_each.reset,\n );\n } else {\n await resetWorkspaceRoot(\n workspacePath,\n evalCase.workspace.hooks.before_each.reset,\n sharedBaselineCommit,\n );\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n new Error(`before_each reset failed: ${message}`),\n promptInputs,\n provider,\n 'setup',\n 'script_error',\n verbose,\n );\n }\n }\n\n // Execute before_each hook (runs before each test for any workspace)\n const caseBeforeEachHook = evalCase.workspace?.hooks?.before_each;\n if (workspacePath && caseHooksEnabled && hasHookCommand(caseBeforeEachHook)) {\n const beforeEachHook = caseBeforeEachHook;\n const scriptContext: ScriptExecutionContext = {\n workspacePath,\n testId: evalCase.id,\n evalRunId: evalRunId ?? '',\n caseInput: evalCase.question,\n caseMetadata: evalCase.metadata,\n evalDir,\n workspaceFileDir: evalCase.workspace?.workspaceFileDir,\n };\n try {\n beforeEachOutput = await executeWorkspaceScript(\n toScriptConfig(beforeEachHook, 'before_each', `test '${evalCase.id}'`),\n scriptContext,\n );\n beforeEachNeedsFreshBaseline = true;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n new Error(`before_each script failed: ${message}`),\n promptInputs,\n provider,\n 'setup',\n 'script_error',\n verbose,\n );\n }\n }\n\n // Execute target before_each hook (runs after workspace before_each)\n const targetBeforeEachHook = options.targetHooks?.before_each;\n if (workspacePath && hasHookCommand(targetBeforeEachHook)) {\n const scriptContext: ScriptExecutionContext = {\n workspacePath,\n testId: evalCase.id,\n evalRunId: evalRunId ?? '',\n caseInput: evalCase.question,\n caseMetadata: evalCase.metadata,\n evalDir,\n workspaceFileDir: evalCase.workspace?.workspaceFileDir,\n };\n try {\n await executeWorkspaceScript(\n toScriptConfig(targetBeforeEachHook, 'before_each', `target hook for '${evalCase.id}'`),\n scriptContext,\n );\n beforeEachNeedsFreshBaseline = true;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n new Error(`target before_each hook failed: ${message}`),\n promptInputs,\n provider,\n 'setup',\n 'script_error',\n verbose,\n );\n }\n }\n\n // Initialize git baseline for file-change tracking.\n // Runs git init + baseline commit before the agent, then diffs after.\n // Supports nested repos via --submodule=diff.\n let baselineCommit: string | undefined = beforeEachNeedsFreshBaseline\n ? undefined\n : sharedBaselineCommit;\n if (!baselineCommit && workspacePath) {\n try {\n baselineCommit = await initializeBaseline(workspacePath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (verbose) {\n console.warn(`[setup] test=${evalCase.id} baseline initialization failed: ${message}`);\n }\n }\n }\n\n // Conversation mode: turn-by-turn evaluation\n if (evalCase.mode === 'conversation' && evalCase.turns?.length) {\n const conversationResult = await runConversationMode({\n evalCase,\n provider,\n target,\n evaluators,\n typeRegistry,\n graderProvider,\n promptInputs,\n nowFn,\n signal,\n workspacePath,\n caseWorkspaceFile: caseWorkspaceFile ?? suiteWorkspaceFile,\n agentTimeoutMs,\n streamCallbacks: options.streamCallbacks,\n verbose,\n threshold: evalCase.threshold ?? caseThreshold,\n targetResolver,\n availableTargets,\n });\n\n // Cleanup workspace (same logic as standard path)\n if (workspacePath && !isSharedWorkspace) {\n const shouldRetain =\n conversationResult.executionStatus === 'ok'\n ? retainOnSuccess === 'keep' || keepWorkspaces\n : retainOnFailure === 'keep' || (!forceCleanup && !keepWorkspaces);\n if (!shouldRetain) {\n await cleanupWorkspace(workspacePath).catch(() => {});\n }\n }\n\n return conversationResult;\n }\n\n const caseStartMs = Date.now();\n const attemptBudget = (maxRetries ?? 0) + 1;\n let attempt = 0;\n let providerResponse: ProviderResponse | undefined = cachedResponse;\n let lastError: unknown;\n /** Set when a fallback target actually served the response. */\n let targetUsed: string | undefined;\n\n while (!providerResponse && attempt < attemptBudget) {\n try {\n providerResponse = await invokeProvider(provider, {\n evalCase: evalCase,\n target,\n promptInputs,\n attempt,\n agentTimeoutMs,\n signal,\n cwd: workspacePath,\n workspaceFile: caseWorkspaceFile ?? suiteWorkspaceFile,\n captureFileChanges: !!baselineCommit,\n streamCallbacks: options.streamCallbacks,\n });\n } catch (error) {\n lastError = error;\n if (attempt + 1 < attemptBudget) {\n const delayMs = retryBackoffMs(attempt);\n await sleep(delayMs, signal);\n attempt += 1;\n continue;\n }\n break; // Exhausted retries on primary — try fallback targets below\n }\n }\n\n // Try fallback targets in order after exhausting retries on the primary\n if (!providerResponse && target.fallbackTargets?.length && targetResolver) {\n for (const fallbackName of target.fallbackTargets) {\n const fallbackProvider = targetResolver(fallbackName);\n if (!fallbackProvider) {\n continue;\n }\n try {\n providerResponse = await invokeProvider(fallbackProvider, {\n evalCase: evalCase,\n target,\n promptInputs,\n attempt: 0,\n agentTimeoutMs,\n signal,\n cwd: workspacePath,\n workspaceFile: caseWorkspaceFile ?? suiteWorkspaceFile,\n captureFileChanges: !!baselineCommit,\n streamCallbacks: options.streamCallbacks,\n });\n targetUsed = fallbackName;\n break; // Fallback succeeded\n } catch (error) {\n lastError = error;\n // Continue to next fallback\n }\n }\n }\n\n if (!providerResponse) {\n const errorResult = buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n lastError ?? new Error('Provider did not return a response'),\n promptInputs,\n provider,\n 'agent',\n 'provider_error',\n verbose,\n );\n // On error, keep workspace for debugging (unless forceCleanup is set)\n if (workspacePath) {\n if (forceCleanup) {\n await cleanupWorkspace(workspacePath).catch(() => {});\n }\n return { ...errorResult, workspacePath };\n }\n return errorResult;\n }\n\n if (cacheKey && cache && !cachedResponse) {\n await cache.set(cacheKey, providerResponse);\n }\n\n // Extract output from provider response\n const output = providerResponse.output;\n\n const hasExecutionMetrics =\n providerResponse.tokenUsage !== undefined ||\n providerResponse.costUsd !== undefined ||\n providerResponse.durationMs !== undefined;\n\n // Compute trace summary if output available. If not, still preserve execution metrics.\n const computed = output\n ? computeTraceSummary(output)\n : hasExecutionMetrics\n ? { trace: { eventCount: 0, toolCalls: {}, errorCount: 0 } }\n : undefined;\n const merged = computed\n ? mergeExecutionMetrics(computed, {\n tokenUsage: providerResponse.tokenUsage,\n costUsd: providerResponse.costUsd,\n durationMs: providerResponse.durationMs,\n startTime: providerResponse.startTime,\n endTime: providerResponse.endTime,\n })\n : undefined;\n const trace = merged?.trace;\n const costUsd = merged?.costUsd;\n const durationMs = merged?.durationMs;\n const tokenUsage = merged?.tokenUsage;\n const startTime = merged?.startTime;\n const endTime = merged?.endTime;\n\n // Extract candidate from last assistant message in output\n const candidate = extractLastAssistantContent(output);\n\n // Capture file changes: git diff against baseline, then merge any provider-reported artifacts.\n let fileChanges: string | undefined;\n if (baselineCommit && workspacePath) {\n try {\n const diff = await captureWorkspaceFileChanges(workspacePath, baselineCommit);\n if (diff.length > 0) {\n fileChanges = diff;\n }\n } catch {\n // Non-fatal: file change tracking is best-effort\n }\n }\n\n // Provider-reported artifacts (files written outside workspace_path,\n // e.g. copilot session-state). Merged on top of any workspace-based diff.\n const providerFileChanges = providerResponse?.fileChanges;\n if (providerFileChanges) {\n fileChanges = fileChanges ? `${fileChanges}\\n${providerFileChanges}` : providerFileChanges;\n }\n\n // Format tool calls for LLM grader template variable\n const toolCalls = formatToolCalls(output);\n\n const providerError = extractProviderError(providerResponse);\n\n // Execute target after_each hook (runs before workspace after_each)\n const targetAfterEachHook = options.targetHooks?.after_each;\n if (workspacePath && hasHookCommand(targetAfterEachHook)) {\n const scriptContext: ScriptExecutionContext = {\n workspacePath,\n testId: evalCase.id,\n evalRunId: evalRunId ?? '',\n caseInput: evalCase.question,\n caseMetadata: evalCase.metadata,\n evalDir,\n workspaceFileDir: evalCase.workspace?.workspaceFileDir,\n };\n try {\n await executeWorkspaceScript(\n toScriptConfig(targetAfterEachHook, 'after_each', `target hook for '${evalCase.id}'`),\n scriptContext,\n 'warn',\n );\n } catch {\n // target after_each failures are non-fatal\n }\n }\n\n // Reset workspace state before after_each hook (if configured)\n if (\n caseHooksEnabled &&\n workspacePath &&\n evalCase.workspace?.hooks?.after_each?.reset &&\n evalCase.workspace.hooks.after_each.reset !== 'none'\n ) {\n try {\n if (repoManager && evalCase.workspace.repos?.length) {\n await repoManager.reset(\n evalCase.workspace.repos,\n workspacePath,\n evalCase.workspace.hooks.after_each.reset,\n );\n } else {\n await resetWorkspaceRoot(\n workspacePath,\n evalCase.workspace.hooks.after_each.reset,\n baselineCommit,\n );\n }\n } catch {\n // Reset failures are non-fatal (like after_each)\n }\n }\n\n // Execute after_each hook (runs after evaluation, before cleanup)\n const caseAfterEachHook = evalCase.workspace?.hooks?.after_each;\n if (workspacePath && caseHooksEnabled && hasHookCommand(caseAfterEachHook)) {\n const afterEachHook = caseAfterEachHook;\n const scriptContext: ScriptExecutionContext = {\n workspacePath,\n testId: evalCase.id,\n evalRunId: evalRunId ?? '',\n caseInput: evalCase.question,\n caseMetadata: evalCase.metadata,\n evalDir,\n workspaceFileDir: evalCase.workspace?.workspaceFileDir,\n };\n try {\n afterEachOutput = await executeWorkspaceScript(\n toScriptConfig(afterEachHook, 'after_each', `test '${evalCase.id}'`),\n scriptContext,\n 'warn',\n );\n } catch {\n // after_each failures are non-fatal\n }\n }\n\n try {\n const result = await evaluateCandidate({\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n typeRegistry,\n promptInputs,\n nowFn,\n attempt,\n graderProvider,\n agentTimeoutMs,\n output,\n trace,\n costUsd,\n durationMs,\n tokenUsage,\n startTime,\n endTime,\n targetResolver,\n availableTargets,\n fileChanges,\n toolCalls,\n workspacePath,\n dockerConfig: evalCase.workspace?.docker,\n verbose,\n threshold: evalCase.threshold ?? caseThreshold,\n dependencyResults,\n });\n\n const effectiveThreshold = evalCase.threshold ?? caseThreshold;\n const totalDurationMs = Date.now() - caseStartMs;\n\n // Aggregate grader token usage from individual grader results\n const graderTokens = aggregateEvaluatorTokenUsage(result.scores);\n const evalRunTokenUsage =\n tokenUsage || graderTokens\n ? {\n input: (tokenUsage?.input ?? 0) + (graderTokens?.input ?? 0),\n output: (tokenUsage?.output ?? 0) + (graderTokens?.output ?? 0),\n ...(tokenUsage?.reasoning != null || graderTokens?.reasoning != null\n ? { reasoning: (tokenUsage?.reasoning ?? 0) + (graderTokens?.reasoning ?? 0) }\n : {}),\n ...(tokenUsage?.cached != null || graderTokens?.cached != null\n ? { cached: (tokenUsage?.cached ?? 0) + (graderTokens?.cached ?? 0) }\n : {}),\n }\n : undefined;\n\n const evalRun = {\n durationMs: totalDurationMs,\n ...(evalRunTokenUsage ? { tokenUsage: evalRunTokenUsage } : {}),\n };\n\n const skippedEvaluatorError = buildSkippedEvaluatorError(result.scores);\n const executionStatus: ExecutionStatus =\n providerError || skippedEvaluatorError\n ? 'execution_error'\n : classifyQualityStatus(result.score, effectiveThreshold);\n\n // Include targetUsed only when a fallback target served the response\n const targetUsedField = targetUsed ? { targetUsed } : {};\n\n const finalResult = providerError\n ? {\n ...result,\n ...targetUsedField,\n evalRun,\n error: providerError,\n executionStatus,\n failureStage: 'agent' as const,\n failureReasonCode: 'provider_error',\n executionError: { message: providerError, stage: 'agent' as const },\n beforeAllOutput,\n beforeEachOutput,\n afterEachOutput,\n }\n : skippedEvaluatorError\n ? {\n ...result,\n ...targetUsedField,\n score: 0,\n evalRun,\n error: skippedEvaluatorError,\n executionStatus,\n failureStage: 'evaluator' as const,\n failureReasonCode: 'evaluator_error',\n executionError: { message: skippedEvaluatorError, stage: 'evaluator' as const },\n beforeAllOutput,\n beforeEachOutput,\n afterEachOutput,\n }\n : {\n ...result,\n ...targetUsedField,\n evalRun,\n executionStatus,\n beforeAllOutput,\n beforeEachOutput,\n afterEachOutput,\n };\n\n // Determine if this is a failure (has error or low score)\n const isFailure = !!finalResult.error || finalResult.score < 0.5;\n\n // Cleanup workspace based on result and flags (only for per-case workspaces)\n if (workspacePath && !isSharedWorkspace) {\n if (forceCleanup) {\n await cleanupWorkspace(workspacePath).catch(() => {});\n } else if (isFailure) {\n if ((retainOnFailure ?? 'keep') === 'cleanup') {\n await cleanupWorkspace(workspacePath).catch(() => {});\n } else {\n return { ...finalResult, workspacePath };\n }\n } else if ((retainOnSuccess ?? (keepWorkspaces ? 'keep' : 'cleanup')) !== 'keep') {\n await cleanupWorkspace(workspacePath).catch(() => {});\n } else {\n return { ...finalResult, workspacePath };\n }\n }\n\n return finalResult;\n } catch (error) {\n const evalRun = { durationMs: Date.now() - caseStartMs };\n const errorResult = buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n error,\n promptInputs,\n provider,\n 'evaluator',\n 'evaluator_error',\n verbose,\n );\n // On error, keep workspace for debugging (only for per-case workspaces)\n if (workspacePath && !isSharedWorkspace) {\n if (forceCleanup || (retainOnFailure ?? 'keep') === 'cleanup') {\n await cleanupWorkspace(workspacePath).catch(() => {});\n } else {\n return { ...errorResult, evalRun, workspacePath, beforeEachOutput, afterEachOutput };\n }\n }\n return { ...errorResult, evalRun, beforeEachOutput, afterEachOutput };\n }\n}\n\nasync function runEvalCaseWithTrials(\n options: RunEvalCaseOptions,\n trialsConfig: TrialsConfig,\n): Promise<EvaluationResult> {\n const trialResults: TrialResult[] = [];\n const allResults: EvaluationResult[] = [];\n let cumulativeCost = 0;\n let costLimited = false;\n let costWarningEmitted = false;\n\n for (let attempt = 0; attempt < trialsConfig.count; attempt++) {\n // For intermediate trials, force workspace cleanup.\n // We don't know the declared count's last index because early exit may occur,\n // so treat the current trial as \"last\" only if it's the final declared iteration.\n // On early exit, the actual last trial gets intermediate cleanup — acceptable since\n // the passing trial's workspace is less important to preserve.\n const isLastDeclaredTrial = attempt === trialsConfig.count - 1;\n const trialOptions: RunEvalCaseOptions = {\n ...options,\n // Disable cache for individual trials (each should be a fresh invocation)\n useCache: false,\n // Force cleanup for intermediate trials\n cleanupWorkspaces: isLastDeclaredTrial ? options.cleanupWorkspaces : true,\n keepWorkspaces: isLastDeclaredTrial ? options.keepWorkspaces : false,\n retainOnSuccess: isLastDeclaredTrial ? options.retainOnSuccess : 'cleanup',\n retainOnFailure: isLastDeclaredTrial ? options.retainOnFailure : 'cleanup',\n };\n\n const result = await runEvalCase(trialOptions);\n allResults.push(result);\n\n // Extract cost from trace summary if available\n const trialCost = result.costUsd;\n\n const trialVerdict = scoreToVerdict(result.score);\n const trial: TrialResult = {\n attempt,\n score: result.score,\n verdict: trialVerdict,\n scores: result.scores,\n error: result.error,\n costUsd: trialCost,\n executionStatus: result.executionStatus,\n failureStage: result.failureStage,\n failureReasonCode: result.failureReasonCode,\n };\n trialResults.push(trial);\n\n // Track cumulative cost\n if (trialCost !== undefined) {\n cumulativeCost += trialCost;\n } else if (trialsConfig.costLimitUsd && !costWarningEmitted) {\n console.warn(\n 'Warning: cost_limit_usd is set but provider does not report cost. All trials will run.',\n );\n costWarningEmitted = true;\n }\n\n // Check cost limit\n if (trialsConfig.costLimitUsd && cumulativeCost >= trialsConfig.costLimitUsd) {\n costLimited = true;\n break;\n }\n\n // pass_at_k early exit: short-circuit after first passing trial\n if (trialsConfig.strategy === 'pass_at_k' && trialVerdict === 'pass') {\n break;\n }\n }\n\n // Aggregate trial results\n const { score, aggregation } = aggregateTrials(trialResults, trialsConfig);\n\n // Use the best-scoring trial's EvaluationResult for metadata (assertions,\n // answer) so that the result's metadata corresponds to the aggregated score.\n const bestTrialIndex = trialResults.reduce(\n (bestIdx, t, idx) => (t.score > trialResults[bestIdx].score ? idx : bestIdx),\n 0,\n );\n const baseResult = allResults[bestTrialIndex];\n\n // Determine aggregate executionStatus from trial results:\n // - If ANY trial succeeded → ok\n // - If ALL trials had execution_error → execution_error\n // - Otherwise → quality_failure\n const hasOk = trialResults.some((t) => t.executionStatus === 'ok');\n const allExecutionError =\n trialResults.length > 0 && trialResults.every((t) => t.executionStatus === 'execution_error');\n const aggregateExecutionStatus: ExecutionStatus = hasOk\n ? 'ok'\n : allExecutionError\n ? 'execution_error'\n : 'quality_failure';\n\n // When the aggregate status differs from baseResult, clear failure fields that no longer apply\n const aggregateFailureStage =\n aggregateExecutionStatus === 'ok' ? undefined : baseResult.failureStage;\n const aggregateFailureReasonCode =\n aggregateExecutionStatus === 'ok' ? undefined : baseResult.failureReasonCode;\n const aggregateExecutionError =\n aggregateExecutionStatus === 'execution_error' ? baseResult.executionError : undefined;\n\n return {\n ...baseResult,\n score,\n trials: trialResults,\n aggregation,\n costLimited: costLimited || undefined,\n executionStatus: aggregateExecutionStatus,\n failureStage: aggregateFailureStage,\n failureReasonCode: aggregateFailureReasonCode,\n executionError: aggregateExecutionError,\n };\n}\n\nasync function evaluateCandidate(options: {\n readonly evalCase: EvalTest;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluators: Partial<Record<string, Grader>> & { readonly 'llm-grader': Grader };\n readonly typeRegistry: import('./registry/grader-registry.js').GraderRegistry;\n readonly promptInputs: PromptInputs;\n readonly nowFn: () => Date;\n readonly attempt: number;\n readonly graderProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly output?: readonly Message[];\n readonly trace?: TraceSummary;\n readonly costUsd?: number;\n readonly durationMs?: number;\n readonly tokenUsage?: TokenUsage;\n readonly startTime?: string;\n readonly endTime?: string;\n readonly targetResolver?: (name: string) => Provider | undefined;\n readonly availableTargets?: readonly string[];\n readonly fileChanges?: string;\n readonly toolCalls?: string;\n readonly workspacePath?: string;\n readonly dockerConfig?: import('./types.js').DockerWorkspaceConfig;\n readonly verbose?: boolean;\n readonly threshold?: number;\n readonly dependencyResults?: Readonly<Record<string, import('./types.js').DependencyResult>>;\n}): Promise<EvaluationResult> {\n const {\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n typeRegistry,\n promptInputs,\n nowFn,\n attempt,\n graderProvider,\n agentTimeoutMs,\n output,\n trace,\n costUsd,\n durationMs,\n tokenUsage,\n startTime,\n endTime,\n targetResolver,\n availableTargets,\n fileChanges,\n toolCalls,\n workspacePath,\n dockerConfig,\n threshold: evalThreshold,\n dependencyResults,\n } = options;\n\n const gradeTimestamp = nowFn();\n const { score, scores } = await runEvaluatorsForCase({\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n typeRegistry,\n attempt,\n promptInputs,\n now: gradeTimestamp,\n graderProvider,\n agentTimeoutMs,\n output,\n trace,\n costUsd,\n durationMs,\n tokenUsage,\n startTime,\n endTime,\n targetResolver,\n availableTargets,\n fileChanges,\n toolCalls,\n workspacePath,\n dockerConfig,\n threshold: evalThreshold,\n dependencyResults,\n });\n\n const completedAt = nowFn();\n\n let agentRequest: JsonObject | undefined;\n let lmRequest: JsonObject | undefined;\n\n if (isAgentProvider(provider)) {\n agentRequest = {\n ...(options.verbose ? { input: promptInputs.question } : {}),\n } as JsonObject;\n } else {\n if (promptInputs.chatPrompt) {\n lmRequest = {\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\n } as JsonObject;\n } else {\n lmRequest = {\n question: promptInputs.question,\n } as JsonObject;\n }\n }\n\n const evaluatorRequest = scores ? undefined : score.graderRawRequest;\n // Only include agent request if it has content (verbose mode adds the input field)\n const effectiveAgentRequest =\n agentRequest && Object.keys(agentRequest).length > 0 ? agentRequest : undefined;\n const requests =\n effectiveAgentRequest || lmRequest || evaluatorRequest\n ? {\n ...(effectiveAgentRequest ? { agent: effectiveAgentRequest } : {}),\n ...(lmRequest ? { lm: lmRequest } : {}),\n ...(evaluatorRequest ? { evaluator: evaluatorRequest } : {}),\n }\n : undefined;\n const input = buildResultInput(promptInputs);\n\n return {\n timestamp: completedAt.toISOString(),\n testId: evalCase.id,\n suite: evalCase.suite,\n category: evalCase.category,\n conversationId: evalCase.conversation_id,\n score: score.score,\n assertions: score.assertions,\n target: target.name,\n tokenUsage,\n costUsd,\n durationMs,\n startTime,\n endTime,\n requests,\n input,\n output: output ?? [{ role: 'assistant' as const, content: candidate }],\n scores: scores,\n trace: trace,\n fileChanges,\n executionStatus: classifyQualityStatus(score.score, evalThreshold),\n };\n}\n\nasync function runEvaluatorsForCase(options: {\n readonly evalCase: EvalTest;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluators: Partial<Record<string, Grader>> & { readonly 'llm-grader': Grader };\n readonly typeRegistry: import('./registry/grader-registry.js').GraderRegistry;\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly graderProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly output?: readonly Message[];\n readonly trace?: TraceSummary;\n readonly costUsd?: number;\n readonly durationMs?: number;\n readonly tokenUsage?: TokenUsage;\n readonly startTime?: string;\n readonly endTime?: string;\n readonly targetResolver?: (name: string) => Provider | undefined;\n readonly availableTargets?: readonly string[];\n readonly fileChanges?: string;\n readonly toolCalls?: string;\n readonly workspacePath?: string;\n readonly dockerConfig?: import('./types.js').DockerWorkspaceConfig;\n readonly threshold?: number;\n readonly dependencyResults?: Readonly<Record<string, import('./types.js').DependencyResult>>;\n}): Promise<{ score: EvaluationScore; scores?: GraderResult[] }> {\n const {\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n typeRegistry,\n attempt,\n promptInputs,\n now,\n graderProvider,\n agentTimeoutMs,\n output,\n trace,\n costUsd,\n durationMs,\n tokenUsage,\n startTime,\n endTime,\n targetResolver,\n availableTargets,\n fileChanges,\n toolCalls,\n workspacePath,\n dockerConfig,\n threshold,\n dependencyResults,\n } = options;\n\n if (evalCase.assertions && evalCase.assertions.length > 0) {\n return runEvaluatorList({\n evalCase,\n evaluators: evalCase.assertions,\n candidate,\n target,\n provider,\n evaluatorRegistry: evaluators,\n typeRegistry,\n attempt,\n promptInputs,\n now,\n graderProvider,\n agentTimeoutMs,\n output,\n trace,\n costUsd,\n durationMs,\n tokenUsage,\n startTime,\n endTime,\n targetResolver,\n availableTargets,\n fileChanges,\n toolCalls,\n workspacePath,\n dockerConfig,\n threshold,\n dependencyResults,\n });\n }\n\n const evaluatorKind = evalCase.evaluator ?? 'llm-grader';\n const activeEvaluator = evaluators[evaluatorKind] ?? evaluators['llm-grader'];\n if (!activeEvaluator) {\n throw new Error(`No evaluator registered for kind '${evaluatorKind}'`);\n }\n const implicitEvaluator =\n evaluatorKind === 'llm-grader' && !evalCase.assertions\n ? buildImplicitLlmGraderConfig(evalCase)\n : undefined;\n\n const score = await activeEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n graderProvider,\n output,\n trace,\n tokenUsage,\n costUsd,\n durationMs,\n startTime,\n endTime,\n targetResolver,\n availableTargets,\n fileChanges,\n toolCalls,\n workspacePath,\n dockerConfig,\n dependencyResults,\n ...(implicitEvaluator ? { evaluator: implicitEvaluator } : {}),\n });\n\n return { score };\n}\n\nfunction buildImplicitLlmGraderConfig(evalCase: EvalTest): LlmGraderConfig | undefined {\n if (!evalCase.preprocessors || evalCase.preprocessors.length === 0) {\n return undefined;\n }\n\n return {\n name: 'llm-grader',\n type: 'llm-grader',\n preprocessors: evalCase.preprocessors,\n };\n}\n\nasync function runEvaluatorList(options: {\n readonly evalCase: EvalTest;\n readonly evaluators: readonly GraderConfig[];\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluatorRegistry: Partial<Record<string, Grader>> & {\n readonly 'llm-grader': Grader;\n };\n readonly typeRegistry: import('./registry/grader-registry.js').GraderRegistry;\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly graderProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly output?: readonly Message[];\n readonly trace?: TraceSummary;\n readonly costUsd?: number;\n readonly durationMs?: number;\n readonly tokenUsage?: TokenUsage;\n readonly startTime?: string;\n readonly endTime?: string;\n readonly targetResolver?: (name: string) => Provider | undefined;\n readonly availableTargets?: readonly string[];\n readonly fileChanges?: string;\n readonly toolCalls?: string;\n readonly workspacePath?: string;\n readonly dockerConfig?: import('./types.js').DockerWorkspaceConfig;\n readonly threshold?: number;\n readonly dependencyResults?: Readonly<Record<string, import('./types.js').DependencyResult>>;\n}): Promise<{ score: EvaluationScore; scores: GraderResult[] }> {\n const {\n evalCase,\n evaluators,\n candidate,\n target,\n provider,\n evaluatorRegistry,\n typeRegistry,\n attempt,\n promptInputs,\n now,\n graderProvider,\n agentTimeoutMs,\n output,\n trace,\n costUsd,\n durationMs,\n tokenUsage,\n startTime,\n endTime,\n targetResolver,\n availableTargets,\n fileChanges,\n toolCalls,\n workspacePath,\n dockerConfig,\n dependencyResults,\n } = options;\n\n const scored: Array<{\n readonly score: EvaluationScore;\n readonly name: string;\n readonly type: string;\n readonly weight?: number;\n readonly required?: boolean | number;\n readonly min_score?: number;\n }> = [];\n const scores: GraderResult[] = [];\n\n // Build the evaluation context (shared across all evaluators for this case)\n const evalContext: import('./graders/types.js').EvaluationContext = {\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n graderProvider,\n output,\n trace,\n tokenUsage,\n costUsd,\n durationMs,\n startTime,\n endTime,\n targetResolver,\n availableTargets,\n fileChanges,\n toolCalls,\n workspacePath,\n dockerConfig,\n dependencyResults,\n };\n\n // Build the dispatch context for evaluator factories\n const evalFileDir = evalCase.file_paths[0] ? path.dirname(evalCase.file_paths[0]) : process.cwd();\n const dispatchContext: import('./registry/grader-registry.js').GraderDispatchContext = {\n graderProvider,\n targetResolver,\n availableTargets,\n agentTimeoutMs,\n evalFileDir,\n llmGrader: evaluatorRegistry['llm-grader'],\n registry: typeRegistry,\n };\n\n for (const evaluatorConfig of evaluators ?? []) {\n const startedAt = new Date();\n try {\n // Create evaluator instance via registry\n const evaluatorInstance = await typeRegistry.create(evaluatorConfig, dispatchContext);\n const score = await evaluatorInstance.evaluate(evalContext);\n const endedAt = new Date();\n\n const weight = evaluatorConfig.weight ?? 1.0;\n\n scored.push({\n score,\n name: evaluatorConfig.name,\n type: evaluatorConfig.type,\n weight,\n ...(evaluatorConfig.required !== undefined ? { required: evaluatorConfig.required } : {}),\n ...(evaluatorConfig.min_score !== undefined\n ? { min_score: evaluatorConfig.min_score }\n : {}),\n });\n scores.push({\n name: evaluatorConfig.name,\n type: evaluatorConfig.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n assertions: score.assertions,\n input: score.graderRawRequest,\n target: score.graderTarget,\n details: score.details,\n scores: mapChildResults(score.scores),\n tokenUsage: score.tokenUsage,\n durationMs: endedAt.getTime() - startedAt.getTime(),\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n });\n } catch (error) {\n const endedAt = new Date();\n const message = error instanceof Error ? error.message : String(error);\n const fallbackScore: EvaluationScore = {\n score: 0,\n verdict: 'fail',\n assertions: [\n { text: `Grader '${evaluatorConfig.name}' failed: ${message}`, passed: false },\n ],\n expectedAspectCount: 1,\n };\n const weight = evaluatorConfig.weight ?? 1.0;\n scored.push({\n score: fallbackScore,\n name: evaluatorConfig.name ?? 'unknown',\n type: evaluatorConfig.type ?? 'llm-grader',\n weight,\n ...(evaluatorConfig.required !== undefined ? { required: evaluatorConfig.required } : {}),\n ...(evaluatorConfig.min_score !== undefined\n ? { min_score: evaluatorConfig.min_score }\n : {}),\n });\n scores.push({\n name: evaluatorConfig.name ?? 'unknown',\n type: evaluatorConfig.type ?? 'llm-grader',\n score: 0,\n weight,\n verdict: 'fail',\n assertions: [\n {\n text: `Grader '${evaluatorConfig.name ?? 'unknown'}' failed: ${message}`,\n passed: false,\n },\n ],\n durationMs: endedAt.getTime() - startedAt.getTime(),\n startedAt: startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n });\n }\n\n // Apply negation if configured — inverts score and swaps pass/fail verdict\n if (evaluatorConfig.negate === true && scored.length > 0) {\n const lastScoredIdx = scored.length - 1;\n const lastScoresIdx = scores.length - 1;\n const negated = negateScore(scored[lastScoredIdx].score);\n scored[lastScoredIdx] = { ...scored[lastScoredIdx], score: negated };\n if (lastScoresIdx >= 0) {\n scores[lastScoresIdx] = {\n ...scores[lastScoresIdx],\n score: negated.score,\n verdict: negated.verdict,\n assertions: [...negated.assertions],\n };\n }\n }\n }\n\n // Required gate: if any evaluator with `required` flag fails its threshold, aggregate becomes 0\n const effectiveThreshold = options.threshold ?? DEFAULT_THRESHOLD;\n const hasRequiredFailure = scored.some((entry) => {\n if (!entry.required) return false;\n const minScore =\n entry.min_score ?? (typeof entry.required === 'number' ? entry.required : effectiveThreshold);\n return entry.score.score < minScore;\n });\n\n // Exclude skipped evaluators from score aggregation\n const scorable = scored.filter((entry) => entry.score.verdict !== 'skip');\n const aggregateScore = hasRequiredFailure\n ? 0\n : scorable.length > 0\n ? computeWeightedMean(\n scorable.map((entry) => ({ score: entry.score.score, weight: entry.weight })),\n )\n : 0;\n const assertions: AssertionEntry[] = scored.flatMap((entry) => entry.score.assertions);\n const expectedAspectCount = assertions.length || 1;\n\n const score: EvaluationScore = {\n score: aggregateScore,\n verdict: scoreToVerdict(aggregateScore, effectiveThreshold),\n assertions,\n expectedAspectCount,\n };\n\n return { score, scores };\n}\n\nfunction formatFilter(filter: string | readonly string[]): string {\n return typeof filter === 'string' ? filter : filter.join(', ');\n}\n\nfunction matchesFilter(id: string, filter: string | readonly string[]): boolean {\n return typeof filter === 'string'\n ? micromatch.isMatch(id, filter)\n : filter.some((pattern) => micromatch.isMatch(id, pattern));\n}\n\nfunction filterEvalCases(\n evalCases: readonly EvalTest[],\n filter?: string | readonly string[],\n): readonly EvalTest[] {\n if (!filter) {\n return evalCases;\n }\n return evalCases.filter((evalCase) => matchesFilter(evalCase.id, filter));\n}\n\nfunction buildEvaluatorRegistry(\n overrides: Partial<Record<string, Grader>> | undefined,\n resolveGraderProvider: (target: ResolvedTarget) => Promise<Provider | undefined>,\n): Partial<Record<string, Grader>> & { readonly 'llm-grader': Grader } {\n const llmGrader =\n overrides?.['llm-grader'] ??\n new LlmGrader({\n resolveGraderProvider: async (context) => {\n if (context.graderProvider) {\n return context.graderProvider;\n }\n return resolveGraderProvider(context.target);\n },\n });\n\n return {\n ...overrides,\n 'llm-grader': llmGrader,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Conversation mode: turn-by-turn evaluation\n// ---------------------------------------------------------------------------\n\n/**\n * Run a multi-turn conversation evaluation.\n * For each turn: append user message → call provider → grade turn → append LLM response.\n * After all turns, run conversation-level assertions on the full transcript.\n * Final score is aggregated from turn scores + conversation scores.\n */\nasync function runConversationMode(options: {\n readonly evalCase: EvalTest;\n readonly provider: Provider;\n readonly target: ResolvedTarget;\n readonly evaluators: Partial<Record<string, Grader>> & { readonly 'llm-grader': Grader };\n readonly typeRegistry: import('./registry/grader-registry.js').GraderRegistry;\n readonly graderProvider?: Provider;\n readonly promptInputs: PromptInputs;\n readonly nowFn: () => Date;\n readonly signal?: AbortSignal;\n readonly workspacePath?: string;\n readonly caseWorkspaceFile?: string;\n readonly agentTimeoutMs?: number;\n readonly streamCallbacks?: ProviderStreamCallbacks;\n readonly verbose?: boolean;\n readonly threshold?: number;\n readonly targetResolver?: (name: string) => Provider | undefined;\n readonly availableTargets?: readonly string[];\n}): Promise<EvaluationResult> {\n const {\n evalCase,\n provider,\n target,\n evaluators,\n typeRegistry,\n graderProvider,\n promptInputs,\n nowFn,\n signal,\n workspacePath,\n caseWorkspaceFile,\n agentTimeoutMs,\n streamCallbacks,\n verbose,\n threshold,\n targetResolver,\n availableTargets,\n } = options;\n\n // biome-ignore lint/style/noNonNullAssertion: turns is guaranteed by the caller (conversation mode gate)\n const turns = evalCase.turns!;\n const aggregation = evalCase.aggregation ?? 'mean';\n const onTurnFailure = evalCase.on_turn_failure ?? 'continue';\n const windowSize = evalCase.window_size;\n\n // Build initial message history from evalCase.input (system prompt + any context)\n const history: ChatMessage[] = [];\n for (const msg of evalCase.input) {\n const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);\n history.push({ role: msg.role as ChatMessageRole, content });\n }\n\n const turnScores: GraderResult[] = [];\n const allTurnScoreValues: number[] = [];\n let stopped = false;\n const caseStartMs = Date.now();\n\n for (let i = 0; i < turns.length; i++) {\n const turn = turns[i];\n const turnIndex = i + 1;\n\n if (stopped) {\n // Turn skipped due to on_turn_failure: stop\n turnScores.push({\n name: `turn-${turnIndex}`,\n type: 'rubrics' as GraderKind,\n score: 0,\n verdict: 'skip' as EvaluationVerdict,\n assertions: [{ text: 'Skipped due to previous turn failure', passed: false }],\n });\n allTurnScoreValues.push(0);\n continue;\n }\n\n // Append user message to history\n const userContent = typeof turn.input === 'string' ? turn.input : JSON.stringify(turn.input);\n history.push({ role: 'user', content: userContent });\n\n // Build chatPrompt for provider call (with optional window_size)\n const chatPromptForProvider = windowSize\n ? buildWindowedHistory(history, windowSize)\n : [...history];\n\n // Call provider with accumulated history\n let response: ProviderResponse;\n try {\n response = await provider.invoke({\n question: userContent,\n chatPrompt: chatPromptForProvider,\n evalCaseId: `${evalCase.id}/turn-${turnIndex}`,\n signal,\n cwd: workspacePath,\n workspaceFile: caseWorkspaceFile,\n streamCallbacks,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n turnScores.push({\n name: `turn-${turnIndex}`,\n type: 'rubrics' as GraderKind,\n score: 0,\n verdict: 'fail' as EvaluationVerdict,\n assertions: [{ text: `Provider error: ${message}`, passed: false }],\n });\n allTurnScoreValues.push(0);\n if (onTurnFailure === 'stop') stopped = true;\n continue;\n }\n\n // Extract assistant response\n const assistantContent = extractLastAssistantContent(response.output);\n\n // Append actual LLM response (NOT expected_output) to history\n history.push({ role: 'assistant', content: assistantContent });\n\n // Grade this turn\n if (!turn.assertions?.length && !turn.expected_output) {\n // No assertions or expected_output — turn scores 1.0\n turnScores.push({\n name: `turn-${turnIndex}`,\n type: 'rubrics' as GraderKind,\n score: 1.0,\n verdict: 'pass' as EvaluationVerdict,\n assertions: [],\n });\n allTurnScoreValues.push(1.0);\n continue;\n }\n\n // Build assertions for this turn\n const turnAssertions = buildTurnAssertions(turn);\n\n // Create a synthetic EvalTest for this turn's grading\n const turnEvalCase: EvalTest = {\n ...evalCase,\n id: `${evalCase.id}/turn-${turnIndex}`,\n assertions: turnAssertions,\n input: buildTurnGraderInput(history, windowSize),\n expected_output: turn.expected_output\n ? [\n typeof turn.expected_output === 'string'\n ? ({ content: turn.expected_output } as JsonObject)\n : (turn.expected_output as JsonObject),\n ]\n : [],\n // Clear conversation fields to prevent recursion\n mode: undefined,\n turns: undefined,\n };\n\n const turnResult = await evaluateCandidate({\n evalCase: turnEvalCase,\n candidate: assistantContent,\n target,\n provider,\n evaluators,\n typeRegistry,\n promptInputs: {\n question: buildConversationContext(history, windowSize),\n chatPrompt: windowSize ? buildWindowedHistory(history, windowSize) : [...history],\n },\n nowFn,\n attempt: 0,\n graderProvider,\n agentTimeoutMs,\n output: response.output,\n verbose,\n threshold,\n targetResolver,\n availableTargets,\n });\n\n const turnScore = turnResult.score;\n allTurnScoreValues.push(turnScore);\n\n turnScores.push({\n name: `turn-${turnIndex}`,\n type: 'rubrics' as GraderKind,\n score: turnScore,\n verdict: scoreToVerdict(turnScore, threshold ?? DEFAULT_THRESHOLD) as EvaluationVerdict,\n assertions: turnResult.assertions ? [...turnResult.assertions] : [],\n scores: turnResult.scores,\n });\n\n // Check if we should stop on failure\n if (onTurnFailure === 'stop' && turnScore < (threshold ?? DEFAULT_THRESHOLD)) {\n stopped = true;\n }\n }\n\n // Run conversation-level assertions (top-level assertions on full transcript)\n let conversationScores: GraderResult[] = [];\n if (evalCase.assertions?.length) {\n const conversationEvalCase: EvalTest = {\n ...evalCase,\n id: `${evalCase.id}/conversation`,\n input: history.map((m) => ({\n role: m.role as TestMessageRole,\n content: m.content,\n })),\n expected_output: [],\n mode: undefined,\n turns: undefined,\n };\n\n const fullTranscript = history\n .map((m) => {\n const content = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n return `${m.role}: ${content}`;\n })\n .join('\\n\\n');\n\n const conversationResult = await evaluateCandidate({\n evalCase: conversationEvalCase,\n candidate: fullTranscript,\n target,\n provider,\n evaluators,\n typeRegistry,\n promptInputs: {\n question: fullTranscript,\n chatPrompt: [...history],\n },\n nowFn,\n attempt: 0,\n graderProvider,\n agentTimeoutMs,\n verbose,\n threshold,\n targetResolver,\n availableTargets,\n });\n\n conversationScores = [\n {\n name: 'conversation',\n type: 'rubrics' as GraderKind,\n score: conversationResult.score,\n verdict: scoreToVerdict(\n conversationResult.score,\n threshold ?? DEFAULT_THRESHOLD,\n ) as EvaluationVerdict,\n assertions: conversationResult.assertions ? [...conversationResult.assertions] : [],\n scores: conversationResult.scores,\n },\n ];\n }\n\n // Aggregate final score\n const allScoreValues = [...allTurnScoreValues, ...conversationScores.map((s) => s.score)];\n\n const finalScore = aggregateConversationScores(allScoreValues, aggregation);\n const allResultScores = [...turnScores, ...conversationScores];\n\n // Build output as full conversation transcript\n const outputMessages: Message[] = history.map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const flatAssertions: AssertionEntry[] = allResultScores.flatMap((s) => [...s.assertions]);\n const totalDurationMs = Date.now() - caseStartMs;\n\n return {\n timestamp: nowFn().toISOString(),\n testId: evalCase.id,\n suite: evalCase.suite,\n category: evalCase.category,\n score: finalScore,\n assertions: flatAssertions,\n target: target.name,\n output: outputMessages,\n scores: allResultScores,\n executionStatus: classifyQualityStatus(finalScore, threshold ?? DEFAULT_THRESHOLD),\n input: evalCase.input.map((m) => ({\n role: m.role,\n content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n })),\n evalRun: { durationMs: totalDurationMs },\n };\n}\n\n/** Include system messages + last windowSize*2 non-system messages */\nfunction buildWindowedHistory(history: readonly ChatMessage[], windowSize: number): ChatMessage[] {\n const systemMessages = history.filter((m) => m.role === 'system');\n const nonSystem = history.filter((m) => m.role !== 'system');\n const windowed = nonSystem.slice(-windowSize * 2);\n return [...systemMessages, ...windowed];\n}\n\n/** Build a text representation of the conversation for grader context */\nfunction buildConversationContext(history: readonly ChatMessage[], windowSize?: number): string {\n const msgs = windowSize ? buildWindowedHistory(history, windowSize) : history;\n return msgs\n .map((m) => {\n const content = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n return `${m.role}: ${content}`;\n })\n .join('\\n\\n');\n}\n\n/** Build TestMessage[] from history for synthetic EvalTest input */\nfunction buildTurnGraderInput(history: readonly ChatMessage[], windowSize?: number): TestMessage[] {\n const msgs = windowSize ? buildWindowedHistory(history, windowSize) : history;\n return msgs.map((m) => ({\n role: m.role as TestMessageRole,\n content: m.content,\n }));\n}\n\n/**\n * Convert per-turn assertions to GraderConfig[].\n * String assertions are grouped into a single rubrics evaluator.\n * Structured assertions pass through as-is.\n */\nfunction buildTurnAssertions(turn: ConversationTurn): GraderConfig[] {\n if (!turn.assertions?.length) return [];\n\n const stringCriteria: string[] = [];\n const structured: GraderConfig[] = [];\n\n for (const a of turn.assertions) {\n if (typeof a === 'string') {\n stringCriteria.push(a);\n } else {\n structured.push(a);\n }\n }\n\n const result: GraderConfig[] = [];\n\n // Group string assertions into a single llm-grader evaluator with rubrics.\n // Uses llm-grader (not rubrics) because 'rubrics' is a YAML shorthand resolved by\n // the grader-parser — at runtime we always dispatch through 'llm-grader'.\n if (stringCriteria.length > 0) {\n result.push({\n name: 'turn-rubrics',\n type: 'llm-grader' as GraderKind,\n rubrics: stringCriteria.map((text, idx) => ({\n id: `criterion-${idx + 1}`,\n outcome: text,\n weight: 1,\n })),\n } as unknown as GraderConfig);\n }\n\n result.push(...structured);\n return result;\n}\n\n/** Aggregate turn scores using the configured strategy */\nfunction aggregateConversationScores(\n scores: readonly number[],\n aggregation: ConversationAggregation,\n): number {\n if (scores.length === 0) return 1.0;\n switch (aggregation) {\n case 'min':\n return Math.min(...scores);\n case 'max':\n return Math.max(...scores);\n default:\n return scores.reduce((sum, s) => sum + s, 0) / scores.length;\n }\n}\n\nasync function invokeProvider(\n provider: Provider,\n options: {\n readonly evalCase: EvalTest;\n readonly target: ResolvedTarget;\n readonly promptInputs: PromptInputs;\n readonly attempt: number;\n readonly agentTimeoutMs?: number;\n readonly signal?: AbortSignal;\n /** Working directory override (e.g., from eval-level workspace.template) */\n readonly cwd?: string;\n /** VS Code .code-workspace file (resolved from workspace.template) */\n readonly workspaceFile?: string;\n /** When true, AgentV captures file changes — provider should skip forced diff prompt */\n readonly captureFileChanges?: boolean;\n /** Real-time observability callbacks */\n readonly streamCallbacks?: ProviderStreamCallbacks;\n },\n): Promise<ProviderResponse> {\n const {\n evalCase,\n promptInputs,\n attempt,\n agentTimeoutMs,\n signal,\n cwd,\n workspaceFile,\n captureFileChanges,\n streamCallbacks,\n } = options;\n\n const controller = new AbortController();\n const timeout = agentTimeoutMs ? setTimeout(() => controller.abort(), agentTimeoutMs) : undefined;\n\n if (signal) {\n signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n // Extract Braintrust span IDs for trace bridging (Claude provider only)\n const braintrustSpanIds = streamCallbacks?.getActiveSpanIds?.() ?? undefined;\n\n return await provider.invoke({\n question: promptInputs.question,\n systemPrompt: promptInputs.systemMessage,\n chatPrompt: promptInputs.chatPrompt,\n inputFiles: evalCase.file_paths,\n evalCaseId: evalCase.id,\n attempt,\n signal: controller.signal,\n cwd,\n workspaceFile,\n captureFileChanges,\n streamCallbacks,\n braintrustSpanIds: braintrustSpanIds ?? undefined,\n });\n } finally {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n }\n}\n\nfunction buildErrorResult(\n evalCase: EvalTest,\n targetName: string,\n timestamp: Date,\n error: unknown,\n promptInputs: PromptInputs,\n provider: Provider | undefined,\n failureStage: FailureStage,\n failureReasonCode: string,\n verbose?: boolean,\n): EvaluationResult {\n const message = extractErrorMessage(error);\n\n let agentRequest: JsonObject | undefined;\n let lmRequest: JsonObject | undefined;\n\n if (isAgentProvider(provider)) {\n agentRequest = {\n ...(verbose ? { input: promptInputs.question } : {}),\n error: message,\n } as JsonObject;\n } else {\n if (promptInputs.chatPrompt) {\n lmRequest = {\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\n error: message,\n } as JsonObject;\n } else {\n lmRequest = {\n question: promptInputs.question,\n error: message,\n } as JsonObject;\n }\n }\n\n const requests =\n agentRequest || lmRequest\n ? {\n ...(agentRequest ? { agent: agentRequest } : {}),\n ...(lmRequest ? { lm: lmRequest } : {}),\n }\n : undefined;\n const input = buildResultInput(promptInputs);\n\n return {\n timestamp: timestamp.toISOString(),\n testId: evalCase.id,\n suite: evalCase.suite,\n category: evalCase.category,\n conversationId: evalCase.conversation_id,\n score: 0,\n assertions: [{ text: `Error: ${message}`, passed: false }],\n target: targetName,\n requests,\n input,\n output: [{ role: 'assistant' as const, content: `Error occurred: ${message}` }],\n error: message,\n executionStatus: 'execution_error',\n failureStage,\n failureReasonCode,\n executionError: { message, stage: failureStage },\n } satisfies EvaluationResult;\n}\n\nfunction extractProviderError(response: ProviderResponse): string | undefined {\n const raw = response.raw;\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return undefined;\n }\n\n const error = (raw as Record<string, unknown>).error;\n if (typeof error !== 'string') {\n return undefined;\n }\n\n const trimmed = error.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction createCacheKey(\n provider: Provider,\n target: ResolvedTarget,\n evalCase: EvalTest,\n promptInputs: PromptInputs,\n): string {\n const hash = createHash('sha256');\n hash.update(provider.id);\n hash.update(target.name);\n hash.update(evalCase.id);\n hash.update(promptInputs.question);\n hash.update(promptInputs.systemMessage ?? '');\n if (promptInputs.chatPrompt) {\n hash.update(JSON.stringify(promptInputs.chatPrompt));\n }\n return hash.digest('hex');\n}\n\nfunction buildResultInput(promptInputs: PromptInputs): EvaluationResult['input'] {\n if (promptInputs.chatPrompt) {\n return promptInputs.chatPrompt.map((message) => ({\n role: message.role,\n ...(message.name ? { name: message.name } : {}),\n content: message.content,\n }));\n }\n return [{ role: 'user' as const, content: promptInputs.question }];\n}\n\n/**\n * Sum token usage across all grader results (including nested children).\n * Returns undefined when no evaluator reported token usage.\n */\nfunction aggregateEvaluatorTokenUsage(scores?: readonly GraderResult[]): TokenUsage | undefined {\n if (!scores || scores.length === 0) return undefined;\n\n let hasAny = false;\n let input = 0;\n let output = 0;\n let reasoning = 0;\n let cached = 0;\n let hasReasoning = false;\n let hasCached = false;\n\n const visit = (items: readonly GraderResult[]): void => {\n for (const item of items) {\n if (item.tokenUsage) {\n hasAny = true;\n input += item.tokenUsage.input;\n output += item.tokenUsage.output;\n if (item.tokenUsage.reasoning != null) {\n hasReasoning = true;\n reasoning += item.tokenUsage.reasoning;\n }\n if (item.tokenUsage.cached != null) {\n hasCached = true;\n cached += item.tokenUsage.cached;\n }\n }\n if (item.scores) {\n visit(item.scores);\n }\n }\n };\n\n visit(scores);\n if (!hasAny) return undefined;\n\n return {\n input,\n output,\n ...(hasReasoning ? { reasoning } : {}),\n ...(hasCached ? { cached } : {}),\n };\n}\n\n/**\n * Extract a human-readable message from an error of any shape.\n *\n * Handles three cases:\n * 1. Standard Error instances → error.message\n * 2. Plain objects with a `message` property (e.g. JSON-RPC error objects\n * rejected by @agentclientprotocol/sdk) → obj.message\n * 3. Everything else → String(error)\n */\nfunction extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (error !== null && typeof error === 'object') {\n const obj = error as Record<string, unknown>;\n const parts: string[] = [];\n if (typeof obj.message === 'string' && obj.message) {\n parts.push(obj.message);\n }\n if (typeof obj.code === 'number') {\n parts.push(`(code ${obj.code})`);\n }\n if (parts.length > 0) {\n return parts.join(' ');\n }\n // Fallback: serialize the object so we never return \"[object Object]\"\n try {\n return JSON.stringify(error);\n } catch {\n // circular reference or other serialization failure\n }\n }\n return String(error);\n}\n\n/** Exponential backoff: 2^attempt * 1000ms (1s, 2s, 4s, …), capped at 30s. */\nfunction retryBackoffMs(attempt: number): number {\n return Math.min(2 ** attempt * 1000, 30_000);\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer);\n resolve();\n },\n { once: true },\n );\n });\n}\n\nfunction mapChildResults(\n children?: readonly ChildGraderResult[],\n): readonly GraderResult[] | undefined {\n if (!children || children.length === 0) {\n return undefined;\n }\n\n return children.map((child) => ({\n name: child.name,\n type: child.type as GraderKind,\n score: child.score,\n weight: child.weight,\n verdict: child.verdict,\n assertions: child.assertions,\n input: child.graderRawRequest,\n scores: mapChildResults(child.scores),\n details: child.details,\n tokenUsage: child.tokenUsage,\n }));\n}\n\n/**\n * Compute weighted mean of scores, defaulting missing weights to 1.0.\n * Returns 0 if total weight is 0.\n */\nfunction computeWeightedMean(\n entries: readonly { readonly score: number; readonly weight?: number }[],\n): number {\n let totalWeight = 0;\n let weightedSum = 0;\n\n for (const entry of entries) {\n const weight = entry.weight ?? 1.0;\n totalWeight += weight;\n weightedSum += entry.score * weight;\n }\n\n return totalWeight > 0 ? weightedSum / totalWeight : 0;\n}\n\n/**\n * Run preflight environment checks for workspace.env config.\n * Fails fast if any required command or Python module is missing.\n * Called once before before_all hooks, so long evals abort immediately on missing deps.\n */\nasync function runPreflightChecks(\n env: import('./types.js').WorkspaceEnvConfig,\n cwd: string | undefined,\n log: (msg: string) => void,\n): Promise<void> {\n const execFileAsync = promisify(execFile);\n const missing: string[] = [];\n\n for (const cmd of env.required_commands ?? []) {\n log(`preflight: checking command \"${cmd}\"`);\n try {\n if (process.platform === 'win32') {\n await execFileAsync('where', [cmd], { cwd });\n } else {\n await execFileAsync('sh', ['-c', `command -v ${cmd}`], { cwd });\n }\n } catch {\n missing.push(`command: ${cmd}`);\n }\n }\n\n for (const mod of env.required_python_modules ?? []) {\n log(`preflight: checking Python module \"${mod}\"`);\n try {\n await execFileAsync('python3', ['-c', `import ${mod}`], { cwd });\n } catch {\n missing.push(`python module: ${mod}`);\n }\n }\n\n if (missing.length > 0) {\n throw new Error(\n `Preflight checks failed — missing dependencies:\\n${missing.map((m) => ` • ${m}`).join('\\n')}\\n\\nInstall the missing dependencies before running this eval.`,\n );\n }\n}\n","/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\n\t\t// Clean up tail reference when queue becomes empty\n\t\tif (!this.#head) {\n\t\t\tthis.#tail = undefined;\n\t\t}\n\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t\t// Since `pendingCount` has been decreased by one, increase `activeCount` by one.\n\t\t\tactiveCount++;\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue `internalResolve` instead of the `run` function\n\t\t// to preserve asynchronous context.\n\t\tnew Promise(internalResolve => {\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(\n\t\t\trun.bind(undefined, function_, resolve, arguments_),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// after the `internalResolve` function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency) {\n\t\t\t\tresumeNext();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nexport function limitFunction(function_, option) {\n\tconst {concurrency} = option;\n\tconst limit = pLimit(concurrency);\n\n\treturn (...arguments_) => limit(() => function_(...arguments_));\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n","import os from 'node:os';\nimport path from 'node:path';\n\nlet logged = false;\n\n/**\n * The default config directory (~/.agentv). Always resolves to the user's home\n * directory regardless of AGENTV_HOME. Used for lightweight, machine-local files\n * like version-check.json, last-config.json, and benchmarks.yaml.\n */\nexport function getAgentvConfigDir(): string {\n return path.join(os.homedir(), '.agentv');\n}\n\n/**\n * The data root for heavy/large artifacts (workspaces, workspace-pool, subagents,\n * trace-state, cache, deps). Respects AGENTV_HOME override so users can relocate\n * bulky data to a different drive. Falls back to ~/.agentv when unset.\n */\nexport function getAgentvHome(): string {\n const envHome = process.env.AGENTV_HOME;\n if (envHome && envHome !== 'undefined') {\n if (!logged) {\n logged = true;\n console.warn(`Using AGENTV_HOME: ${envHome}`);\n }\n return envHome;\n }\n return path.join(os.homedir(), '.agentv');\n}\n\nexport function getWorkspacesRoot(): string {\n return path.join(getAgentvHome(), 'workspaces');\n}\n\nexport function getSubagentsRoot(): string {\n return path.join(getAgentvHome(), 'subagents');\n}\n\nexport function getTraceStateRoot(): string {\n return path.join(getAgentvHome(), 'trace-state');\n}\n\nexport function getWorkspacePoolRoot(): string {\n return path.join(getAgentvHome(), 'workspace-pool');\n}\n\n/** @internal Reset logged flag for testing. */\nexport function _resetLoggedForTesting(): void {\n logged = false;\n}\n","import { mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nimport { execFileWithStdin, execShellWithStdin } from '../../runtime/exec.js';\nimport {\n DEFAULT_MAX_CALLS,\n type TargetProxyUsageMetadata,\n createTargetProxy,\n} from '../../runtime/target-proxy.js';\nimport { toSnakeCaseDeep } from '../case-conversion.js';\nimport { type ContentImage, isContentArray } from '../content.js';\nimport type { AssertionEntry, JsonObject, TargetAccessConfig } from '../types.js';\nimport { getRepoCheckoutTargets } from '../workspace/repo-checkout.js';\nimport { clampScore, isNonEmptyString, parseJsonSafe, scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Grader } from './types.js';\n\n/** Threshold in bytes above which output is written to a temp file instead of inlined. */\nconst FILE_BACKED_OUTPUT_THRESHOLD = 50_000;\n\n/** Regex matching `data:<mediaType>;base64,<data>` URIs. */\nconst DATA_URI_RE = /^data:([^;]+);base64,(.+)$/s;\n\n/**\n * Convert ContentImage blocks in message arrays for code grader consumption.\n *\n * - Data URI images (`data:image/png;base64,...`) → decoded, written to temp file, replaced with file path.\n * - Non-URI images (already a path or URL) → `source` carried through as `path`.\n * - ContentText, ContentFile blocks → passed through unchanged.\n * - Messages with plain string content → passed through unchanged.\n *\n * Returns the original array when no image blocks exist (zero-copy fast path).\n */\nexport async function materializeContentForGrader(\n messages: readonly Record<string, unknown>[] | null | undefined,\n getWorkDir: () => Promise<string>,\n): Promise<readonly Record<string, unknown>[] | null> {\n if (!messages || messages.length === 0) return messages ?? null;\n\n // Fast path: skip if no image blocks exist\n let hasAnyImage = false;\n for (const msg of messages) {\n if (isContentArray(msg.content)) {\n for (const block of msg.content) {\n if (block.type === 'image') {\n hasAnyImage = true;\n break;\n }\n }\n }\n if (hasAnyImage) break;\n }\n if (!hasAnyImage) return messages;\n\n let counter = 0;\n const result: Record<string, unknown>[] = [];\n\n for (const msg of messages) {\n if (!isContentArray(msg.content)) {\n result.push(msg);\n continue;\n }\n\n if (!msg.content.some((b) => b.type === 'image')) {\n result.push(msg);\n continue;\n }\n\n const blocks: Record<string, unknown>[] = [];\n for (const block of msg.content) {\n if (block.type !== 'image') {\n blocks.push({ ...block });\n continue;\n }\n\n const img = block as ContentImage;\n const match = DATA_URI_RE.exec(img.source);\n\n if (match) {\n const [, mediaType, base64Data] = match;\n const ext = mediaType.split('/')[1] === 'jpeg' ? 'jpg' : (mediaType.split('/')[1] ?? 'bin');\n const dir = await getWorkDir();\n const filePath = join(dir, `img-${counter++}.${ext}`);\n await writeFile(filePath, Buffer.from(base64Data, 'base64'));\n blocks.push({ type: 'image', media_type: img.media_type, path: filePath });\n } else {\n // Already a path or URL → carry through as path\n blocks.push({ type: 'image', media_type: img.media_type, path: img.source });\n }\n }\n\n result.push({ ...msg, content: blocks });\n }\n\n return result;\n}\n\nexport interface CodeGraderOptions {\n readonly command: readonly string[];\n /** @deprecated Use `command` instead */\n readonly script?: readonly string[];\n readonly cwd?: string;\n readonly agentTimeoutMs?: number;\n /** Pass-through configuration from YAML (any unrecognized properties) */\n readonly config?: Record<string, unknown>;\n /** Target access config - when present, enables target invocation */\n readonly target?: TargetAccessConfig;\n}\n\nexport class CodeGrader implements Grader {\n readonly kind = 'code-grader';\n\n private readonly command: readonly string[];\n private readonly cwd?: string;\n private readonly agentTimeoutMs?: number;\n private readonly config?: Record<string, unknown>;\n private readonly target?: TargetAccessConfig;\n\n constructor(options: CodeGraderOptions) {\n this.command = options.command ?? options.script ?? [];\n this.cwd = options.cwd;\n this.agentTimeoutMs = options.agentTimeoutMs;\n this.config = options.config;\n this.target = options.target;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n // Lazy temp dir for materialized image files\n let imageTmpDir: string | undefined;\n const getImageDir = async () => {\n if (!imageTmpDir) {\n imageTmpDir = await mkdtemp(join(tmpdir(), 'agentv-img-'));\n }\n return imageTmpDir;\n };\n\n // Materialize multimodal content (data URIs → temp files, source → path)\n const materializedOutput = await materializeContentForGrader(\n context.output as readonly Record<string, unknown>[] | undefined,\n getImageDir,\n );\n\n // Determine whether to use file-backed output for large payloads\n let outputForPayload: readonly Record<string, unknown>[] | null = materializedOutput;\n let outputPath: string | undefined;\n\n if (outputForPayload) {\n const serialized = JSON.stringify(outputForPayload);\n if (serialized.length > FILE_BACKED_OUTPUT_THRESHOLD) {\n const tmpDir = await mkdtemp(join(tmpdir(), 'agentv-grader-'));\n outputPath = join(tmpDir, 'output.json');\n await writeFile(outputPath, serialized);\n outputForPayload = null;\n }\n }\n\n // Build payload (camelCase internally, converted to snake_case for graders)\n const payload = {\n criteria: context.evalCase.criteria,\n expectedOutput: await materializeContentForGrader(\n context.evalCase.expected_output as readonly Record<string, unknown>[],\n getImageDir,\n ),\n output: outputForPayload,\n outputPath,\n inputFiles: context.evalCase.file_paths,\n input: await materializeContentForGrader(\n context.evalCase.input as readonly Record<string, unknown>[],\n getImageDir,\n ),\n trace: context.trace ?? null,\n tokenUsage: context.tokenUsage ?? null,\n costUsd: context.costUsd ?? null,\n durationMs: context.durationMs ?? null,\n startTime: context.startTime ?? null,\n endTime: context.endTime ?? null,\n fileChanges: context.fileChanges ?? null,\n workspacePath: context.workspacePath ?? null,\n config: this.config ?? null,\n };\n\n const inputPayload = JSON.stringify(toSnakeCaseDeep(payload), null, 2);\n\n // Set up target proxy if configured and grader provider is available\n let proxyEnv: Record<string, string> | undefined;\n let proxyShutdown: (() => Promise<void>) | undefined;\n let getProxyUsage: (() => TargetProxyUsageMetadata) | undefined;\n\n if (this.target !== undefined && context.judgeProvider) {\n const maxCalls = this.target.max_calls ?? DEFAULT_MAX_CALLS;\n const proxy = await createTargetProxy({\n defaultProvider: context.judgeProvider,\n targetResolver: context.targetResolver,\n availableTargets: context.availableTargets,\n maxCalls,\n });\n proxyEnv = {\n AGENTV_TARGET_PROXY_URL: proxy.url,\n AGENTV_TARGET_PROXY_TOKEN: proxy.token,\n };\n proxyShutdown = proxy.shutdown;\n getProxyUsage = proxy.getUsageMetadata;\n }\n\n // Build workspace env if workspace path is available\n const workspaceEnv = context.workspacePath\n ? { AGENTV_WORKSPACE_PATH: context.workspacePath }\n : undefined;\n\n // Merge proxy and workspace env vars\n const env = proxyEnv || workspaceEnv ? { ...proxyEnv, ...workspaceEnv } : undefined;\n\n try {\n let stdout: string;\n let exitCode = 0;\n let execStderr = '';\n if (context.dockerConfig) {\n // Docker execution mode: run grader inside a container\n const { DockerWorkspaceProvider } = await import('../workspace/docker-workspace.js');\n const dockerProvider = new DockerWorkspaceProvider(context.dockerConfig);\n const result = await dockerProvider.runGraderInContainer({\n command: [...this.command],\n stdin: inputPayload,\n repoCheckouts: getRepoCheckoutTargets(context.evalCase.workspace?.repos),\n });\n exitCode = result.exitCode;\n stdout = result.stdout.trim();\n execStderr = result.stderr;\n } else {\n const result = await runScriptRaw(\n this.command,\n inputPayload,\n this.agentTimeoutMs,\n this.cwd,\n env,\n );\n exitCode = result.exitCode;\n stdout = result.stdout.trim();\n execStderr = result.stderr;\n }\n // Non-zero exit with JSON stdout, or with stderr output, is treated as an error\n // (script signaled failure through the protocol or wrote an error message).\n // Non-zero exit with plain stdout and no stderr uses the exit-code convention —\n // score 0 (fail), stdout becomes the assertion text.\n const looksLikeJson = stdout.startsWith('{') || stdout.startsWith('[');\n const hasStderr = execStderr.trim().length > 0;\n if (exitCode !== 0 && (looksLikeJson || hasStderr)) {\n const trimmedErr = formatStderr(execStderr);\n throw new Error(\n trimmedErr.length > 0\n ? `Code evaluator exited with code ${exitCode}: ${trimmedErr}`\n : `Code evaluator exited with code ${exitCode}`,\n );\n }\n const rawParsed = parseJsonSafe(stdout);\n // Only treat stdout as the JSON protocol if it parsed as a plain object.\n // Bare JSON scalars (numbers, booleans, strings) fall through to the plain-text path.\n const parsed =\n rawParsed != null && typeof rawParsed === 'object' && !Array.isArray(rawParsed)\n ? rawParsed\n : undefined;\n // Plain-text fallback: exit code is pass/fail, stdout is the assertion text.\n // For numeric scores or multi-aspect results, use the JSON protocol instead.\n const passed = exitCode === 0;\n const assertions: AssertionEntry[] =\n parsed != null && Array.isArray(parsed?.assertions)\n ? parsed.assertions\n .filter(\n (a: unknown): a is { text: string; passed: boolean; evidence?: string } =>\n typeof a === 'object' &&\n a !== null &&\n typeof (a as Record<string, unknown>).text === 'string',\n )\n .map((a) => ({\n text: String(a.text),\n passed: Boolean(a.passed),\n ...(typeof a.evidence === 'string' ? { evidence: a.evidence } : {}),\n }))\n : parsed == null\n ? [{ text: stdout.trim() || (passed ? 'exit 0' : `exit ${exitCode}`), passed }]\n : [];\n // When the script omits `score` but returns `assertions`, derive score as passing/total.\n const score =\n parsed != null\n ? clampScore(\n typeof parsed.score === 'number'\n ? parsed.score\n : assertions.length > 0\n ? assertions.filter((a) => a.passed).length / assertions.length\n : 0,\n )\n : passed\n ? 1\n : 0;\n // Capture optional structured details from code judge output\n const details =\n parsed?.details && typeof parsed.details === 'object' && !Array.isArray(parsed.details)\n ? (parsed.details as JsonObject)\n : undefined;\n\n // Build evaluator raw request with proxy metadata if used\n const proxyUsage = getProxyUsage?.();\n const graderRawRequest: JsonObject = {\n command: this.command,\n ...(this.cwd ? { cwd: this.cwd } : {}),\n ...(proxyUsage\n ? {\n target_proxy: {\n call_count: proxyUsage.callCount,\n max_calls: proxyUsage.maxCalls,\n },\n }\n : {}),\n };\n\n return {\n score,\n verdict: scoreToVerdict(score),\n assertions,\n expectedAspectCount: assertions.length || 1,\n graderRawRequest,\n ...(details ? { details } : {}),\n tokenUsage: proxyUsage?.tokenUsage,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const proxyUsage = getProxyUsage?.();\n return {\n score: 0,\n verdict: 'fail',\n assertions: [{ text: `Code evaluator failed: ${message}`, passed: false }],\n expectedAspectCount: 1,\n graderRawRequest: {\n command: this.command,\n ...(this.cwd ? { cwd: this.cwd } : {}),\n ...(proxyUsage\n ? {\n target_proxy: {\n call_count: proxyUsage.callCount,\n max_calls: proxyUsage.maxCalls,\n },\n }\n : {}),\n error: message,\n },\n tokenUsage: proxyUsage?.tokenUsage,\n };\n } finally {\n // Always shut down the proxy when done\n if (proxyShutdown) {\n await proxyShutdown();\n }\n // Clean up temp file for file-backed output\n if (outputPath) {\n await rm(dirname(outputPath), { recursive: true, force: true }).catch(() => {});\n }\n // Clean up temp dir for materialized images\n if (imageTmpDir) {\n await rm(imageTmpDir, { recursive: true, force: true }).catch(() => {});\n }\n }\n }\n}\n\n/** Run a script and return raw stdout/stderr/exitCode without throwing. */\nasync function runScriptRaw(\n scriptPath: readonly string[] | string,\n input: string,\n agentTimeoutMs?: number,\n cwd?: string,\n env?: Record<string, string>,\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n return typeof scriptPath === 'string'\n ? execShellWithStdin(scriptPath, input, { cwd, timeoutMs: agentTimeoutMs, env })\n : execFileWithStdin(scriptPath, input, { cwd, timeoutMs: agentTimeoutMs, env });\n}\n\nexport async function executeScript(\n scriptPath: readonly string[] | string,\n input: string,\n agentTimeoutMs?: number,\n cwd?: string,\n env?: Record<string, string>,\n): Promise<string> {\n const { stdout, stderr, exitCode } = await runScriptRaw(\n scriptPath,\n input,\n agentTimeoutMs,\n cwd,\n env,\n );\n\n if (exitCode !== 0) {\n const trimmedErr = formatStderr(stderr);\n throw new Error(\n trimmedErr.length > 0\n ? `Code evaluator exited with code ${exitCode}: ${trimmedErr}`\n : `Code evaluator exited with code ${exitCode}`,\n );\n }\n\n return stdout.trim();\n}\n\nfunction formatStderr(stderr: string): string {\n const trimmed = stderr.trim();\n const maxLength = 2000;\n if (trimmed.length <= maxLength) {\n return trimmed;\n }\n const tail = trimmed.slice(-maxLength);\n return `...(truncated, last ${maxLength} chars)\\n${tail}`;\n}\n","/**\n * Local HTTP proxy server for target invocations from code-grader scripts.\n *\n * Security properties:\n * - Binds to loopback only (127.0.0.1)\n * - Requires bearer token authentication (unique per invocation)\n * - Enforces max_calls limit\n * - Automatically shut down after evaluator completes\n */\n\nimport { randomBytes } from 'node:crypto';\nimport { type IncomingMessage, type Server, type ServerResponse, createServer } from 'node:http';\nimport type { AddressInfo } from 'node:net';\n\nimport type { Provider } from '../evaluation/providers/types.js';\nimport type { TokenUsage } from '../evaluation/trace.js';\n\n/**\n * Request body for /invoke endpoint\n */\nexport interface TargetProxyInvokeRequest {\n readonly evalCaseId: string;\n readonly attempt: number;\n readonly question: string;\n readonly systemPrompt?: string;\n /** Optional target override - use a different target for this invocation */\n readonly target?: string;\n}\n\n/**\n * Response body for /invoke endpoint\n */\nexport interface TargetProxyInvokeResponse {\n readonly output: readonly unknown[];\n readonly rawText?: string;\n readonly tokenUsage?: TokenUsage;\n}\n\n/**\n * Proxy usage metadata recorded after execution\n */\nexport interface TargetProxyUsageMetadata {\n readonly callCount: number;\n readonly maxCalls: number;\n readonly tokenUsage?: TokenUsage;\n}\n\n/**\n * Response body for /info endpoint\n */\nexport interface TargetProxyInfoResponse {\n readonly targetName: string;\n readonly maxCalls: number;\n readonly callCount: number;\n readonly availableTargets: readonly string[];\n}\n\n/**\n * Function to resolve a target name to a provider\n */\nexport type TargetResolver = (targetName: string) => Provider | undefined;\n\n/**\n * Options for creating a target proxy\n */\nexport interface TargetProxyOptions {\n readonly defaultProvider: Provider;\n /** Optional resolver for target override - if not provided, only default target is available */\n readonly targetResolver?: TargetResolver;\n /** Names of all available targets (for /info endpoint) */\n readonly availableTargets?: readonly string[];\n readonly maxCalls: number;\n}\n\n/**\n * Active target proxy instance\n */\nexport interface TargetProxyInstance {\n readonly url: string;\n readonly token: string;\n readonly shutdown: () => Promise<void>;\n readonly getUsageMetadata: () => TargetProxyUsageMetadata;\n}\n\n/** Default max calls if not specified */\nexport const DEFAULT_MAX_CALLS = 50;\n\n/**\n * Create and start a target proxy server.\n */\nexport async function createTargetProxy(options: TargetProxyOptions): Promise<TargetProxyInstance> {\n const { defaultProvider, targetResolver, availableTargets, maxCalls } = options;\n\n // Generate unique token for this invocation\n const token = randomBytes(32).toString('hex');\n\n let callCount = 0;\n let isShutdown = false;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n // Build available targets list - always includes default\n const targetsList: readonly string[] = availableTargets ?? [defaultProvider.targetName];\n\n /**\n * Resolve a target name to a provider.\n * Returns the default provider if targetName is undefined or matches default.\n * Returns undefined if targetName is unknown.\n */\n function resolveProvider(targetName: string | undefined): Provider | undefined {\n if (targetName === undefined || targetName === defaultProvider.targetName) {\n return defaultProvider;\n }\n if (targetResolver) {\n return targetResolver(targetName);\n }\n return undefined;\n }\n\n const server = createServer(async (req, res) => {\n // CORS headers for local development\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n // Verify auth\n const authHeader = req.headers.authorization;\n if (!authHeader || authHeader !== `Bearer ${token}`) {\n sendJson(res, 401, { error: 'Unauthorized' });\n return;\n }\n\n // Check if shutdown\n if (isShutdown) {\n sendJson(res, 503, { error: 'Proxy is shutting down' });\n return;\n }\n\n const url = req.url ?? '';\n\n if (req.method === 'GET' && url === '/info') {\n handleInfo(res);\n return;\n }\n\n if (req.method === 'POST' && url === '/invoke') {\n await handleInvoke(req, res);\n return;\n }\n\n if (req.method === 'POST' && url === '/invokeBatch') {\n await handleInvokeBatch(req, res);\n return;\n }\n\n sendJson(res, 404, { error: 'Not found' });\n });\n\n function handleInfo(res: ServerResponse): void {\n const response: TargetProxyInfoResponse = {\n targetName: defaultProvider.targetName,\n maxCalls,\n callCount,\n availableTargets: targetsList,\n };\n sendJson(res, 200, response);\n }\n\n async function handleInvoke(req: IncomingMessage, res: ServerResponse): Promise<void> {\n // Check call limit\n if (callCount >= maxCalls) {\n sendJson(res, 429, { error: `Max calls exceeded (limit: ${maxCalls})` });\n return;\n }\n\n try {\n const body = await readBody(req);\n const request = JSON.parse(body) as TargetProxyInvokeRequest;\n\n // Validate required fields\n if (!request.question || typeof request.question !== 'string') {\n sendJson(res, 400, { error: 'Missing required field: question' });\n return;\n }\n\n // Resolve target provider\n const provider = resolveProvider(request.target);\n if (!provider) {\n sendJson(res, 400, {\n error: `Unknown target '${request.target}'. Available: ${targetsList.join(', ')}`,\n });\n return;\n }\n\n callCount++;\n\n const response = await provider.invoke({\n question: request.question,\n systemPrompt: request.systemPrompt,\n evalCaseId: request.evalCaseId ?? 'proxy',\n attempt: request.attempt ?? 1,\n });\n\n if (response.tokenUsage) {\n totalInputTokens += response.tokenUsage.input;\n totalOutputTokens += response.tokenUsage.output;\n }\n\n // Extract output messages and rawText\n const output = response.output ?? [];\n const rawText = extractLastAssistantContent(output);\n\n const result: TargetProxyInvokeResponse = {\n output,\n rawText,\n tokenUsage: response.tokenUsage,\n };\n\n sendJson(res, 200, result);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendJson(res, 500, { error: message });\n }\n }\n\n async function handleInvokeBatch(req: IncomingMessage, res: ServerResponse): Promise<void> {\n try {\n const body = await readBody(req);\n const { requests } = JSON.parse(body) as { requests: TargetProxyInvokeRequest[] };\n\n if (!Array.isArray(requests)) {\n sendJson(res, 400, { error: 'Missing required field: requests (array)' });\n return;\n }\n\n // Check if batch would exceed limit\n if (callCount + requests.length > maxCalls) {\n sendJson(res, 429, {\n error: `Batch would exceed max calls (current: ${callCount}, batch: ${requests.length}, limit: ${maxCalls})`,\n });\n return;\n }\n\n const responses: TargetProxyInvokeResponse[] = [];\n\n for (const request of requests) {\n if (!request.question || typeof request.question !== 'string') {\n responses.push({\n output: [],\n rawText: 'Error: Missing required field: question',\n });\n continue;\n }\n\n // Resolve target provider\n const provider = resolveProvider(request.target);\n if (!provider) {\n responses.push({\n output: [],\n rawText: `Error: Unknown target '${request.target}'. Available: ${targetsList.join(', ')}`,\n });\n continue;\n }\n\n callCount++;\n\n try {\n const response = await provider.invoke({\n question: request.question,\n systemPrompt: request.systemPrompt,\n evalCaseId: request.evalCaseId ?? 'proxy',\n attempt: request.attempt ?? 1,\n });\n\n if (response.tokenUsage) {\n totalInputTokens += response.tokenUsage.input;\n totalOutputTokens += response.tokenUsage.output;\n }\n\n const output = response.output ?? [];\n responses.push({\n output,\n rawText: extractLastAssistantContent(output),\n tokenUsage: response.tokenUsage,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n responses.push({\n output: [],\n rawText: `Error: ${message}`,\n });\n }\n }\n\n sendJson(res, 200, { responses });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendJson(res, 500, { error: message });\n }\n }\n\n // Bind to loopback only (security requirement)\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(0, '127.0.0.1', () => {\n server.removeListener('error', reject);\n resolve();\n });\n });\n\n const address = server.address() as AddressInfo;\n const url = `http://127.0.0.1:${address.port}`;\n\n return {\n url,\n token,\n shutdown: async () => {\n isShutdown = true;\n return new Promise<void>((resolve, reject) => {\n server.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n },\n getUsageMetadata: () => ({\n callCount,\n maxCalls,\n tokenUsage:\n totalInputTokens > 0 || totalOutputTokens > 0\n ? { input: totalInputTokens, output: totalOutputTokens }\n : undefined,\n }),\n };\n}\n\nfunction sendJson(res: ServerResponse, statusCode: number, body: unknown): void {\n res.writeHead(statusCode, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(body));\n}\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on('data', (chunk: Buffer) => chunks.push(chunk));\n req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n req.on('error', reject);\n });\n}\n\n/**\n * Extract the text content from the last assistant message.\n */\nfunction extractLastAssistantContent(\n messages: readonly { role: string; content?: unknown }[],\n): string | undefined {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === 'assistant' && msg.content !== undefined) {\n if (typeof msg.content === 'string') {\n return msg.content;\n }\n if (Array.isArray(msg.content)) {\n // Handle content array format\n for (const part of msg.content) {\n if (typeof part === 'object' && part !== null && 'text' in part) {\n return String((part as { text: unknown }).text);\n }\n }\n }\n }\n }\n return undefined;\n}\n","/**\n * Converts a camelCase string to snake_case.\n * Examples:\n * testId -> test_id\n * outputText -> output_text\n * conversationId -> conversation_id\n *\n * Note: Keys that start with an uppercase letter are treated as proper nouns\n * and returned unchanged (e.g., \"Read\", \"Edit\" for tool names).\n */\nfunction toSnakeCase(str: string): string {\n // Don't convert keys that start with uppercase (proper nouns/tool names)\n if (/^[A-Z]/.test(str)) {\n return str;\n }\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\nfunction toCamelCase(str: string): string {\n if (/^[A-Z]/.test(str)) {\n return str;\n }\n return str.replace(/_([a-z0-9])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Recursively converts all keys in an object from camelCase to snake_case.\n * This is used to convert TypeScript internal representations to snake_case\n * for Python ecosystem compatibility in JSON payloads.\n *\n * Conversion rules:\n * - Object keys: camelCase -> snake_case\n * - Array elements: recursively converted\n * - Primitives: returned unchanged\n * - null/undefined: returned unchanged\n *\n * @param obj - The object to convert (can be any JSON-serializable value)\n * @returns A new object with all keys converted to snake_case\n */\nexport function toSnakeCaseDeep(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => toSnakeCaseDeep(item));\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const snakeKey = toSnakeCase(key);\n result[snakeKey] = toSnakeCaseDeep(value);\n }\n return result;\n }\n\n return obj;\n}\n\n/**\n * Recursively converts all keys in an object from snake_case to camelCase.\n * This is used by optional SDK helpers to map wire payloads into TypeScript-friendly\n * shapes.\n *\n * @param obj - The object to convert (can be any JSON-serializable value)\n * @returns A new object with all keys converted to camelCase\n */\nexport function toCamelCaseDeep(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => toCamelCaseDeep(item));\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const camelKey = toCamelCase(key);\n result[camelKey] = toCamelCaseDeep(value);\n }\n return result;\n }\n\n return obj;\n}\n","import type { RepoCheckout, RepoConfig } from '../types.js';\n\nexport interface RepoCheckoutTarget {\n readonly path?: string;\n readonly ref: string;\n}\n\nexport function getRepoCheckoutRef(checkout: RepoCheckout | undefined): string {\n return checkout?.base_commit ?? checkout?.ref ?? 'HEAD';\n}\n\nexport function getRepoCheckoutTargets(\n repos: readonly RepoConfig[] | undefined,\n): RepoCheckoutTarget[] {\n if (!repos) return [];\n return repos\n .filter((repo) => repo.checkout?.base_commit || repo.checkout?.ref)\n .map((repo) => ({\n path: repo.path,\n ref: getRepoCheckoutRef(repo.checkout),\n }));\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { z } from 'zod';\n\nimport {\n appendPreprocessingWarnings,\n extractTextWithPreprocessors,\n} from '../content-preprocessor.js';\nimport type { ContentImage } from '../content.js';\nimport { isContentArray } from '../content.js';\nimport type { Message, Provider, ProviderResponse, ProviderTool } from '../providers/types.js';\nimport { extractLastAssistantContent, isAgentProvider } from '../providers/types.js';\nimport { DEPRECATED_TEMPLATE_VARIABLES, TEMPLATE_VARIABLES } from '../template-variables.js';\nimport type { TokenUsage } from '../trace.js';\nimport type { AssertionEntry, JsonObject, RubricItem } from '../types.js';\nimport { clampScore, isNonEmptyString, parseJsonFromText, scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Grader } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Constants for built-in agent mode (filesystem tools)\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_STEPS = 10;\nconst MAX_STEPS_LIMIT = 50;\nconst MAX_FILE_SIZE = 50 * 1024; // 50KB\nconst MAX_SEARCH_MATCHES = 20;\n\n/**\n * Directories/patterns to skip during file search.\n */\nconst SEARCH_SKIP_DIRS = new Set([\n 'node_modules',\n '.git',\n '.next',\n 'dist',\n '__pycache__',\n '.cache',\n]);\n\n/**\n * Binary file extensions to skip during search.\n */\nconst BINARY_EXTENSIONS = new Set([\n '.png',\n '.jpg',\n '.jpeg',\n '.gif',\n '.ico',\n '.svg',\n '.woff',\n '.woff2',\n '.ttf',\n '.eot',\n '.mp3',\n '.mp4',\n '.wav',\n '.zip',\n '.tar',\n '.gz',\n '.pdf',\n '.exe',\n '.dll',\n '.so',\n '.dylib',\n]);\n\n/**\n * Default grader template for the user prompt (variables will be substituted).\n * Custom graders can override this via graderTemplate option.\n */\nexport const DEFAULT_GRADER_TEMPLATE = `You are an expert grader. Your goal is to grade the answer based on how well it achieves the criteria for the original task.\n\nUse the reference_answer as a gold standard for a high-quality response (if provided). The reference_answer may be a simple text response, or it may contain a sequence of expected agent messages including tool calls. When it contains multiple messages, the last message represents the final expected answer. The answer does not need to match it verbatim, but should capture the key points and follow the same spirit.\n\nBe concise and focused in your evaluation. Provide succinct, specific feedback rather than verbose explanations.\n\n[[ ## criteria ## ]]\n{{${TEMPLATE_VARIABLES.CRITERIA}}}\n\n[[ ## question ## ]]\n{{${TEMPLATE_VARIABLES.INPUT}}}\n\n[[ ## reference_answer ## ]]\n{{${TEMPLATE_VARIABLES.EXPECTED_OUTPUT}}}\n\n[[ ## answer ## ]]\n{{${TEMPLATE_VARIABLES.OUTPUT}}}`;\n\ntype GraderProviderResolver = (context: EvaluationContext) => Promise<Provider | undefined>;\n\nexport interface LlmGraderOptions {\n readonly resolveGraderProvider: GraderProviderResolver;\n /** @deprecated Use `resolveGraderProvider` instead. */\n readonly resolveJudgeProvider?: GraderProviderResolver;\n readonly maxOutputTokens?: number;\n readonly temperature?: number;\n readonly graderTemplate?: string;\n readonly maxSteps?: number;\n readonly graderTargetProvider?: Provider;\n /** @deprecated Use `graderTargetProvider` instead. */\n readonly judgeTargetProvider?: Provider;\n}\n\nconst freeformEvaluationSchema = z.object({\n score: z.number().min(0).max(1).describe('Score between 0.0 and 1.0'),\n assertions: z\n .array(\n z.object({\n text: z.string().describe('Brief description of what was checked'),\n passed: z.boolean().describe('Whether this aspect was satisfied'),\n evidence: z.string().describe('Concise evidence (1-2 sentences)').optional(),\n }),\n )\n .describe('Per-aspect evaluation results — one entry per aspect checked')\n .optional(),\n details: z\n .record(z.unknown())\n .describe('Optional structured metadata for domain-specific metrics')\n .optional(),\n});\n\nconst rubricCheckResultSchema = z.object({\n id: z.string().describe('The ID of the rubric item being checked'),\n satisfied: z.boolean().describe('Whether this rubric requirement is met'),\n reasoning: z.string().describe('Brief explanation (1-2 sentences) for this check'),\n});\n\nconst rubricEvaluationSchema = z.object({\n checks: z.array(rubricCheckResultSchema).describe('Results for each rubric item'),\n overall_reasoning: z.string().describe('Overall assessment summary (1-2 sentences)'),\n});\n\n/**\n * Schema for score-range rubric evaluation.\n * Each check returns an integer score 0-10 instead of boolean satisfied.\n */\nconst scoreRangeCheckResultSchema = z.object({\n id: z.string().describe('The ID of the rubric criterion being scored'),\n score: z.number().int().min(0).max(10).describe('Integer score 0-10 for this criterion'),\n reasoning: z.string().describe('Brief explanation (1-2 sentences) for this score').optional(),\n});\n\nconst scoreRangeEvaluationSchema = z.object({\n checks: z.array(scoreRangeCheckResultSchema).describe('Scores for each rubric criterion'),\n overall_reasoning: z.string().describe('Overall assessment summary (1-2 sentences)').optional(),\n});\n\nexport { freeformEvaluationSchema, rubricEvaluationSchema, scoreRangeEvaluationSchema };\n\ninterface StructuredGenerationResult {\n readonly text: string;\n readonly providerResponse?: ProviderResponse;\n readonly tokenUsage?: TokenUsage;\n}\n\nfunction resolveContentBasePath(context: EvaluationContext): string | undefined {\n if (context.workspacePath) {\n return context.workspacePath;\n }\n\n if (\n 'config' in context.target &&\n context.target.config &&\n typeof context.target.config === 'object' &&\n 'cwd' in context.target.config &&\n typeof context.target.config.cwd === 'string'\n ) {\n return context.target.config.cwd;\n }\n\n return undefined;\n}\n\nexport class LlmGrader implements Grader {\n readonly kind = 'llm-grader';\n\n private readonly resolveGraderProvider: GraderProviderResolver;\n private readonly maxOutputTokens?: number;\n private readonly temperature?: number;\n private readonly graderTemplate?: string;\n private readonly maxSteps: number;\n private readonly graderTargetProvider?: Provider;\n\n constructor(options: LlmGraderOptions) {\n this.resolveGraderProvider = (options.resolveGraderProvider ??\n options.resolveJudgeProvider) as NonNullable<typeof options.resolveGraderProvider>;\n this.maxOutputTokens = options.maxOutputTokens;\n this.temperature = options.temperature;\n this.graderTemplate = options.graderTemplate;\n this.maxSteps = Math.min(options.maxSteps ?? DEFAULT_MAX_STEPS, MAX_STEPS_LIMIT);\n this.graderTargetProvider = options.graderTargetProvider ?? options.judgeTargetProvider;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n const preparedContext = await this.prepareContext(context);\n\n // Delegate mode: grader target provider is an agent provider — send prompt via invoke()\n if (this.graderTargetProvider) {\n return this.evaluateWithGraderTarget(preparedContext);\n }\n\n const graderProvider = await this.resolveGraderProvider(preparedContext);\n if (!graderProvider) {\n throw new Error('No grader provider available for LLM grading');\n }\n\n // Built-in agent mode: agentv provider → provider.invoke() with filesystem tools\n if (graderProvider.kind === 'agentv') {\n return this.evaluateBuiltIn(preparedContext, graderProvider);\n }\n\n // Delegate mode: resolved provider is an agent provider → send prompt via invoke()\n if (isAgentProvider(graderProvider)) {\n return this.evaluateWithDelegatedAgent(preparedContext, graderProvider);\n }\n\n // LLM mode: structured JSON evaluation\n const config = preparedContext.evaluator;\n if (config?.type === 'llm-grader' && config.rubrics && config.rubrics.length > 0) {\n return this.evaluateWithRubrics(preparedContext, graderProvider, config.rubrics);\n }\n\n return this.evaluateFreeform(preparedContext, graderProvider);\n }\n\n private async prepareContext(context: EvaluationContext): Promise<EvaluationContext> {\n const config = context.evaluator;\n if (config?.type !== 'llm-grader' || !context.output) {\n return context;\n }\n\n const lastAssistant = [...context.output]\n .reverse()\n .find((message) => message.role === 'assistant' && message.content !== undefined);\n if (!lastAssistant || typeof lastAssistant.content === 'string') {\n return context;\n }\n\n const extracted = await extractTextWithPreprocessors(\n lastAssistant.content,\n config.preprocessors,\n {\n basePath: resolveContentBasePath(context),\n },\n );\n return {\n ...context,\n candidate: appendPreprocessingWarnings(extracted.text, extracted.warnings),\n };\n }\n\n // ---------------------------------------------------------------------------\n // LLM mode (existing)\n // ---------------------------------------------------------------------------\n\n private async evaluateFreeform(\n context: EvaluationContext,\n graderProvider: Provider,\n ): Promise<EvaluationScore> {\n const formattedQuestion =\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\n ? context.promptInputs.question\n : context.evalCase.question;\n\n // Prepare template variables for substitution.\n // Primary variables resolve to human-readable text; deprecated _text aliases map to the same values.\n const variables = {\n [TEMPLATE_VARIABLES.INPUT]: formattedQuestion.trim(),\n [TEMPLATE_VARIABLES.OUTPUT]: context.candidate.trim(),\n [TEMPLATE_VARIABLES.EXPECTED_OUTPUT]: (context.evalCase.reference_answer ?? '').trim(),\n [TEMPLATE_VARIABLES.CRITERIA]: context.evalCase.criteria.trim(),\n [TEMPLATE_VARIABLES.FILE_CHANGES]: context.fileChanges ?? '',\n [TEMPLATE_VARIABLES.TOOL_CALLS]: context.toolCalls ?? '',\n // Deprecated aliases — same values as the primary variables above\n [TEMPLATE_VARIABLES.INPUT_TEXT]: formattedQuestion.trim(),\n [TEMPLATE_VARIABLES.OUTPUT_TEXT]: context.candidate.trim(),\n [TEMPLATE_VARIABLES.EXPECTED_OUTPUT_TEXT]: (context.evalCase.reference_answer ?? '').trim(),\n };\n\n // Build system prompt (only the mandatory output schema)\n const systemPrompt = buildOutputSchema();\n\n // Build user prompt based on custom template or default template\n const graderTemplate =\n context.graderTemplateOverride ?? this.graderTemplate ?? DEFAULT_GRADER_TEMPLATE;\n\n // Warn once per run when custom templates use deprecated _text variable names\n warnDeprecatedTemplateVars(graderTemplate);\n\n let userPrompt = substituteVariables(graderTemplate, variables);\n\n // Append file_changes and tool_calls sections to default template only when present\n if (context.fileChanges && !context.graderTemplateOverride && !this.graderTemplate) {\n userPrompt += `\\n\\n[[ ## file_changes ## ]]\\n${context.fileChanges}`;\n }\n if (context.toolCalls && !context.graderTemplateOverride && !this.graderTemplate) {\n userPrompt += `\\n\\n[[ ## tool_calls ## ]]\\n${context.toolCalls}`;\n }\n\n const graderRawRequest: JsonObject = {\n userPrompt,\n systemPrompt,\n };\n\n // Extract image blocks from agent output for multimodal grading\n const images = context.output ? extractImageBlocks(context.output) : [];\n\n try {\n const { data, tokenUsage } = await this.runWithRetry({\n context,\n graderProvider,\n systemPrompt,\n userPrompt,\n schema: freeformEvaluationSchema,\n images,\n });\n\n const score = clampScore(data.score);\n const assertions: AssertionEntry[] = Array.isArray(data.assertions)\n ? data.assertions.slice(0, 8)\n : [];\n\n return {\n score,\n verdict: scoreToVerdict(score),\n assertions,\n expectedAspectCount: Math.max(assertions.length, 1),\n graderRawRequest,\n graderTarget: graderProvider.targetName,\n details: data.details as JsonObject | undefined,\n tokenUsage,\n };\n } catch (e: unknown) {\n // Grader parse failure -> skip (not silent zero).\n // Signals infrastructure error to downstream consumers, excluded from score averages.\n const message = e instanceof Error ? e.message : String(e);\n const evalName = context.evaluator?.name ?? 'llm-grader';\n console.warn(`⚠ LLM grader \"${evalName}\" failed after 3 attempts (${message}) — skipped`);\n return {\n score: 0,\n verdict: 'skip' as const,\n assertions: [{ text: `Grader parse failure after 3 attempts: ${message}`, passed: false }],\n expectedAspectCount: 1,\n graderRawRequest,\n graderTarget: graderProvider.targetName,\n };\n }\n }\n\n private async evaluateWithRubrics(\n context: EvaluationContext,\n graderProvider: Provider,\n rubrics: readonly RubricItem[],\n ): Promise<EvaluationScore> {\n if (!rubrics || rubrics.length === 0) {\n throw new Error(\n `No rubrics found for evaluator \"${context.evaluator?.name ?? 'llm-grader'}\". Add rubric criteria under assertions or use the agentv-eval-writer skill for authoring help.`,\n );\n }\n\n // Detect if any rubric uses score_ranges (analytic rubric mode)\n const hasScoreRanges = rubrics.some((r) => r.score_ranges && r.score_ranges.length > 0);\n\n if (hasScoreRanges) {\n return this.evaluateWithScoreRanges(context, graderProvider, rubrics);\n }\n\n const prompt = this.buildRubricPrompt(context, rubrics);\n const systemPrompt = buildRubricOutputSchema();\n\n const graderRawRequest: JsonObject = {\n userPrompt: prompt,\n systemPrompt,\n };\n\n // Extract image blocks from agent output for multimodal grading\n const images = context.output ? extractImageBlocks(context.output) : [];\n\n try {\n const { data, tokenUsage } = await this.runWithRetry({\n context,\n graderProvider,\n systemPrompt,\n userPrompt: prompt,\n schema: rubricEvaluationSchema,\n images,\n });\n\n const { score, verdict, assertions } = calculateRubricScore(data, rubrics);\n\n return {\n score,\n verdict,\n assertions,\n expectedAspectCount: rubrics.length,\n graderRawRequest,\n graderTarget: graderProvider.targetName,\n tokenUsage,\n };\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n const evalName = context.evaluator?.name ?? 'llm-grader';\n console.warn(`⚠ LLM grader \"${evalName}\" failed after 3 attempts (${message}) — skipped`);\n return {\n score: 0,\n verdict: 'skip' as const,\n assertions: [{ text: `Grader parse failure after 3 attempts: ${message}`, passed: false }],\n expectedAspectCount: rubrics.length,\n graderRawRequest,\n graderTarget: graderProvider.targetName,\n };\n }\n }\n\n /**\n * Evaluate using score-range rubrics (analytic rubric scoring).\n * Each criterion is scored 0-10 and normalized to 0-1.\n */\n private async evaluateWithScoreRanges(\n context: EvaluationContext,\n graderProvider: Provider,\n rubrics: readonly RubricItem[],\n ): Promise<EvaluationScore> {\n const prompt = this.buildScoreRangePrompt(context, rubrics);\n const systemPrompt = buildScoreRangeOutputSchema();\n\n const graderRawRequest: JsonObject = {\n userPrompt: prompt,\n systemPrompt,\n };\n\n // Extract image blocks from agent output for multimodal grading\n const images = context.output ? extractImageBlocks(context.output) : [];\n\n try {\n const { data, tokenUsage } = await this.runWithRetry({\n context,\n graderProvider,\n systemPrompt,\n userPrompt: prompt,\n schema: scoreRangeEvaluationSchema,\n images,\n });\n\n const { score, verdict, assertions, details } = calculateScoreRangeResult(data, rubrics);\n\n return {\n score,\n verdict,\n assertions,\n expectedAspectCount: rubrics.length,\n graderRawRequest,\n graderTarget: graderProvider.targetName,\n details,\n tokenUsage,\n };\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n const evalName = context.evaluator?.name ?? 'llm-grader';\n console.warn(`⚠ LLM grader \"${evalName}\" failed after 3 attempts (${message}) — skipped`);\n return {\n score: 0,\n verdict: 'skip' as const,\n assertions: [{ text: `Grader parse failure after 3 attempts: ${message}`, passed: false }],\n expectedAspectCount: rubrics.length,\n graderRawRequest,\n graderTarget: graderProvider.targetName,\n };\n }\n }\n\n // ---------------------------------------------------------------------------\n // Built-in agent mode (agentv provider — provider.invoke() with filesystem tools)\n // ---------------------------------------------------------------------------\n\n /**\n * Built-in mode: drives the grader through provider.invoke() with the\n * sandboxed filesystem tools and a step budget. The pi-ai-backed agentv\n * provider runs the agent loop (tool call → tool execute → next model\n * turn) until the model stops requesting tools or maxSteps is hit.\n */\n private async evaluateBuiltIn(\n context: EvaluationContext,\n graderProvider: Provider,\n ): Promise<EvaluationScore> {\n const workspacePath = context.workspacePath;\n if (!workspacePath) {\n throw new Error(\n 'llm-grader built-in agent mode requires a workspace (workspacePath is not set)',\n );\n }\n\n const systemPrompt = this.buildAgentSystemPrompt(context);\n const userPrompt = this.buildAgentUserPrompt(context);\n\n const config = context.evaluator;\n const rubrics = config?.type === 'llm-grader' ? config.rubrics : undefined;\n\n const fsTools = createFilesystemTools(workspacePath);\n\n const graderRawRequest: JsonObject = {\n mode: 'built-in',\n systemPrompt,\n userPrompt,\n maxSteps: this.maxSteps,\n };\n\n try {\n const response = await graderProvider.invoke({\n question: userPrompt,\n systemPrompt,\n evalCaseId: context.evalCase.id,\n attempt: context.attempt,\n temperature: this.temperature ?? 0,\n tools: fsTools,\n maxSteps: this.maxSteps,\n });\n\n const text = extractLastAssistantContent(response.output);\n const stepCount = response.steps?.count ?? 1;\n const toolCallCount = response.steps?.toolCallCount ?? 0;\n\n const details: JsonObject = {\n mode: 'built-in',\n steps: stepCount,\n tool_calls: toolCallCount,\n };\n\n return this.parseAgentResult(\n text,\n rubrics,\n graderRawRequest,\n details,\n graderProvider.targetName,\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n score: 0,\n verdict: 'fail',\n assertions: [{ text: `llm-grader built-in evaluation failed: ${message}`, passed: false }],\n expectedAspectCount: 1,\n graderRawRequest,\n graderTarget: graderProvider.targetName,\n details: { mode: 'built-in', error: message },\n };\n }\n }\n\n // ---------------------------------------------------------------------------\n // Delegate mode (agent provider — send prompt via Provider.invoke())\n // ---------------------------------------------------------------------------\n\n /**\n * Grader target mode: Delegates to an explicit graderTargetProvider via Provider.invoke().\n */\n private async evaluateWithGraderTarget(context: EvaluationContext): Promise<EvaluationScore> {\n return this.evaluateWithDelegate(\n context,\n this.graderTargetProvider as Provider,\n 'grader_target',\n );\n }\n\n /**\n * Delegate mode: resolved provider is an agent provider — send prompt via invoke().\n */\n private async evaluateWithDelegatedAgent(\n context: EvaluationContext,\n graderProvider: Provider,\n ): Promise<EvaluationScore> {\n return this.evaluateWithDelegate(context, graderProvider, 'delegate');\n }\n\n /**\n * Shared implementation for grader_target and delegate modes.\n * Both invoke a provider and parse the agent result from the response.\n */\n private async evaluateWithDelegate(\n context: EvaluationContext,\n provider: Provider,\n modeLabel: string,\n ): Promise<EvaluationScore> {\n const workspacePath = context.workspacePath;\n const prompt = this.buildDelegatedPrompt(context);\n\n const graderRawRequest: JsonObject = {\n mode: modeLabel,\n grader_target: provider.targetName,\n prompt,\n };\n\n try {\n const response = await provider.invoke({\n question: prompt,\n cwd: workspacePath,\n evalCaseId: context.evalCase.id,\n attempt: context.attempt,\n });\n\n const assistantContent = extractLastAssistantContent(response.output);\n if (!assistantContent) {\n return {\n score: 0,\n verdict: 'fail',\n assertions: [\n { text: `llm-grader ${modeLabel} returned no assistant response`, passed: false },\n ],\n expectedAspectCount: 1,\n graderRawRequest,\n graderTarget: provider.targetName,\n details: { mode: modeLabel, grader_target: provider.targetName },\n };\n }\n\n const config = context.evaluator;\n const rubrics = config?.type === 'llm-grader' ? config.rubrics : undefined;\n\n const details: JsonObject = {\n mode: modeLabel,\n grader_target: provider.targetName,\n };\n\n return this.parseAgentResult(\n assistantContent,\n rubrics,\n graderRawRequest,\n details,\n provider.targetName,\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n score: 0,\n verdict: 'fail',\n assertions: [\n { text: `llm-grader ${modeLabel} evaluation failed: ${message}`, passed: false },\n ],\n expectedAspectCount: 1,\n graderRawRequest,\n graderTarget: provider.targetName,\n details: {\n mode: modeLabel,\n grader_target: provider.targetName,\n error: message,\n },\n };\n }\n }\n\n // ---------------------------------------------------------------------------\n // Prompt builders for agent modes\n // ---------------------------------------------------------------------------\n\n /**\n * Build system prompt for built-in agent mode.\n * Includes output format instructions.\n */\n private buildAgentSystemPrompt(context: EvaluationContext): string {\n const config = context.evaluator;\n const rubrics = config?.type === 'llm-grader' ? config.rubrics : undefined;\n\n const parts: string[] = [\n 'You are an expert grader with access to the workspace filesystem.',\n 'Use the provided tools to investigate the workspace and verify the criteria are met.',\n 'Thoroughly examine relevant files before making your assessment.',\n '',\n ];\n\n if (rubrics && rubrics.length > 0) {\n parts.push(buildRubricOutputSchema());\n } else {\n parts.push(buildOutputSchema());\n }\n\n return parts.join('\\n');\n }\n\n /**\n * Build user prompt for built-in agent mode.\n * Uses custom template if provided, otherwise builds default prompt.\n */\n private buildAgentUserPrompt(context: EvaluationContext): string {\n const formattedQuestion =\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\n ? context.promptInputs.question\n : context.evalCase.question;\n\n const variables: Record<string, string> = {\n [TEMPLATE_VARIABLES.CRITERIA]: context.evalCase.criteria.trim(),\n [TEMPLATE_VARIABLES.INPUT]: formattedQuestion.trim(),\n [TEMPLATE_VARIABLES.OUTPUT]: context.candidate.trim(),\n [TEMPLATE_VARIABLES.EXPECTED_OUTPUT]: (context.evalCase.reference_answer ?? '').trim(),\n [TEMPLATE_VARIABLES.FILE_CHANGES]: context.fileChanges ?? '',\n [TEMPLATE_VARIABLES.TOOL_CALLS]: context.toolCalls ?? '',\n // Deprecated aliases\n [TEMPLATE_VARIABLES.INPUT_TEXT]: formattedQuestion.trim(),\n [TEMPLATE_VARIABLES.OUTPUT_TEXT]: context.candidate.trim(),\n [TEMPLATE_VARIABLES.EXPECTED_OUTPUT_TEXT]: (context.evalCase.reference_answer ?? '').trim(),\n };\n\n if (this.graderTemplate) {\n warnDeprecatedTemplateVars(this.graderTemplate);\n return substituteVariables(this.graderTemplate, variables);\n }\n\n const config = context.evaluator;\n const rubrics = config?.type === 'llm-grader' ? config.rubrics : undefined;\n\n const parts: string[] = [\n 'Evaluate the candidate answer by investigating the workspace.',\n '',\n '[[ ## question ## ]]',\n formattedQuestion,\n '',\n '[[ ## criteria ## ]]',\n context.evalCase.criteria,\n '',\n ];\n\n if (context.evalCase.reference_answer && context.evalCase.reference_answer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', context.evalCase.reference_answer, '');\n }\n\n parts.push('[[ ## answer ## ]]', context.candidate, '');\n\n if (context.fileChanges) {\n parts.push('[[ ## file_changes ## ]]', context.fileChanges, '');\n }\n\n if (context.toolCalls) {\n parts.push('[[ ## tool_calls ## ]]', context.toolCalls, '');\n }\n\n if (rubrics && rubrics.length > 0) {\n parts.push('[[ ## rubrics ## ]]');\n for (const rubric of rubrics) {\n const requiredLabel = rubric.required ? ' (REQUIRED)' : '';\n const weightLabel = rubric.weight !== 1.0 ? ` (weight: ${rubric.weight})` : '';\n parts.push(`- [${rubric.id}]${requiredLabel}${weightLabel}: ${rubric.outcome}`);\n }\n parts.push(\n '',\n 'For each rubric, investigate the workspace to determine if it is satisfied. Provide brief reasoning.',\n );\n } else {\n parts.push(\n 'Investigate the workspace to verify the criteria. Provide a score between 0.0 and 1.0.',\n );\n }\n\n return parts.join('\\n');\n }\n\n /**\n * Build the full evaluation prompt for delegate mode (agent providers).\n * Combines task context, criteria, candidate info, and output format instructions.\n */\n private buildDelegatedPrompt(context: EvaluationContext): string {\n const formattedQuestion =\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\n ? context.promptInputs.question\n : context.evalCase.question;\n\n const config = context.evaluator;\n const rubrics = config?.type === 'llm-grader' ? config.rubrics : undefined;\n\n if (this.graderTemplate) {\n const variables: Record<string, string> = {\n [TEMPLATE_VARIABLES.CRITERIA]: context.evalCase.criteria.trim(),\n [TEMPLATE_VARIABLES.INPUT]: formattedQuestion.trim(),\n [TEMPLATE_VARIABLES.OUTPUT]: context.candidate.trim(),\n [TEMPLATE_VARIABLES.EXPECTED_OUTPUT]: (context.evalCase.reference_answer ?? '').trim(),\n [TEMPLATE_VARIABLES.FILE_CHANGES]: context.fileChanges ?? '',\n [TEMPLATE_VARIABLES.TOOL_CALLS]: context.toolCalls ?? '',\n // Deprecated aliases\n [TEMPLATE_VARIABLES.INPUT_TEXT]: formattedQuestion.trim(),\n [TEMPLATE_VARIABLES.OUTPUT_TEXT]: context.candidate.trim(),\n [TEMPLATE_VARIABLES.EXPECTED_OUTPUT_TEXT]: (context.evalCase.reference_answer ?? '').trim(),\n };\n warnDeprecatedTemplateVars(this.graderTemplate);\n const customPrompt = substituteVariables(this.graderTemplate, variables);\n\n const outputSchema =\n rubrics && rubrics.length > 0 ? buildRubricOutputSchema() : buildOutputSchema();\n\n return `${customPrompt}\\n\\n${outputSchema}`;\n }\n\n const parts: string[] = [\n 'You are an expert grader. Investigate the workspace to verify the criteria are met.',\n '',\n '[[ ## question ## ]]',\n formattedQuestion,\n '',\n '[[ ## criteria ## ]]',\n context.evalCase.criteria,\n '',\n ];\n\n if (context.evalCase.reference_answer && context.evalCase.reference_answer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', context.evalCase.reference_answer, '');\n }\n\n parts.push('[[ ## answer ## ]]', context.candidate, '');\n\n if (context.fileChanges) {\n parts.push('[[ ## file_changes ## ]]', context.fileChanges, '');\n }\n\n if (context.toolCalls) {\n parts.push('[[ ## tool_calls ## ]]', context.toolCalls, '');\n }\n\n if (rubrics && rubrics.length > 0) {\n parts.push('[[ ## rubrics ## ]]');\n for (const rubric of rubrics) {\n const requiredLabel = rubric.required ? ' (REQUIRED)' : '';\n const weightLabel = rubric.weight !== 1.0 ? ` (weight: ${rubric.weight})` : '';\n parts.push(`- [${rubric.id}]${requiredLabel}${weightLabel}: ${rubric.outcome}`);\n }\n parts.push('');\n parts.push(buildRubricOutputSchema());\n } else {\n parts.push(buildOutputSchema());\n }\n\n return parts.join('\\n');\n }\n\n // ---------------------------------------------------------------------------\n // Agent result parser (shared by built-in and delegate modes)\n // ---------------------------------------------------------------------------\n\n /**\n * Parse the agent's response text into an EvaluationScore.\n * Supports both freeform and rubric modes.\n */\n private parseAgentResult(\n text: string,\n rubrics: readonly RubricItem[] | undefined,\n graderRawRequest: JsonObject,\n details: JsonObject,\n graderTarget?: string,\n ): EvaluationScore {\n try {\n const parsed = parseJsonFromText(text);\n\n if (rubrics && rubrics.length > 0) {\n const data = rubricEvaluationSchema.parse(parsed);\n const { score, verdict, assertions } = calculateRubricScore(data, rubrics);\n return {\n score,\n verdict,\n assertions,\n expectedAspectCount: rubrics.length,\n graderRawRequest,\n graderTarget,\n details,\n };\n }\n\n const data = freeformEvaluationSchema.parse(parsed);\n const score = clampScore(data.score);\n const assertions: AssertionEntry[] = Array.isArray(data.assertions)\n ? data.assertions.slice(0, 8)\n : [];\n\n return {\n score,\n verdict: scoreToVerdict(score),\n assertions,\n expectedAspectCount: Math.max(assertions.length, 1),\n graderRawRequest,\n graderTarget,\n details:\n data.details && Object.keys(data.details).length > 0\n ? ({ ...details, ...data.details } as JsonObject)\n : details,\n };\n } catch {\n return {\n score: 0,\n verdict: 'fail',\n assertions: [\n {\n text: 'Failed to parse llm-grader agent response as valid evaluation JSON',\n passed: false,\n },\n ],\n expectedAspectCount: 1,\n graderRawRequest,\n graderTarget,\n details,\n };\n }\n }\n\n // ---------------------------------------------------------------------------\n // LLM mode prompt builders\n // ---------------------------------------------------------------------------\n\n /**\n * Build prompt for score-range rubric evaluation.\n */\n private buildScoreRangePrompt(\n context: EvaluationContext,\n rubrics: readonly RubricItem[],\n ): string {\n const formattedQuestion =\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\n ? context.promptInputs.question\n : context.evalCase.question;\n\n const parts: string[] = [\n 'You are an expert grader. Score the candidate answer on each criterion below using the provided score ranges.',\n 'For each criterion, output an integer score from 0 to 10 based on which score range best matches the answer.',\n '',\n '[[ ## question ## ]]',\n formattedQuestion,\n '',\n '[[ ## criteria ## ]]',\n context.evalCase.criteria,\n '',\n ];\n\n if (context.evalCase.reference_answer && context.evalCase.reference_answer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', context.evalCase.reference_answer, '');\n }\n\n parts.push('[[ ## answer ## ]]', context.candidate, '');\n\n if (context.fileChanges) {\n parts.push('[[ ## file_changes ## ]]', context.fileChanges, '');\n }\n\n if (context.toolCalls) {\n parts.push('[[ ## tool_calls ## ]]', context.toolCalls, '');\n }\n\n parts.push('[[ ## scoring_criteria ## ]]');\n\n for (const rubric of rubrics) {\n const weightLabel = rubric.weight !== 1.0 ? ` (weight: ${rubric.weight})` : '';\n const minScoreLabel =\n rubric.min_score !== undefined\n ? ` [REQUIRED: min score ${rubric.min_score}]`\n : rubric.required_min_score !== undefined\n ? ` [REQUIRED: min score ${rubric.required_min_score}]`\n : '';\n\n parts.push('', `### Criterion: ${rubric.id}${weightLabel}${minScoreLabel}`);\n\n if (rubric.outcome) {\n parts.push(`Description: ${rubric.outcome}`);\n }\n\n if (rubric.score_ranges && rubric.score_ranges.length > 0) {\n parts.push('Score ranges:');\n for (const range of rubric.score_ranges) {\n const [min, max] = range.score_range;\n const rangeLabel = min === max ? `${min}` : `${min}-${max}`;\n parts.push(` - Score ${rangeLabel}: ${range.outcome}`);\n }\n }\n }\n\n parts.push(\n '',\n 'For each criterion, provide an integer score 0-10 that matches one of its defined score ranges.',\n );\n\n return parts.join('\\n');\n }\n\n private buildRubricPrompt(context: EvaluationContext, rubrics: readonly RubricItem[]): string {\n const formattedQuestion =\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\n ? context.promptInputs.question\n : context.evalCase.question;\n\n const parts: string[] = [\n 'You are an expert grader. Evaluate the candidate answer against each rubric item below.',\n '',\n '[[ ## question ## ]]',\n formattedQuestion,\n '',\n '[[ ## criteria ## ]]',\n context.evalCase.criteria,\n '',\n ];\n\n if (context.evalCase.reference_answer && context.evalCase.reference_answer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', context.evalCase.reference_answer, '');\n }\n\n parts.push('[[ ## answer ## ]]', context.candidate, '');\n\n if (context.fileChanges) {\n parts.push('[[ ## file_changes ## ]]', context.fileChanges, '');\n }\n\n if (context.toolCalls) {\n parts.push('[[ ## tool_calls ## ]]', context.toolCalls, '');\n }\n\n parts.push('[[ ## rubrics ## ]]');\n\n for (const rubric of rubrics) {\n const requiredLabel = rubric.required ? ' (REQUIRED)' : '';\n const weightLabel = rubric.weight !== 1.0 ? ` (weight: ${rubric.weight})` : '';\n parts.push(`- [${rubric.id}]${requiredLabel}${weightLabel}: ${rubric.outcome}`);\n }\n\n parts.push('', 'For each rubric, determine if it is satisfied and provide brief reasoning.');\n\n return parts.join('\\n');\n }\n\n // ---------------------------------------------------------------------------\n // LLM mode retry logic\n // ---------------------------------------------------------------------------\n\n private async runWithRetry<T>(options: {\n readonly context: EvaluationContext;\n readonly graderProvider: Provider;\n readonly systemPrompt: string;\n readonly userPrompt: string;\n readonly schema: z.ZodSchema<T>;\n readonly images?: readonly ContentImage[];\n }): Promise<{ data: T; providerResponse?: ProviderResponse; tokenUsage?: TokenUsage }> {\n const { context, graderProvider, systemPrompt, userPrompt, schema, images } = options;\n\n let lastError: Error | undefined;\n let lastInvalidResponse: StructuredGenerationResult | undefined;\n let shouldAttemptStructureFix = false;\n\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const result = await this.generateStructuredResponse({\n context,\n graderProvider,\n systemPrompt,\n userPrompt,\n images,\n });\n const canRepairResponse = result.text.trim().length > 0;\n lastInvalidResponse = canRepairResponse ? result : undefined;\n let data: T;\n try {\n data = schema.parse(parseJsonFromText(result.text));\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n shouldAttemptStructureFix = canRepairResponse;\n continue;\n }\n return {\n data,\n providerResponse: result.providerResponse,\n tokenUsage: result.tokenUsage,\n };\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n }\n }\n\n if (shouldAttemptStructureFix && lastInvalidResponse) {\n try {\n const repaired = await this.generateStructuredResponse({\n context,\n graderProvider,\n systemPrompt,\n userPrompt: buildStructureRepairPrompt({\n validationError: lastError?.message ?? 'Schema validation failed',\n invalidResponse: lastInvalidResponse.text,\n }),\n });\n const data = schema.parse(parseJsonFromText(repaired.text));\n return {\n data,\n providerResponse: repaired.providerResponse,\n tokenUsage: sumTokenUsage(lastInvalidResponse.tokenUsage, repaired.tokenUsage),\n };\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n }\n }\n\n throw new Error(\n `Failed to parse evaluator response after 3 attempts and 1 structure-fix attempt: ${lastError?.message}`,\n );\n }\n\n private async generateStructuredResponse(options: {\n readonly context: EvaluationContext;\n readonly graderProvider: Provider;\n readonly systemPrompt: string;\n readonly userPrompt: string;\n readonly images?: readonly ContentImage[];\n }): Promise<StructuredGenerationResult> {\n const { context, graderProvider, systemPrompt, userPrompt, images } = options;\n\n const response = await graderProvider.invoke({\n question: userPrompt,\n systemPrompt,\n evalCaseId: context.evalCase.id,\n attempt: context.attempt,\n maxOutputTokens: this.maxOutputTokens,\n temperature: this.temperature,\n ...(images && images.length > 0 ? { images } : {}),\n });\n\n return {\n text: extractLastAssistantContent(response.output),\n providerResponse: response,\n tokenUsage: response.tokenUsage,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Output schema builders (exported for reuse)\n// ---------------------------------------------------------------------------\n\n/**\n * Build the mandatory output schema that all evaluators must follow.\n * This schema is always appended to the grader template.\n */\nexport function buildOutputSchema(): string {\n return [\n 'You must respond with a single JSON object matching this schema:',\n '',\n '{',\n ' \"score\": <number between 0.0 and 1.0>,',\n ' \"assertions\": [',\n ' {',\n ' \"text\": \"<brief description of what was checked>\",',\n ' \"passed\": <boolean>,',\n ' \"evidence\": \"<concise evidence, 1-2 sentences, optional>\"',\n ' }',\n ' ],',\n ' \"details\": {<optional object with domain-specific structured metrics>}',\n '}',\n ].join('\\n');\n}\n\nfunction buildStructureRepairPrompt(options: {\n readonly validationError: string;\n readonly invalidResponse: string;\n}): string {\n const { validationError, invalidResponse } = options;\n return [\n 'The following evaluation response has useful grading content but invalid JSON structure.',\n 'Repair it to satisfy the schema in the system prompt.',\n 'Preserve the evaluation meaning, do not re-grade the answer, and return only a single JSON object.',\n '',\n 'Validation error:',\n validationError,\n '',\n 'Invalid response:',\n invalidResponse,\n ].join('\\n');\n}\n\nfunction sumTokenUsage(\n first: TokenUsage | undefined,\n second: TokenUsage | undefined,\n): TokenUsage | undefined {\n if (!first && !second) {\n return undefined;\n }\n return {\n input: (first?.input ?? 0) + (second?.input ?? 0),\n output: (first?.output ?? 0) + (second?.output ?? 0),\n };\n}\n\nexport function buildRubricOutputSchema(): string {\n return `You are an expert grader. Evaluate the candidate answer against each rubric item.\nYou must return a valid JSON object matching this schema:\n{\n \"checks\": [\n {\n \"id\": \"string (rubric id)\",\n \"satisfied\": boolean,\n \"reasoning\": \"string (brief explanation)\"\n }\n ],\n \"overall_reasoning\": \"string (summary)\"\n}`;\n}\n\nexport function substituteVariables(template: string, variables: Record<string, string>): string {\n return template.replace(/\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g, (match, varName) => {\n return variables[varName] ?? match;\n });\n}\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/** Set of templates that have already emitted a deprecation warning (one-time per template). */\nconst warnedTemplateStrings = new Set<string>();\n\n/**\n * Emit a one-time stderr warning when a template uses deprecated _text variable names.\n * Skips the default template (which uses the new names and should never trigger warnings).\n */\nexport function warnDeprecatedTemplateVars(template: string): void {\n if (warnedTemplateStrings.has(template)) return;\n\n const used: string[] = [];\n for (const [deprecated, replacement] of DEPRECATED_TEMPLATE_VARIABLES) {\n if (new RegExp(`\\\\{\\\\{\\\\s*${deprecated}\\\\s*\\\\}\\\\}`).test(template)) {\n used.push(`{{ ${deprecated} }} → {{ ${replacement} }}`);\n }\n }\n\n if (used.length > 0) {\n warnedTemplateStrings.add(template);\n console.warn(\n `${ANSI_YELLOW}⚠ Deprecated template variables detected (they still work but will be removed in a future version):\\n ${used.join('\\n ')}\\n Update your custom grader template to use the new names.${ANSI_RESET}`,\n );\n }\n}\n\nexport function calculateRubricScore(\n result: z.infer<typeof rubricEvaluationSchema>,\n rubrics: readonly RubricItem[],\n): {\n score: number;\n verdict: import('../types.js').EvaluationVerdict;\n assertions: AssertionEntry[];\n} {\n const rubricMap = new Map(rubrics.map((rubric) => [rubric.id, rubric]));\n const assertions: AssertionEntry[] = [];\n let totalWeight = 0;\n let earnedWeight = 0;\n let failedRequired = false;\n\n for (const check of result.checks) {\n const rubric = rubricMap.get(check.id);\n if (!rubric) {\n continue;\n }\n\n totalWeight += rubric.weight;\n\n assertions.push({\n text: `[${rubric.id}] ${rubric.outcome}`,\n passed: check.satisfied,\n evidence: check.reasoning,\n });\n\n if (check.satisfied) {\n earnedWeight += rubric.weight;\n } else if (rubric.required) {\n failedRequired = true;\n }\n }\n\n const score = totalWeight > 0 ? Math.min(1, Math.max(0, earnedWeight / totalWeight)) : 0;\n const verdict = failedRequired ? 'fail' : scoreToVerdict(score);\n return { score, verdict, assertions };\n}\n\n/**\n * Build the output schema for score-range rubric evaluation.\n */\nexport function buildScoreRangeOutputSchema(): string {\n return `You are an expert grader. Score the candidate answer on each criterion.\nYou must return a valid JSON object matching this schema:\n{\n \"checks\": [\n {\n \"id\": \"string (criterion id)\",\n \"score\": integer (0-10),\n \"reasoning\": \"string (brief explanation for score)\"\n }\n ],\n \"overall_reasoning\": \"string (summary, optional)\"\n}\n\nImportant: The \"score\" must be an integer from 0 to 10 that falls within one of the defined score ranges for that criterion.`;\n}\n\n/**\n * Calculate score from score-range rubric evaluation results.\n * - Normalizes each criterion score (0-10) to 0-1 by dividing by 10\n * - Computes weighted average across criteria\n * - Applies required_min_score gating (force fail if below threshold)\n */\nfunction calculateScoreRangeResult(\n result: z.infer<typeof scoreRangeEvaluationSchema>,\n rubrics: readonly RubricItem[],\n): {\n score: number;\n verdict: import('../types.js').EvaluationVerdict;\n assertions: AssertionEntry[];\n details: JsonObject;\n} {\n const rubricMap = new Map(rubrics.map((rubric) => [rubric.id, rubric]));\n const assertions: AssertionEntry[] = [];\n const rawScores: Record<string, number> = {};\n let totalWeight = 0;\n let weightedScoreSum = 0;\n let failedRequired = false;\n\n for (const check of result.checks) {\n const rubric = rubricMap.get(check.id);\n if (!rubric) {\n continue;\n }\n\n const rawScore = Math.max(0, Math.min(10, check.score)); // Clamp to 0-10\n const normalizedScore = rawScore / 10; // Normalize to 0-1\n rawScores[rubric.id] = rawScore;\n\n totalWeight += rubric.weight;\n weightedScoreSum += normalizedScore * rubric.weight;\n\n // Determine required minimum score (as normalized 0-1):\n // - If min_score is set (0-1), use directly\n // - If required_min_score is set (legacy 0-10), normalize to 0-1\n // - If required is true (legacy), treat as min_score: 1.0\n // - Otherwise, no gating\n let minScoreThreshold: number | undefined;\n if (rubric.min_score !== undefined) {\n minScoreThreshold = rubric.min_score;\n } else if (rubric.required_min_score !== undefined) {\n minScoreThreshold = rubric.required_min_score / 10;\n } else if (rubric.required === true) {\n minScoreThreshold = 1.0; // Legacy: required: true means must score 10/10\n }\n\n // Find the matching score range description for reporting\n const matchingRange = rubric.score_ranges?.find(\n (r) => rawScore >= r.score_range[0] && rawScore <= r.score_range[1],\n );\n const rangeDescription = matchingRange?.outcome ?? '';\n const criterionLabel = rubric.outcome ?? rubric.id;\n\n // Check gating — compare normalized score against min_score threshold (both 0-1)\n const passed =\n !(minScoreThreshold !== undefined && normalizedScore < minScoreThreshold) && rawScore >= 7;\n if (minScoreThreshold !== undefined && normalizedScore < minScoreThreshold) {\n failedRequired = true;\n }\n\n assertions.push({\n text: `[${rubric.id}] ${criterionLabel} - Score: ${rawScore}/10 (${rangeDescription})`,\n passed,\n evidence: check.reasoning,\n });\n }\n\n const score = totalWeight > 0 ? Math.min(1, Math.max(0, weightedScoreSum / totalWeight)) : 0;\n const verdict = failedRequired ? 'fail' : scoreToVerdict(score);\n\n return {\n score,\n verdict,\n assertions,\n details: {\n raw_scores: rawScores,\n normalization: 'score / 10',\n aggregation: 'weighted_average',\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Multimodal helpers — extract image blocks from agent output messages\n// ---------------------------------------------------------------------------\n\n/**\n * Extract all `ContentImage` blocks from assistant messages.\n *\n * Scans `messages` for assistant-role entries whose `content` is a `Content[]`\n * array and collects every `ContentImage` block. Non-assistant messages and\n * plain-string content are skipped.\n */\nexport function extractImageBlocks(messages: readonly Message[]): ContentImage[] {\n const images: ContentImage[] = [];\n for (const msg of messages) {\n if (msg.role !== 'assistant') continue;\n if (!isContentArray(msg.content)) continue;\n for (const block of msg.content) {\n if (block.type === 'image') {\n images.push(block);\n }\n }\n }\n return images;\n}\n\n// ---------------------------------------------------------------------------\n// Sandboxed filesystem tools for built-in agent mode\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a relative path within the sandbox, preventing path traversal.\n * Returns the absolute path if valid, or throws if the path escapes the sandbox.\n */\nfunction resolveSandboxed(basePath: string, relativePath: string): string {\n const resolved = path.resolve(basePath, relativePath);\n if (!resolved.startsWith(basePath + path.sep) && resolved !== basePath) {\n throw new Error(`Path '${relativePath}' is outside the workspace`);\n }\n return resolved;\n}\n\n/**\n * Create sandboxed filesystem tools for the built-in grader agent loop.\n *\n * Tools are returned as plain `ProviderTool` records with JSON Schema\n * `parameters`. The provider serializes them to whatever wire format the\n * underlying API expects (OpenAI: tools[], Anthropic: tools, ...).\n */\nfunction createFilesystemTools(workspacePath: string): ProviderTool[] {\n return [\n {\n name: 'list_files',\n description:\n 'List files and directories at a relative path within the workspace. Returns names only (single level, no recursion).',\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Relative path within workspace (use \".\" for root)',\n default: '.',\n },\n },\n },\n execute: async (input: unknown) => {\n const args = (input ?? {}) as { path?: string };\n try {\n const resolved = resolveSandboxed(workspacePath, args.path ?? '.');\n const entries = await fs.readdir(resolved, { withFileTypes: true });\n return entries\n .map((e) => ({\n name: e.name,\n type: e.isDirectory() ? 'directory' : 'file',\n }))\n .slice(0, 100);\n } catch (error) {\n return { error: error instanceof Error ? error.message : String(error) };\n }\n },\n },\n {\n name: 'read_file',\n description:\n 'Read the content of a file at a relative path within the workspace. Large files are truncated at 50KB.',\n parameters: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Relative path to file within workspace' },\n },\n required: ['path'],\n },\n execute: async (input: unknown) => {\n const args = (input ?? {}) as { path?: string };\n const relPath = args.path ?? '';\n try {\n const resolved = resolveSandboxed(workspacePath, relPath);\n const stat = await fs.stat(resolved);\n if (stat.isDirectory()) {\n return { error: `'${relPath}' is a directory, not a file` };\n }\n const buffer = Buffer.alloc(Math.min(stat.size, MAX_FILE_SIZE));\n const fd = await fs.open(resolved, 'r');\n try {\n await fd.read(buffer, 0, buffer.length, 0);\n } finally {\n await fd.close();\n }\n const content = buffer.toString('utf-8');\n const truncated = stat.size > MAX_FILE_SIZE;\n return { content, truncated, size: stat.size };\n } catch (error) {\n return { error: error instanceof Error ? error.message : String(error) };\n }\n },\n },\n {\n name: 'search_files',\n description:\n 'Search for a regex pattern across files in the workspace. Returns up to 20 matches. Skips binary files and node_modules/.git.',\n parameters: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Regex pattern to search for' },\n path: {\n type: 'string',\n description: 'Relative path to search within (use \".\" for root)',\n default: '.',\n },\n },\n required: ['pattern'],\n },\n execute: async (input: unknown) => {\n const args = (input ?? {}) as { pattern?: string; path?: string };\n try {\n const resolved = resolveSandboxed(workspacePath, args.path ?? '.');\n let regex: RegExp;\n try {\n regex = new RegExp(args.pattern ?? '', 'gi');\n } catch (regexErr) {\n return {\n error: `Invalid regex pattern: ${regexErr instanceof Error ? regexErr.message : String(regexErr)}`,\n };\n }\n const matches: Array<{ file: string; line: number; text: string }> = [];\n\n await searchDirectory(resolved, workspacePath, regex, matches);\n\n return { matches, total: matches.length };\n } catch (error) {\n return { error: error instanceof Error ? error.message : String(error) };\n }\n },\n },\n ];\n}\n\n/**\n * Recursively search a directory for regex matches.\n */\nasync function searchDirectory(\n dirPath: string,\n workspacePath: string,\n regex: RegExp,\n matches: Array<{ file: string; line: number; text: string }>,\n): Promise<void> {\n if (matches.length >= MAX_SEARCH_MATCHES) return;\n\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dirPath, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (matches.length >= MAX_SEARCH_MATCHES) return;\n\n if (SEARCH_SKIP_DIRS.has(entry.name)) continue;\n\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n await searchDirectory(fullPath, workspacePath, regex, matches);\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name).toLowerCase();\n if (BINARY_EXTENSIONS.has(ext)) continue;\n\n try {\n const stat = await fs.stat(fullPath);\n if (stat.size > MAX_FILE_SIZE) continue;\n\n const content = await fs.readFile(fullPath, 'utf-8');\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n if (matches.length >= MAX_SEARCH_MATCHES) return;\n regex.lastIndex = 0;\n if (regex.test(lines[i])) {\n matches.push({\n file: path.relative(workspacePath, fullPath),\n line: i + 1,\n text: lines[i].substring(0, 200),\n });\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { execFileWithStdin } from '../runtime/exec.js';\nimport type { Content, ContentFile } from './content.js';\nimport type { ContentPreprocessorConfig } from './types.js';\n\nconst MIME_TYPE_ALIASES: Record<string, string> = {\n csv: 'text/csv',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n htm: 'text/html',\n html: 'text/html',\n json: 'application/json',\n markdown: 'text/markdown',\n md: 'text/markdown',\n pdf: 'application/pdf',\n sql: 'application/sql',\n txt: 'text/plain',\n xhtml: 'application/xhtml+xml',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n xml: 'application/xml',\n yaml: 'application/yaml',\n yml: 'application/yaml',\n};\n\nconst REPLACEMENT_CHAR = '\\ufffd';\n\nexport interface FilePreprocessingWarning {\n readonly file: string;\n readonly mediaType: string;\n readonly reason: string;\n}\n\nexport interface ExtractedContentText {\n readonly text: string;\n readonly warnings: readonly FilePreprocessingWarning[];\n}\n\nexport async function extractTextWithPreprocessors(\n content: string | readonly Content[] | undefined,\n preprocessors: readonly ContentPreprocessorConfig[] | undefined,\n options: { readonly basePath?: string } = {},\n): Promise<ExtractedContentText> {\n if (typeof content === 'string') {\n return { text: content, warnings: [] };\n }\n if (!content || content.length === 0) {\n return { text: '', warnings: [] };\n }\n\n const parts: string[] = [];\n const warnings: FilePreprocessingWarning[] = [];\n\n for (const block of content) {\n if (block.type === 'text') {\n parts.push(block.text);\n continue;\n }\n if (block.type !== 'file') {\n continue;\n }\n\n const result = await preprocessContentFile(block, preprocessors, options.basePath);\n if (result.text) {\n parts.push(result.text);\n }\n warnings.push(...result.warnings);\n }\n\n return { text: parts.join('\\n'), warnings };\n}\n\nasync function preprocessContentFile(\n block: ContentFile,\n preprocessors: readonly ContentPreprocessorConfig[] | undefined,\n basePath?: string,\n): Promise<ExtractedContentText> {\n const mediaType = normalizePreprocessorType(block.media_type);\n const resolvedPath = resolveLocalFilePath(block.path, basePath);\n\n if (!resolvedPath) {\n return {\n text: '',\n warnings: [\n {\n file: block.path,\n mediaType: block.media_type,\n reason: 'remote file paths are not supported for preprocessing',\n },\n ],\n };\n }\n\n const preprocessor = preprocessors?.find(\n (entry) => normalizePreprocessorType(entry.type) === mediaType,\n );\n if (preprocessor) {\n return runContentPreprocessor(block, resolvedPath, preprocessor);\n }\n\n try {\n const buffer = await readFile(resolvedPath);\n const text = buffer.toString('utf8').replace(/\\r\\n/g, '\\n');\n if (buffer.includes(0) || text.includes(REPLACEMENT_CHAR)) {\n return {\n text: '',\n warnings: [\n {\n file: block.path,\n mediaType: block.media_type,\n reason: 'default UTF-8 read produced binary or invalid text; configure a preprocessor',\n },\n ],\n };\n }\n return { text: formatFileText(block.path, text), warnings: [] };\n } catch (error) {\n return {\n text: '',\n warnings: [\n {\n file: block.path,\n mediaType: block.media_type,\n reason: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n}\n\nasync function runContentPreprocessor(\n block: ContentFile,\n resolvedPath: string,\n preprocessor: ContentPreprocessorConfig,\n): Promise<ExtractedContentText> {\n try {\n const argv = preprocessor.resolvedCommand ?? preprocessor.command;\n const { stdout, stderr, exitCode } = await execFileWithStdin(\n argv,\n JSON.stringify({\n path: resolvedPath,\n original_path: block.path,\n media_type: block.media_type,\n }),\n );\n\n if (exitCode !== 0) {\n return {\n text: '',\n warnings: [\n {\n file: block.path,\n mediaType: block.media_type,\n reason: stderr.trim() || `preprocessor exited with code ${exitCode}`,\n },\n ],\n };\n }\n\n return { text: formatFileText(block.path, stdout.trim()), warnings: [] };\n } catch (error) {\n return {\n text: '',\n warnings: [\n {\n file: block.path,\n mediaType: block.media_type,\n reason: error instanceof Error ? error.message : String(error),\n },\n ],\n };\n }\n}\n\nexport function appendPreprocessingWarnings(\n text: string,\n warnings: readonly FilePreprocessingWarning[],\n): string {\n if (warnings.length === 0) {\n return text;\n }\n\n const notes = warnings.map(\n (warning) =>\n `[file preprocessing warning] ${warning.file} (${warning.mediaType}): ${warning.reason}`,\n );\n\n return [text, ...notes].filter((part) => part.length > 0).join('\\n');\n}\n\nexport function normalizePreprocessorType(value: string): string {\n const normalized = value.trim().toLowerCase();\n return MIME_TYPE_ALIASES[normalized] ?? normalized;\n}\n\nfunction resolveLocalFilePath(value: string, basePath?: string): string | undefined {\n if (value.startsWith('file://')) {\n return fileURLToPath(value);\n }\n if (/^[a-z]+:\\/\\//i.test(value)) {\n return undefined;\n }\n return basePath ? path.resolve(basePath, value) : path.resolve(value);\n}\n\nfunction formatFileText(filePath: string, text: string): string {\n return `[[ file: ${filePath} ]]\\n${text}`;\n}\n","/**\n * Template variable constants for evaluator prompts.\n * These variables can be used in custom grader templates with {{ variable_name }} syntax.\n *\n * Primary variables:\n * - {{ input }} — input as plain text (single-turn) or role-prefixed conversation (multi-turn)\n * - {{ output }} — last assistant message as plain text\n * - {{ expected_output }} — reference answer as plain text\n * - {{ criteria }} — evaluation criteria string\n * - {{ file_changes }} — file diff (if available)\n * - {{ tool_calls }} — formatted summary of tool calls from agent execution\n *\n * Deprecated aliases (emit a warning when used in custom templates):\n * - {{ input_text }} → use {{ input }}\n * - {{ output_text }} → use {{ output }}\n * - {{ expected_output_text }} → use {{ expected_output }}\n */\nexport const TEMPLATE_VARIABLES = {\n EXPECTED_OUTPUT: 'expected_output',\n CRITERIA: 'criteria',\n INPUT: 'input',\n OUTPUT: 'output',\n FILE_CHANGES: 'file_changes',\n TOOL_CALLS: 'tool_calls',\n /** @deprecated Use INPUT instead — resolves to the same text value. */\n INPUT_TEXT: 'input_text',\n /** @deprecated Use OUTPUT instead — resolves to the same text value. */\n OUTPUT_TEXT: 'output_text',\n /** @deprecated Use EXPECTED_OUTPUT instead — resolves to the same text value. */\n EXPECTED_OUTPUT_TEXT: 'expected_output_text',\n} as const;\n\n/**\n * Type representing all valid template variable names.\n */\nexport type TemplateVariable = (typeof TEMPLATE_VARIABLES)[keyof typeof TEMPLATE_VARIABLES];\n\n/**\n * Set of all valid template variable names for runtime validation.\n */\nexport const VALID_TEMPLATE_VARIABLES = new Set<string>(Object.values(TEMPLATE_VARIABLES));\n\n/**\n * Template variables that are required for meaningful evaluation.\n * At least one of these should be present in a custom grader template.\n */\nexport const REQUIRED_TEMPLATE_VARIABLES = new Set<string>([\n TEMPLATE_VARIABLES.OUTPUT,\n TEMPLATE_VARIABLES.EXPECTED_OUTPUT,\n]);\n\n/**\n * Deprecated template variable names that still work but trigger a warning.\n * Maps deprecated name → replacement name.\n */\nexport const DEPRECATED_TEMPLATE_VARIABLES: ReadonlyMap<string, string> = new Map([\n [TEMPLATE_VARIABLES.INPUT_TEXT, TEMPLATE_VARIABLES.INPUT],\n [TEMPLATE_VARIABLES.OUTPUT_TEXT, TEMPLATE_VARIABLES.OUTPUT],\n [TEMPLATE_VARIABLES.EXPECTED_OUTPUT_TEXT, TEMPLATE_VARIABLES.EXPECTED_OUTPUT],\n]);\n","import { extractLastAssistantContent } from '../providers/types.js';\nimport type {\n AssertionEntry,\n CompositeAggregatorConfig,\n CompositeGraderConfig,\n JsonObject,\n} from '../types.js';\nimport { executeScript } from './code-grader.js';\nimport { buildOutputSchema, freeformEvaluationSchema } from './llm-grader.js';\nimport { clampScore, parseJsonFromText, parseJsonSafe, scoreToVerdict } from './scoring.js';\nimport type {\n ChildGraderResult,\n EvaluationContext,\n EvaluationScore,\n Grader,\n GraderFactory,\n} from './types.js';\n\ninterface MemberResult {\n readonly id: string;\n readonly type: string;\n readonly result: EvaluationScore;\n}\n\nconst DEFAULT_COMPOSITE_AGGREGATOR_PROMPT = `Review the following evaluation results:\n{{EVALUATOR_RESULTS_JSON}}\n\nDecide the final score and verdict based on all grader results.\nReturn a JSON object with: score (0.0-1.0), verdict (pass/fail), and reasoning.`;\n\nexport interface CompositeGraderOptions {\n readonly config: CompositeGraderConfig;\n readonly evaluatorFactory: GraderFactory;\n readonly cwd?: string;\n}\n\nexport class CompositeGrader implements Grader {\n readonly kind = 'composite';\n\n private readonly config: CompositeGraderConfig;\n private readonly evaluatorFactory: GraderFactory;\n private readonly cwd?: string;\n\n constructor(options: CompositeGraderOptions) {\n this.config = options.config;\n this.evaluatorFactory = options.evaluatorFactory;\n this.cwd = options.cwd;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n // 1. Instantiate and run evaluators in parallel\n const memberResults = await Promise.all(\n this.config.assertions.map(async (memberConfig) => {\n const evaluator = this.evaluatorFactory.create(memberConfig, context);\n return {\n id: memberConfig.name,\n type: memberConfig.type,\n result: await evaluator.evaluate(context),\n };\n }),\n );\n\n // 2. Aggregate results\n return this.aggregate(memberResults, context);\n }\n\n private async aggregate(\n results: readonly MemberResult[],\n context: EvaluationContext,\n ): Promise<EvaluationScore> {\n const aggregator = this.config.aggregator;\n\n switch (aggregator.type) {\n case 'code-grader':\n return this.runCodeAggregator(results, aggregator.path, aggregator.cwd ?? this.cwd);\n case 'llm-grader':\n return this.runLlmAggregator(results, context, aggregator);\n case 'threshold':\n return this.runThreshold(results, aggregator.threshold);\n default:\n return this.runWeightedAverage(results, aggregator.weights);\n }\n }\n\n private runWeightedAverage(\n results: readonly MemberResult[],\n weights?: Record<string, number>,\n ): EvaluationScore {\n let totalWeight = 0;\n let weightedSum = 0;\n let evaluatedCount = 0;\n const allAssertions: AssertionEntry[] = [];\n const scores: ChildGraderResult[] = [];\n\n for (const member of results) {\n const weight = weights?.[member.id] ?? 1.0;\n\n // Always build child result entry for observability\n scores.push({\n name: member.id,\n type: member.type,\n score: member.result.score,\n weight,\n verdict: member.result.verdict,\n assertions: [...member.result.assertions],\n graderRawRequest: member.result.graderRawRequest,\n scores: member.result.scores,\n details: member.result.details,\n tokenUsage: member.result.tokenUsage,\n });\n\n // Skip-verdict members excluded from aggregation\n if (member.result.verdict === 'skip') {\n continue;\n }\n\n evaluatedCount++;\n totalWeight += weight;\n weightedSum += member.result.score * weight;\n allAssertions.push(\n ...member.result.assertions.map((a) => ({ ...a, text: `[${member.id}] ${a.text}` })),\n );\n }\n\n // If all members skipped, propagate skip verdict\n if (evaluatedCount === 0 && results.length > 0) {\n return {\n score: 0,\n verdict: 'skip' as const,\n assertions: [{ text: 'All evaluators skipped (infrastructure failure)', passed: false }],\n expectedAspectCount: 1,\n graderRawRequest: {\n aggregator: 'weighted_average',\n ...(weights ? { weights } : {}),\n },\n scores,\n };\n }\n\n const finalScore = totalWeight > 0 ? weightedSum / totalWeight : 0;\n\n return {\n score: clampScore(finalScore),\n verdict: scoreToVerdict(finalScore),\n assertions: allAssertions,\n expectedAspectCount: allAssertions.length || 1,\n graderRawRequest: {\n aggregator: 'weighted_average',\n ...(weights ? { weights } : {}),\n },\n scores,\n };\n }\n\n private runThreshold(results: readonly MemberResult[], threshold: number): EvaluationScore {\n const scores: ChildGraderResult[] = [];\n const allAssertions: AssertionEntry[] = [];\n let passingCount = 0;\n let evaluatedCount = 0;\n\n for (const member of results) {\n // Always add to scores for observability\n scores.push({\n name: member.id,\n type: member.type,\n score: member.result.score,\n verdict: member.result.verdict,\n assertions: [...member.result.assertions],\n graderRawRequest: member.result.graderRawRequest,\n scores: member.result.scores,\n details: member.result.details,\n tokenUsage: member.result.tokenUsage,\n });\n\n // Skip-verdict members excluded from aggregation\n if (member.result.verdict === 'skip') {\n continue;\n }\n\n evaluatedCount++;\n const isPassing = member.result.verdict === 'pass';\n if (isPassing) {\n passingCount++;\n }\n\n allAssertions.push(\n ...member.result.assertions.map((a) => ({ ...a, text: `[${member.id}] ${a.text}` })),\n );\n }\n\n // If all members skipped, propagate skip verdict\n if (evaluatedCount === 0 && results.length > 0) {\n return {\n score: 0,\n verdict: 'skip' as const,\n assertions: [{ text: 'All evaluators skipped (infrastructure failure)', passed: false }],\n expectedAspectCount: 1,\n graderRawRequest: {\n aggregator: 'threshold',\n threshold,\n },\n scores,\n };\n }\n\n const totalCount = evaluatedCount;\n const score = totalCount > 0 ? passingCount / totalCount : 0;\n const pass = score >= threshold;\n\n allAssertions.unshift({\n text: `${passingCount}/${totalCount} evaluators passed (threshold: ${threshold})`,\n passed: pass,\n });\n\n return {\n score: clampScore(score),\n verdict: pass ? 'pass' : 'fail',\n assertions: allAssertions,\n expectedAspectCount: allAssertions.length || 1,\n graderRawRequest: {\n aggregator: 'threshold',\n threshold,\n },\n scores,\n };\n }\n\n private async runCodeAggregator(\n results: readonly MemberResult[],\n scriptPath: string,\n cwd?: string,\n weights?: Record<string, number>,\n ): Promise<EvaluationScore> {\n const resultsObject = Object.fromEntries(results.map((r) => [r.id, r.result]));\n const inputPayload = JSON.stringify({ results: resultsObject }, null, 2);\n\n // Build child results for output\n const scores: ChildGraderResult[] = results.map((member) => ({\n name: member.id,\n type: member.type,\n score: member.result.score,\n weight: weights?.[member.id] ?? 1.0,\n verdict: member.result.verdict,\n assertions: [...member.result.assertions],\n graderRawRequest: member.result.graderRawRequest,\n scores: member.result.scores,\n details: member.result.details,\n }));\n\n try {\n const stdout = await executeScript(scriptPath, inputPayload, undefined, cwd);\n const parsed = parseJsonSafe(stdout);\n const score = clampScore(typeof parsed?.score === 'number' ? parsed.score : 0);\n const assertions: AssertionEntry[] = Array.isArray(parsed?.assertions)\n ? parsed.assertions\n .filter(\n (a: unknown): a is { text: string; passed: boolean; evidence?: string } =>\n typeof a === 'object' &&\n a !== null &&\n typeof (a as Record<string, unknown>).text === 'string',\n )\n .map((a) => ({\n text: String(a.text),\n passed: Boolean(a.passed),\n ...(typeof a.evidence === 'string' ? { evidence: a.evidence } : {}),\n }))\n : [];\n const verdict =\n typeof parsed?.verdict === 'string' &&\n (parsed.verdict === 'pass' || parsed.verdict === 'fail')\n ? parsed.verdict\n : scoreToVerdict(score);\n\n return {\n score,\n verdict,\n assertions,\n expectedAspectCount: assertions.length || 1,\n graderRawRequest: {\n aggregator: 'code-grader',\n script: scriptPath,\n },\n scores,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n score: 0,\n verdict: 'fail',\n assertions: [{ text: `Code aggregator failed: ${message}`, passed: false }],\n expectedAspectCount: 1,\n graderRawRequest: {\n aggregator: 'code-grader',\n script: scriptPath,\n error: message,\n },\n scores,\n };\n }\n }\n\n private async runLlmAggregator(\n results: readonly MemberResult[],\n context: EvaluationContext,\n config: Extract<CompositeAggregatorConfig, { type: 'llm-grader' }>,\n ): Promise<EvaluationScore> {\n const graderProvider = context.graderProvider;\n if (!graderProvider) {\n throw new Error('No grader provider available for LLM aggregation');\n }\n\n const resultsObject = Object.fromEntries(results.map((r) => [r.id, r.result]));\n const resultsJson = JSON.stringify(resultsObject, null, 2);\n\n // Build child results for output\n const scores: ChildGraderResult[] = results.map((member) => ({\n name: member.id,\n type: member.type,\n score: member.result.score,\n verdict: member.result.verdict,\n assertions: [...member.result.assertions],\n graderRawRequest: member.result.graderRawRequest,\n scores: member.result.scores,\n details: member.result.details,\n }));\n\n // Use custom prompt if provided, otherwise use default\n const promptTemplate = config.prompt ?? DEFAULT_COMPOSITE_AGGREGATOR_PROMPT;\n const userPrompt = promptTemplate.replace(/\\{\\{EVALUATOR_RESULTS_JSON\\}\\}/g, resultsJson);\n\n const systemPrompt = buildOutputSchema();\n\n const graderRawRequest: JsonObject = {\n aggregator: 'llm-grader',\n userPrompt,\n systemPrompt,\n target: graderProvider.targetName,\n };\n\n try {\n const response = await graderProvider.invoke({\n question: userPrompt,\n systemPrompt,\n evalCaseId: context.evalCase.id,\n attempt: context.attempt,\n });\n\n const data = freeformEvaluationSchema.parse(\n parseJsonFromText(extractLastAssistantContent(response.output)),\n );\n const score = clampScore(data.score);\n const assertions: AssertionEntry[] = Array.isArray(data.assertions)\n ? data.assertions.slice(0, 8)\n : [];\n\n return {\n score,\n verdict: scoreToVerdict(score),\n assertions,\n expectedAspectCount: Math.max(assertions.length, 1),\n graderRawRequest,\n scores,\n };\n } catch {\n return {\n score: 0,\n verdict: 'fail',\n assertions: [{ text: 'LLM aggregator failed', passed: false }],\n expectedAspectCount: 1,\n graderRawRequest,\n scores,\n };\n }\n }\n}\n","import type { CostGraderConfig } from '../types.js';\nimport type { EvaluationContext, EvaluationScore, Grader } from './types.js';\n\nexport interface CostGraderOptions {\n readonly config: CostGraderConfig;\n}\n\n/**\n * Grader that checks execution cost against a budget.\n * Uses costUsd from the evaluation context.\n */\nexport class CostGrader implements Grader {\n readonly kind = 'cost';\n\n private readonly config: CostGraderConfig;\n\n constructor(options: CostGraderOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { budget } = this.config;\n const costUsd = context.costUsd;\n\n // If no cost data available, we can't evaluate\n if (costUsd === undefined) {\n return {\n score: 0,\n verdict: 'fail',\n assertions: [{ text: 'No cost data available in trace', passed: false }],\n expectedAspectCount: 1,\n graderRawRequest: {\n type: 'cost',\n budget,\n costUsd: null,\n },\n };\n }\n\n const passed = costUsd <= budget;\n const score = passed ? 1 : 0;\n\n // Format cost for display\n const formatCost = (n: number) => `$${n.toFixed(4)}`;\n\n return {\n score,\n verdict: passed ? 'pass' : 'fail',\n assertions: [\n passed\n ? { text: `Cost ${formatCost(costUsd)} <= ${formatCost(budget)} budget`, passed: true }\n : { text: `Cost ${formatCost(costUsd)} > ${formatCost(budget)} budget`, passed: false },\n ],\n expectedAspectCount: 1,\n graderRawRequest: {\n type: 'cost',\n budget,\n costUsd,\n },\n };\n }\n}\n","/**\n * Trace event types for capturing agent execution traces.\n * Provides a normalized, provider-agnostic model for tool-call trajectories.\n */\n\n/**\n * Token usage metrics from provider execution.\n */\nexport interface TokenUsage {\n /** Input/prompt tokens consumed */\n readonly input: number;\n /** Output/completion tokens generated */\n readonly output: number;\n /** Cached tokens (optional, provider-specific) */\n readonly cached?: number;\n /** Reasoning/thinking tokens (optional, provider-specific) */\n readonly reasoning?: number;\n}\n\n/**\n * Compact summary of a trace for lightweight persistence.\n * Included in results by default to avoid payload bloat.\n */\nexport interface TraceSummary {\n /** Total number of events in trace */\n readonly eventCount: number;\n /** Map of tool name to call count */\n readonly toolCalls: Readonly<Record<string, number>>;\n /** Number of error events */\n readonly errorCount: number;\n /** Per-tool duration arrays in milliseconds (optional) */\n readonly toolDurations?: Readonly<Record<string, readonly number[]>>;\n /** Number of LLM calls (assistant messages) */\n readonly llmCallCount?: number;\n}\n\n/**\n * Combined result of trace computation + execution metrics merge.\n * Returned by computeTraceSummaryWithMetrics().\n */\nexport interface TraceComputeResult {\n readonly trace: TraceSummary;\n readonly tokenUsage?: TokenUsage;\n readonly costUsd?: number;\n readonly durationMs?: number;\n readonly startTime?: string;\n readonly endTime?: string;\n}\n\n/**\n * Argument matching mode for tool-trajectory expected items.\n * - 'exact': bidirectional deep equality, no extra keys allowed (default)\n * - 'superset': actual args must contain all expected keys (extras OK)\n * - 'subset': actual args must be a subset of expected keys (no unexpected keys)\n * - 'ignore': skip argument checking entirely\n */\nexport type ArgsMatchMode = 'exact' | 'ignore' | 'subset' | 'superset';\n\n/**\n * Configuration for tool-trajectory evaluator.\n */\nexport interface ToolTrajectoryGraderConfig {\n readonly name: string;\n readonly type: 'tool-trajectory';\n /** Matching mode */\n readonly mode: 'any_order' | 'in_order' | 'exact' | 'subset' | 'superset';\n /** Minimum call counts per tool (for any_order mode) */\n readonly minimums?: Readonly<Record<string, number>>;\n /** Expected tool sequence (for in_order/exact/subset/superset modes) */\n readonly expected?: readonly ToolTrajectoryExpectedItem[];\n /** Optional weight for top-level aggregation (defaults to 1.0) */\n readonly weight?: number;\n readonly required?: boolean | number;\n /** Minimum score (0-1) for this evaluator to pass. Independent of `required` gate. */\n readonly min_score?: number;\n /** When true, inverts the grader score (1 - score) and swaps pass/fail verdict */\n readonly negate?: boolean;\n /** Default argument matching mode for all expected items (defaults to 'exact') */\n readonly argsMatch?: ArgsMatchMode | readonly string[];\n}\n\n/**\n * Expected tool call item in a trajectory sequence.\n */\nexport interface ToolTrajectoryExpectedItem {\n readonly tool: string;\n /** Optional argument matching: 'any' skips validation, object performs partial deep equality */\n readonly args?: 'any' | Record<string, unknown>;\n /** Optional maximum duration in milliseconds for latency assertions */\n readonly maxDurationMs?: number;\n /** Per-item argument matching mode override (takes precedence over evaluator-level argsMatch) */\n readonly argsMatch?: ArgsMatchMode | readonly string[];\n}\n\n/**\n * Simplified input type for computeTraceSummary.\n * Matches Message structure without requiring full provider/types import.\n */\ninterface MessageLike {\n readonly role?: string;\n readonly startTime?: string;\n readonly endTime?: string;\n readonly toolCalls?: readonly {\n readonly tool: string;\n readonly startTime?: string;\n readonly endTime?: string;\n readonly durationMs?: number;\n }[];\n}\n\n/**\n * Compute a lightweight summary from output messages.\n * Used for default result persistence without payload bloat.\n *\n * Derives timing information from span boundaries:\n * - startTime: earliest startTime across all messages and tool calls\n * - endTime: latest endTime across all messages and tool calls\n * - toolDurations: per-tool duration arrays (from durationMs or computed from start/end)\n * - llmCallCount: count of assistant messages\n */\nexport function computeTraceSummary(messages: readonly MessageLike[]): TraceComputeResult {\n const toolCallCounts: Record<string, number> = {};\n const toolDurations: Record<string, number[]> = {};\n let totalToolCalls = 0;\n let llmCallCount = 0;\n let earliestStart: Date | undefined;\n let latestEnd: Date | undefined;\n let hasAnyDuration = false;\n\n for (const message of messages) {\n // Count assistant messages as LLM calls\n if (message.role === 'assistant') {\n llmCallCount++;\n }\n\n // Track message timing boundaries\n if (message.startTime) {\n const startDate = new Date(message.startTime);\n if (!earliestStart || startDate < earliestStart) {\n earliestStart = startDate;\n }\n }\n if (message.endTime) {\n const endDate = new Date(message.endTime);\n if (!latestEnd || endDate > latestEnd) {\n latestEnd = endDate;\n }\n }\n\n if (!message.toolCalls) continue;\n\n for (const toolCall of message.toolCalls) {\n toolCallCounts[toolCall.tool] = (toolCallCounts[toolCall.tool] ?? 0) + 1;\n totalToolCalls++;\n\n // Track tool call timing boundaries\n if (toolCall.startTime) {\n const startDate = new Date(toolCall.startTime);\n if (!earliestStart || startDate < earliestStart) {\n earliestStart = startDate;\n }\n }\n if (toolCall.endTime) {\n const endDate = new Date(toolCall.endTime);\n if (!latestEnd || endDate > latestEnd) {\n latestEnd = endDate;\n }\n }\n\n // Compute tool duration\n let duration: number | undefined = toolCall.durationMs;\n if (duration === undefined && toolCall.startTime && toolCall.endTime) {\n const start = new Date(toolCall.startTime).getTime();\n const end = new Date(toolCall.endTime).getTime();\n duration = end - start;\n }\n\n if (duration !== undefined) {\n hasAnyDuration = true;\n if (!toolDurations[toolCall.tool]) {\n toolDurations[toolCall.tool] = [];\n }\n toolDurations[toolCall.tool].push(duration);\n }\n }\n }\n\n return {\n trace: {\n eventCount: totalToolCalls,\n toolCalls: toolCallCounts,\n errorCount: 0,\n llmCallCount,\n ...(hasAnyDuration ? { toolDurations } : {}),\n },\n startTime: earliestStart?.toISOString(),\n endTime: latestEnd?.toISOString(),\n };\n}\n\n/**\n * Default tool names considered as exploration/read-only operations.\n * Can be overridden per-evaluation via config.\n */\nexport const DEFAULT_EXPLORATION_TOOLS = [\n 'read',\n 'grep',\n 'glob',\n 'search',\n 'list',\n 'Read',\n 'Grep',\n 'Glob',\n 'WebSearch',\n 'WebFetch',\n] as const;\n\n/**\n * Ratio of exploration tool calls to total tool calls.\n * Returns undefined if there are no tool calls.\n *\n * @param summary - Trace summary with tool call counts\n * @param explorationTools - Tool names considered exploration (defaults to DEFAULT_EXPLORATION_TOOLS)\n * @returns Ratio between 0 and 1, or undefined if no tool calls\n */\nexport function explorationRatio(\n summary: TraceSummary,\n explorationTools: readonly string[] = DEFAULT_EXPLORATION_TOOLS,\n): number | undefined {\n if (summary.eventCount === 0) return undefined;\n\n const explorationCalls = explorationTools.reduce(\n (sum, tool) => sum + (summary.toolCalls[tool] ?? 0),\n 0,\n );\n\n return explorationCalls / summary.eventCount;\n}\n\n/**\n * Average tokens consumed per tool call.\n * Returns undefined if tokenUsage is not available or no tool calls.\n *\n * @param summary - Trace summary with optional token usage\n * @returns Average tokens per tool call, or undefined\n */\nexport function tokensPerTool(summary: TraceSummary, tokenUsage?: TokenUsage): number | undefined {\n if (!tokenUsage || summary.eventCount === 0) return undefined;\n\n const totalTokens = tokenUsage.input + tokenUsage.output;\n return totalTokens / summary.eventCount;\n}\n\n/**\n * Average tool duration across all tool calls.\n * Returns undefined if toolDurations is not available or empty.\n *\n * @param summary - Trace summary with optional tool durations\n * @returns Average duration in milliseconds, or undefined\n */\nexport function avgToolDurationMs(summary: TraceSummary): number | undefined {\n if (!summary.toolDurations) return undefined;\n\n let totalDuration = 0;\n let totalCalls = 0;\n\n for (const durations of Object.values(summary.toolDurations)) {\n for (const duration of durations) {\n totalDuration += duration;\n totalCalls++;\n }\n }\n\n if (totalCalls === 0) return undefined;\n return totalDuration / totalCalls;\n}\n\n/**\n * Execution metrics from provider response.\n */\nexport interface ExecutionMetrics {\n readonly tokenUsage?: TokenUsage;\n readonly costUsd?: number;\n readonly durationMs?: number;\n /** ISO 8601 timestamp when execution started */\n readonly startTime?: string;\n /** ISO 8601 timestamp when execution ended */\n readonly endTime?: string;\n}\n\n/**\n * Merge execution metrics from provider response into a trace compute result.\n * Returns a new TraceComputeResult with metrics fields populated.\n * Provider-level timing takes precedence over span-derived timing.\n *\n * @param computed - Base trace compute result from computeTraceSummary\n * @param metrics - Optional execution metrics from provider\n * @returns TraceComputeResult with merged metrics\n */\nexport function mergeExecutionMetrics(\n computed: TraceComputeResult,\n metrics?: ExecutionMetrics,\n): TraceComputeResult {\n if (!metrics) return computed;\n\n return {\n trace: computed.trace,\n tokenUsage: metrics.tokenUsage,\n costUsd: metrics.costUsd,\n durationMs: metrics.durationMs,\n startTime: metrics.startTime ?? computed.startTime,\n endTime: metrics.endTime ?? computed.endTime,\n };\n}\n","import { explorationRatio } from '../trace.js';\nimport type { AssertionEntry, ExecutionMetricsGraderConfig } from '../types.js';\nimport { scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Grader } from './types.js';\n\nexport interface ExecutionMetricsGraderOptions {\n readonly config: ExecutionMetricsGraderConfig;\n}\n\n/**\n * Grader that checks execution metrics against configured thresholds.\n * Supports multiple threshold types: tool calls, LLM calls, tokens, cost, duration,\n * and exploration ratio. Only specified thresholds are checked.\n *\n * Score is proportional: passed / total assertions\n */\nexport class ExecutionMetricsGrader implements Grader {\n readonly kind = 'execution-metrics';\n\n private readonly config: ExecutionMetricsGraderConfig;\n\n constructor(options: ExecutionMetricsGraderOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { trace, tokenUsage, costUsd, durationMs } = context;\n const {\n max_tool_calls,\n max_llm_calls,\n max_tokens,\n max_cost_usd,\n max_duration_ms,\n target_exploration_ratio,\n exploration_tolerance = 0.2,\n } = this.config;\n\n // Guard: need trace for tool-specific checks\n const needsTrace =\n max_tool_calls !== undefined ||\n max_llm_calls !== undefined ||\n target_exploration_ratio !== undefined;\n if (needsTrace && !trace) {\n return {\n score: 0,\n verdict: 'fail',\n assertions: [{ text: 'No trace summary available', passed: false }],\n expectedAspectCount: 1,\n graderRawRequest: {\n type: 'execution-metrics',\n config: this.extractConfiguredThresholds(),\n actual: null,\n },\n };\n }\n\n // After the guard, trace is guaranteed to be defined when needed\n const narrowedTrace = trace;\n\n const assertions: AssertionEntry[] = [];\n const actualMetrics: Record<string, number | undefined> = {};\n\n // Check max_tool_calls\n if (max_tool_calls !== undefined && narrowedTrace) {\n const toolCalls = narrowedTrace.eventCount;\n actualMetrics.tool_calls = toolCalls;\n\n if (toolCalls <= max_tool_calls) {\n assertions.push({ text: `Tool calls ${toolCalls} <= ${max_tool_calls} max`, passed: true });\n } else {\n assertions.push({ text: `Tool calls ${toolCalls} > ${max_tool_calls} max`, passed: false });\n }\n }\n\n // Check max_llm_calls\n if (max_llm_calls !== undefined && narrowedTrace) {\n const llmCalls = narrowedTrace.llmCallCount;\n\n if (llmCalls === undefined) {\n assertions.push({ text: 'LLM call count data not available', passed: false });\n } else {\n actualMetrics.llm_calls = llmCalls;\n\n if (llmCalls <= max_llm_calls) {\n assertions.push({ text: `LLM calls ${llmCalls} <= ${max_llm_calls} max`, passed: true });\n } else {\n assertions.push({ text: `LLM calls ${llmCalls} > ${max_llm_calls} max`, passed: false });\n }\n }\n }\n\n // Check max_tokens\n if (max_tokens !== undefined) {\n if (!tokenUsage) {\n assertions.push({ text: 'Token usage data not available', passed: false });\n } else {\n const totalTokens = tokenUsage.input + tokenUsage.output;\n actualMetrics.tokens = totalTokens;\n\n if (totalTokens <= max_tokens) {\n assertions.push({\n text: `Total tokens ${totalTokens} <= ${max_tokens} max`,\n passed: true,\n });\n } else {\n assertions.push({\n text: `Total tokens ${totalTokens} > ${max_tokens} max`,\n passed: false,\n });\n }\n }\n }\n\n // Check max_cost_usd\n if (max_cost_usd !== undefined) {\n if (costUsd === undefined) {\n assertions.push({ text: 'Cost data not available', passed: false });\n } else {\n actualMetrics.cost_usd = costUsd;\n\n const formatCost = (n: number) => `$${n.toFixed(4)}`;\n if (costUsd <= max_cost_usd) {\n assertions.push({\n text: `Cost ${formatCost(costUsd)} <= ${formatCost(max_cost_usd)} max`,\n passed: true,\n });\n } else {\n assertions.push({\n text: `Cost ${formatCost(costUsd)} > ${formatCost(max_cost_usd)} max`,\n passed: false,\n });\n }\n }\n }\n\n // Check max_duration_ms\n if (max_duration_ms !== undefined) {\n if (durationMs === undefined) {\n assertions.push({ text: 'Duration data not available', passed: false });\n } else {\n actualMetrics.duration_ms = durationMs;\n\n if (durationMs <= max_duration_ms) {\n assertions.push({\n text: `Duration ${durationMs}ms <= ${max_duration_ms}ms max`,\n passed: true,\n });\n } else {\n assertions.push({\n text: `Duration ${durationMs}ms > ${max_duration_ms}ms max`,\n passed: false,\n });\n }\n }\n }\n\n // Check target_exploration_ratio\n if (target_exploration_ratio !== undefined && narrowedTrace) {\n const ratio = explorationRatio(narrowedTrace);\n\n if (ratio === undefined) {\n assertions.push({ text: 'Exploration ratio not available (no tool calls)', passed: false });\n } else {\n actualMetrics.exploration_ratio = ratio;\n\n const diff = Math.abs(ratio - target_exploration_ratio);\n if (diff <= exploration_tolerance) {\n assertions.push({\n text: `Exploration ratio ${ratio.toFixed(2)} within tolerance of target ${target_exploration_ratio}`,\n passed: true,\n });\n } else {\n assertions.push({\n text: `Exploration ratio ${ratio.toFixed(2)} outside tolerance of target ${target_exploration_ratio} (diff: ${diff.toFixed(2)}, tolerance: ${exploration_tolerance})`,\n passed: false,\n });\n }\n }\n }\n\n // Calculate score as proportion of passed assertions\n const totalChecks = assertions.length;\n const passedCount = assertions.filter((a) => a.passed).length;\n const score = totalChecks > 0 ? passedCount / totalChecks : 0;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n assertions,\n expectedAspectCount: totalChecks || 1,\n graderRawRequest: {\n type: 'execution-metrics',\n config: this.extractConfiguredThresholds(),\n actual: this.filterDefinedMetrics(actualMetrics),\n },\n };\n }\n\n private extractConfiguredThresholds(): Record<string, number> {\n const thresholds: Record<string, number> = {};\n\n if (this.config.max_tool_calls !== undefined) {\n thresholds.max_tool_calls = this.config.max_tool_calls;\n }\n if (this.config.max_llm_calls !== undefined) {\n thresholds.max_llm_calls = this.config.max_llm_calls;\n }\n if (this.config.max_tokens !== undefined) {\n thresholds.max_tokens = this.config.max_tokens;\n }\n if (this.config.max_cost_usd !== undefined) {\n thresholds.max_cost_usd = this.config.max_cost_usd;\n }\n if (this.config.max_duration_ms !== undefined) {\n thresholds.max_duration_ms = this.config.max_duration_ms;\n }\n if (this.config.target_exploration_ratio !== undefined) {\n thresholds.target_exploration_ratio = this.config.target_exploration_ratio;\n thresholds.exploration_tolerance = this.config.exploration_tolerance ?? 0.2;\n }\n\n return thresholds;\n }\n\n private filterDefinedMetrics(\n metrics: Record<string, number | undefined>,\n ): Record<string, number> | null {\n const defined: Record<string, number> = {};\n let hasAny = false;\n\n for (const [key, value] of Object.entries(metrics)) {\n if (value !== undefined) {\n defined[key] = value;\n hasAny = true;\n }\n }\n\n return hasAny ? defined : null;\n }\n}\n","import type {\n AssertionEntry,\n FieldAccuracyGraderConfig,\n FieldConfig,\n JsonObject,\n} from '../types.js';\nimport { clampScore, deepEqual, parseJsonFromText, scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Grader } from './types.js';\n\n/** Result from evaluating a single field */\ninterface FieldResult {\n readonly path: string;\n readonly score: number;\n readonly weight: number;\n readonly hit: boolean;\n readonly message: string;\n}\n\n/**\n * Default date formats to try when parsing dates.\n * Ordered from most specific to least specific.\n */\nconst DEFAULT_DATE_FORMATS = [\n 'YYYY-MM-DDTHH:mm:ssZ', // ISO with timezone\n 'YYYY-MM-DDTHH:mm:ss', // ISO with time\n 'YYYY-MM-DD', // ISO date\n 'DD-MMM-YYYY', // Localized (e.g., \"15-JAN-2025\")\n 'MM/DD/YYYY', // US format\n 'DD/MM/YYYY', // EU format\n 'MM-DD-YYYY', // US with dashes\n 'DD-MM-YYYY', // EU with dashes\n];\n\n/**\n * Month name mappings for parsing localized dates.\n */\nconst MONTH_NAMES: Record<string, number> = {\n jan: 0,\n january: 0,\n feb: 1,\n february: 1,\n mar: 2,\n march: 2,\n apr: 3,\n april: 3,\n may: 4,\n jun: 5,\n june: 5,\n jul: 6,\n july: 6,\n aug: 7,\n august: 7,\n sep: 8,\n sept: 8,\n september: 8,\n oct: 9,\n october: 9,\n nov: 10,\n november: 10,\n dec: 11,\n december: 11,\n};\n\nexport interface FieldAccuracyGraderOptions {\n readonly config: FieldAccuracyGraderConfig;\n}\n\n/**\n * FieldAccuracyGrader compares extracted structured data against expected values\n * with configurable matching strategies (exact, fuzzy, numeric_tolerance, date).\n */\nexport class FieldAccuracyGrader implements Grader {\n readonly kind = 'field-accuracy';\n\n private readonly config: FieldAccuracyGraderConfig;\n\n constructor(options: FieldAccuracyGraderOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { evalCase, candidate } = context;\n\n // Parse candidate answer as JSON\n let candidateData: Record<string, unknown>;\n try {\n candidateData = parseJsonFromTextSafe(candidate);\n } catch {\n return {\n score: 0,\n verdict: 'fail',\n assertions: [{ text: 'Failed to parse candidate answer as JSON', passed: false }],\n expectedAspectCount: this.config.fields.length,\n };\n }\n\n // Extract expected data from expected_output\n const expectedData = this.extractExpectedData(evalCase.expected_output);\n if (!expectedData) {\n return {\n score: 0,\n verdict: 'fail',\n assertions: [{ text: 'No expected data found in expected_output', passed: false }],\n expectedAspectCount: this.config.fields.length,\n };\n }\n\n // Evaluate each field\n const fieldResults: FieldResult[] = [];\n for (const fieldConfig of this.config.fields) {\n const result = this.evaluateField(fieldConfig, candidateData, expectedData);\n fieldResults.push(result);\n }\n\n // Aggregate results\n return this.aggregateResults(fieldResults);\n }\n\n /**\n * Extract expected data from expected_output array.\n * Looks for the last assistant message with content.\n */\n private extractExpectedData(\n expectedMessages: readonly JsonObject[],\n ): Record<string, unknown> | undefined {\n // Find the last assistant message with content\n for (let i = expectedMessages.length - 1; i >= 0; i--) {\n const message = expectedMessages[i];\n if (message.role === 'assistant' && message.content) {\n if (typeof message.content === 'object' && message.content !== null) {\n return message.content as Record<string, unknown>;\n }\n // If content is a string, try to parse it as JSON\n if (typeof message.content === 'string') {\n try {\n return parseJsonFromTextSafe(message.content);\n } catch {\n // Parsing failed, continue to next message\n }\n }\n }\n }\n return undefined;\n }\n\n /**\n * Evaluate a single field against the expected value.\n */\n private evaluateField(\n fieldConfig: FieldConfig,\n candidateData: Record<string, unknown>,\n expectedData: Record<string, unknown>,\n ): FieldResult {\n const { path, match, required = true, weight = 1.0 } = fieldConfig;\n\n const candidateValue = resolvePath(candidateData, path);\n const expectedValue = resolvePath(expectedData, path);\n\n // Handle missing expected value\n if (expectedValue === undefined) {\n // If the expected value is missing, we can't compare\n return {\n path,\n score: 1.0, // No expected value means no comparison needed\n weight,\n hit: true,\n message: `${path}: no expected value`,\n };\n }\n\n // Handle missing candidate value\n if (candidateValue === undefined) {\n if (required) {\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (required, missing)`,\n };\n }\n // Optional field missing - don't count in aggregation\n return {\n path,\n score: 1.0, // Don't penalize missing optional fields\n weight: 0, // Zero weight means it won't affect the score\n hit: true,\n message: `${path}: optional field missing`,\n };\n }\n\n // Compare based on match type\n switch (match) {\n case 'exact':\n return this.compareExact(path, candidateValue, expectedValue, weight);\n case 'numeric_tolerance':\n return this.compareNumericTolerance(\n path,\n candidateValue,\n expectedValue,\n fieldConfig,\n weight,\n );\n case 'date':\n return this.compareDate(path, candidateValue, expectedValue, fieldConfig, weight);\n default:\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path}: unknown match type \"${match}\"`,\n };\n }\n }\n\n /**\n * Exact equality comparison.\n */\n private compareExact(\n path: string,\n candidateValue: unknown,\n expectedValue: unknown,\n weight: number,\n ): FieldResult {\n // Deep equality for objects and arrays\n if (deepEqual(candidateValue, expectedValue)) {\n return {\n path,\n score: 1.0,\n weight,\n hit: true,\n message: path,\n };\n }\n\n // Type mismatch\n if (typeof candidateValue !== typeof expectedValue) {\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (type mismatch: got ${typeof candidateValue}, expected ${typeof expectedValue})`,\n };\n }\n\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (value mismatch)`,\n };\n }\n\n /**\n * Numeric comparison with absolute or relative tolerance.\n */\n private compareNumericTolerance(\n path: string,\n candidateValue: unknown,\n expectedValue: unknown,\n fieldConfig: FieldConfig,\n weight: number,\n ): FieldResult {\n const { tolerance = 0, relative = false } = fieldConfig;\n\n const candidateNum = toNumber(candidateValue);\n const expectedNum = toNumber(expectedValue);\n\n if (candidateNum === null || expectedNum === null) {\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (non-numeric value)`,\n };\n }\n\n if (!Number.isFinite(candidateNum) || !Number.isFinite(expectedNum)) {\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (invalid numeric value)`,\n };\n }\n\n const diff = Math.abs(candidateNum - expectedNum);\n let withinTolerance: boolean;\n\n if (relative) {\n // Relative tolerance: |actual - expected| / |expected| <= tolerance\n // Handle division by zero for expected === 0\n const relativeDiff = expectedNum === 0 ? diff : diff / Math.abs(expectedNum);\n withinTolerance = relativeDiff <= tolerance;\n } else {\n // Absolute tolerance: |actual - expected| <= tolerance\n withinTolerance = diff <= tolerance;\n }\n\n if (withinTolerance) {\n return {\n path,\n score: 1.0,\n weight,\n hit: true,\n message: `${path} (within tolerance: diff=${diff.toFixed(2)})`,\n };\n }\n\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (outside tolerance: diff=${diff.toFixed(2)}, tolerance=${tolerance})`,\n };\n }\n\n /**\n * Date comparison with format normalization.\n */\n private compareDate(\n path: string,\n candidateValue: unknown,\n expectedValue: unknown,\n fieldConfig: FieldConfig,\n weight: number,\n ): FieldResult {\n const formats = fieldConfig.formats ?? DEFAULT_DATE_FORMATS;\n\n const candidateDate = parseDate(String(candidateValue), formats);\n const expectedDate = parseDate(String(expectedValue), formats);\n\n if (candidateDate === null) {\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (unparseable candidate date)`,\n };\n }\n\n if (expectedDate === null) {\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (unparseable expected date)`,\n };\n }\n\n // Compare dates by year, month, and day (ignore time component)\n if (\n candidateDate.getFullYear() === expectedDate.getFullYear() &&\n candidateDate.getMonth() === expectedDate.getMonth() &&\n candidateDate.getDate() === expectedDate.getDate()\n ) {\n return {\n path,\n score: 1.0,\n weight,\n hit: true,\n message: path,\n };\n }\n\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (date mismatch: got ${formatDateISO(candidateDate)}, expected ${formatDateISO(expectedDate)})`,\n };\n }\n\n /**\n * Aggregate field results using configured strategy.\n */\n private aggregateResults(results: readonly FieldResult[]): EvaluationScore {\n const aggregation = this.config.aggregation ?? 'weighted_average';\n const assertions: AssertionEntry[] = [];\n\n for (const result of results) {\n assertions.push({ text: result.message, passed: result.hit });\n }\n\n let score: number;\n if (aggregation === 'all_or_nothing') {\n // All fields must pass for score 1.0\n const hasFailed = assertions.some((a) => !a.passed);\n score = hasFailed ? 0.0 : 1.0;\n } else {\n // weighted_average (default)\n const totalWeight = results.reduce((sum, r) => sum + r.weight, 0);\n if (totalWeight === 0) {\n score = results.length === 0 ? 1.0 : 0.0;\n } else {\n const weightedSum = results.reduce((sum, r) => sum + r.score * r.weight, 0);\n score = weightedSum / totalWeight;\n }\n }\n\n return {\n score: clampScore(score),\n verdict: scoreToVerdict(score),\n assertions,\n expectedAspectCount: results.length,\n };\n }\n}\n\n/**\n * Resolve a dot-notation path (with array indexing) to a value.\n * Example: \"invoice.line_items[0].amount\"\n */\nfunction resolvePath(obj: Record<string, unknown>, path: string): unknown {\n if (!path || !obj) {\n return undefined;\n }\n\n // Split on dots and array brackets\n const parts = path.split(/\\.|\\[|\\]/).filter((p) => p.length > 0);\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n\n if (typeof current !== 'object') {\n return undefined;\n }\n\n const isIndex = /^\\d+$/.test(part);\n if (isIndex && Array.isArray(current)) {\n current = current[Number.parseInt(part, 10)];\n } else {\n current = (current as Record<string, unknown>)[part];\n }\n }\n\n return current;\n}\n\n/**\n * Convert a value to a number, returning null if not possible.\n */\nfunction toNumber(value: unknown): number | null {\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'string') {\n const num = Number.parseFloat(value);\n return Number.isNaN(num) ? null : num;\n }\n return null;\n}\n\n/**\n * Parse a date string using the specified formats.\n * Returns null if parsing fails.\n *\n * Date format disambiguation:\n * - If only US formats (MM/DD/YYYY) are specified, parses as US\n * - If only EU formats (DD/MM/YYYY) are specified, parses as EU\n * - If both or neither are specified, attempts to infer from values:\n * - If first number > 12, assumes EU format (day first)\n * - If second number > 12, assumes US format (month first)\n * - If ambiguous (both <= 12), defaults to US format (MM/DD/YYYY)\n */\nfunction parseDate(dateStr: string, formats: readonly string[]): Date | null {\n if (!dateStr) return null;\n\n const trimmed = dateStr.trim();\n\n // Try ISO format first (JavaScript native)\n const isoDate = new Date(trimmed);\n if (!Number.isNaN(isoDate.getTime())) {\n return isoDate;\n }\n\n // Try localized format (DD-MMM-YYYY)\n const localizedMatch = trimmed.match(/^(\\d{1,2})-([A-Za-z]{3,9})-(\\d{4})$/);\n if (localizedMatch) {\n const day = Number.parseInt(localizedMatch[1], 10);\n const monthName = localizedMatch[2].toLowerCase();\n const year = Number.parseInt(localizedMatch[3], 10);\n const month = MONTH_NAMES[monthName];\n if (month !== undefined) {\n return new Date(year, month, day);\n }\n }\n\n // Try US format (MM/DD/YYYY or MM-DD-YYYY)\n const usMatch = trimmed.match(/^(\\d{1,2})[\\/\\-](\\d{1,2})[\\/\\-](\\d{4})$/);\n if (usMatch) {\n // Check if first or second number is likely the month\n // Assume MM/DD/YYYY for formats array containing \"MM/DD/YYYY\" or \"MM-DD-YYYY\"\n const hasUSFormat = formats.some((f) => f.includes('MM/DD') || f.includes('MM-DD'));\n const hasEUFormat = formats.some((f) => f.includes('DD/MM') || f.includes('DD-MM'));\n\n if (hasUSFormat && !hasEUFormat) {\n const month = Number.parseInt(usMatch[1], 10) - 1;\n const day = Number.parseInt(usMatch[2], 10);\n const year = Number.parseInt(usMatch[3], 10);\n if (month >= 0 && month <= 11 && day >= 1 && day <= 31) {\n return new Date(year, month, day);\n }\n } else if (hasEUFormat && !hasUSFormat) {\n const day = Number.parseInt(usMatch[1], 10);\n const month = Number.parseInt(usMatch[2], 10) - 1;\n const year = Number.parseInt(usMatch[3], 10);\n if (month >= 0 && month <= 11 && day >= 1 && day <= 31) {\n return new Date(year, month, day);\n }\n } else {\n // Ambiguous - try to infer from values\n const num1 = Number.parseInt(usMatch[1], 10);\n const num2 = Number.parseInt(usMatch[2], 10);\n const year = Number.parseInt(usMatch[3], 10);\n\n // If first number > 12, it must be day (EU format)\n if (num1 > 12 && num2 <= 12) {\n return new Date(year, num2 - 1, num1);\n }\n // If second number > 12, it must be day (US format)\n if (num2 > 12 && num1 <= 12) {\n return new Date(year, num1 - 1, num2);\n }\n // Default to US format\n if (num1 <= 12 && num2 <= 31) {\n return new Date(year, num1 - 1, num2);\n }\n }\n }\n\n return null;\n}\n\n/**\n * Format a date as ISO date string (YYYY-MM-DD).\n */\nfunction formatDateISO(date: Date): string {\n return date.toISOString().split('T')[0];\n}\n\n/**\n * Parse JSON from text with type narrowing to Record<string, unknown>.\n * Delegates to parseJsonFromText from scoring.ts.\n */\nfunction parseJsonFromTextSafe(text: string): Record<string, unknown> {\n return parseJsonFromText(text) as Record<string, unknown>;\n}\n","import type { LatencyGraderConfig } from '../types.js';\nimport type { EvaluationContext, EvaluationScore, Grader } from './types.js';\n\nexport interface LatencyGraderOptions {\n readonly config: LatencyGraderConfig;\n}\n\n/**\n * Grader that checks execution duration against a threshold.\n * Uses durationMs from the evaluation context.\n */\nexport class LatencyGrader implements Grader {\n readonly kind = 'latency';\n\n private readonly config: LatencyGraderConfig;\n\n constructor(options: LatencyGraderOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { threshold } = this.config;\n const durationMs = context.durationMs;\n\n // If no duration data available, we can't evaluate\n if (durationMs === undefined) {\n return {\n score: 0,\n verdict: 'fail',\n assertions: [{ text: 'No duration data available in trace', passed: false }],\n expectedAspectCount: 1,\n graderRawRequest: {\n type: 'latency',\n threshold,\n durationMs: null,\n },\n };\n }\n\n const passed = durationMs <= threshold;\n const score = passed ? 1 : 0;\n\n return {\n score,\n verdict: passed ? 'pass' : 'fail',\n assertions: [\n passed\n ? { text: `Duration ${durationMs}ms <= ${threshold}ms threshold`, passed: true }\n : { text: `Duration ${durationMs}ms > ${threshold}ms threshold`, passed: false },\n ],\n expectedAspectCount: 1,\n graderRawRequest: {\n type: 'latency',\n threshold,\n durationMs,\n },\n };\n }\n}\n","/**\n * Formats tool calls from agent output messages into a human-readable summary.\n *\n * Used by `{{ tool_calls }}` template variable in LLM grader prompts.\n * Extracts key input fields per tool to keep the summary compact:\n * - Skill: `skill` arg\n * - Read/Write/Edit: `file_path`\n * - Bash: `command`\n * - Grep/Glob: `pattern`\n * - Other tools: first string-valued input field (if any)\n *\n * Returns empty string when there are no tool calls (template variable resolves to '').\n */\n\nimport type { Message } from '../providers/types.js';\n\n/**\n * Key input fields to extract per tool name.\n * Order matters — first matching field wins.\n */\nconst KEY_INPUT_FIELDS: ReadonlyMap<string, readonly string[]> = new Map([\n ['Skill', ['skill']],\n ['Read', ['file_path']],\n ['Write', ['file_path']],\n ['Edit', ['file_path']],\n ['Bash', ['command']],\n ['Grep', ['pattern']],\n ['Glob', ['pattern']],\n]);\n\n/** Fallback: pick the first short string-valued field from input. */\nconst MAX_FALLBACK_LENGTH = 120;\n\nexport function formatToolCalls(output: readonly Message[] | undefined): string {\n if (!output) return '';\n\n const lines: string[] = [];\n\n for (const message of output) {\n if (!message.toolCalls) continue;\n for (const call of message.toolCalls) {\n const toolName = call.tool ?? 'unknown';\n const detail = extractKeyDetail(toolName, call.input);\n lines.push(detail ? `- ${toolName}: ${detail}` : `- ${toolName}`);\n }\n }\n\n return lines.length > 0 ? lines.join('\\n') : '';\n}\n\nfunction extractKeyDetail(toolName: string, input: unknown): string {\n if (!input || typeof input !== 'object') return '';\n const record = input as Record<string, unknown>;\n\n // Try known key fields for this tool\n const knownFields = KEY_INPUT_FIELDS.get(toolName);\n if (knownFields) {\n for (const field of knownFields) {\n const value = record[field];\n if (typeof value === 'string' && value.length > 0) {\n return truncate(value);\n }\n }\n }\n\n // Fallback: first short string-valued field\n for (const value of Object.values(record)) {\n if (typeof value === 'string' && value.length > 0 && value.length <= MAX_FALLBACK_LENGTH) {\n return truncate(value);\n }\n }\n\n return '';\n}\n\nfunction truncate(value: string, maxLen = 120): string {\n if (value.length <= maxLen) return value;\n return `${value.slice(0, maxLen)}…`;\n}\n","/**\n * Built-in skill-trigger evaluator.\n *\n * Detects whether the agent invoked a named skill during a session.\n * Works with canonical tool names produced by normalizeToolCall() — no\n * provider-specific matching logic needed.\n *\n * Detection logic:\n * - Scans ALL tool calls (not just the first) for skill invocation evidence.\n * - Skill tool: checks `tool === 'Skill'` and `input.skill` contains the skill name.\n * - Read tool: checks `tool === 'Read'` and `input.file_path` contains a skills/ path.\n * - Fallback: checks tool output for skill file path references.\n * - Supports negative cases via should_trigger: false.\n *\n * Prerequisites:\n * All providers and import parsers must call normalizeToolCall() when\n * constructing ToolCall objects. This ensures canonical tool names\n * (\"Skill\", \"Read\", \"Write\", \"Edit\", \"Bash\") and canonical input field\n * names (input.skill, input.file_path) regardless of provider.\n */\n\nimport type { SkillTriggerGraderConfig } from '../types.js';\nimport type { EvaluationContext, EvaluationScore, Grader } from './types.js';\n\nexport class SkillTriggerGrader implements Grader {\n readonly kind = 'skill-trigger';\n\n private readonly config: SkillTriggerGraderConfig;\n\n constructor(config: SkillTriggerGraderConfig) {\n this.config = config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const skillName = this.config.skill;\n const shouldTrigger = this.config.should_trigger !== false;\n\n const allToolCalls = (context.output ?? []).flatMap((msg) => msg.toolCalls ?? []);\n\n let triggered = false;\n let evidence = '';\n\n for (const toolCall of allToolCalls) {\n const toolName = toolCall.tool ?? '';\n const input = (toolCall.input ?? {}) as Record<string, unknown>;\n\n if (toolName === 'Skill') {\n const skillArg = String(input.skill ?? '');\n if (skillArg.includes(skillName)) {\n triggered = true;\n evidence = `Skill tool invoked with skill=\"${skillArg}\"`;\n break;\n }\n } else if (toolName === 'Read') {\n const filePath = String(input.file_path ?? '');\n if (filePath.includes(`skills/${skillName}/`)) {\n triggered = true;\n evidence = `Read tool loaded skill file: ${filePath}`;\n break;\n }\n }\n\n // Fallback: check if a tool's output contains a skill file path.\n if (!triggered && toolCall.output != null) {\n const outputStr =\n typeof toolCall.output === 'string' ? toolCall.output : JSON.stringify(toolCall.output);\n if (outputStr.includes(`skills/${skillName}/`)) {\n triggered = true;\n evidence = `Tool \"${toolName}\" output referenced skill file for \"${skillName}\"`;\n break;\n }\n }\n }\n\n const pass = triggered === shouldTrigger;\n\n if (pass) {\n return {\n score: 1,\n verdict: 'pass',\n assertions: [\n {\n text: shouldTrigger\n ? evidence || `Skill \"${skillName}\" triggered as expected`\n : `Skill \"${skillName}\" correctly did not trigger`,\n passed: true,\n },\n ],\n expectedAspectCount: 1,\n };\n }\n\n return {\n score: 0,\n verdict: 'fail',\n assertions: [\n {\n text: shouldTrigger\n ? allToolCalls.length > 0\n ? `Skill \"${skillName}\" not found in ${allToolCalls.length} tool call(s)`\n : 'No tool calls recorded'\n : evidence || `Skill \"${skillName}\" triggered unexpectedly`,\n passed: false,\n },\n ],\n expectedAspectCount: 1,\n };\n }\n}\n","import type { Message } from '../providers/types.js';\nimport { TEMPLATE_VARIABLES } from '../template-variables.js';\nimport type { EvalTest, LlmGraderConfig, RubricItem } from '../types.js';\nimport type { PromptInputs } from '../yaml-parser.js';\nimport {\n DEFAULT_GRADER_TEMPLATE,\n buildOutputSchema,\n buildRubricOutputSchema,\n buildScoreRangeOutputSchema,\n substituteVariables,\n} from './llm-grader.js';\n\nexport interface LlmGraderPromptAssembly {\n systemPrompt: string;\n userPrompt: string;\n responseSchema: string;\n mode: 'freeform' | 'checklist' | 'score_range';\n}\n\nexport function assembleLlmGraderPrompt(input: {\n evalCase: EvalTest;\n candidate: string;\n promptInputs: PromptInputs;\n evaluatorConfig?: LlmGraderConfig;\n output?: readonly Message[];\n fileChanges?: string;\n toolCalls?: string;\n graderTemplateOverride?: string;\n}): LlmGraderPromptAssembly {\n const {\n evalCase,\n candidate,\n promptInputs,\n evaluatorConfig,\n fileChanges,\n toolCalls,\n graderTemplateOverride,\n } = input;\n\n const rubrics = evaluatorConfig?.rubrics;\n\n // Detect mode\n if (rubrics && rubrics.length > 0) {\n const hasScoreRanges = rubrics.some((r) => r.score_ranges && r.score_ranges.length > 0);\n if (hasScoreRanges) {\n return assembleScoreRange(evalCase, candidate, promptInputs, rubrics, fileChanges, toolCalls);\n }\n return assembleChecklist(evalCase, candidate, promptInputs, rubrics, fileChanges, toolCalls);\n }\n\n return assembleFreeform(\n evalCase,\n candidate,\n promptInputs,\n fileChanges,\n toolCalls,\n graderTemplateOverride,\n );\n}\n\nfunction assembleFreeform(\n evalCase: EvalTest,\n candidate: string,\n promptInputs: PromptInputs,\n fileChanges?: string,\n toolCalls?: string,\n graderTemplateOverride?: string,\n): LlmGraderPromptAssembly {\n const formattedQuestion =\n promptInputs.question && promptInputs.question.trim().length > 0\n ? promptInputs.question\n : evalCase.question;\n\n const variables = {\n [TEMPLATE_VARIABLES.INPUT]: formattedQuestion.trim(),\n [TEMPLATE_VARIABLES.OUTPUT]: candidate.trim(),\n [TEMPLATE_VARIABLES.EXPECTED_OUTPUT]: (evalCase.reference_answer ?? '').trim(),\n [TEMPLATE_VARIABLES.CRITERIA]: evalCase.criteria.trim(),\n [TEMPLATE_VARIABLES.FILE_CHANGES]: fileChanges ?? '',\n [TEMPLATE_VARIABLES.TOOL_CALLS]: toolCalls ?? '',\n // Deprecated aliases\n [TEMPLATE_VARIABLES.INPUT_TEXT]: formattedQuestion.trim(),\n [TEMPLATE_VARIABLES.OUTPUT_TEXT]: candidate.trim(),\n [TEMPLATE_VARIABLES.EXPECTED_OUTPUT_TEXT]: (evalCase.reference_answer ?? '').trim(),\n };\n\n const systemPrompt = buildOutputSchema();\n const template = graderTemplateOverride ?? DEFAULT_GRADER_TEMPLATE;\n let userPrompt = substituteVariables(template, variables);\n\n // Append file_changes and tool_calls sections to default template only when present\n if (fileChanges && !graderTemplateOverride) {\n userPrompt += `\\n\\n[[ ## file_changes ## ]]\\n${fileChanges}`;\n }\n if (toolCalls && !graderTemplateOverride) {\n userPrompt += `\\n\\n[[ ## tool_calls ## ]]\\n${toolCalls}`;\n }\n\n return {\n systemPrompt,\n userPrompt,\n responseSchema: systemPrompt,\n mode: 'freeform',\n };\n}\n\nfunction assembleChecklist(\n evalCase: EvalTest,\n candidate: string,\n promptInputs: PromptInputs,\n rubrics: readonly RubricItem[],\n fileChanges?: string,\n toolCalls?: string,\n): LlmGraderPromptAssembly {\n const formattedQuestion =\n promptInputs.question && promptInputs.question.trim().length > 0\n ? promptInputs.question\n : evalCase.question;\n\n const parts: string[] = [\n 'You are an expert grader. Evaluate the candidate answer against each rubric item below.',\n '',\n '[[ ## question ## ]]',\n formattedQuestion,\n '',\n '[[ ## criteria ## ]]',\n evalCase.criteria,\n '',\n ];\n\n if (evalCase.reference_answer && evalCase.reference_answer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', evalCase.reference_answer, '');\n }\n\n parts.push('[[ ## answer ## ]]', candidate, '');\n\n if (fileChanges) {\n parts.push('[[ ## file_changes ## ]]', fileChanges, '');\n }\n\n if (toolCalls) {\n parts.push('[[ ## tool_calls ## ]]', toolCalls, '');\n }\n\n parts.push('[[ ## rubrics ## ]]');\n\n for (const rubric of rubrics) {\n const requiredLabel = rubric.required ? ' (REQUIRED)' : '';\n const weightLabel = rubric.weight !== 1.0 ? ` (weight: ${rubric.weight})` : '';\n parts.push(`- [${rubric.id}]${requiredLabel}${weightLabel}: ${rubric.outcome}`);\n }\n\n parts.push('', 'For each rubric, determine if it is satisfied and provide brief reasoning.');\n\n const systemPrompt = buildRubricOutputSchema();\n const userPrompt = parts.join('\\n');\n\n return {\n systemPrompt,\n userPrompt,\n responseSchema: systemPrompt,\n mode: 'checklist',\n };\n}\n\nfunction assembleScoreRange(\n evalCase: EvalTest,\n candidate: string,\n promptInputs: PromptInputs,\n rubrics: readonly RubricItem[],\n fileChanges?: string,\n toolCalls?: string,\n): LlmGraderPromptAssembly {\n const formattedQuestion =\n promptInputs.question && promptInputs.question.trim().length > 0\n ? promptInputs.question\n : evalCase.question;\n\n const parts: string[] = [\n 'You are an expert grader. Score the candidate answer on each criterion below using the provided score ranges.',\n 'For each criterion, output an integer score from 0 to 10 based on which score range best matches the answer.',\n '',\n '[[ ## question ## ]]',\n formattedQuestion,\n '',\n '[[ ## criteria ## ]]',\n evalCase.criteria,\n '',\n ];\n\n if (evalCase.reference_answer && evalCase.reference_answer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', evalCase.reference_answer, '');\n }\n\n parts.push('[[ ## answer ## ]]', candidate, '');\n\n if (fileChanges) {\n parts.push('[[ ## file_changes ## ]]', fileChanges, '');\n }\n\n if (toolCalls) {\n parts.push('[[ ## tool_calls ## ]]', toolCalls, '');\n }\n\n parts.push('[[ ## scoring_criteria ## ]]');\n\n for (const rubric of rubrics) {\n const weightLabel = rubric.weight !== 1.0 ? ` (weight: ${rubric.weight})` : '';\n const minScoreLabel =\n rubric.required_min_score !== undefined\n ? ` [REQUIRED: min score ${rubric.required_min_score}]`\n : '';\n\n parts.push('', `### Criterion: ${rubric.id}${weightLabel}${minScoreLabel}`);\n\n if (rubric.outcome) {\n parts.push(`Description: ${rubric.outcome}`);\n }\n\n if (rubric.score_ranges && rubric.score_ranges.length > 0) {\n parts.push('Score ranges:');\n for (const range of rubric.score_ranges) {\n const [min, max] = range.score_range;\n const rangeLabel = min === max ? `${min}` : `${min}-${max}`;\n parts.push(` - Score ${rangeLabel}: ${range.outcome}`);\n }\n }\n }\n\n parts.push(\n '',\n 'For each criterion, provide an integer score 0-10 that matches one of its defined score ranges.',\n );\n\n const systemPrompt = buildScoreRangeOutputSchema();\n const userPrompt = parts.join('\\n');\n\n return {\n systemPrompt,\n userPrompt,\n responseSchema: systemPrompt,\n mode: 'score_range',\n };\n}\n","import type { AssertionEntry, TokenUsageGraderConfig } from '../types.js';\nimport type { EvaluationContext, EvaluationScore, Grader } from './types.js';\n\nexport interface TokenUsageGraderOptions {\n readonly config: TokenUsageGraderConfig;\n}\n\n/**\n * Grader that checks provider-reported token usage against configured limits.\n * Uses tokenUsage from the evaluation context.\n */\nexport class TokenUsageGrader implements Grader {\n readonly kind = 'token-usage';\n\n private readonly config: TokenUsageGraderConfig;\n\n constructor(options: TokenUsageGraderOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const usage = context.tokenUsage;\n\n const maxTotal = this.config.max_total;\n const maxInput = this.config.max_input;\n const maxOutput = this.config.max_output;\n\n const expectedAspectCount = Math.max(\n [maxTotal, maxInput, maxOutput].filter((v) => typeof v === 'number').length,\n 1,\n );\n\n if (!usage) {\n return {\n score: 0,\n verdict: 'fail',\n assertions: [{ text: 'No token usage data available in trace', passed: false }],\n expectedAspectCount,\n graderRawRequest: {\n type: 'token-usage',\n max_total: maxTotal ?? null,\n max_input: maxInput ?? null,\n max_output: maxOutput ?? null,\n tokenUsage: null,\n },\n };\n }\n\n const input = usage.input;\n const output = usage.output;\n const cached = usage.cached ?? 0;\n const total = input + output + cached;\n\n const assertions: AssertionEntry[] = [];\n\n if (typeof maxInput === 'number') {\n if (input <= maxInput) {\n assertions.push({ text: `Input tokens ${input} <= ${maxInput}`, passed: true });\n } else {\n assertions.push({ text: `Input tokens ${input} > ${maxInput}`, passed: false });\n }\n }\n\n if (typeof maxOutput === 'number') {\n if (output <= maxOutput) {\n assertions.push({ text: `Output tokens ${output} <= ${maxOutput}`, passed: true });\n } else {\n assertions.push({ text: `Output tokens ${output} > ${maxOutput}`, passed: false });\n }\n }\n\n if (typeof maxTotal === 'number') {\n if (total <= maxTotal) {\n assertions.push({ text: `Total tokens ${total} <= ${maxTotal}`, passed: true });\n } else {\n assertions.push({ text: `Total tokens ${total} > ${maxTotal}`, passed: false });\n }\n }\n\n const passed = assertions.every((a) => a.passed);\n\n return {\n score: passed ? 1 : 0,\n verdict: passed ? 'pass' : 'fail',\n assertions,\n expectedAspectCount,\n graderRawRequest: {\n type: 'token-usage',\n max_total: maxTotal ?? null,\n max_input: maxInput ?? null,\n max_output: maxOutput ?? null,\n tokenUsage: {\n input,\n output,\n cached,\n total,\n },\n },\n };\n }\n}\n","import type { Message } from '../providers/types.js';\nimport type {\n ArgsMatchMode,\n ToolTrajectoryExpectedItem,\n ToolTrajectoryGraderConfig,\n TraceSummary,\n} from '../trace.js';\nimport type { AssertionEntry } from '../types.js';\nimport { deepEqual, scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Grader } from './types.js';\n\n/** Extracted tool call with optional arguments and timing */\ninterface ExtractedToolCall {\n readonly name: string;\n readonly args?: Record<string, unknown>;\n readonly durationMs?: number;\n}\n\n/**\n * Get a nested value from an object using dot-notation path.\n * Supports paths like \"a.b.c\" to access deeply nested properties.\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/**\n * Resolve the effective args match mode for an expected item.\n * Priority: per-item argsMatch > evaluator-level argsMatch > 'exact'\n */\nfunction resolveArgsMatchMode(\n item: ToolTrajectoryExpectedItem,\n config: ToolTrajectoryGraderConfig,\n): ArgsMatchMode | readonly string[] {\n return item.argsMatch ?? config.argsMatch ?? 'exact';\n}\n\n/**\n * Check if actual args match expected args using the specified mode.\n *\n * Modes:\n * - 'exact': bidirectional deep equality (no extra keys allowed)\n * - 'superset': actual must contain all expected keys (extras OK) - was the old implicit default\n * - 'subset': actual must be a subset of expected (no unexpected keys in actual)\n * - 'ignore': skip argument checking entirely\n * - string[]: check only the listed fields (dot-notation supported)\n */\nfunction argsMatch(\n expected: ToolTrajectoryExpectedItem['args'],\n actual: Record<string, unknown> | undefined,\n mode: ArgsMatchMode | readonly string[],\n): boolean {\n // No args constraint means match (regardless of mode)\n if (expected === undefined) return true;\n // 'any' means skip validation (legacy shorthand for ignore)\n if (expected === 'any') return true;\n\n // 'ignore' mode skips all arg checking\n if (mode === 'ignore') return true;\n\n // From here expected is a Record<string, unknown>\n if (actual === undefined) return false;\n\n // Field list mode: check only the listed fields with deep equality\n if (Array.isArray(mode)) {\n for (const field of mode) {\n const expectedVal = getNestedValue(expected, field);\n const actualVal = getNestedValue(actual, field);\n if (expectedVal === undefined) continue; // Skip fields not specified in expected\n if (!deepEqual(expectedVal, actualVal)) return false;\n }\n return true;\n }\n\n switch (mode) {\n case 'exact':\n return deepEqual(expected, actual);\n\n case 'superset':\n // actual must contain all expected keys (extras OK)\n for (const key of Object.keys(expected)) {\n if (!Object.hasOwn(actual, key)) return false;\n if (!deepEqual(expected[key], actual[key])) return false;\n }\n return true;\n\n case 'subset':\n // actual must be a subset of expected (no unexpected keys in actual)\n for (const key of Object.keys(actual)) {\n if (!Object.hasOwn(expected, key)) return false;\n if (!deepEqual(actual[key], expected[key])) return false;\n }\n return true;\n\n default:\n return deepEqual(expected, actual);\n }\n}\n\n/** Result of checking latency assertion */\ninterface LatencyCheckResult {\n /** Whether the check passed, failed, or was skipped */\n readonly status: 'pass' | 'fail' | 'skip';\n /** Message describing the result */\n readonly message: string;\n}\n\n/**\n * Check latency assertion for a tool call.\n * Returns pass/fail/skip status and a descriptive message.\n */\nfunction checkLatency(\n toolName: string,\n maxDurationMs: number | undefined,\n actualDurationMs: number | undefined,\n): LatencyCheckResult {\n // No latency assertion specified - nothing to check\n if (maxDurationMs === undefined) {\n return { status: 'skip', message: '' };\n }\n\n // Latency assertion specified but no timing data available\n if (actualDurationMs === undefined) {\n return {\n status: 'skip',\n message: `No duration data for ${toolName}; latency assertion skipped`,\n };\n }\n\n // Check the assertion\n if (actualDurationMs <= maxDurationMs) {\n return {\n status: 'pass',\n message: `${toolName} completed in ${actualDurationMs}ms (max: ${maxDurationMs}ms)`,\n };\n }\n\n return {\n status: 'fail',\n message: `${toolName} took ${actualDurationMs}ms (max: ${maxDurationMs}ms)`,\n };\n}\n\nexport interface ToolTrajectoryGraderOptions {\n readonly config: ToolTrajectoryGraderConfig;\n}\n\nexport class ToolTrajectoryGrader implements Grader {\n readonly kind = 'tool-trajectory';\n\n private readonly config: ToolTrajectoryGraderConfig;\n\n constructor(options: ToolTrajectoryGraderOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { output, trace } = context;\n\n // Extract tool calls from output (primary source)\n const toolCalls = this.extractToolCallsFromMessages(output);\n const hasOutput = output !== undefined && output.length > 0;\n\n // Handle missing data — but allow empty tool calls through for subset/superset\n // modes when output messages exist (empty call list is valid input for those modes)\n if (toolCalls.length === 0 && !trace && !hasOutput) {\n return {\n score: 0,\n verdict: 'fail',\n assertions: [{ text: 'No trace available for evaluation', passed: false }],\n expectedAspectCount: 1,\n };\n }\n\n // Build summary from tool calls if available, otherwise use provided summary\n const summary = toolCalls.length > 0 ? this.buildSummary(toolCalls) : trace;\n\n switch (this.config.mode) {\n case 'any_order': {\n if (!summary) {\n return {\n score: 0,\n verdict: 'fail',\n assertions: [{ text: 'No trace available for evaluation', passed: false }],\n expectedAspectCount: 1,\n };\n }\n return this.evaluateAnyOrder(summary);\n }\n case 'in_order':\n return this.evaluateInOrder(toolCalls);\n case 'exact':\n return this.evaluateExact(toolCalls);\n case 'superset':\n return this.evaluateSuperset(toolCalls);\n case 'subset':\n return this.evaluateSubset(toolCalls);\n default:\n return {\n score: 0,\n verdict: 'fail',\n assertions: [{ text: `Unknown mode: ${this.config.mode}`, passed: false }],\n expectedAspectCount: 1,\n };\n }\n }\n\n /**\n * Extract tool calls from output messages.\n */\n private extractToolCallsFromMessages(\n messages: readonly Message[] | undefined,\n ): readonly ExtractedToolCall[] {\n if (!messages) {\n return [];\n }\n\n const toolCalls: ExtractedToolCall[] = [];\n for (const message of messages) {\n if (message.toolCalls) {\n for (const call of message.toolCalls) {\n toolCalls.push({\n name: call.tool,\n args: call.input as Record<string, unknown> | undefined,\n durationMs: call.durationMs,\n });\n }\n }\n }\n return toolCalls;\n }\n\n /**\n * Build a summary from extracted tool calls.\n */\n private buildSummary(toolCalls: readonly ExtractedToolCall[]): TraceSummary {\n const toolCallsByName: Record<string, number> = {};\n for (const call of toolCalls) {\n toolCallsByName[call.name] = (toolCallsByName[call.name] ?? 0) + 1;\n }\n return {\n eventCount: toolCalls.length,\n toolCalls: toolCallsByName,\n errorCount: 0,\n };\n }\n\n private evaluateAnyOrder(summary: TraceSummary): EvaluationScore {\n const minimums = this.config.minimums ?? {};\n const toolNames = Object.keys(minimums);\n\n if (toolNames.length === 0) {\n return {\n score: 1,\n verdict: 'pass',\n assertions: [{ text: 'No tool requirements specified', passed: true }],\n expectedAspectCount: 0,\n };\n }\n\n const assertions: AssertionEntry[] = [];\n\n for (const toolName of toolNames) {\n const required = minimums[toolName];\n const actual = summary.toolCalls[toolName] ?? 0;\n if (actual >= required) {\n assertions.push({\n text: `${toolName}: called ${actual} times (required >=${required})`,\n passed: true,\n });\n } else {\n assertions.push({\n text: `${toolName}: called ${actual} times (required >=${required})`,\n passed: false,\n });\n }\n }\n\n const passedCount = assertions.filter((a) => a.passed).length;\n const score = passedCount / toolNames.length;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n assertions,\n expectedAspectCount: toolNames.length,\n };\n }\n\n private evaluateInOrder(toolCalls: readonly ExtractedToolCall[]): EvaluationScore {\n const expected = this.config.expected ?? [];\n\n if (expected.length === 0) {\n return {\n score: 1,\n verdict: 'pass',\n assertions: [{ text: 'No tool sequence specified', passed: true }],\n expectedAspectCount: 0,\n };\n }\n\n const assertions: AssertionEntry[] = [];\n const warnings: string[] = [];\n let actualIndex = 0;\n\n // Track latency assertion results separately for accurate scoring\n let sequenceHits = 0;\n let latencyHits = 0;\n let latencySkips = 0;\n\n // Count latency assertions specified in expected items\n const latencyAssertionCount = expected.filter(\n (item) => item.maxDurationMs !== undefined,\n ).length;\n\n for (let i = 0; i < expected.length; i++) {\n const expectedItem = expected[i];\n const expectedTool = expectedItem.tool;\n const mode = resolveArgsMatchMode(expectedItem, this.config);\n let found = false;\n let argsMismatch = false;\n let matchedCall: ExtractedToolCall | undefined;\n\n while (actualIndex < toolCalls.length) {\n const actualCall = toolCalls[actualIndex];\n if (actualCall.name === expectedTool) {\n // Tool name matches, check args if specified\n if (argsMatch(expectedItem.args, actualCall.args, mode)) {\n assertions.push({\n text: `Found ${expectedTool} at position ${actualIndex}`,\n passed: true,\n });\n sequenceHits++;\n matchedCall = actualCall;\n actualIndex++;\n found = true;\n break;\n }\n // Tool name matches but args don't - this is a miss for this expected item\n assertions.push({\n text: `Expected ${expectedTool} at position ${i}: tool found at ${actualIndex} but args mismatch`,\n passed: false,\n });\n actualIndex++;\n argsMismatch = true;\n break;\n }\n actualIndex++;\n }\n\n if (!found && !argsMismatch) {\n assertions.push({\n text: `Expected ${expectedTool} at position ${i}, not found in remaining trace`,\n passed: false,\n });\n }\n\n // Check latency assertion if tool was found and latency assertion is specified\n if (found && matchedCall) {\n const latencyResult = checkLatency(\n expectedTool,\n expectedItem.maxDurationMs,\n matchedCall.durationMs,\n );\n if (latencyResult.status === 'pass') {\n assertions.push({ text: latencyResult.message, passed: true });\n latencyHits++;\n } else if (latencyResult.status === 'fail') {\n assertions.push({ text: latencyResult.message, passed: false });\n } else if (latencyResult.message) {\n // Skip with warning message (missing duration data) - neutral, don't count\n warnings.push(latencyResult.message);\n latencySkips++;\n }\n }\n }\n\n // Log warnings for missing duration data\n for (const warning of warnings) {\n console.warn(`[tool-trajectory] ${warning}`);\n }\n\n // Calculate score: sequence assertions + effective latency assertions (excluding skipped)\n const effectiveLatencyAssertions = latencyAssertionCount - latencySkips;\n const totalAssertions = expected.length + effectiveLatencyAssertions;\n const score = totalAssertions > 0 ? (sequenceHits + latencyHits) / totalAssertions : 1;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n assertions,\n expectedAspectCount: totalAssertions,\n };\n }\n\n private evaluateExact(toolCalls: readonly ExtractedToolCall[]): EvaluationScore {\n const expected = this.config.expected ?? [];\n\n if (expected.length === 0) {\n return {\n score: 1,\n verdict: 'pass',\n assertions: [{ text: 'No tool sequence specified', passed: true }],\n expectedAspectCount: 0,\n };\n }\n\n const assertions: AssertionEntry[] = [];\n const warnings: string[] = [];\n\n // Track latency assertion results separately for accurate scoring\n let sequenceHits = 0;\n let latencyHits = 0;\n let latencySkips = 0;\n\n // Count latency assertions specified in expected items\n const latencyAssertionCount = expected.filter(\n (item) => item.maxDurationMs !== undefined,\n ).length;\n\n if (toolCalls.length !== expected.length) {\n assertions.push({\n text: `Expected ${expected.length} tool calls, got ${toolCalls.length}`,\n passed: false,\n });\n }\n\n const checkLength = Math.min(expected.length, toolCalls.length);\n for (let i = 0; i < checkLength; i++) {\n const expectedItem = expected[i];\n const expectedTool = expectedItem.tool;\n const actualCall = toolCalls[i];\n const actualTool = actualCall.name;\n const mode = resolveArgsMatchMode(expectedItem, this.config);\n let sequenceMatched = false;\n\n if (actualTool === expectedTool) {\n // Tool name matches, check args if specified\n if (argsMatch(expectedItem.args, actualCall.args, mode)) {\n assertions.push({ text: `Position ${i}: ${expectedTool}`, passed: true });\n sequenceHits++;\n sequenceMatched = true;\n } else {\n assertions.push({ text: `Position ${i}: ${expectedTool} args mismatch`, passed: false });\n }\n } else {\n assertions.push({\n text: `Position ${i}: expected ${expectedTool}, got ${actualTool}`,\n passed: false,\n });\n }\n\n // Check latency assertion if sequence matched and latency assertion is specified\n if (sequenceMatched) {\n const latencyResult = checkLatency(\n expectedTool,\n expectedItem.maxDurationMs,\n actualCall.durationMs,\n );\n if (latencyResult.status === 'pass') {\n assertions.push({ text: latencyResult.message, passed: true });\n latencyHits++;\n } else if (latencyResult.status === 'fail') {\n assertions.push({ text: latencyResult.message, passed: false });\n } else if (latencyResult.message) {\n // Skip with warning message (missing duration data) - neutral, don't count\n warnings.push(latencyResult.message);\n latencySkips++;\n }\n }\n }\n\n for (let i = checkLength; i < expected.length; i++) {\n assertions.push({\n text: `Position ${i}: expected ${expected[i].tool}, got nothing`,\n passed: false,\n });\n }\n\n // Log warnings for missing duration data\n for (const warning of warnings) {\n console.warn(`[tool-trajectory] ${warning}`);\n }\n\n // Calculate score: sequence assertions + effective latency assertions (excluding skipped)\n const effectiveLatencyAssertions = latencyAssertionCount - latencySkips;\n const totalAssertions = expected.length + effectiveLatencyAssertions;\n const score = totalAssertions > 0 ? (sequenceHits + latencyHits) / totalAssertions : 1;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n assertions,\n expectedAspectCount: totalAssertions,\n };\n }\n\n /**\n * Superset mode: actual trajectory must contain all expected tool calls.\n * Every expected item must be found in actual (greedy matching with consumption).\n * Extra tool calls in actual are OK.\n */\n private evaluateSuperset(toolCalls: readonly ExtractedToolCall[]): EvaluationScore {\n const expected = this.config.expected ?? [];\n\n if (expected.length === 0) {\n return {\n score: 1,\n verdict: 'pass',\n assertions: [{ text: 'No expected tools specified', passed: true }],\n expectedAspectCount: 0,\n };\n }\n\n const assertions: AssertionEntry[] = [];\n\n // Track which actual calls have been consumed\n const consumed = new Set<number>();\n\n for (let i = 0; i < expected.length; i++) {\n const expectedItem = expected[i];\n const expectedTool = expectedItem.tool;\n const mode = resolveArgsMatchMode(expectedItem, this.config);\n let found = false;\n\n // Greedy: find the first unconsumed actual call that matches\n for (let j = 0; j < toolCalls.length; j++) {\n if (consumed.has(j)) continue;\n const actualCall = toolCalls[j];\n if (\n actualCall.name === expectedTool &&\n argsMatch(expectedItem.args, actualCall.args, mode)\n ) {\n assertions.push({ text: `Found ${expectedTool} at position ${j}`, passed: true });\n consumed.add(j);\n found = true;\n break;\n }\n }\n\n if (!found) {\n assertions.push({\n text: `Expected ${expectedTool} not found in actual trajectory`,\n passed: false,\n });\n }\n }\n\n const passedCount = assertions.filter((a) => a.passed).length;\n const score = expected.length > 0 ? passedCount / expected.length : 1;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n assertions,\n expectedAspectCount: expected.length,\n };\n }\n\n /**\n * Subset mode: every actual tool call must be in the allowed list.\n * Expected items are reusable (not consumed) - they define the allowed set.\n * If every actual call matches at least one expected item, score is 1.\n */\n private evaluateSubset(toolCalls: readonly ExtractedToolCall[]): EvaluationScore {\n const expected = this.config.expected ?? [];\n\n if (expected.length === 0) {\n // No expected items means no calls are allowed\n if (toolCalls.length === 0) {\n return {\n score: 1,\n verdict: 'pass',\n assertions: [{ text: 'No tool calls and no expected tools', passed: true }],\n expectedAspectCount: 0,\n };\n }\n return {\n score: 0,\n verdict: 'fail',\n assertions: [\n {\n text: `${toolCalls.length} unexpected tool call(s) with empty allowed list`,\n passed: false,\n },\n ],\n expectedAspectCount: toolCalls.length,\n };\n }\n\n if (toolCalls.length === 0) {\n return {\n score: 1,\n verdict: 'pass',\n assertions: [{ text: 'No actual tool calls (trivially a subset)', passed: true }],\n expectedAspectCount: 0,\n };\n }\n\n const assertions: AssertionEntry[] = [];\n\n for (let i = 0; i < toolCalls.length; i++) {\n const actualCall = toolCalls[i];\n let allowed = false;\n\n // Check if actual call matches any expected item (items are reusable)\n for (const expectedItem of expected) {\n const mode = resolveArgsMatchMode(expectedItem, this.config);\n if (\n actualCall.name === expectedItem.tool &&\n argsMatch(expectedItem.args, actualCall.args, mode)\n ) {\n allowed = true;\n break;\n }\n }\n\n if (allowed) {\n assertions.push({\n text: `Position ${i}: ${actualCall.name} is in allowed set`,\n passed: true,\n });\n } else {\n assertions.push({\n text: `Position ${i}: ${actualCall.name} is not in allowed set`,\n passed: false,\n });\n }\n }\n\n const passedCount = assertions.filter((a) => a.passed).length;\n const score = toolCalls.length > 0 ? passedCount / toolCalls.length : 1;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n assertions,\n expectedAspectCount: toolCalls.length,\n };\n }\n}\n","/**\n * Deterministic assertion evaluators.\n *\n * Pure functions that check agent output against simple conditions\n * and return a binary score (0 or 1) with descriptive assertions.\n */\n\nexport type AssertionResult = {\n score: number;\n assertions: { text: string; passed: boolean }[];\n};\n\n/** Checks if `output` contains the given `value` substring. */\nexport function runContainsAssertion(output: string, value: string): AssertionResult {\n const passed = output.includes(value);\n return {\n score: passed ? 1 : 0,\n assertions: [\n {\n text: passed ? `Output contains \"${value}\"` : `Output does not contain \"${value}\"`,\n passed,\n },\n ],\n };\n}\n\n/** Checks if `output` contains ANY of the given `values`. */\nexport function runContainsAnyAssertion(\n output: string,\n values: readonly string[],\n): AssertionResult {\n const matched = values.filter((v) => output.includes(v));\n const passed = matched.length > 0;\n return {\n score: passed ? 1 : 0,\n assertions: [\n {\n text: passed\n ? `Output contains \"${matched[0]}\"`\n : `Output does not contain any of: ${values.map((v) => `\"${v}\"`).join(', ')}`,\n passed,\n },\n ],\n };\n}\n\n/** Checks if `output` contains ALL of the given `values`. */\nexport function runContainsAllAssertion(\n output: string,\n values: readonly string[],\n): AssertionResult {\n const missing = values.filter((v) => !output.includes(v));\n const passed = missing.length === 0;\n return {\n score: passed ? 1 : 0,\n assertions: [\n {\n text: passed\n ? `Output contains all ${values.length} expected strings`\n : `Output missing: ${missing.map((v) => `\"${v}\"`).join(', ')}`,\n passed,\n },\n ],\n };\n}\n\n/** Case-insensitive check if `output` contains `value`. */\nexport function runIcontainsAssertion(output: string, value: string): AssertionResult {\n const passed = output.toLowerCase().includes(value.toLowerCase());\n return {\n score: passed ? 1 : 0,\n assertions: [\n {\n text: passed\n ? `Output contains \"${value}\" (case-insensitive)`\n : `Output does not contain \"${value}\" (case-insensitive)`,\n passed,\n },\n ],\n };\n}\n\n/** Case-insensitive check if `output` contains ANY of the given `values`. */\nexport function runIcontainsAnyAssertion(\n output: string,\n values: readonly string[],\n): AssertionResult {\n const lower = output.toLowerCase();\n const matched = values.filter((v) => lower.includes(v.toLowerCase()));\n const passed = matched.length > 0;\n return {\n score: passed ? 1 : 0,\n assertions: [\n {\n text: passed\n ? `Output contains \"${matched[0]}\" (case-insensitive)`\n : `Output does not contain any of: ${values.map((v) => `\"${v}\"`).join(', ')} (case-insensitive)`,\n passed,\n },\n ],\n };\n}\n\n/** Case-insensitive check if `output` contains ALL of the given `values`. */\nexport function runIcontainsAllAssertion(\n output: string,\n values: readonly string[],\n): AssertionResult {\n const lower = output.toLowerCase();\n const missing = values.filter((v) => !lower.includes(v.toLowerCase()));\n const passed = missing.length === 0;\n return {\n score: passed ? 1 : 0,\n assertions: [\n {\n text: passed\n ? `Output contains all ${values.length} expected strings (case-insensitive)`\n : `Output missing (case-insensitive): ${missing.map((v) => `\"${v}\"`).join(', ')}`,\n passed,\n },\n ],\n };\n}\n\n/** Checks if `output` starts with `value` (both trimmed). */\nexport function runStartsWithAssertion(output: string, value: string): AssertionResult {\n const passed = output.trim().startsWith(value.trim());\n return {\n score: passed ? 1 : 0,\n assertions: [\n {\n text: passed ? `Output starts with \"${value}\"` : `Output does not start with \"${value}\"`,\n passed,\n },\n ],\n };\n}\n\n/** Checks if `output` ends with `value` (both trimmed). */\nexport function runEndsWithAssertion(output: string, value: string): AssertionResult {\n const passed = output.trim().endsWith(value.trim());\n return {\n score: passed ? 1 : 0,\n assertions: [\n {\n text: passed ? `Output ends with \"${value}\"` : `Output does not end with \"${value}\"`,\n passed,\n },\n ],\n };\n}\n\n/** Checks if `output` matches the given regex `pattern` with optional `flags`. */\nexport function runRegexAssertion(\n output: string,\n pattern: string,\n flags?: string,\n): AssertionResult {\n const regex = new RegExp(pattern, flags);\n const passed = regex.test(output);\n const flagsLabel = flags ? ` (flags: ${flags})` : '';\n return {\n score: passed ? 1 : 0,\n assertions: [\n {\n text: passed\n ? `Output matches pattern /${pattern}/${flags ?? ''}${flagsLabel}`\n : `Output does not match pattern /${pattern}/${flags ?? ''}${flagsLabel}`,\n passed,\n },\n ],\n };\n}\n\n/** Checks if `output` is valid JSON. */\nexport function runIsJsonAssertion(output: string): AssertionResult {\n let passed = false;\n try {\n JSON.parse(output);\n passed = true;\n } catch {\n // not valid JSON\n }\n return {\n score: passed ? 1 : 0,\n assertions: [\n {\n text: passed ? 'Output is valid JSON' : 'Output is not valid JSON',\n passed,\n },\n ],\n };\n}\n\n/** Checks if `output` exactly equals `value` (both trimmed). */\nexport function runEqualsAssertion(output: string, value: string): AssertionResult {\n const passed = output.trim() === value.trim();\n return {\n score: passed ? 1 : 0,\n assertions: [\n {\n text: passed ? `Output equals \"${value}\"` : `Output does not equal \"${value}\"`,\n passed,\n },\n ],\n };\n}\n","import { spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { createWriteStream } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { trackChild } from '../../runtime/child-tracker.js';\nimport { extractTextContent, toContentArray } from './claude-content.js';\nimport { recordClaudeLogEntry } from './claude-log-tracker.js';\nimport { normalizeToolCall } from './normalize-tool-call.js';\nimport { buildPromptDocument, normalizeInputFiles } from './preread.js';\nimport type { ClaudeResolvedConfig } from './targets.js';\nimport type {\n Message,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ProviderTokenUsage,\n ToolCall,\n} from './types.js';\n\n/**\n * Claude CLI provider that spawns `claude -p` as a subprocess.\n * Uses --output-format stream-json --include-partial-messages for structured output.\n * This is the default `claude` provider. Use `claude-sdk` for SDK-based invocation.\n */\nexport class ClaudeCliProvider implements Provider {\n readonly id: string;\n readonly kind = 'claude-cli' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: ClaudeResolvedConfig;\n\n constructor(targetName: string, config: ClaudeResolvedConfig) {\n this.id = `claude-cli:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Claude CLI request was aborted before execution');\n }\n\n const startTime = new Date().toISOString();\n const startMs = Date.now();\n\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n\n // Build the prompt\n const inputFiles = normalizeInputFiles(request.inputFiles);\n const prompt = buildPromptDocument(request, inputFiles);\n\n const args = this.buildArgs();\n const cwd = this.resolveCwd(request.cwd);\n const env = sanitizeEnvForClaude(request.braintrustSpanIds);\n\n // Track state from stream events\n const completedToolCalls: ToolCall[] = [];\n const output: Message[] = [];\n let tokenUsage: ProviderTokenUsage | undefined;\n let costUsd: number | undefined;\n let durationMs: number | undefined;\n\n try {\n const result = await this.runClaude({\n args,\n cwd,\n prompt,\n env,\n signal: request.signal,\n onLine: (line) => {\n logger?.handleLine(line);\n const event = tryParseJson(line);\n if (!event) return;\n\n if (event.type === 'assistant') {\n const betaMessage = event.message;\n if (betaMessage && typeof betaMessage === 'object') {\n const msg = betaMessage as Record<string, unknown>;\n const content = msg.content;\n const structuredContent = toContentArray(content);\n const textContent = extractTextContent(content);\n const toolCalls = extractToolCalls(content);\n\n const outputMsg: Message = {\n role: 'assistant',\n content: structuredContent ?? textContent,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n output.push(outputMsg);\n completedToolCalls.push(...toolCalls);\n\n // Stream callbacks for real-time observability\n if (request.streamCallbacks) {\n for (const tc of toolCalls) {\n request.streamCallbacks.onToolCallEnd?.(\n tc.tool,\n tc.input,\n tc.output,\n tc.durationMs ?? 0,\n tc.id,\n );\n }\n }\n }\n }\n\n if (event.type === 'result') {\n const resultEvent = event as Record<string, unknown>;\n if (typeof resultEvent.total_cost_usd === 'number') {\n costUsd = resultEvent.total_cost_usd;\n }\n if (typeof resultEvent.duration_ms === 'number') {\n durationMs = resultEvent.duration_ms;\n }\n const usage = resultEvent.usage as Record<string, unknown> | undefined;\n if (usage) {\n const inputTokens =\n ((usage.input_tokens as number) ?? 0) +\n ((usage.cache_read_input_tokens as number) ?? 0) +\n ((usage.cache_creation_input_tokens as number) ?? 0);\n const outputTokens = (usage.output_tokens as number) ?? 0;\n const reasoningTokens = (usage.reasoning_tokens as number) ?? undefined;\n tokenUsage = {\n input: inputTokens,\n output: outputTokens,\n cached: (usage.cache_read_input_tokens as number) ?? undefined,\n reasoning: reasoningTokens,\n };\n\n // Stream callback for LLM usage\n request.streamCallbacks?.onLlmCallEnd?.(this.config.model ?? 'claude', tokenUsage);\n }\n }\n },\n });\n\n if (result.timedOut) {\n throw new Error(\n `Claude CLI timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n\n if (result.exitCode !== 0) {\n const detail = result.stderr.trim() || result.stdout.trim();\n const prefix = `Claude CLI exited with code ${result.exitCode}`;\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\n }\n\n const endTime = new Date().toISOString();\n const totalDurationMs = durationMs ?? Date.now() - startMs;\n\n return {\n raw: {\n model: this.config.model,\n logFile: logger?.filePath,\n args,\n exitCode: result.exitCode,\n },\n output,\n tokenUsage,\n costUsd,\n durationMs: totalDurationMs,\n startTime,\n endTime,\n };\n } finally {\n await logger?.close();\n }\n }\n\n private buildArgs(): string[] {\n // --verbose is required when combining -p with --output-format stream-json\n const args = [\n '-p',\n '--output-format',\n 'stream-json',\n '--include-partial-messages',\n '--verbose',\n ];\n\n if (this.config.bypassPermissions !== false) {\n args.push('--dangerously-skip-permissions');\n }\n\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n\n if (this.config.maxTurns !== undefined) {\n args.push('--max-turns', String(this.config.maxTurns));\n }\n\n return args;\n }\n\n private resolveCwd(cwdOverride?: string): string | undefined {\n if (cwdOverride) {\n return path.resolve(cwdOverride);\n }\n if (this.config.cwd) {\n return path.resolve(this.config.cwd);\n }\n return undefined;\n }\n\n private resolveLogDirectory(): string | undefined {\n const disabled = isClaudeCliLogStreamingDisabled();\n if (disabled) {\n return undefined;\n }\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'claude-cli');\n }\n\n private async createStreamLogger(\n request: ProviderRequest,\n ): Promise<ClaudeCliStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Claude CLI stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\n\n try {\n const logger = await ClaudeCliStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n });\n recordClaudeLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Claude CLI stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n\n private async runClaude(options: {\n readonly args: string[];\n readonly cwd: string | undefined;\n readonly prompt: string;\n readonly env: Record<string, string | undefined>;\n readonly signal?: AbortSignal;\n readonly onLine: (line: string) => void;\n }): Promise<{ stdout: string; stderr: string; exitCode: number; timedOut: boolean }> {\n return new Promise((resolve, reject) => {\n const spawnOptions: Parameters<typeof spawn>[2] = {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: options.env as NodeJS.ProcessEnv,\n };\n if (options.cwd) {\n spawnOptions.cwd = options.cwd;\n }\n\n const child = spawn(this.config.executable, options.args, spawnOptions);\n trackChild(child);\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n let stdoutBuffer = '';\n\n const onAbort = (): void => {\n child.kill('SIGTERM');\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n if (this.config.timeoutMs && this.config.timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, this.config.timeoutMs);\n timeoutHandle.unref?.();\n }\n\n if (child.stdout) {\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk: string) => {\n stdout += chunk;\n stdoutBuffer += chunk;\n // Process complete lines\n const lines = stdoutBuffer.split(/\\r?\\n/);\n stdoutBuffer = lines.pop() ?? '';\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length > 0) {\n options.onLine(trimmed);\n }\n }\n });\n }\n\n if (child.stderr) {\n child.stderr.setEncoding('utf8');\n child.stderr.on('data', (chunk: string) => {\n stderr += chunk;\n });\n }\n\n // Send prompt via stdin\n child.stdin?.end(options.prompt);\n\n const cleanup = (): void => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n if (options.signal) {\n options.signal.removeEventListener('abort', onAbort);\n }\n };\n\n child.on('error', (error) => {\n cleanup();\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n reject(\n new Error(\n `Claude CLI executable '${this.config.executable}' was not found on PATH. Install claude-code or ensure it is in PATH.`,\n ),\n );\n } else {\n reject(error);\n }\n });\n\n child.on('close', (code) => {\n cleanup();\n // Flush remaining buffer\n if (stdoutBuffer.trim().length > 0) {\n options.onLine(stdoutBuffer.trim());\n }\n resolve({\n stdout,\n stderr,\n exitCode: typeof code === 'number' ? code : -1,\n timedOut,\n });\n });\n });\n }\n}\n\nclass ClaudeCliStreamLogger {\n readonly filePath: string;\n private readonly stream: WriteStream;\n private readonly startedAt = Date.now();\n private readonly format: 'summary' | 'json';\n\n private constructor(filePath: string, format: 'summary' | 'json') {\n this.filePath = filePath;\n this.format = format;\n this.stream = createWriteStream(filePath, { flags: 'a' });\n }\n\n static async create(options: {\n readonly filePath: string;\n readonly targetName: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly format: 'summary' | 'json';\n }): Promise<ClaudeCliStreamLogger> {\n const logger = new ClaudeCliStreamLogger(options.filePath, options.format);\n const header = [\n '# Claude CLI stream log',\n `# target: ${options.targetName}`,\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\n `# started: ${new Date().toISOString()}`,\n '',\n ].filter((line): line is string => Boolean(line));\n for (const line of header) {\n logger.stream.write(`${line}\\n`);\n }\n return logger;\n }\n\n handleLine(line: string): void {\n const elapsed = formatElapsed(this.startedAt);\n const event = tryParseJson(line);\n\n if (this.format === 'json') {\n if (event) {\n this.stream.write(`${JSON.stringify({ time: elapsed, data: event })}\\n`);\n } else {\n this.stream.write(`${JSON.stringify({ time: elapsed, raw: line })}\\n`);\n }\n } else {\n if (event) {\n const summary = summarizeEvent(event);\n if (summary) {\n const type = typeof event.type === 'string' ? event.type : 'unknown';\n this.stream.write(`[+${elapsed}] [${type}] ${summary}\\n`);\n }\n } else {\n this.stream.write(`[+${elapsed}] ${line}\\n`);\n }\n }\n }\n\n async close(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.stream.once('error', reject);\n this.stream.end(() => resolve());\n });\n }\n}\n\nfunction summarizeEvent(event: Record<string, unknown>): string | undefined {\n const type = event.type as string;\n switch (type) {\n case 'assistant': {\n const message = event.message as Record<string, unknown> | undefined;\n if (message) {\n const content = message.content;\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0] as Record<string, unknown> | undefined;\n if (first?.type === 'tool_use') {\n return `tool_use (${first.name})`;\n }\n if (first?.type === 'text') {\n const text = first.text;\n if (typeof text === 'string') {\n const preview = text.length > 50 ? `${text.slice(0, 50)}...` : text;\n return preview;\n }\n }\n }\n }\n return 'message';\n }\n case 'user': {\n const message = event.message as Record<string, unknown> | undefined;\n if (message) {\n const content = message.content;\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0] as Record<string, unknown> | undefined;\n if (first?.type === 'tool_result') {\n return `tool_result (${first.tool_use_id})`;\n }\n }\n }\n return 'user';\n }\n case 'result': {\n const cost = event.total_cost_usd;\n const duration = event.duration_ms;\n if (typeof cost === 'number' && typeof duration === 'number') {\n return `$${cost.toFixed(4)}, ${Math.round(duration)}ms`;\n }\n return 'result';\n }\n case 'system':\n return 'init';\n default:\n return undefined;\n }\n}\n\n/**\n * Extract tool calls from Claude's content array format.\n */\nfunction extractToolCalls(content: unknown): readonly ToolCall[] {\n if (!Array.isArray(content)) {\n return [];\n }\n const toolCalls: ToolCall[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === 'tool_use' && typeof p.name === 'string') {\n toolCalls.push(\n normalizeToolCall('claude-cli', {\n tool: p.name,\n input: p.input,\n id: typeof p.id === 'string' ? p.id : undefined,\n }),\n );\n }\n }\n return toolCalls;\n}\n\n/**\n * Build a sanitized process.env without variables that block nested Claude sessions.\n * Removes CLAUDECODE so the spawned CLI doesn't refuse to run inside another session.\n */\nfunction sanitizeEnvForClaude(braintrustSpanIds?: {\n readonly parentSpanId: string;\n readonly rootSpanId: string;\n}): Record<string, string | undefined> {\n const env = { ...process.env };\n // Remove all Claude Code session markers to allow nested sessions\n env.CLAUDECODE = undefined;\n env.CLAUDE_CODE_ENTRYPOINT = undefined;\n // Inject Braintrust trace IDs so the trace-claude-code plugin can attach\n // Claude Code session traces to the AgentV eval span\n if (braintrustSpanIds) {\n env.CC_PARENT_SPAN_ID = braintrustSpanIds.parentSpanId;\n env.CC_ROOT_SPAN_ID = braintrustSpanIds.rootSpanId;\n }\n return env;\n}\n\nfunction isClaudeCliLogStreamingDisabled(): boolean {\n const envValue = process.env.AGENTV_CLAUDE_STREAM_LOGS;\n if (!envValue) {\n return false;\n }\n const normalized = envValue.trim().toLowerCase();\n return normalized === 'false' || normalized === '0' || normalized === 'off';\n}\n\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const evalId = sanitizeForFilename(request.evalCaseId ?? 'claude-cli');\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : '';\n const target = sanitizeForFilename(targetName);\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\n}\n\nfunction sanitizeForFilename(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : 'claude-cli';\n}\n\nfunction formatElapsed(startedAt: number): string {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\n const hours = Math.floor(elapsedSeconds / 3600);\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\n const seconds = elapsedSeconds % 60;\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n\nfunction tryParseJson(line: string): Record<string, unknown> | undefined {\n try {\n const parsed = JSON.parse(line);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n","/**\n * Tracks long-lived child processes spawned by AgentV providers so that a\n * top-level signal handler can kill them all on Ctrl+C / SIGTERM.\n *\n * Why this exists: when the CLI receives SIGTERM (e.g. from Studio's Stop\n * button), Node exits the parent process but does NOT propagate the signal\n * to grandchildren. Without tracking, the spawned `claude`, `codex`, `pi`,\n * `copilot` subprocesses linger as orphans. The CLI's signal handler walks\n * this set and SIGTERMs each one before exiting.\n *\n * To extend: any provider that spawns a long-lived subprocess should call\n * `trackChild(child)` immediately after `spawn(...)`. No untrack call is\n * required — `kill()` is a no-op on dead PIDs and the registry lives only\n * for the duration of one CLI invocation.\n *\n * Why a structural `Killable` type instead of `ChildProcess`: importing\n * the real type from `node:child_process` triggers a rollup-plugin-dts\n * resolution failure when this module's signatures are re-exported from\n * the package entry. The structural shape avoids that, and any\n * `ChildProcess` satisfies it.\n */\n\ntype Killable = {\n kill(signal?: NodeJS.Signals | number): boolean;\n once(event: 'close', listener: (...args: unknown[]) => void): unknown;\n};\n\nconst tracked = new Set<Killable>();\n\nexport function trackChild(child: Killable): void {\n tracked.add(child);\n child.once('close', () => {\n tracked.delete(child);\n });\n}\n\nexport function killAllTrackedChildren(signal: NodeJS.Signals = 'SIGTERM'): void {\n for (const child of tracked) {\n try {\n child.kill(signal);\n } catch {\n // Already dead or unable to signal; nothing to do.\n }\n }\n}\n\nexport function trackedChildCount(): number {\n return tracked.size;\n}\n","/**\n * Shared content-mapping utilities for Claude-based providers.\n *\n * Converts Claude's raw content array format (Anthropic API) into the AgentV\n * Content[] union so that non-text blocks (images) flow through the pipeline\n * without lossy flattening.\n *\n * Used by: claude-cli, claude-sdk, claude (legacy).\n *\n * ## Claude content format\n *\n * Claude responses use:\n * ```json\n * { \"content\": [\n * { \"type\": \"text\", \"text\": \"...\" },\n * { \"type\": \"image\", \"source\": { \"type\": \"base64\", \"media_type\": \"image/png\", \"data\": \"...\" } },\n * { \"type\": \"tool_use\", \"name\": \"...\", \"input\": {...}, \"id\": \"...\" }\n * ]}\n * ```\n *\n * `toContentArray` maps text and image blocks to `Content[]`.\n * `tool_use` and `tool_result` blocks are handled separately as `ToolCall`.\n */\n\nimport type { Content } from '../content.js';\n\n/**\n * Convert Claude's raw content array to `Content[]`, preserving non-text blocks.\n *\n * Returns `undefined` when the content is a plain string or contains only text\n * blocks — callers should fall back to the text-only string representation in\n * that case (no benefit from wrapping plain text in `Content[]`).\n */\nexport function toContentArray(content: unknown): Content[] | undefined {\n if (!Array.isArray(content)) return undefined;\n\n let hasNonText = false;\n const blocks: Content[] = [];\n\n for (const part of content) {\n if (!part || typeof part !== 'object') continue;\n const p = part as Record<string, unknown>;\n\n if (p.type === 'text' && typeof p.text === 'string') {\n blocks.push({ type: 'text', text: p.text });\n } else if (p.type === 'image' && typeof p.source === 'object' && p.source !== null) {\n const src = p.source as Record<string, unknown>;\n const mediaType =\n typeof p.media_type === 'string'\n ? p.media_type\n : typeof src.media_type === 'string'\n ? src.media_type\n : 'application/octet-stream';\n const data =\n typeof src.data === 'string' && src.data !== ''\n ? `data:${mediaType};base64,${src.data}`\n : typeof p.url === 'string' && p.url !== ''\n ? (p.url as string)\n : '';\n if (!data) continue;\n blocks.push({ type: 'image', media_type: mediaType, source: data });\n hasNonText = true;\n } else if (p.type === 'tool_use') {\n // tool_use blocks are handled separately as ToolCall — skip\n } else if (p.type === 'tool_result') {\n // tool_result blocks are not user content — skip\n }\n }\n\n return hasNonText && blocks.length > 0 ? blocks : undefined;\n}\n\n/**\n * Extract text content from Claude's content array format.\n * Returns joined text from all `type: 'text'` blocks (newline-separated).\n */\nexport function extractTextContent(content: unknown): string | undefined {\n if (typeof content === 'string') {\n return content;\n }\n if (!Array.isArray(content)) {\n return undefined;\n }\n const textParts: string[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === 'text' && typeof p.text === 'string') {\n textParts.push(p.text);\n }\n }\n return textParts.length > 0 ? textParts.join('\\n') : undefined;\n}\n","export type ClaudeLogEntry = {\n readonly filePath: string;\n readonly evalCaseId?: string;\n readonly targetName: string;\n readonly attempt?: number;\n};\n\nconst GLOBAL_LOGS_KEY = Symbol.for('agentv.claudeLogs');\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for('agentv.claudeLogSubscribers');\n\ntype ClaudeLogListener = (entry: ClaudeLogEntry) => void;\n\ntype GlobalWithClaudeLogs = typeof globalThis & {\n [GLOBAL_LOGS_KEY]?: ClaudeLogEntry[];\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<ClaudeLogListener>;\n};\n\nfunction getClaudeLogStore(): ClaudeLogEntry[] {\n const globalObject = globalThis as GlobalWithClaudeLogs;\n const existing = globalObject[GLOBAL_LOGS_KEY];\n if (existing) {\n return existing;\n }\n const created: ClaudeLogEntry[] = [];\n globalObject[GLOBAL_LOGS_KEY] = created;\n return created;\n}\n\nfunction getSubscriberStore(): Set<ClaudeLogListener> {\n const globalObject = globalThis as GlobalWithClaudeLogs;\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\n if (existing) {\n return existing;\n }\n const created = new Set<ClaudeLogListener>();\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\n return created;\n}\n\nfunction notifySubscribers(entry: ClaudeLogEntry): void {\n const subscribers = Array.from(getSubscriberStore());\n for (const listener of subscribers) {\n try {\n listener(entry);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Claude log subscriber failed: ${message}`);\n }\n }\n}\n\nexport function recordClaudeLogEntry(entry: ClaudeLogEntry): void {\n getClaudeLogStore().push(entry);\n notifySubscribers(entry);\n}\n\nexport function consumeClaudeLogEntries(): ClaudeLogEntry[] {\n const store = getClaudeLogStore();\n if (store.length === 0) {\n return [];\n }\n return store.splice(0, store.length);\n}\n\nexport function subscribeToClaudeLogEntries(listener: ClaudeLogListener): () => void {\n const store = getSubscriberStore();\n store.add(listener);\n return () => {\n store.delete(listener);\n };\n}\n","/**\n * Canonical ToolCall name normalization.\n *\n * Maps provider-native tool names and input fields to canonical values so that\n * downstream consumers (evaluators, analytics, transcript writers) never need\n * provider-specific matching logic.\n *\n * Canonical tool names (Claude's naming is the canonical set):\n * - \"Skill\" — skill invocation\n * - \"Read\" — file read\n * - \"Write\" — file write\n * - \"Edit\" — file edit\n * - \"Bash\" — shell command execution\n *\n * Tools not in the mapping table pass through unchanged.\n *\n * To add a new provider:\n * 1. Add entries to TOOL_NAME_MAP for that provider's native tool names.\n * 2. If the provider encodes info in tool-name prefixes (e.g. \"Using skill: X\"),\n * add entries to TOOL_PREFIX_MAP.\n * 3. Add input-field normalizations to INPUT_FIELD_NORMALIZERS if the provider\n * uses non-canonical field names (e.g. `path` instead of `file_path`).\n */\n\nimport type { ProviderKind } from './types.js';\nimport type { ToolCall } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Canonical tool names\n// ---------------------------------------------------------------------------\n\ntype CanonicalTool = 'Skill' | 'Read' | 'Write' | 'Edit' | 'Bash';\n\n// ---------------------------------------------------------------------------\n// Static mapping: provider × native-name → canonical name\n// ---------------------------------------------------------------------------\n\n/**\n * Exact tool-name mapping per provider kind.\n * Key = `${providerKind}::${nativeToolName}`, value = canonical name.\n *\n * Providers whose names already match canonical (Claude variants) still have\n * entries for explicitness and forward safety.\n */\nconst TOOL_NAME_MAP = new Map<string, CanonicalTool>([\n // --- Claude (already canonical) ---\n ['claude::Skill', 'Skill'],\n ['claude::Read', 'Read'],\n ['claude::Write', 'Write'],\n ['claude::Edit', 'Edit'],\n ['claude::Bash', 'Bash'],\n ['claude-cli::Skill', 'Skill'],\n ['claude-cli::Read', 'Read'],\n ['claude-cli::Write', 'Write'],\n ['claude-cli::Edit', 'Edit'],\n ['claude-cli::Bash', 'Bash'],\n ['claude-sdk::Skill', 'Skill'],\n ['claude-sdk::Read', 'Read'],\n ['claude-sdk::Write', 'Write'],\n ['claude-sdk::Edit', 'Edit'],\n ['claude-sdk::Bash', 'Bash'],\n\n // --- Copilot ---\n ['copilot-cli::Skill', 'Skill'],\n ['copilot-cli::skill', 'Skill'],\n ['copilot-cli::Read File', 'Read'],\n ['copilot-cli::readFile', 'Read'],\n ['copilot-cli::Read', 'Read'],\n ['copilot-cli::readTextFile', 'Read'],\n ['copilot-cli::writeTextFile', 'Write'],\n ['copilot-cli::Write File', 'Write'],\n ['copilot-cli::editFile', 'Edit'],\n ['copilot-cli::Edit File', 'Edit'],\n ['copilot-cli::runTerminalCommand', 'Bash'],\n\n ['copilot-sdk::Skill', 'Skill'],\n ['copilot-sdk::skill', 'Skill'],\n ['copilot-sdk::Read File', 'Read'],\n ['copilot-sdk::readFile', 'Read'],\n ['copilot-sdk::Read', 'Read'],\n ['copilot-sdk::readTextFile', 'Read'],\n ['copilot-sdk::writeTextFile', 'Write'],\n ['copilot-sdk::Write File', 'Write'],\n ['copilot-sdk::editFile', 'Edit'],\n ['copilot-sdk::Edit File', 'Edit'],\n ['copilot-sdk::runTerminalCommand', 'Bash'],\n\n ['copilot-log::Skill', 'Skill'],\n ['copilot-log::skill', 'Skill'],\n ['copilot-log::Read File', 'Read'],\n ['copilot-log::readFile', 'Read'],\n ['copilot-log::Read', 'Read'],\n ['copilot-log::readTextFile', 'Read'],\n ['copilot-log::writeTextFile', 'Write'],\n ['copilot-log::Write File', 'Write'],\n ['copilot-log::editFile', 'Edit'],\n ['copilot-log::Edit File', 'Edit'],\n ['copilot-log::runTerminalCommand', 'Bash'],\n\n ['vscode::Skill', 'Skill'],\n ['vscode::skill', 'Skill'],\n ['vscode::Read File', 'Read'],\n ['vscode::readFile', 'Read'],\n ['vscode::Read', 'Read'],\n ['vscode::readTextFile', 'Read'],\n ['vscode::writeTextFile', 'Write'],\n ['vscode::Write File', 'Write'],\n ['vscode::editFile', 'Edit'],\n ['vscode::Edit File', 'Edit'],\n ['vscode::runTerminalCommand', 'Bash'],\n\n ['vscode-insiders::Skill', 'Skill'],\n ['vscode-insiders::skill', 'Skill'],\n ['vscode-insiders::Read File', 'Read'],\n ['vscode-insiders::readFile', 'Read'],\n ['vscode-insiders::Read', 'Read'],\n ['vscode-insiders::readTextFile', 'Read'],\n ['vscode-insiders::writeTextFile', 'Write'],\n ['vscode-insiders::Write File', 'Write'],\n ['vscode-insiders::editFile', 'Edit'],\n ['vscode-insiders::Edit File', 'Edit'],\n ['vscode-insiders::runTerminalCommand', 'Bash'],\n\n // --- Codex ---\n ['codex::command_execution', 'Bash'],\n ['codex::file_change', 'Edit'],\n\n // --- Pi ---\n ['pi-coding-agent::read', 'Read'],\n ['pi-coding-agent::bash', 'Bash'],\n ['pi-cli::read', 'Read'],\n ['pi-cli::bash', 'Bash'],\n]);\n\n// ---------------------------------------------------------------------------\n// Prefix-based mapping: provider × prefix → canonical name\n// ---------------------------------------------------------------------------\n\n/**\n * Prefix-based tool-name mappings for providers that encode information in the\n * tool name itself (e.g. Copilot's \"Using skill: X\" or Codex's \"mcp:/...\").\n *\n * Checked when no exact match is found in TOOL_NAME_MAP.\n */\ninterface PrefixRule {\n readonly prefix: string;\n readonly canonical: CanonicalTool;\n /** If true, extract the suffix after the prefix as input.skill */\n readonly extractSkillFromName?: boolean;\n}\n\nconst COPILOT_PREFIXES: readonly PrefixRule[] = [\n { prefix: 'Using skill: ', canonical: 'Skill', extractSkillFromName: true },\n { prefix: 'Viewing ', canonical: 'Read' },\n];\n\nconst CODEX_PREFIXES: readonly PrefixRule[] = [\n { prefix: 'mcp:', canonical: 'Skill', extractSkillFromName: true },\n];\n\nconst TOOL_PREFIX_MAP = new Map<string, readonly PrefixRule[]>([\n ['copilot-cli', COPILOT_PREFIXES],\n ['copilot-sdk', COPILOT_PREFIXES],\n ['copilot-log', COPILOT_PREFIXES],\n ['vscode', COPILOT_PREFIXES],\n ['vscode-insiders', COPILOT_PREFIXES],\n ['codex', CODEX_PREFIXES],\n]);\n\n// ---------------------------------------------------------------------------\n// Input field normalization\n// ---------------------------------------------------------------------------\n\n/**\n * After tool-name normalization, ensure canonical input field names exist.\n * E.g. if a provider uses `input.path` for reads, copy it to `input.file_path`.\n */\ntype InputNormalizer = (input: Record<string, unknown>) => Record<string, unknown>;\n\nconst normalizeSkillInput: InputNormalizer = (input) => {\n if (input.skill !== undefined) return input;\n return input;\n};\n\nconst normalizeReadInput: InputNormalizer = (input) => {\n if (input.file_path !== undefined) return input;\n if (input.path !== undefined) return { ...input, file_path: input.path };\n if (input.filePath !== undefined) return { ...input, file_path: input.filePath };\n return input;\n};\n\nconst INPUT_NORMALIZERS = new Map<CanonicalTool, InputNormalizer>([\n ['Skill', normalizeSkillInput],\n ['Read', normalizeReadInput],\n]);\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Normalize a ToolCall's tool name and input fields to canonical values.\n *\n * This is a pure function — provider kind in, canonical ToolCall out.\n * Unknown tool names pass through unchanged.\n */\nexport function normalizeToolCall(providerKind: ProviderKind, tc: ToolCall): ToolCall {\n const nativeName = tc.tool;\n\n // 1. Try exact match\n const exactKey = `${providerKind}::${nativeName}`;\n const canonical = TOOL_NAME_MAP.get(exactKey);\n if (canonical) {\n return applyInputNormalization(canonical, { ...tc, tool: canonical });\n }\n\n // 2. Try prefix match\n const prefixRules = TOOL_PREFIX_MAP.get(providerKind);\n if (prefixRules) {\n for (const rule of prefixRules) {\n if (nativeName.startsWith(rule.prefix)) {\n const suffix = nativeName.slice(rule.prefix.length);\n let normalizedInput = tc.input;\n\n if (rule.extractSkillFromName && suffix) {\n const existingInput = (tc.input as Record<string, unknown> | undefined) ?? {};\n normalizedInput = { ...existingInput, skill: suffix };\n }\n\n const normalized: ToolCall = {\n ...tc,\n tool: rule.canonical,\n input: normalizedInput,\n };\n return applyInputNormalization(rule.canonical, normalized);\n }\n }\n }\n\n // 3. No match — pass through unchanged\n return tc;\n}\n\nfunction applyInputNormalization(canonical: CanonicalTool, tc: ToolCall): ToolCall {\n const normalizer = INPUT_NORMALIZERS.get(canonical);\n if (!normalizer || tc.input === undefined || tc.input === null) return tc;\n\n const input = tc.input as Record<string, unknown>;\n const normalized = normalizer(input);\n return normalized === input ? tc : { ...tc, input: normalized };\n}\n","import path from 'node:path';\n\nimport type { ProviderRequest } from './types.js';\n\nexport function buildPromptDocument(\n request: ProviderRequest,\n inputFiles: readonly string[] | undefined,\n): string {\n const parts: string[] = [];\n\n const inputFilesList = collectInputFiles(inputFiles);\n\n const prereadBlock = buildMandatoryPrereadBlock(inputFilesList);\n if (prereadBlock.length > 0) {\n parts.push('\\n', prereadBlock);\n }\n\n parts.push('\\n[[ ## user_query ## ]]\\n', request.question.trim());\n\n return parts.join('\\n').trim();\n}\n\nexport function normalizeInputFiles(\n inputFiles: readonly string[] | undefined,\n): string[] | undefined {\n if (!inputFiles || inputFiles.length === 0) {\n return undefined;\n }\n const deduped = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!deduped.has(absolutePath)) {\n deduped.set(absolutePath, absolutePath);\n }\n }\n return Array.from(deduped.values());\n}\n\nfunction collectInputFiles(inputFiles: readonly string[] | undefined): string[] {\n if (!inputFiles || inputFiles.length === 0) {\n return [];\n }\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n return Array.from(unique.values());\n}\n\nfunction buildMandatoryPrereadBlock(inputFiles: readonly string[]): string {\n if (inputFiles.length === 0) {\n return '';\n }\n\n const buildList = (files: readonly string[]): string[] =>\n files.map((absolutePath) => {\n const fileName = path.basename(absolutePath);\n const fileUri = pathToFileUri(absolutePath);\n return `* [${fileName}](${fileUri})`;\n });\n\n const sections: string[] = [];\n\n if (inputFiles.length > 0) {\n sections.push(`Read all input files:\\n${buildList(inputFiles).join('\\n')}.`);\n }\n\n sections.push(\n 'If any file is missing, fail with ERROR: missing-file <filename> and stop.',\n 'Then apply system_instructions on the user query below.',\n );\n\n return sections.join('\\n');\n}\n\nfunction pathToFileUri(filePath: string): string {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n return `file://${normalizedPath}`;\n}\n","import { randomUUID } from 'node:crypto';\nimport { createWriteStream } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { extractTextContent, toContentArray } from './claude-content.js';\nimport { recordClaudeLogEntry } from './claude-log-tracker.js';\nimport { normalizeToolCall } from './normalize-tool-call.js';\nimport { buildPromptDocument, normalizeInputFiles } from './preread.js';\nimport type { ClaudeResolvedConfig } from './targets.js';\nimport type {\n Message,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ProviderTokenUsage,\n ToolCall,\n} from './types.js';\n\n// Lazy-loaded module to avoid bundling issues with dynamic requires\n// biome-ignore lint/suspicious/noExplicitAny: dynamic import type\nlet claudeSdkModule: any = null;\n\nasync function loadClaudeSdk(): Promise<typeof import('@anthropic-ai/claude-agent-sdk')> {\n if (!claudeSdkModule) {\n try {\n claudeSdkModule = await import('@anthropic-ai/claude-agent-sdk');\n } catch (error) {\n throw new Error(\n `Failed to load @anthropic-ai/claude-agent-sdk. Please install it:\\n npm install @anthropic-ai/claude-agent-sdk\\n\\nOriginal error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return claudeSdkModule;\n}\n\n/**\n * Claude Agent SDK provider using the @anthropic-ai/claude-agent-sdk library directly.\n * This provides typed SDK access for structured tool calls, token usage, and clean\n * session lifecycle. Use `claude-cli` for subprocess-based invocation.\n *\n * Note: The SDK is loaded lazily on first use to avoid bundling issues.\n * Users must install @anthropic-ai/claude-agent-sdk separately.\n */\nexport class ClaudeSdkProvider implements Provider {\n readonly id: string;\n readonly kind = 'claude-sdk' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: ClaudeResolvedConfig;\n\n constructor(targetName: string, config: ClaudeResolvedConfig) {\n this.id = `claude-sdk:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Claude SDK request was aborted before execution');\n }\n\n const sdk = await loadClaudeSdk();\n\n const startTime = new Date().toISOString();\n const startMs = Date.now();\n\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n\n // Build the prompt\n const inputFiles = normalizeInputFiles(request.inputFiles);\n const prompt = buildPromptDocument(request, inputFiles);\n\n // Skip forced diff prompt when AgentV captures file changes\n const systemPrompt = this.config.systemPrompt;\n\n // Build query options\n // biome-ignore lint/suspicious/noExplicitAny: SDK options type is dynamically loaded\n const queryOptions: any = {\n permissionMode: 'bypassPermissions',\n allowDangerouslySkipPermissions: true,\n // The SDK spawns a Claude Code subprocess. When AgentV itself runs inside\n // a Claude Code session the CLAUDECODE env var is set, which causes the\n // subprocess to refuse to start (\"cannot be launched inside another Claude\n // Code session\"). Passing a sanitized env removes that guard.\n env: sanitizeEnvForClaudeSdk(request.braintrustSpanIds),\n };\n\n if (this.config.model) {\n queryOptions.model = this.config.model;\n }\n\n const cwd = this.resolveCwd(request.cwd);\n if (cwd) {\n queryOptions.cwd = cwd;\n }\n\n if (systemPrompt) {\n queryOptions.systemPrompt = systemPrompt;\n }\n\n if (this.config.maxTurns !== undefined) {\n queryOptions.maxTurns = this.config.maxTurns;\n }\n\n if (this.config.maxBudgetUsd !== undefined) {\n queryOptions.maxBudgetUsd = this.config.maxBudgetUsd;\n }\n\n if (request.signal) {\n queryOptions.abortController = { signal: request.signal } as AbortController;\n }\n\n // Track state from messages\n const completedToolCalls: ToolCall[] = [];\n const output: Message[] = [];\n let tokenUsage: ProviderTokenUsage | undefined;\n let costUsd: number | undefined;\n let durationMs: number | undefined;\n\n try {\n const q = sdk.query({ prompt, options: queryOptions });\n\n // Set up timeout if configured\n let timeoutTimer: ReturnType<typeof setTimeout> | undefined;\n if (this.config.timeoutMs) {\n timeoutTimer = setTimeout(() => {\n q.return(undefined as never).catch(() => {});\n }, this.config.timeoutMs);\n timeoutTimer.unref?.();\n }\n\n try {\n for await (const message of q) {\n logger?.handleMessage(message);\n\n if (message.type === 'assistant') {\n const betaMessage = (message as { message?: unknown }).message;\n if (betaMessage && typeof betaMessage === 'object') {\n const msg = betaMessage as Record<string, unknown>;\n const content = msg.content;\n const structuredContent = toContentArray(content);\n const textContent = extractTextContent(content);\n const toolCalls = extractToolCalls(content);\n\n const outputMsg: Message = {\n role: 'assistant',\n content: structuredContent ?? textContent,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n output.push(outputMsg);\n completedToolCalls.push(...toolCalls);\n\n // Stream callbacks for real-time observability\n if (request.streamCallbacks) {\n for (const tc of toolCalls) {\n request.streamCallbacks.onToolCallEnd?.(\n tc.tool,\n tc.input,\n tc.output,\n tc.durationMs ?? 0,\n tc.id,\n );\n }\n }\n }\n }\n\n if (message.type === 'result') {\n const result = message as Record<string, unknown>;\n if (typeof result.total_cost_usd === 'number') {\n costUsd = result.total_cost_usd;\n }\n if (typeof result.duration_ms === 'number') {\n durationMs = result.duration_ms;\n }\n const usage = result.usage as Record<string, unknown> | undefined;\n if (usage) {\n const inputTokens =\n ((usage.input_tokens as number) ?? 0) +\n ((usage.cache_read_input_tokens as number) ?? 0) +\n ((usage.cache_creation_input_tokens as number) ?? 0);\n const outputTokens = (usage.output_tokens as number) ?? 0;\n const reasoningTokens = (usage.reasoning_tokens as number) ?? undefined;\n tokenUsage = {\n input: inputTokens,\n output: outputTokens,\n cached: (usage.cache_read_input_tokens as number) ?? undefined,\n reasoning: reasoningTokens,\n };\n\n // Stream callback for LLM usage\n request.streamCallbacks?.onLlmCallEnd?.(this.config.model ?? 'claude', tokenUsage);\n }\n }\n }\n } finally {\n if (timeoutTimer) {\n clearTimeout(timeoutTimer);\n }\n }\n\n const endTime = new Date().toISOString();\n const totalDurationMs = durationMs ?? Date.now() - startMs;\n\n return {\n raw: {\n model: this.config.model,\n logFile: logger?.filePath,\n },\n output,\n tokenUsage,\n costUsd,\n durationMs: totalDurationMs,\n startTime,\n endTime,\n };\n } finally {\n await logger?.close();\n }\n }\n\n private resolveCwd(cwdOverride?: string): string | undefined {\n if (cwdOverride) {\n return path.resolve(cwdOverride);\n }\n if (this.config.cwd) {\n return path.resolve(this.config.cwd);\n }\n return undefined;\n }\n\n private resolveLogDirectory(): string | undefined {\n const disabled = isClaudeLogStreamingDisabled();\n if (disabled) {\n return undefined;\n }\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'claude');\n }\n\n private async createStreamLogger(\n request: ProviderRequest,\n ): Promise<ClaudeStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Claude stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\n\n try {\n const logger = await ClaudeStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n });\n recordClaudeLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Claude stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\n/**\n * Extract tool calls from Claude's content array format.\n * Claude uses: content: [{ type: \"tool_use\", name: \"...\", input: {...}, id: \"...\" }, ...]\n */\nfunction extractToolCalls(content: unknown): readonly ToolCall[] {\n if (!Array.isArray(content)) {\n return [];\n }\n const toolCalls: ToolCall[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === 'tool_use' && typeof p.name === 'string') {\n toolCalls.push(\n normalizeToolCall('claude-sdk', {\n tool: p.name,\n input: p.input,\n id: typeof p.id === 'string' ? p.id : undefined,\n }),\n );\n }\n }\n return toolCalls;\n}\n\nclass ClaudeStreamLogger {\n readonly filePath: string;\n private readonly stream: WriteStream;\n private readonly startedAt = Date.now();\n private readonly format: 'summary' | 'json';\n\n private constructor(filePath: string, format: 'summary' | 'json') {\n this.filePath = filePath;\n this.format = format;\n this.stream = createWriteStream(filePath, { flags: 'a' });\n }\n\n static async create(options: {\n readonly filePath: string;\n readonly targetName: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly format: 'summary' | 'json';\n }): Promise<ClaudeStreamLogger> {\n const logger = new ClaudeStreamLogger(options.filePath, options.format);\n const header = [\n '# Claude Agent SDK stream log',\n `# target: ${options.targetName}`,\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\n `# started: ${new Date().toISOString()}`,\n '',\n ].filter((line): line is string => Boolean(line));\n for (const line of header) {\n logger.stream.write(`${line}\\n`);\n }\n return logger;\n }\n\n handleMessage(message: unknown): void {\n if (!message || typeof message !== 'object') {\n return;\n }\n const elapsed = formatElapsed(this.startedAt);\n const msg = message as Record<string, unknown>;\n const type = typeof msg.type === 'string' ? msg.type : 'unknown';\n\n if (this.format === 'json') {\n this.stream.write(`${JSON.stringify({ time: elapsed, type, data: message })}\\n`);\n } else {\n const summary = summarizeMessage(msg);\n if (summary) {\n this.stream.write(`[+${elapsed}] [${type}] ${summary}\\n`);\n }\n }\n }\n\n async close(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.stream.once('error', reject);\n this.stream.end(() => resolve());\n });\n }\n}\n\nfunction summarizeMessage(msg: Record<string, unknown>): string | undefined {\n const type = msg.type as string;\n switch (type) {\n case 'assistant': {\n const message = msg.message as Record<string, unknown> | undefined;\n if (message) {\n const content = message.content;\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0] as Record<string, unknown> | undefined;\n if (first?.type === 'tool_use') {\n return `tool_use (${first.name})`;\n }\n if (first?.type === 'text') {\n const text = first.text;\n if (typeof text === 'string') {\n const preview = text.length > 50 ? `${text.slice(0, 50)}...` : text;\n return preview;\n }\n }\n }\n }\n return 'message';\n }\n case 'user': {\n const message = msg.message as Record<string, unknown> | undefined;\n if (message) {\n const content = message.content;\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0] as Record<string, unknown> | undefined;\n if (first?.type === 'tool_result') {\n return `tool_result (${first.tool_use_id})`;\n }\n }\n }\n return 'user';\n }\n case 'result': {\n const cost = msg.total_cost_usd;\n const duration = msg.duration_ms;\n if (typeof cost === 'number' && typeof duration === 'number') {\n return `$${cost.toFixed(4)}, ${Math.round(duration)}ms`;\n }\n return 'result';\n }\n case 'system':\n return 'init';\n default:\n return undefined;\n }\n}\n\n/**\n * Build a process.env copy without variables that block nested Claude sessions.\n * The Claude Agent SDK spawns Claude Code as a child process; if CLAUDECODE is\n * present the child immediately exits with \"cannot be launched inside another\n * Claude Code session\".\n */\nfunction sanitizeEnvForClaudeSdk(braintrustSpanIds?: {\n readonly parentSpanId: string;\n readonly rootSpanId: string;\n}): Record<string, string | undefined> {\n const env = { ...process.env };\n // Remove all Claude Code session markers to allow nested sessions\n env.CLAUDECODE = undefined;\n env.CLAUDE_CODE_ENTRYPOINT = undefined;\n // Inject Braintrust trace IDs so the trace-claude-code plugin can attach\n // Claude Code session traces to the AgentV eval span\n if (braintrustSpanIds) {\n env.CC_PARENT_SPAN_ID = braintrustSpanIds.parentSpanId;\n env.CC_ROOT_SPAN_ID = braintrustSpanIds.rootSpanId;\n }\n return env;\n}\n\nfunction isClaudeLogStreamingDisabled(): boolean {\n const envValue = process.env.AGENTV_CLAUDE_STREAM_LOGS;\n if (!envValue) {\n return false;\n }\n const normalized = envValue.trim().toLowerCase();\n return normalized === 'false' || normalized === '0' || normalized === 'off';\n}\n\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const evalId = sanitizeForFilename(request.evalCaseId ?? 'claude');\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : '';\n const target = sanitizeForFilename(targetName);\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\n}\n\nfunction sanitizeForFilename(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : 'claude';\n}\n\nfunction formatElapsed(startedAt: number): string {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\n const hours = Math.floor(elapsedSeconds / 3600);\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\n const seconds = elapsedSeconds % 60;\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n","import { type ExecException, type ExecOptions, exec as execWithCallback } from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { z } from 'zod';\n\nimport type { Content } from '../content.js';\nimport { isContentArray } from '../content.js';\nimport { readTextFile } from '../file-utils.js';\nimport type { CliResolvedConfig } from './targets.js';\nimport type {\n Message,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ProviderTokenUsage,\n} from './types.js';\n\n// ---------------------------------------------------------------------------\n// Zod Schemas for CLI Output Parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Schema for tool calls in output messages.\n * Validates tool_calls array items from CLI JSON output.\n */\nconst ToolCallSchema = z.object({\n tool: z.string(),\n input: z.unknown().optional(),\n output: z.unknown().optional(),\n id: z.string().optional(),\n start_time: z.string().optional(),\n end_time: z.string().optional(),\n duration_ms: z.number().optional(),\n});\n\n/**\n * Schema for individual output messages.\n * Validates output array items from CLI JSON output.\n * Uses snake_case field names matching JSONL convention.\n */\nconst MessageInputSchema = z.object({\n role: z.string(),\n name: z.string().optional(),\n content: z.unknown().optional(),\n tool_calls: z.array(ToolCallSchema).optional(),\n start_time: z.string().optional(),\n end_time: z.string().optional(),\n duration_ms: z.number().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n/**\n * Schema for token usage metrics.\n * Validates token_usage object from CLI JSON output.\n */\nconst TokenUsageSchema = z.object({\n input: z.number(),\n output: z.number(),\n cached: z.number().optional(),\n});\n\n/**\n * Schema for CLI single output JSON structure.\n * Validates the complete JSON output from a single CLI invocation.\n * All fields are optional to support various output formats.\n */\nconst CliOutputSchema = z.object({\n text: z.unknown().optional(),\n output: z.array(MessageInputSchema).optional(),\n output_messages: z.array(MessageInputSchema).optional(),\n token_usage: TokenUsageSchema.optional(),\n cost_usd: z.number().optional(),\n duration_ms: z.number().optional(),\n});\n\n/**\n * Schema for CLI JSONL batch output records.\n * Extends CliOutputSchema with required 'id' field for batch processing.\n */\nconst CliJsonlRecordSchema = CliOutputSchema.extend({\n id: z.string().min(1),\n});\n\n// Type for parsed output messages from Zod schema\ntype ParsedMessage = z.infer<typeof MessageInputSchema>;\n\n/**\n * Validates cost_usd and duration_ms values, warning and discarding negative values.\n * Returns sanitized values (undefined if negative).\n */\nfunction validateMetrics(\n costUsd: number | undefined,\n durationMs: number | undefined,\n context: string,\n): { costUsd: number | undefined; durationMs: number | undefined } {\n let validCostUsd = costUsd;\n let validDurationMs = durationMs;\n\n if (costUsd !== undefined && costUsd < 0) {\n console.warn(`[cli-provider] ${context}: ignoring negative cost_usd value (${costUsd})`);\n validCostUsd = undefined;\n }\n\n if (durationMs !== undefined && durationMs < 0) {\n console.warn(`[cli-provider] ${context}: ignoring negative duration_ms value (${durationMs})`);\n validDurationMs = undefined;\n }\n\n return { costUsd: validCostUsd, durationMs: validDurationMs };\n}\n\n/**\n * Converts Zod-parsed output messages to internal Message format.\n * Handles snake_case to camelCase conversion for toolCalls and durationMs.\n */\nfunction convertMessages(\n messages: readonly ParsedMessage[] | undefined,\n): readonly Message[] | undefined {\n if (!messages || messages.length === 0) {\n return undefined;\n }\n\n return messages.map((msg) => ({\n role: msg.role,\n name: msg.name,\n content: isContentArray(msg.content)\n ? (msg.content as Content[])\n : typeof msg.content === 'string'\n ? msg.content\n : undefined,\n toolCalls: msg.tool_calls?.map((tc) => ({\n tool: tc.tool,\n input: tc.input,\n output: tc.output,\n id: tc.id,\n startTime: tc.start_time,\n endTime: tc.end_time,\n durationMs: tc.duration_ms,\n })),\n startTime: msg.start_time,\n endTime: msg.end_time,\n durationMs: msg.duration_ms,\n metadata: msg.metadata,\n }));\n}\n\nconst execAsync = promisify(execWithCallback);\nconst DEFAULT_MAX_BUFFER = 10 * 1024 * 1024; // 10 MB to accommodate verbose CLI output\n\nexport interface CommandRunOptions {\n readonly cwd?: string;\n readonly env?: NodeJS.ProcessEnv;\n readonly timeoutMs?: number;\n readonly signal?: AbortSignal;\n}\n\nexport interface CommandRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number | null;\n readonly failed: boolean;\n readonly timedOut?: boolean;\n readonly signal?: NodeJS.Signals | null;\n}\n\nexport type CommandRunner = (\n command: string,\n options: CommandRunOptions,\n) => Promise<CommandRunResult>;\n\nasync function defaultCommandRunner(\n command: string,\n options: CommandRunOptions,\n): Promise<CommandRunResult> {\n const execOptions: ExecOptions = {\n cwd: options.cwd,\n env: options.env,\n timeout: options.timeoutMs,\n signal: options.signal,\n maxBuffer: DEFAULT_MAX_BUFFER,\n shell: process.platform === 'win32' ? 'powershell.exe' : undefined,\n };\n\n try {\n const { stdout, stderr } = await execAsync(command, execOptions);\n\n return {\n stdout,\n stderr,\n exitCode: 0,\n failed: false,\n timedOut: false,\n signal: null,\n };\n } catch (error) {\n const execError = error as ExecException & {\n stdout?: string;\n stderr?: string;\n timedOut?: boolean;\n killed?: boolean;\n };\n\n return {\n stdout: execError.stdout ?? '',\n stderr: execError.stderr ?? '',\n exitCode: typeof execError.code === 'number' ? execError.code : null,\n failed: true,\n timedOut: execError.timedOut === true || execError.killed === true,\n signal: execError.signal ?? null,\n };\n }\n}\n\nexport class CliProvider implements Provider {\n readonly id: string;\n readonly kind = 'cli';\n readonly targetName: string;\n readonly supportsBatch = true;\n\n private readonly config: CliResolvedConfig;\n private readonly runCommand: CommandRunner;\n private readonly verbose: boolean;\n private readonly keepTempFiles: boolean;\n private healthcheckPromise?: Promise<void>;\n\n constructor(\n targetName: string,\n config: CliResolvedConfig,\n runner: CommandRunner = defaultCommandRunner,\n ) {\n this.targetName = targetName;\n this.id = `cli:${targetName}`;\n this.config = config;\n this.runCommand = runner;\n this.verbose = config.verbose ?? false;\n this.keepTempFiles = config.keepTempFiles ?? false;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('CLI provider request was aborted before execution');\n }\n\n await this.ensureHealthy(request.signal);\n\n // Use request.cwd (workspace override) if provided, otherwise fall back to config.cwd\n const effectiveCwd = request.cwd ?? this.config.cwd;\n\n const outputFilePath = generateOutputFilePath(request.evalCaseId);\n const { values: templateValues, promptFilePath } = await buildTemplateValues(\n request,\n this.config,\n outputFilePath,\n );\n const renderedCommand = renderTemplate(this.config.command, templateValues);\n\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] cwd=${effectiveCwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n // Measure wall-clock time as fallback for duration\n try {\n const startTime = Date.now();\n const result = await this.runCommand(renderedCommand, {\n cwd: effectiveCwd,\n env: process.env,\n timeoutMs: this.config.timeoutMs,\n signal: request.signal,\n });\n const measuredDurationMs = Date.now() - startTime;\n\n if (result.failed || (result.exitCode ?? 0) !== 0) {\n if (request.signal?.aborted) {\n throw new Error('CLI provider request was aborted');\n }\n if (result.timedOut) {\n throw new Error(\n `CLI provider timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\n const detail = result.stderr.trim() || result.stdout.trim();\n const message = detail\n ? `${detail} (exit code ${codeText})`\n : `CLI exited with code ${codeText}`;\n throw new Error(message);\n }\n\n // Read from output file and parse as JSON if possible\n const responseContent = await this.readAndCleanupOutputFile(outputFilePath);\n const parsed = this.parseOutputContent(responseContent);\n\n return {\n output: parsed.output,\n tokenUsage: parsed.tokenUsage,\n costUsd: parsed.costUsd,\n durationMs: parsed.durationMs ?? measuredDurationMs,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: effectiveCwd,\n outputFile: outputFilePath,\n },\n };\n } finally {\n await cleanupTempFile(promptFilePath, this.keepTempFiles);\n }\n }\n\n async invokeBatch(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]> {\n if (requests.length === 0) {\n return [];\n }\n\n for (const request of requests) {\n if (request.signal?.aborted) {\n throw new Error('CLI provider batch request was aborted before execution');\n }\n }\n\n const controller = new AbortController();\n for (const request of requests) {\n request.signal?.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n await this.ensureHealthy(controller.signal);\n\n const outputFilePath = generateOutputFilePath('batch', '.jsonl');\n\n const batchInputFiles: string[] = [];\n for (const request of requests) {\n if (request.inputFiles && request.inputFiles.length > 0) {\n batchInputFiles.push(...request.inputFiles);\n }\n }\n\n const { values: templateValues, promptFilePath } = await buildTemplateValues(\n {\n question: '',\n inputFiles: batchInputFiles,\n evalCaseId: 'batch',\n attempt: 0,\n },\n this.config,\n outputFilePath,\n );\n const renderedCommand = renderTemplate(this.config.command, templateValues);\n\n // Use per-request cwd override (from workspace) if any request provides one,\n // otherwise fall back to the target's configured cwd.\n // All requests in a batch share the same workspace, so the first request's cwd\n // is representative of the entire batch.\n const effectiveCwd = requests[0]?.cwd ?? this.config.cwd;\n\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] (batch size=${requests.length}) cwd=${effectiveCwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n // Measure wall-clock time for batch (used as fallback if records don't provide duration)\n try {\n const startTime = Date.now();\n const result = await this.runCommand(renderedCommand, {\n cwd: effectiveCwd,\n env: process.env,\n timeoutMs: this.config.timeoutMs,\n signal: controller.signal,\n });\n const measuredDurationMs = Date.now() - startTime;\n\n if (result.failed || (result.exitCode ?? 0) !== 0) {\n if (controller.signal.aborted) {\n throw new Error('CLI provider request was aborted');\n }\n if (result.timedOut) {\n throw new Error(\n `CLI provider timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\n const detail = result.stderr.trim() || result.stdout.trim();\n const message = detail\n ? `${detail} (exit code ${codeText})`\n : `CLI exited with code ${codeText}`;\n throw new Error(message);\n }\n\n const responseContent = await this.readAndCleanupOutputFile(outputFilePath);\n const recordsById = this.parseJsonlBatchOutput(responseContent);\n\n // Calculate per-request fallback duration (total time / number of requests)\n const perRequestFallbackMs = Math.round(measuredDurationMs / requests.length);\n\n const responses: ProviderResponse[] = requests.map((request) => {\n const evalCaseId = request.evalCaseId;\n if (!evalCaseId) {\n return {\n output: [],\n durationMs: perRequestFallbackMs,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: effectiveCwd,\n outputFile: outputFilePath,\n },\n };\n }\n\n const parsed = recordsById.get(evalCaseId);\n if (!parsed) {\n // Return error response for missing IDs instead of throwing.\n // This allows other eval cases with matching IDs to be evaluated correctly.\n const errorMessage = `Batch output missing id '${evalCaseId}'`;\n if (this.verbose) {\n console.warn(`[cli-provider:${this.targetName}] ${errorMessage}`);\n }\n return {\n output: [{ role: 'assistant', content: `Error: ${errorMessage}` }],\n durationMs: perRequestFallbackMs,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: effectiveCwd,\n outputFile: outputFilePath,\n error: errorMessage,\n },\n };\n }\n\n return {\n output: parsed.output,\n tokenUsage: parsed.tokenUsage,\n costUsd: parsed.costUsd,\n durationMs: parsed.durationMs ?? perRequestFallbackMs,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: effectiveCwd,\n outputFile: outputFilePath,\n recordId: evalCaseId,\n },\n };\n });\n\n return responses;\n } finally {\n await cleanupTempFile(promptFilePath, this.keepTempFiles);\n }\n }\n\n /**\n * Parse output content from CLI.\n * If the content is valid JSON with 'output' (or legacy 'output_messages') or 'text' field, extract them.\n * If only 'text' is provided, wrap it in output.\n * Otherwise, treat the entire content as plain text wrapped in output.\n *\n * Also extracts optional execution metrics:\n * - token_usage: { input, output, cached? }\n * - cost_usd: number\n * - duration_ms: number\n */\n private parseOutputContent(content: string): {\n output: readonly Message[];\n tokenUsage?: ProviderTokenUsage;\n costUsd?: number;\n durationMs?: number;\n } {\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n // Not valid JSON, treat as plain text\n return { output: [{ role: 'assistant', content }] };\n }\n\n // Validate against schema\n const result = CliOutputSchema.safeParse(parsed);\n if (!result.success) {\n // Invalid structure, treat as plain text\n return { output: [{ role: 'assistant', content }] };\n }\n\n const obj = result.data;\n\n // Validate metrics and warn about negative values\n const metrics = validateMetrics(obj.cost_usd, obj.duration_ms, 'parsing output');\n\n // Convert output (or legacy output_messages) to Message[] format\n const output = convertMessages(obj.output ?? obj.output_messages);\n\n // If output provided, use it\n if (output && output.length > 0) {\n return {\n output,\n tokenUsage: obj.token_usage,\n costUsd: metrics.costUsd,\n durationMs: metrics.durationMs,\n };\n }\n\n // Fall back to text field, wrap in output\n if (obj.text !== undefined) {\n const text = typeof obj.text === 'string' ? obj.text : String(obj.text);\n return {\n output: [{ role: 'assistant', content: text }],\n tokenUsage: obj.token_usage,\n costUsd: metrics.costUsd,\n durationMs: metrics.durationMs,\n };\n }\n\n // No output or text, treat original content as plain text\n return { output: [{ role: 'assistant', content }] };\n }\n\n private parseJsonlBatchOutput(content: string): Map<\n string,\n {\n output: readonly Message[];\n tokenUsage?: ProviderTokenUsage;\n costUsd?: number;\n durationMs?: number;\n }\n > {\n const records = new Map<\n string,\n {\n output: readonly Message[];\n tokenUsage?: ProviderTokenUsage;\n costUsd?: number;\n durationMs?: number;\n }\n >();\n\n const lines = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n for (const line of lines) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`CLI batch output contains invalid JSONL line: ${reason}`);\n }\n\n // Validate against schema\n const result = CliJsonlRecordSchema.safeParse(parsed);\n if (!result.success) {\n const firstError = result.error.errors[0];\n if (firstError?.path.includes('id')) {\n throw new Error('CLI batch output JSONL line missing required string field: id');\n }\n throw new Error('CLI batch output JSONL line must be an object');\n }\n\n const obj = result.data;\n\n if (records.has(obj.id)) {\n throw new Error(`CLI batch output contains duplicate id: ${obj.id}`);\n }\n\n // Prefer output (or legacy output_messages), fall back to text wrapped in output\n const output = convertMessages(obj.output ?? obj.output_messages);\n let finalMessages: readonly Message[];\n if (output && output.length > 0) {\n finalMessages = output;\n } else {\n // Fall back to text field\n const text =\n typeof obj.text === 'string'\n ? obj.text\n : obj.text === undefined\n ? ''\n : JSON.stringify(obj.text);\n finalMessages = text ? [{ role: 'assistant', content: text }] : [];\n }\n\n // Validate metrics and warn about negative values\n const metrics = validateMetrics(obj.cost_usd, obj.duration_ms, `batch record '${obj.id}'`);\n\n records.set(obj.id, {\n output: finalMessages,\n tokenUsage: obj.token_usage,\n costUsd: metrics.costUsd,\n durationMs: metrics.durationMs,\n });\n }\n\n return records;\n }\n\n private async readAndCleanupOutputFile(filePath: string): Promise<string> {\n try {\n const content = await readTextFile(filePath);\n return content;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to read output file '${filePath}': ${errorMsg}`);\n } finally {\n // Clean up temp file - ignore errors as the file might not exist on read failure\n if (!this.keepTempFiles) {\n await fs.unlink(filePath).catch(() => {\n /* ignore cleanup errors */\n });\n }\n }\n }\n\n private async ensureHealthy(signal?: AbortSignal): Promise<void> {\n if (!this.config.healthcheck) {\n return;\n }\n if (!this.healthcheckPromise) {\n this.healthcheckPromise = this.runHealthcheck(this.config.healthcheck, signal);\n }\n return this.healthcheckPromise;\n }\n\n private async runHealthcheck(\n healthcheck: CliResolvedConfig['healthcheck'],\n signal?: AbortSignal,\n ): Promise<void> {\n if (!healthcheck) {\n return;\n }\n\n const timeoutMs = healthcheck.timeoutMs ?? this.config.timeoutMs;\n\n if ('url' in healthcheck && healthcheck.url) {\n const controller = new AbortController();\n const timer = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : undefined;\n signal?.addEventListener('abort', () => controller.abort(), { once: true });\n\n try {\n const response = await fetch(healthcheck.url, { method: 'GET', signal: controller.signal });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\n }\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${reason}`);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n return;\n }\n\n const hcCommand = 'command' in healthcheck ? healthcheck.command : undefined;\n if (!hcCommand) {\n throw new Error(`CLI healthcheck for '${this.targetName}': 'command' or 'url' is required`);\n }\n\n const { values: templateValues, promptFilePath } = await buildTemplateValues(\n {\n question: '',\n inputFiles: [],\n evalCaseId: 'healthcheck',\n attempt: 0,\n },\n this.config,\n generateOutputFilePath('healthcheck'),\n );\n const renderedCommand = renderTemplate(hcCommand, templateValues);\n const hcCwd = 'cwd' in healthcheck ? healthcheck.cwd : undefined;\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] (healthcheck) cwd=${hcCwd ?? this.config.cwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n try {\n const result = await this.runCommand(renderedCommand, {\n cwd: hcCwd ?? this.config.cwd,\n env: process.env,\n timeoutMs,\n signal,\n });\n\n if (result.failed || (result.exitCode ?? 0) !== 0) {\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\n const detail = result.stderr.trim() || result.stdout.trim();\n const message = detail\n ? `${detail} (exit code ${codeText})`\n : `CLI healthcheck command exited with code ${codeText}`;\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${message}`);\n }\n } finally {\n await cleanupTempFile(promptFilePath, this.keepTempFiles);\n }\n }\n}\n\nasync function buildTemplateValues(\n request: Pick<ProviderRequest, 'question' | 'inputFiles' | 'evalCaseId' | 'attempt'>,\n config: CliResolvedConfig,\n outputFilePath: string,\n): Promise<{ values: Record<string, string>; promptFilePath: string }> {\n const inputFiles = normalizeInputFiles(request.inputFiles);\n const promptFilePath = generateOutputFilePath(request.evalCaseId, '.prompt.txt');\n await fs.writeFile(promptFilePath, request.question ?? '', 'utf8');\n\n return {\n values: {\n PROMPT: shellEscape(request.question ?? ''),\n PROMPT_FILE: shellEscape(promptFilePath),\n EVAL_ID: shellEscape(request.evalCaseId ?? ''),\n ATTEMPT: shellEscape(String(request.attempt ?? 0)),\n FILES: formatFileList(inputFiles, config.filesFormat),\n OUTPUT_FILE: shellEscape(outputFilePath),\n },\n promptFilePath,\n };\n}\n\nasync function cleanupTempFile(\n filePath: string | undefined,\n keepTempFiles: boolean,\n): Promise<void> {\n if (!filePath || keepTempFiles) {\n return;\n }\n await fs.unlink(filePath).catch(() => {\n /* ignore cleanup errors */\n });\n}\n\nfunction normalizeInputFiles(\n inputFiles: readonly string[] | undefined,\n): readonly string[] | undefined {\n if (!inputFiles || inputFiles.length === 0) {\n return undefined;\n }\n\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction formatFileList(\n files: readonly string[] | undefined,\n template: string | undefined,\n): string {\n if (!files || files.length === 0) {\n return '';\n }\n\n const formatter = template ?? '{path}';\n return files\n .map((filePath) => {\n const escapedPath = shellEscape(filePath);\n const escapedName = shellEscape(path.basename(filePath));\n return formatter.replaceAll('{path}', escapedPath).replaceAll('{basename}', escapedName);\n })\n .join(' ');\n}\n\nfunction renderTemplate(template: string, values: Record<string, string>): string {\n return template.replace(/\\{([A-Z_]+)\\}/g, (match, key) => {\n const replacement = values[key];\n return replacement !== undefined ? replacement : match;\n });\n}\n\nfunction shellEscape(value: string): string {\n if (value.length === 0) {\n return \"''\";\n }\n\n if (process.platform === 'win32') {\n // PowerShell uses backtick (`) for escaping, not backslash\n // Double quotes inside the string need to be escaped with backtick\n // Single quotes can be used instead for simpler escaping\n const escaped = value.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n\n return `'${value.replace(/'/g, \"'\\\"'\\\"'\")}'`;\n}\n\nfunction generateOutputFilePath(evalCaseId?: string, extension = '.json'): string {\n const safeEvalId = evalCaseId || 'unknown';\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 9);\n return path.join(os.tmpdir(), `agentv-${safeEvalId}-${timestamp}-${random}${extension}`);\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n","import { randomUUID } from 'node:crypto';\nimport { createWriteStream } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { recordCodexLogEntry } from './codex-log-tracker.js';\nimport { normalizeToolCall } from './normalize-tool-call.js';\nimport { buildPromptDocument, normalizeInputFiles } from './preread.js';\nimport type { CodexResolvedConfig } from './targets.js';\nimport type {\n Message,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ProviderTokenUsage,\n ToolCall,\n} from './types.js';\n\n// Lazy-loaded module to avoid bundling issues with dynamic requires\n// biome-ignore lint/suspicious/noExplicitAny: dynamic import type\nlet codexSdkModule: any = null;\n\nasync function loadCodexSdk(): Promise<typeof import('@openai/codex-sdk')> {\n if (!codexSdkModule) {\n try {\n codexSdkModule = await import('@openai/codex-sdk');\n } catch (error) {\n throw new Error(\n `Failed to load @openai/codex-sdk. Please install it:\\n npm install @openai/codex-sdk\\n\\nOriginal error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return codexSdkModule;\n}\n\n/**\n * Codex SDK provider using the @openai/codex-sdk library directly.\n * This provides typed event access for structured tool calls, token usage, and clean thread lifecycle.\n *\n * Note: The SDK is loaded lazily on first use to avoid bundling issues.\n * Users must install @openai/codex-sdk separately.\n */\nexport class CodexProvider implements Provider {\n readonly id: string;\n readonly kind = 'codex' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: CodexResolvedConfig;\n\n constructor(targetName: string, config: CodexResolvedConfig) {\n this.id = `codex:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Codex SDK request was aborted before execution');\n }\n\n const sdk = await loadCodexSdk();\n\n const startTime = new Date().toISOString();\n const startMs = Date.now();\n\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n\n // Build Codex SDK options\n // biome-ignore lint/suspicious/noExplicitAny: SDK constructor options are dynamic\n const codexOptions: any = {};\n if (this.config.model) {\n codexOptions.config = { model: this.config.model };\n }\n\n const codex = new sdk.Codex(codexOptions);\n\n // Build thread options\n // biome-ignore lint/suspicious/noExplicitAny: SDK thread options are dynamic\n const threadOptions: any = {\n skipGitRepoCheck: true,\n };\n\n const cwd = this.resolveCwd(request.cwd);\n if (cwd) {\n threadOptions.workingDirectory = cwd;\n }\n\n const thread = codex.startThread(threadOptions);\n\n // Build the prompt\n const inputFiles = normalizeInputFiles(request.inputFiles);\n const basePrompt = buildPromptDocument(request, inputFiles);\n\n const systemPrompt = this.config.systemPrompt;\n const prompt = systemPrompt ? `${systemPrompt}\\n\\n${basePrompt}` : basePrompt;\n\n // Track events\n const completedToolCalls: ToolCall[] = [];\n let finalContent = '';\n let tokenUsage: ProviderTokenUsage | undefined;\n\n try {\n const timeoutMs = this.config.timeoutMs;\n\n // Run with streaming to capture events\n const runPromise = this.runStreamedWithEvents(\n thread,\n prompt,\n completedToolCalls,\n logger,\n (content) => {\n finalContent = content;\n },\n (usage) => {\n tokenUsage = usage;\n },\n request.signal,\n );\n\n if (timeoutMs) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Codex SDK timed out after ${Math.ceil(timeoutMs / 1000)}s`));\n }, timeoutMs);\n timer.unref?.();\n });\n await Promise.race([runPromise, timeoutPromise]);\n } else {\n await runPromise;\n }\n\n const endTime = new Date().toISOString();\n const durationMs = Date.now() - startMs;\n\n // Build output messages\n const output: Message[] = [];\n\n if (completedToolCalls.length > 0) {\n output.push({\n role: 'assistant',\n content: finalContent || undefined,\n toolCalls: completedToolCalls,\n });\n } else if (finalContent) {\n output.push({\n role: 'assistant',\n content: finalContent,\n });\n }\n\n return {\n raw: {\n model: this.config.model,\n logFile: logger?.filePath,\n },\n output,\n tokenUsage,\n durationMs,\n startTime,\n endTime,\n };\n } finally {\n await logger?.close();\n }\n }\n\n private async runStreamedWithEvents(\n // biome-ignore lint/suspicious/noExplicitAny: SDK thread type is dynamically loaded\n thread: any,\n prompt: string,\n completedToolCalls: ToolCall[],\n logger: CodexSdkStreamLogger | undefined,\n onContent: (content: string) => void,\n onUsage: (usage: ProviderTokenUsage) => void,\n signal?: AbortSignal,\n ): Promise<void> {\n // biome-ignore lint/suspicious/noExplicitAny: SDK types are dynamic\n const turnOptions: any = {};\n if (signal) {\n turnOptions.signal = signal;\n }\n\n const { events } = await thread.runStreamed(prompt, turnOptions);\n\n for await (const event of events) {\n const eventType = event.type as string;\n\n logger?.handleEvent(eventType, event);\n\n if (eventType === 'item.completed') {\n // biome-ignore lint/suspicious/noExplicitAny: SDK event item is dynamic\n const item = (event as any).item;\n if (item) {\n this.processCompletedItem(item, completedToolCalls, onContent);\n }\n }\n\n if (eventType === 'turn.completed') {\n // biome-ignore lint/suspicious/noExplicitAny: SDK event usage is dynamic\n const usage = (event as any).usage;\n if (usage) {\n onUsage({\n input: usage.input_tokens ?? 0,\n output: usage.output_tokens ?? 0,\n cached: usage.cached_input_tokens ?? undefined,\n reasoning: usage.reasoning_tokens ?? undefined,\n });\n }\n }\n\n if (eventType === 'turn.failed') {\n // biome-ignore lint/suspicious/noExplicitAny: SDK event error is dynamic\n const error = (event as any).error;\n throw new Error(`Codex SDK turn failed: ${error?.message ?? 'unknown error'}`);\n }\n }\n }\n\n private processCompletedItem(\n // biome-ignore lint/suspicious/noExplicitAny: SDK item type is dynamic\n item: any,\n completedToolCalls: ToolCall[],\n onContent: (content: string) => void,\n ): void {\n const itemType = item.type as string;\n\n if (itemType === 'agent_message') {\n const text = item.text;\n if (typeof text === 'string') {\n onContent(text);\n }\n }\n\n if (itemType === 'command_execution') {\n completedToolCalls.push(\n normalizeToolCall('codex', {\n tool: 'command_execution',\n input: { command: item.command },\n output: item.aggregated_output,\n id: item.id,\n }),\n );\n }\n\n if (itemType === 'file_change') {\n completedToolCalls.push(\n normalizeToolCall('codex', {\n tool: 'file_change',\n input: item.changes,\n id: item.id,\n }),\n );\n }\n\n if (itemType === 'mcp_tool_call') {\n completedToolCalls.push(\n normalizeToolCall('codex', {\n tool: `mcp:${item.server}/${item.tool}`,\n input: item.arguments,\n output: item.result ?? item.error,\n id: item.id,\n }),\n );\n }\n }\n\n private resolveCwd(cwdOverride?: string): string | undefined {\n if (cwdOverride) {\n return path.resolve(cwdOverride);\n }\n if (this.config.cwd) {\n return path.resolve(this.config.cwd);\n }\n return undefined;\n }\n\n private resolveLogDirectory(): string | undefined {\n const disabled = isCodexLogStreamingDisabled();\n if (disabled) {\n return undefined;\n }\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'codex');\n }\n\n private async createStreamLogger(\n request: ProviderRequest,\n ): Promise<CodexSdkStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Codex SDK stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\n\n try {\n const logger = await CodexSdkStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n });\n recordCodexLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Codex SDK stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\nclass CodexSdkStreamLogger {\n readonly filePath: string;\n private readonly stream: WriteStream;\n private readonly startedAt = Date.now();\n private readonly format: 'summary' | 'json';\n\n private constructor(filePath: string, format: 'summary' | 'json') {\n this.filePath = filePath;\n this.format = format;\n this.stream = createWriteStream(filePath, { flags: 'a' });\n }\n\n static async create(options: {\n readonly filePath: string;\n readonly targetName: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly format: 'summary' | 'json';\n }): Promise<CodexSdkStreamLogger> {\n const logger = new CodexSdkStreamLogger(options.filePath, options.format);\n const header = [\n '# Codex SDK stream log',\n `# target: ${options.targetName}`,\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\n `# started: ${new Date().toISOString()}`,\n '',\n ].filter((line): line is string => Boolean(line));\n for (const line of header) {\n logger.stream.write(`${line}\\n`);\n }\n return logger;\n }\n\n handleEvent(eventType: string, data: unknown): void {\n const elapsed = formatElapsed(this.startedAt);\n if (this.format === 'json') {\n this.stream.write(`${JSON.stringify({ time: elapsed, event: eventType, data })}\\n`);\n } else {\n const summary = summarizeEvent(eventType, data);\n if (summary) {\n this.stream.write(`[+${elapsed}] [${eventType}] ${summary}\\n`);\n }\n }\n }\n\n async close(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.stream.once('error', reject);\n this.stream.end(() => resolve());\n });\n }\n}\n\nfunction summarizeEvent(eventType: string, data: unknown): string | undefined {\n if (!data || typeof data !== 'object') {\n return eventType;\n }\n const d = data as Record<string, unknown>;\n // biome-ignore lint/suspicious/noExplicitAny: SDK event item is dynamic\n const item = (d as any).item;\n switch (eventType) {\n case 'item.completed':\n case 'item.started':\n case 'item.updated': {\n if (!item || typeof item !== 'object') return eventType;\n const itemType = item.type as string;\n if (itemType === 'agent_message') {\n const text = typeof item.text === 'string' ? item.text : '';\n return `${itemType}: ${text.slice(0, 200)}${text.length > 200 ? '...' : ''}`;\n }\n if (itemType === 'command_execution') {\n return `${itemType}: ${item.command ?? 'unknown'}`;\n }\n if (itemType === 'file_change') {\n return `${itemType}: ${Array.isArray(item.changes) ? item.changes.length : 0} files`;\n }\n if (itemType === 'mcp_tool_call') {\n return `${itemType}: ${item.server}/${item.tool}`;\n }\n return itemType;\n }\n case 'turn.completed': {\n // biome-ignore lint/suspicious/noExplicitAny: SDK event usage is dynamic\n const usage = (d as any).usage;\n if (usage) {\n return `input=${usage.input_tokens ?? 0} output=${usage.output_tokens ?? 0}`;\n }\n return 'completed';\n }\n case 'turn.failed': {\n // biome-ignore lint/suspicious/noExplicitAny: SDK event error is dynamic\n const error = (d as any).error;\n return typeof error?.message === 'string' ? error.message : 'failed';\n }\n default:\n return undefined;\n }\n}\n\nfunction isCodexLogStreamingDisabled(): boolean {\n const envValue = process.env.AGENTV_CODEX_STREAM_LOGS;\n if (!envValue) {\n return false;\n }\n const normalized = envValue.trim().toLowerCase();\n return normalized === 'false' || normalized === '0' || normalized === 'off';\n}\n\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const evalId = sanitizeForFilename(request.evalCaseId ?? 'codex');\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : '';\n const target = sanitizeForFilename(targetName);\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\n}\n\nfunction sanitizeForFilename(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : 'codex';\n}\n\nfunction formatElapsed(startedAt: number): string {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\n const hours = Math.floor(elapsedSeconds / 3600);\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\n const seconds = elapsedSeconds % 60;\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n","export type CodexLogEntry = {\n readonly filePath: string;\n readonly evalCaseId?: string;\n readonly targetName: string;\n readonly attempt?: number;\n};\n\nconst GLOBAL_LOGS_KEY = Symbol.for('agentv.codexLogs');\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for('agentv.codexLogSubscribers');\n\ntype CodexLogListener = (entry: CodexLogEntry) => void;\n\ntype GlobalWithCodexLogs = typeof globalThis & {\n [GLOBAL_LOGS_KEY]?: CodexLogEntry[];\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<CodexLogListener>;\n};\n\nfunction getCodexLogStore(): CodexLogEntry[] {\n const globalObject = globalThis as GlobalWithCodexLogs;\n const existing = globalObject[GLOBAL_LOGS_KEY];\n if (existing) {\n return existing;\n }\n const created: CodexLogEntry[] = [];\n globalObject[GLOBAL_LOGS_KEY] = created;\n return created;\n}\n\nfunction getSubscriberStore(): Set<CodexLogListener> {\n const globalObject = globalThis as GlobalWithCodexLogs;\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\n if (existing) {\n return existing;\n }\n const created = new Set<CodexLogListener>();\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\n return created;\n}\n\nfunction notifySubscribers(entry: CodexLogEntry): void {\n const subscribers = Array.from(getSubscriberStore());\n for (const listener of subscribers) {\n try {\n listener(entry);\n } catch (error) {\n // Avoid surfacing subscriber errors to providers; log for visibility.\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Codex log subscriber failed: ${message}`);\n }\n }\n}\n\nexport function recordCodexLogEntry(entry: CodexLogEntry): void {\n getCodexLogStore().push(entry);\n notifySubscribers(entry);\n}\n\nexport function consumeCodexLogEntries(): CodexLogEntry[] {\n const store = getCodexLogStore();\n if (store.length === 0) {\n return [];\n }\n return store.splice(0, store.length);\n}\n\nexport function subscribeToCodexLogEntries(listener: CodexLogListener): () => void {\n const store = getSubscriberStore();\n store.add(listener);\n return () => {\n store.delete(listener);\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport { mkdir } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\nimport { Readable, Writable } from 'node:stream';\n\nimport type { ChildProcess } from 'node:child_process';\nimport { spawn } from 'node:child_process';\n\nimport * as acp from '@agentclientprotocol/sdk';\n\nimport { trackChild } from '../../runtime/child-tracker.js';\nimport { captureSessionArtifacts } from '../workspace/file-changes.js';\nimport { recordCopilotCliLogEntry } from './copilot-cli-log-tracker.js';\nimport {\n CopilotStreamLogger,\n buildLogFilename,\n isLogStreamingDisabled,\n killProcess,\n resolvePlatformCliPath,\n} from './copilot-utils.js';\nimport { normalizeToolCall } from './normalize-tool-call.js';\nimport { buildPromptDocument, normalizeInputFiles } from './preread.js';\nimport type { CopilotCliResolvedConfig } from './targets.js';\nimport type {\n Message,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ProviderTokenUsage,\n ToolCall,\n} from './types.js';\n\ninterface ToolCallInProgress {\n readonly tool: string;\n readonly input?: unknown;\n readonly id?: string;\n readonly startTime: string;\n readonly startMs: number;\n}\n\n/**\n * Copilot CLI provider using the Agent Client Protocol (ACP).\n *\n * Spawns `copilot --acp --stdio` and communicates via NDJSON using\n * @agentclientprotocol/sdk. This bypasses the @github/copilot-sdk's\n * 60s session.idle timeout, enabling long-running agent tasks.\n *\n * Token usage: Copilot CLI does not currently emit token usage data via\n * ACP — usage events are tracked internally but marked ephemeral and not\n * sent to clients (see github/copilot-cli#1152). The provider is wired to\n * consume PromptResponse.usage and usage_update events when they become\n * available, but until then token_usage will be undefined. See #683.\n */\nexport class CopilotCliProvider implements Provider {\n readonly id: string;\n readonly kind = 'copilot-cli' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: CopilotCliResolvedConfig;\n\n constructor(targetName: string, config: CopilotCliResolvedConfig) {\n this.id = `copilot-cli:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Copilot CLI request was aborted before execution');\n }\n\n const startTime = new Date().toISOString();\n const startMs = Date.now();\n\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n\n // Build command args\n const executable = this.resolveExecutable();\n const args = this.buildCliArgs();\n\n // Spawn the CLI process\n const agentProcess = spawn(executable, args, {\n stdio: ['pipe', 'pipe', 'inherit'],\n });\n trackChild(agentProcess);\n\n await waitForProcessSpawn(agentProcess, executable, this.targetName);\n\n // Track events\n const toolCallsInProgress = new Map<string, ToolCallInProgress>();\n const completedToolCalls: ToolCall[] = [];\n let finalContent = '';\n let tokenUsage: ProviderTokenUsage | undefined;\n let costUsd: number | undefined;\n\n // Set up ACP connection\n if (!agentProcess.stdin || !agentProcess.stdout) {\n throw new Error('Copilot CLI process missing stdin/stdout (stdio: pipe required)');\n }\n const input = Writable.toWeb(agentProcess.stdin);\n const output = Readable.toWeb(agentProcess.stdout) as ReadableStream<Uint8Array>;\n const stream = acp.ndJsonStream(input, output);\n\n const client: acp.Client = {\n async requestPermission(): Promise<acp.RequestPermissionResponse> {\n // Auto-approve all permissions for autonomous execution\n return {\n outcome: { outcome: 'selected', optionId: 'allow' },\n };\n },\n async sessionUpdate(params: acp.SessionNotification): Promise<void> {\n const update = params.update;\n const sessionUpdate = update.sessionUpdate;\n\n logger?.handleEvent(sessionUpdate, update);\n\n if (sessionUpdate === 'tool_call') {\n const callId = update.toolCallId ?? randomUUID();\n // Track new or in-progress tool calls\n if (!update.status || update.status === 'pending' || update.status === 'in_progress') {\n toolCallsInProgress.set(callId, {\n tool: update.title ?? update.kind ?? 'unknown',\n input: update.rawInput,\n id: callId,\n startTime: new Date().toISOString(),\n startMs: Date.now(),\n });\n }\n // Tool call arrived already completed\n if (update.status === 'completed' || update.status === 'failed') {\n const toolName = update.title ?? update.kind ?? 'unknown';\n completedToolCalls.push(\n normalizeToolCall('copilot-cli', {\n tool: toolName,\n input: update.rawInput,\n output: update.rawOutput,\n id: callId,\n startTime: new Date().toISOString(),\n endTime: new Date().toISOString(),\n durationMs: 0,\n }),\n );\n request.streamCallbacks?.onToolCallEnd?.(\n toolName,\n update.rawInput,\n update.rawOutput,\n 0,\n callId,\n );\n }\n }\n\n if (sessionUpdate === 'tool_call_update') {\n const callId = update.toolCallId;\n if (callId && (update.status === 'completed' || update.status === 'failed')) {\n const inProgress = toolCallsInProgress.get(callId);\n if (inProgress) {\n toolCallsInProgress.delete(callId);\n const duration = Date.now() - inProgress.startMs;\n completedToolCalls.push(\n normalizeToolCall('copilot-cli', {\n tool: inProgress.tool,\n input: inProgress.input,\n output: update.rawOutput,\n id: inProgress.id,\n startTime: inProgress.startTime,\n endTime: new Date().toISOString(),\n durationMs: duration,\n }),\n );\n request.streamCallbacks?.onToolCallEnd?.(\n inProgress.tool,\n inProgress.input,\n update.rawOutput,\n duration,\n inProgress.id,\n );\n }\n }\n }\n\n if (sessionUpdate === 'agent_message_chunk') {\n const content = update.content;\n if (content?.type === 'text' && typeof content.text === 'string') {\n finalContent += content.text;\n }\n }\n\n if (sessionUpdate === 'usage_update') {\n // ACP UsageUpdate provides { size, used, cost? } where `used` is\n // cumulative context window tokens. This does NOT separate input vs\n // output tokens, so we report `used` as input with output 0.\n // Copilot CLI does not currently emit this event via ACP (events are\n // marked ephemeral internally — see github/copilot-cli#1152), but\n // this handler is ready for when it does. See #683.\n tokenUsage = { input: update.used, output: 0 };\n // Cost may arrive across multiple events — accumulate\n if (update.cost && update.cost.currency === 'USD') {\n costUsd = (costUsd ?? 0) + update.cost.amount;\n }\n // Stream callback for LLM usage\n request.streamCallbacks?.onLlmCallEnd?.('copilot', tokenUsage);\n }\n },\n };\n\n const connection = new acp.ClientSideConnection((_agent) => client, stream);\n\n try {\n // Initialize the ACP connection\n await connection.initialize({\n protocolVersion: acp.PROTOCOL_VERSION,\n clientCapabilities: {\n fs: { readTextFile: true, writeTextFile: true },\n terminal: true,\n },\n });\n\n // Create a session\n const cwd = this.resolveCwd(request.cwd);\n const session = await connection.newSession({\n cwd: cwd ?? process.cwd(),\n mcpServers: [],\n });\n\n // Build the prompt with optional system instructions prepended\n const inputFiles = normalizeInputFiles(request.inputFiles);\n const prompt = buildPromptDocument(request, inputFiles);\n const systemPrompt = this.resolveSystemPrompt(request);\n const promptMessages: Array<{ type: 'text'; text: string }> = [];\n if (systemPrompt) {\n promptMessages.push({ type: 'text', text: systemPrompt });\n }\n promptMessages.push({ type: 'text', text: prompt });\n\n // Send and wait with timeout\n const sendPromise = connection.prompt({\n sessionId: session.sessionId,\n prompt: promptMessages,\n });\n\n let promptResponse: acp.PromptResponse;\n if (request.signal) {\n const abortHandler = () => {\n killProcess(agentProcess);\n };\n request.signal.addEventListener('abort', abortHandler, { once: true });\n try {\n promptResponse = await this.raceWithTimeout(sendPromise, agentProcess);\n } finally {\n request.signal.removeEventListener('abort', abortHandler);\n }\n } else {\n promptResponse = await this.raceWithTimeout(sendPromise, agentProcess);\n }\n\n const endTime = new Date().toISOString();\n const durationMs = Date.now() - startMs;\n\n // Prefer accurate token usage from PromptResponse.usage (ACP spec\n // includes per-turn Usage with inputTokens/outputTokens — marked\n // @experimental/UNSTABLE). Copilot CLI v1.0.9 does not populate this\n // yet, but this is ready for when it does. Falls back to usage_update\n // data if that was received. See #683.\n const responseUsage = promptResponse.usage;\n if (responseUsage && responseUsage.totalTokens > 0) {\n tokenUsage = {\n input: responseUsage.inputTokens,\n output: responseUsage.outputTokens,\n ...(responseUsage.thoughtTokens != null\n ? { reasoning: responseUsage.thoughtTokens }\n : {}),\n ...(responseUsage.cachedReadTokens != null\n ? { cached: responseUsage.cachedReadTokens }\n : {}),\n };\n request.streamCallbacks?.onLlmCallEnd?.('copilot', tokenUsage);\n }\n\n // Detect rejected tool calls — copilot's permission system blocked a tool\n const rejectedCalls = completedToolCalls.filter((tc) => {\n const out = tc.output as Record<string, unknown> | undefined;\n return out && (out.code === 'rejected' || out.code === 'denied');\n });\n if (rejectedCalls.length > 0) {\n const tools = rejectedCalls.map((tc) => tc.tool).join(', ');\n throw new Error(\n `Copilot rejected ${rejectedCalls.length} tool call(s): ${tools}. Add args: [\"--yolo\"] to your target config or re-run with --yolo to bypass permission checks.`,\n );\n }\n\n // Build output messages\n const outputMessages: Message[] = [];\n\n if (completedToolCalls.length > 0) {\n outputMessages.push({\n role: 'assistant',\n content: finalContent || undefined,\n toolCalls: completedToolCalls,\n });\n } else if (finalContent) {\n outputMessages.push({\n role: 'assistant',\n content: finalContent,\n });\n }\n\n // Capture session artifacts from session-state `files/` directory.\n // Copilot may write generated files (e.g. CSV reports) there instead of\n // the session cwd, so they wouldn't be captured by workspace git diff.\n // ACP session.sessionId is the UUID Copilot assigns at session creation\n // and is expected to match the ~/.copilot/session-state/<uuid>/ directory\n // name. If the directory doesn't exist the call silently returns undefined.\n const sessionId = session.sessionId as string | undefined;\n const fileChanges = sessionId\n ? await captureSessionArtifacts(\n path.join(homedir(), '.copilot', 'session-state', sessionId, 'files'),\n ).catch(() => undefined)\n : undefined;\n\n return {\n raw: {\n model: this.config.model,\n executable,\n logFile: logger?.filePath,\n },\n output: outputMessages,\n tokenUsage,\n costUsd,\n durationMs,\n startTime,\n endTime,\n ...(fileChanges ? { fileChanges } : {}),\n };\n } finally {\n await logger?.close();\n killProcess(agentProcess);\n }\n }\n\n private buildCliArgs(): string[] {\n // --yolo bypasses copilot's permission system so file reads and tool calls\n // are not rejected during eval runs (see #421).\n const args = ['--acp', '--stdio', '--allow-all-tools', '--yolo'];\n\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n\n // Append user-provided extra args\n if (this.config.args) {\n args.push(...this.config.args);\n }\n\n return args;\n }\n\n private resolveSystemPrompt(_request: ProviderRequest): string | undefined {\n return this.config.systemPrompt;\n }\n\n private async raceWithTimeout<T>(\n sendPromise: Promise<T>,\n agentProcess: ChildProcess,\n ): Promise<T> {\n const timeoutMs = this.config.timeoutMs;\n if (!timeoutMs) {\n return sendPromise;\n }\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n killProcess(agentProcess);\n reject(new Error(`Copilot CLI timed out after ${Math.ceil(timeoutMs / 1000)}s`));\n }, timeoutMs);\n timer.unref?.();\n });\n\n try {\n return await Promise.race([sendPromise, timeoutPromise]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n private resolveCwd(cwdOverride?: string): string | undefined {\n if (cwdOverride) {\n return path.resolve(cwdOverride);\n }\n if (this.config.cwd) {\n return path.resolve(this.config.cwd);\n }\n return undefined;\n }\n\n private resolveExecutable(): string {\n if (this.config.executable !== 'copilot') {\n return this.config.executable;\n }\n\n // Try to resolve the platform-specific native binary\n const nativePath = resolvePlatformCliPath();\n if (nativePath) {\n return nativePath;\n }\n\n return 'copilot';\n }\n\n private resolveLogDirectory(): string | undefined {\n if (isLogStreamingDisabled('AGENTV_COPILOT_CLI_STREAM_LOGS')) {\n return undefined;\n }\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'copilot-cli');\n }\n\n private async createStreamLogger(\n request: ProviderRequest,\n ): Promise<CopilotStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Copilot CLI stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName, 'copilot-cli'));\n\n try {\n const logger = await CopilotStreamLogger.create(\n {\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n headerLabel: 'Copilot CLI (ACP)',\n chunkExtractor: extractAcpChunk,\n },\n summarizeAcpEvent,\n );\n recordCopilotCliLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Copilot CLI stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\nasync function waitForProcessSpawn(\n proc: ChildProcess,\n executable: string,\n targetName: string,\n): Promise<void> {\n if (proc.pid) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n const onSpawn = () => {\n cleanup();\n resolve();\n };\n\n const onError = (error: Error & { code?: string }) => {\n cleanup();\n reject(new Error(formatCopilotSpawnError(error, executable, targetName)));\n };\n\n const cleanup = () => {\n proc.off('spawn', onSpawn);\n proc.off('error', onError);\n };\n\n proc.once('spawn', onSpawn);\n proc.once('error', onError);\n });\n}\n\nfunction formatCopilotSpawnError(\n error: Error & { code?: string },\n executable: string,\n targetName: string,\n): string {\n const code = error.code;\n const base =\n `Failed to start Copilot CLI executable '${executable}' for target '${targetName}'.` +\n ` ${error.message}`;\n\n if (process.platform !== 'win32') {\n return base;\n }\n\n if (code !== 'ENOENT' && code !== 'EINVAL') {\n return base;\n }\n\n return `${base}\n\nOn Windows, shell commands like 'copilot -h' can work via .ps1/.bat shims, but AgentV launches a subprocess that needs a directly spawnable executable path.\n\nFix options:\n1) Install native Copilot binary package:\n npm install -g @github/copilot-win32-x64\n2) Set explicit executable for Copilot targets:\n - In .env: COPILOT_EXE=C:\\\\Users\\\\<you>\\\\AppData\\\\Roaming\\\\npm\\\\node_modules\\\\@github\\\\copilot-win32-x64\\\\copilot.exe\n - In .agentv/targets.yaml: executable: \\${{ COPILOT_EXE }}`;\n}\n\n/**\n * Extracts bufferable text from ACP streaming events.\n *\n * Return values control CopilotStreamLogger buffering:\n * string — accumulate this text into the pending buffer\n * null — reset (discard) the pending buffer without emitting it\n * undefined — not a chunk event; process normally\n *\n * Copilot ACP sends agent_message_chunk events in two passes:\n * 1. A streaming preview batch (before extended thinking)\n * 2. agent_thought_chunk events (extended reasoning)\n * 3. A final response batch (after extended thinking)\n *\n * Returning null for agent_thought_chunk discards the preview batch so that\n * only the final post-thinking response is emitted as [assistant_message].\n */\nfunction extractAcpChunk(eventType: string, data: unknown): string | null | undefined {\n if (eventType === 'agent_thought_chunk') return null;\n if (eventType !== 'agent_message_chunk') return undefined;\n if (!data || typeof data !== 'object') return undefined;\n const d = data as Record<string, unknown>;\n const content = d.content as Record<string, unknown> | undefined;\n return content?.type === 'text' && typeof content.text === 'string' ? content.text : undefined;\n}\n\nfunction summarizeAcpEvent(eventType: string, data: unknown): string | undefined {\n if (!data || typeof data !== 'object') {\n return eventType;\n }\n const d = data as Record<string, unknown>;\n switch (eventType) {\n case 'agent_message_chunk': {\n const content = d.content as Record<string, unknown> | undefined;\n if (content?.type === 'text' && typeof content.text === 'string') {\n return `${content.text.slice(0, 200)}${content.text.length > 200 ? '...' : ''}`;\n }\n return 'message chunk';\n }\n case 'tool_call':\n return `${d.title ?? d.kind ?? 'unknown'} (${d.status ?? 'running'})`;\n case 'tool_call_update':\n return `${d.toolCallId ?? 'unknown'} ${d.status ?? 'updated'}`;\n case 'usage_update':\n return `used=${d.used ?? 0} size=${d.size ?? 0}`;\n default:\n return undefined;\n }\n}\n","/**\n * Workspace file-change tracking for AgentV evaluation.\n *\n * Two strategies are supported — both produce unified-diff output that is\n * stored in `file_changes` and surfaced to LLM / code graders:\n *\n * 1. **Git baseline** (default when `git` is available in workspace_path):\n * - `initializeBaseline` runs `git init`, stages all existing files, and\n * creates a baseline commit so a clean diff is available after the agent runs.\n * - `captureFileChanges` stages everything and emits `git diff <baseline>`.\n * - Supports nested git repos via `--submodule=diff`.\n *\n * 2. **Snapshot baseline** (fallback when git is unavailable / path is read-only):\n * - `captureSnapshot` walks the directory tree and records every text file's\n * content as a `Map<relativePath, content>`.\n * - `diffFromSnapshots` compares two snapshots and emits synthetic unified\n * diffs for new, modified, and deleted files.\n * - Use this when `initializeBaseline` throws (git not installed, permissions,\n * read-only session-state directories, etc.).\n *\n * 3. **Provider-reported artifacts** (for agents that write outside workspace_path):\n * - `generateSessionFileDiff` creates a synthetic \"new file\" diff for a\n * single file, given its relative path and content.\n * - Copilot providers use this to surface files written into the agent's own\n * session-state directory (e.g. `~/.copilot/session-state/<uuid>/files/`).\n *\n * To extend:\n * - Add a new capture strategy here as an exported function.\n * - Call it from `orchestrator.ts` alongside the existing git / snapshot logic.\n */\n\nimport { exec as execCallback } from 'node:child_process';\nimport { readdirSync, statSync } from 'node:fs';\nimport { readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nconst execAsync = promisify(execCallback);\n\n/** Maximum file size (bytes) to include in snapshot diffs. Larger files are skipped. */\nconst SNAPSHOT_MAX_FILE_BYTES = 512 * 1024; // 512 KB\n\n/** Directories always excluded from snapshot walks. */\nconst SNAPSHOT_EXCLUDE_DIRS = new Set(['.git', 'node_modules', '.agentv', '__pycache__']);\n\n/** A point-in-time snapshot of a directory: relative path → UTF-8 content. */\nexport type WorkspaceSnapshot = Map<string, string>;\n\n// ─── Git baseline ────────────────────────────────────────────────────────────\n\n/**\n * Build exec options that ensure git commands target the workspace,\n * not a parent repo. Clears GIT_DIR/GIT_WORK_TREE which may be set\n * by git hooks or other parent processes.\n */\nfunction gitExecOpts(workspacePath: string) {\n const { GIT_DIR: _, GIT_WORK_TREE: __, ...env } = process.env;\n return { cwd: workspacePath, env };\n}\n\n/**\n * Initialize a git baseline for workspace file change tracking.\n *\n * Runs `git init` directly in the workspace, stages all files, and creates\n * a baseline commit. Returns the commit hash for later diffing.\n */\nexport async function initializeBaseline(workspacePath: string): Promise<string> {\n const opts = gitExecOpts(workspacePath);\n\n await execAsync('git init', opts);\n await execAsync('git add -A', opts);\n await execAsync(\n 'git -c user.email=agentv@localhost -c user.name=agentv commit --allow-empty -m \"agentv-baseline\"',\n opts,\n );\n\n const { stdout } = await execAsync('git rev-parse HEAD', opts);\n return stdout.trim();\n}\n\n/**\n * Capture file changes from workspace relative to the baseline commit.\n * Returns a unified diff string, or empty string if no changes.\n *\n * Supports nested git repos (e.g. cloned dependencies): stages files inside\n * each child repo first, then uses `--submodule=diff` to expand submodule\n * changes into individual file diffs rather than opaque gitlink hashes.\n */\nexport async function captureFileChanges(\n workspacePath: string,\n baselineCommit: string,\n): Promise<string> {\n const opts = gitExecOpts(workspacePath);\n\n // Stage new files in nested repos so they appear in the submodule diff\n await stageNestedRepoChanges(workspacePath);\n\n // Stage parent-level changes\n await execAsync('git add -A', opts);\n\n // Use --submodule=diff to expand nested repo changes into individual file diffs\n const { stdout } = await execAsync(`git diff ${baselineCommit} --submodule=diff`, opts);\n\n return stdout.trim();\n}\n\n/**\n * Find immediate child directories that contain a `.git/` directory\n * and stage all their changes so they appear in the parent's submodule diff.\n */\nasync function stageNestedRepoChanges(workspacePath: string): Promise<void> {\n let entries: string[];\n try {\n entries = readdirSync(workspacePath);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (entry === '.git' || entry === 'node_modules') continue;\n const childPath = path.join(workspacePath, entry);\n try {\n if (!statSync(childPath).isDirectory()) continue;\n if (!statSync(path.join(childPath, '.git')).isDirectory()) continue;\n } catch {\n continue;\n }\n // Stage all files in the nested repo\n const childOpts = gitExecOpts(childPath);\n await execAsync('git add -A', childOpts);\n }\n}\n\n// ─── Snapshot baseline ───────────────────────────────────────────────────────\n\n/**\n * Walk `dir` recursively and return a snapshot of every readable text file.\n * Binary files and files larger than SNAPSHOT_MAX_FILE_BYTES are omitted.\n * Standard noise directories (.git, node_modules, etc.) are skipped.\n */\nexport async function captureSnapshot(dir: string): Promise<WorkspaceSnapshot> {\n const snapshot: WorkspaceSnapshot = new Map();\n await walkDir(dir, dir, snapshot);\n return snapshot;\n}\n\nasync function walkDir(\n rootDir: string,\n currentDir: string,\n snapshot: WorkspaceSnapshot,\n): Promise<void> {\n let entries: string[];\n try {\n entries = await readdir(currentDir);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (SNAPSHOT_EXCLUDE_DIRS.has(entry)) continue;\n\n const fullPath = path.join(currentDir, entry);\n let fileStat: Awaited<ReturnType<typeof stat>>;\n try {\n fileStat = await stat(fullPath);\n } catch {\n continue;\n }\n\n if (fileStat.isDirectory()) {\n await walkDir(rootDir, fullPath, snapshot);\n } else if (fileStat.isFile()) {\n if (fileStat.size > SNAPSHOT_MAX_FILE_BYTES) continue;\n let content: string;\n try {\n content = await readFile(fullPath, 'utf8');\n // Skip if not valid UTF-8 text (binary file heuristic: contains null bytes)\n if (content.includes('\\0')) continue;\n } catch {\n continue;\n }\n const relativePath = path.relative(rootDir, fullPath).replace(/\\\\/g, '/');\n snapshot.set(relativePath, content);\n }\n }\n}\n\n/**\n * Compare two snapshots and return a synthetic unified-diff string.\n * Covers new files, modified files, and deleted files.\n * Returns empty string when the snapshots are identical.\n */\nexport function diffFromSnapshots(baseline: WorkspaceSnapshot, current: WorkspaceSnapshot): string {\n const parts: string[] = [];\n\n // New and modified files\n for (const [relPath, currentContent] of current) {\n const baseContent = baseline.get(relPath);\n if (baseContent === undefined) {\n // New file\n parts.push(generateNewFileDiff(relPath, currentContent));\n } else if (baseContent !== currentContent) {\n // Modified file\n parts.push(generateModifiedFileDiff(relPath, baseContent, currentContent));\n }\n }\n\n // Deleted files\n for (const [relPath, baseContent] of baseline) {\n if (!current.has(relPath)) {\n parts.push(generateDeletedFileDiff(relPath, baseContent));\n }\n }\n\n return parts.join('\\n');\n}\n\n// ─── Synthetic diff helpers ──────────────────────────────────────────────────\n\n/**\n * Generate a synthetic unified diff entry for a newly created file.\n * Suitable both for snapshot diffs and provider-reported session artifacts.\n */\nexport function generateNewFileDiff(relativePath: string, content: string): string {\n const lines = content.endsWith('\\n') ? content.slice(0, -1).split('\\n') : content.split('\\n');\n const addedLines = lines.map((l) => `+${l}`).join('\\n');\n return [\n `diff --git a/${relativePath} b/${relativePath}`,\n 'new file mode 100644',\n '--- /dev/null',\n `+++ b/${relativePath}`,\n `@@ -0,0 +1,${lines.length} @@`,\n addedLines,\n ].join('\\n');\n}\n\nfunction generateDeletedFileDiff(relativePath: string, content: string): string {\n const lines = content.endsWith('\\n') ? content.slice(0, -1).split('\\n') : content.split('\\n');\n const removedLines = lines.map((l) => `-${l}`).join('\\n');\n return [\n `diff --git a/${relativePath} b/${relativePath}`,\n 'deleted file mode 100644',\n `--- a/${relativePath}`,\n '+++ /dev/null',\n `@@ -1,${lines.length} +0,0 @@`,\n removedLines,\n ].join('\\n');\n}\n\nfunction generateModifiedFileDiff(\n relativePath: string,\n oldContent: string,\n newContent: string,\n): string {\n // Simple full-file replacement diff (no line-level hunk optimization)\n const oldLines = oldContent.endsWith('\\n')\n ? oldContent.slice(0, -1).split('\\n')\n : oldContent.split('\\n');\n const newLines = newContent.endsWith('\\n')\n ? newContent.slice(0, -1).split('\\n')\n : newContent.split('\\n');\n const removedLines = oldLines.map((l) => `-${l}`).join('\\n');\n const addedLines = newLines.map((l) => `+${l}`).join('\\n');\n return [\n `diff --git a/${relativePath} b/${relativePath}`,\n `--- a/${relativePath}`,\n `+++ b/${relativePath}`,\n `@@ -1,${oldLines.length} +1,${newLines.length} @@`,\n removedLines,\n addedLines,\n ].join('\\n');\n}\n\n// ─── Session-state artifact capture ─────────────────────────────────────────\n\n/**\n * Scan a directory (e.g. copilot session-state `files/`) for text files and\n * return a synthetic unified diff string showing all of them as new additions.\n *\n * Returns undefined when the directory does not exist or is empty.\n *\n * Used by copilot providers to surface files that the agent wrote into its\n * own session-state rather than the eval workspace_path.\n */\nexport async function captureSessionArtifacts(\n filesDir: string,\n pathPrefix = '',\n): Promise<string | undefined> {\n const snapshot = await captureSnapshot(filesDir).catch(() => undefined);\n if (!snapshot || snapshot.size === 0) return undefined;\n\n const parts: string[] = [];\n for (const [relPath, content] of snapshot) {\n const displayPath = pathPrefix ? `${pathPrefix}/${relPath}` : relPath;\n parts.push(generateNewFileDiff(displayPath, content));\n }\n return parts.join('\\n');\n}\n","export type CopilotCliLogEntry = {\n readonly filePath: string;\n readonly evalCaseId?: string;\n readonly targetName: string;\n readonly attempt?: number;\n};\n\nconst GLOBAL_LOGS_KEY = Symbol.for('agentv.copilotCliLogs');\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for('agentv.copilotCliLogSubscribers');\n\ntype CopilotCliLogListener = (entry: CopilotCliLogEntry) => void;\n\ntype GlobalWithCopilotCliLogs = typeof globalThis & {\n [GLOBAL_LOGS_KEY]?: CopilotCliLogEntry[];\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<CopilotCliLogListener>;\n};\n\nfunction getCopilotCliLogStore(): CopilotCliLogEntry[] {\n const globalObject = globalThis as GlobalWithCopilotCliLogs;\n const existing = globalObject[GLOBAL_LOGS_KEY];\n if (existing) {\n return existing;\n }\n const created: CopilotCliLogEntry[] = [];\n globalObject[GLOBAL_LOGS_KEY] = created;\n return created;\n}\n\nfunction getSubscriberStore(): Set<CopilotCliLogListener> {\n const globalObject = globalThis as GlobalWithCopilotCliLogs;\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\n if (existing) {\n return existing;\n }\n const created = new Set<CopilotCliLogListener>();\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\n return created;\n}\n\nfunction notifySubscribers(entry: CopilotCliLogEntry): void {\n const subscribers = Array.from(getSubscriberStore());\n for (const listener of subscribers) {\n try {\n listener(entry);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Copilot CLI log subscriber failed: ${message}`);\n }\n }\n}\n\nexport function recordCopilotCliLogEntry(entry: CopilotCliLogEntry): void {\n getCopilotCliLogStore().push(entry);\n notifySubscribers(entry);\n}\n\nexport function consumeCopilotCliLogEntries(): CopilotCliLogEntry[] {\n const store = getCopilotCliLogStore();\n if (store.length === 0) {\n return [];\n }\n return store.splice(0, store.length);\n}\n\nexport function subscribeToCopilotCliLogEntries(listener: CopilotCliLogListener): () => void {\n const store = getSubscriberStore();\n store.add(listener);\n return () => {\n store.delete(listener);\n };\n}\n","/**\n * Shared utilities for Copilot providers (SDK and CLI).\n *\n * Centralises platform binary resolution, log filename generation,\n * elapsed-time formatting, sanitisation helpers, and process lifecycle\n * so both copilot-sdk.ts and copilot-cli.ts stay DRY.\n */\n\nimport type { ChildProcess } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { createWriteStream, existsSync, readdirSync } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { arch, homedir, platform } from 'node:os';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { ProviderRequest } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Platform binary resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the platform-specific native Copilot CLI binary from the @github/copilot\n * optional dependency. The SDK's default `getBundledCliPath()` points to a JS entry\n * that imports `node:sqlite` (unsupported by Bun). This function locates the native\n * binary directly.\n *\n * Resolution order:\n * 1. `import.meta.resolve()` of `@github/copilot-<os>-<arch>/package.json`\n * 2. Walk upward from `process.cwd()` probing local `node_modules` layouts\n * (standard and Bun's deduped `.bun/` directory)\n * 3. Probe common global npm install roots (e.g. `%APPDATA%\\npm\\node_modules`\n * on Windows, `/usr/local/lib/node_modules` on Unix). Users often install\n * `@github/copilot` globally via `npm install -g`, and on Windows the\n * `copilot` command on PATH is a `.ps1`/`.cmd` shim — `spawn()` needs the\n * native `copilot.exe` directly. See #1036.\n *\n * To teach the resolver about a new global install location, add it to\n * `globalNpmRoots()` below — no other change required.\n */\nexport function resolvePlatformCliPath(): string | undefined {\n const os = platform();\n const cpu = arch();\n\n const platformMap: Record<string, string> = {\n linux: 'linux',\n darwin: 'darwin',\n win32: 'win32',\n };\n const archMap: Record<string, string> = {\n x64: 'x64',\n arm64: 'arm64',\n };\n\n const osPart = platformMap[os];\n const archPart = archMap[cpu];\n if (!osPart || !archPart) {\n return undefined;\n }\n\n const packageName = `@github/copilot-${osPart}-${archPart}`;\n const binaryName = os === 'win32' ? 'copilot.exe' : 'copilot';\n\n try {\n // Try to resolve the platform package via import.meta.resolve\n const resolved = import.meta.resolve(`${packageName}/package.json`);\n // Use fileURLToPath for correct cross-platform conversion (slice(7) breaks on Windows\n // where file:///D:/... becomes /D:/... which is not a valid path)\n const packageJsonPath = resolved.startsWith('file:') ? fileURLToPath(resolved) : resolved;\n const binaryPath = path.join(path.dirname(packageJsonPath), binaryName);\n if (existsSync(binaryPath)) {\n return binaryPath;\n }\n } catch {\n // Not resolvable via import.meta.resolve\n }\n\n // Walk up from cwd looking for node_modules containing the package\n let searchDir = process.cwd();\n for (let i = 0; i < 10; i++) {\n // Standard node_modules layout\n const standardPath = path.join(\n searchDir,\n 'node_modules',\n ...packageName.split('/'),\n binaryName,\n );\n if (existsSync(standardPath)) {\n return standardPath;\n }\n\n // Bun's deduped .bun directory layout\n const bunDir = path.join(searchDir, 'node_modules', '.bun');\n const prefix = `@github+copilot-${osPart}-${archPart}@`;\n try {\n const entries = readdirSync(bunDir);\n for (const entry of entries) {\n if (entry.startsWith(prefix)) {\n const candidate = path.join(\n bunDir,\n entry,\n 'node_modules',\n '@github',\n `copilot-${osPart}-${archPart}`,\n binaryName,\n );\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n }\n } catch {\n // .bun directory doesn't exist or can't be read\n }\n\n const parent = path.dirname(searchDir);\n if (parent === searchDir) break;\n searchDir = parent;\n }\n\n // Global npm install roots (e.g. `npm install -g @github/copilot`).\n // For each root, probe both the hoisted layout and the nested layout where\n // the platform package lives under the parent `@github/copilot` package.\n for (const root of globalNpmRoots()) {\n const hoisted = path.join(root, '@github', `copilot-${osPart}-${archPart}`, binaryName);\n if (existsSync(hoisted)) {\n return hoisted;\n }\n const nested = path.join(\n root,\n '@github',\n 'copilot',\n 'node_modules',\n '@github',\n `copilot-${osPart}-${archPart}`,\n binaryName,\n );\n if (existsSync(nested)) {\n return nested;\n }\n }\n\n return undefined;\n}\n\n/**\n * Candidate global `node_modules` roots to probe for `@github/copilot`.\n *\n * Ordered by how commonly each root is used on the relevant platform. To add\n * a new location, append to the platform block below.\n */\nfunction globalNpmRoots(): string[] {\n const roots: string[] = [];\n const os = platform();\n const home = homedir();\n\n if (os === 'win32') {\n // npm default on Windows: %APPDATA%\\npm\\node_modules\n if (process.env.APPDATA) {\n roots.push(path.join(process.env.APPDATA, 'npm', 'node_modules'));\n }\n // nvm-windows / manual installs sometimes live under the user profile\n roots.push(path.join(home, 'AppData', 'Roaming', 'npm', 'node_modules'));\n } else {\n // Homebrew (Apple Silicon) and common Unix prefixes\n roots.push('/opt/homebrew/lib/node_modules');\n roots.push('/usr/local/lib/node_modules');\n roots.push('/usr/lib/node_modules');\n // User-local npm prefixes (`npm config set prefix ~/.npm-global`)\n roots.push(path.join(home, '.npm-global', 'lib', 'node_modules'));\n roots.push(path.join(home, '.local', 'lib', 'node_modules'));\n }\n\n // Honour an explicit npm prefix override if present in the environment.\n if (process.env.npm_config_prefix) {\n const prefix = process.env.npm_config_prefix;\n roots.push(\n os === 'win32' ? path.join(prefix, 'node_modules') : path.join(prefix, 'lib', 'node_modules'),\n );\n }\n\n return Array.from(new Set(roots));\n}\n\n// ---------------------------------------------------------------------------\n// Log filename & sanitisation\n// ---------------------------------------------------------------------------\n\nexport function buildLogFilename(\n request: ProviderRequest,\n targetName: string,\n fallbackId: string,\n): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const evalId = sanitizeForFilename(request.evalCaseId ?? fallbackId);\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : '';\n const target = sanitizeForFilename(targetName);\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\n}\n\nexport function sanitizeForFilename(value: string, fallback = 'unknown'): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : fallback;\n}\n\n// ---------------------------------------------------------------------------\n// Elapsed-time formatting\n// ---------------------------------------------------------------------------\n\nexport function formatElapsed(startedAt: number): string {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\n const hours = Math.floor(elapsedSeconds / 3600);\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\n const seconds = elapsedSeconds % 60;\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\n// ---------------------------------------------------------------------------\n// Process lifecycle\n// ---------------------------------------------------------------------------\n\nexport function killProcess(proc: ChildProcess): void {\n try {\n if (proc.exitCode === null && proc.signalCode === null) {\n proc.kill('SIGTERM');\n // Give process 5s to exit gracefully, then force-kill\n const forceTimer = setTimeout(() => {\n try {\n proc.kill('SIGKILL');\n } catch {\n // Already exited\n }\n }, 5000);\n forceTimer.unref?.();\n }\n } catch {\n // Process already exited\n }\n}\n\n// ---------------------------------------------------------------------------\n// Stream logger\n// ---------------------------------------------------------------------------\n\nexport interface StreamLoggerOptions {\n readonly filePath: string;\n readonly targetName: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly format: 'summary' | 'json';\n readonly headerLabel: string;\n /**\n * Optional extractor for streaming text chunk events.\n *\n * When provided, the return value controls how each event is handled:\n * - `string` — buffer this text; flush as `[assistant_message]` on the next\n * non-chunk event or `close()`.\n * - `null` — discard (reset) the accumulated buffer without emitting it.\n * Use this for events that signal a new streaming pass is starting,\n * e.g. `agent_thought_chunk` in Copilot ACP, which arrives between\n * a streaming preview batch and the final response batch.\n * - `undefined` — not a chunk event; process normally (flush buffer first, then\n * call `summarize` and write the line).\n *\n * Example (Copilot CLI ACP):\n * chunkExtractor: (type, data) => {\n * if (type === 'agent_thought_chunk') return null; // reset pre-thinking buffer\n * if (type !== 'agent_message_chunk') return undefined;\n * return (data as any)?.content?.text ?? undefined;\n * }\n */\n readonly chunkExtractor?: (eventType: string, data: unknown) => string | null | undefined;\n}\n\nexport class CopilotStreamLogger {\n readonly filePath: string;\n private readonly stream: WriteStream;\n private readonly startedAt = Date.now();\n private readonly format: 'summary' | 'json';\n private readonly summarize: (eventType: string, data: unknown) => string | undefined;\n private readonly chunkExtractor?: (eventType: string, data: unknown) => string | null | undefined;\n private pendingText = '';\n\n private constructor(\n filePath: string,\n format: 'summary' | 'json',\n summarize: (eventType: string, data: unknown) => string | undefined,\n chunkExtractor?: (eventType: string, data: unknown) => string | null | undefined,\n ) {\n this.filePath = filePath;\n this.format = format;\n this.summarize = summarize;\n this.chunkExtractor = chunkExtractor;\n this.stream = createWriteStream(filePath, { flags: 'a' });\n }\n\n static async create(\n options: StreamLoggerOptions,\n summarize: (eventType: string, data: unknown) => string | undefined,\n ): Promise<CopilotStreamLogger> {\n const logger = new CopilotStreamLogger(\n options.filePath,\n options.format,\n summarize,\n options.chunkExtractor,\n );\n const header = [\n `# ${options.headerLabel} stream log`,\n `# target: ${options.targetName}`,\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\n `# started: ${new Date().toISOString()}`,\n '',\n ].filter((line): line is string => Boolean(line));\n for (const line of header) {\n logger.stream.write(`${line}\\n`);\n }\n return logger;\n }\n\n handleEvent(eventType: string, data: unknown): void {\n // Buffer chunk events into a single consolidated entry (both formats).\n if (this.chunkExtractor) {\n const chunkText = this.chunkExtractor(eventType, data);\n if (chunkText === null) {\n // Reset signal: discard the accumulated buffer without emitting.\n // Used for events like agent_thought_chunk that arrive between a\n // streaming preview batch and the final response batch in Copilot ACP —\n // the preview text is stale; the real message follows after thinking.\n this.pendingText = '';\n return;\n }\n if (chunkText !== undefined) {\n this.pendingText += chunkText;\n return;\n }\n // Non-chunk event: flush any accumulated text first.\n this.flushPendingText();\n }\n\n if (this.format === 'json') {\n const elapsed = formatElapsed(this.startedAt);\n this.stream.write(`${JSON.stringify({ time: elapsed, event: eventType, data })}\\n`);\n return;\n }\n\n const elapsed = formatElapsed(this.startedAt);\n const summary = this.summarize(eventType, data);\n if (summary) {\n this.stream.write(`[+${elapsed}] [${eventType}] ${summary}\\n`);\n }\n }\n\n private flushPendingText(): void {\n if (!this.pendingText) return;\n const elapsed = formatElapsed(this.startedAt);\n if (this.format === 'json') {\n this.stream.write(\n `${JSON.stringify({ time: elapsed, event: 'assistant_message', data: { content: this.pendingText } })}\\n`,\n );\n } else {\n this.stream.write(`[+${elapsed}] [assistant_message] ${this.pendingText}\\n`);\n }\n this.pendingText = '';\n }\n\n async close(): Promise<void> {\n this.flushPendingText();\n await new Promise<void>((resolve, reject) => {\n this.stream.once('error', reject);\n this.stream.end(() => resolve());\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Log-streaming env check\n// ---------------------------------------------------------------------------\n\nexport function isLogStreamingDisabled(envKey: string): boolean {\n const envValue = process.env[envKey];\n if (!envValue) {\n return false;\n }\n const normalized = envValue.trim().toLowerCase();\n return normalized === 'false' || normalized === '0' || normalized === 'off';\n}\n","/**\n * Copilot Log provider — reads Copilot CLI session transcripts from disk.\n *\n * Zero-cost alternative to spawning a Copilot CLI instance. Reads\n * ~/.copilot/session-state/{uuid}/events.jsonl and converts to Message[].\n *\n * Config options (specify ONE of these to identify the session):\n * sessionDir — explicit path to a session directory\n * sessionId — session UUID (combined with sessionStateDir)\n * discover — 'latest' to auto-discover most recent session\n *\n * Optional:\n * sessionStateDir — override ~/.copilot/session-state\n * cwd — filter discovery by working directory\n *\n * The invoke() method ignores request.question since no process is spawned.\n * It reads the transcript file and returns a ProviderResponse with the\n * parsed Message[] in the output field.\n *\n * File-change tracking:\n * After reading the transcript, the provider automatically scans the\n * session's `files/` subdirectory for artifacts generated during the\n * session (e.g. CSV / Markdown reports saved by Copilot). Any files\n * found are returned as synthetic unified diffs in `fileChanges` so that\n * LLM and code graders can evaluate them via `{{file_changes}}` without\n * requiring the agent to echo file contents in its final answer.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\nimport { captureSessionArtifacts } from '../workspace/file-changes.js';\nimport { parseCopilotEvents } from './copilot-log-parser.js';\nimport { discoverCopilotSessions } from './copilot-session-discovery.js';\nimport type { CopilotLogResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nexport class CopilotLogProvider implements Provider {\n readonly id: string;\n readonly kind = 'copilot-log' as const;\n readonly targetName: string;\n\n private readonly config: CopilotLogResolvedConfig;\n\n constructor(targetName: string, config: CopilotLogResolvedConfig) {\n this.targetName = targetName;\n this.id = `copilot-log:${targetName}`;\n this.config = config;\n }\n\n async invoke(_request: ProviderRequest): Promise<ProviderResponse> {\n const sessionDir = await this.resolveSessionDir();\n const eventsPath = path.join(sessionDir, 'events.jsonl');\n\n let eventsContent: string;\n try {\n eventsContent = await readFile(eventsPath, 'utf8');\n } catch (err) {\n throw new Error(\n `Failed to read Copilot session transcript at ${eventsPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const parsed = parseCopilotEvents(eventsContent);\n\n // Scan session-state `files/` directory for artifacts generated during\n // the session (e.g. CSV reports). Return as synthetic diffs so graders\n // can evaluate them via {{file_changes}} without special eval wiring.\n const filesDir = path.join(sessionDir, 'files');\n const fileChanges = await captureSessionArtifacts(filesDir).catch(() => undefined);\n\n return {\n output: parsed.messages,\n tokenUsage: parsed.tokenUsage,\n durationMs: parsed.durationMs,\n startTime: parsed.meta.startedAt,\n ...(fileChanges ? { fileChanges } : {}),\n };\n }\n\n private async resolveSessionDir(): Promise<string> {\n if (this.config.sessionDir) {\n return this.config.sessionDir;\n }\n\n if (this.config.sessionId) {\n const stateDir =\n this.config.sessionStateDir ?? path.join(homedir(), '.copilot', 'session-state');\n return path.join(stateDir, this.config.sessionId);\n }\n\n if (this.config.discover === 'latest') {\n const sessions = await discoverCopilotSessions({\n sessionStateDir: this.config.sessionStateDir,\n cwd: this.config.cwd,\n limit: 1,\n });\n\n if (sessions.length === 0) {\n throw new Error(\n `No Copilot CLI sessions found${this.config.cwd ? ` for cwd=${this.config.cwd}` : ''}. ` +\n `Check that sessions exist in ${this.config.sessionStateDir ?? '~/.copilot/session-state/'}`,\n );\n }\n\n return sessions[0].sessionDir;\n }\n\n throw new Error(\n 'CopilotLogProvider requires one of: sessionDir, sessionId, or discover=\"latest\"',\n );\n }\n}\n","/**\n * Copilot CLI events.jsonl parser.\n *\n * Reads a Copilot CLI session transcript (events.jsonl) and converts it to\n * AgentV's Message[] format. Each line is a JSON object with:\n * { type, data: { ...payload }, id, timestamp, parentId }\n *\n * All event-specific fields live under event.data.*, while type, id, timestamp,\n * and parentId are at the top level.\n *\n * Supported event types:\n * session.start → session metadata (data.sessionId, data.context.cwd)\n * user.message → Message { role: 'user' }\n * assistant.message → Message { role: 'assistant', toolCalls from data.toolRequests }\n * skill.invoked → ToolCall { tool: 'Skill', input: { skill: data.name } }\n * tool.execution_start + tool.execution_complete → ToolCall with output\n * session.shutdown → token usage from data.modelMetrics, end timestamp\n *\n * To add a new event type:\n * 1. Add a case to the switch in parseCopilotEvents()\n * 2. Map it to a Message or ToolCall\n * 3. Add a test in copilot-log-parser.test.ts\n */\n\nimport { normalizeToolCall } from './normalize-tool-call.js';\nimport type { Message, ProviderTokenUsage, ToolCall } from './types.js';\n\nexport interface CopilotSessionMeta {\n readonly sessionId: string;\n readonly model: string;\n readonly cwd: string;\n readonly repository?: string;\n readonly branch?: string;\n readonly startedAt?: string;\n}\n\nexport interface ParsedCopilotSession {\n readonly messages: Message[];\n readonly meta: CopilotSessionMeta;\n readonly tokenUsage?: ProviderTokenUsage;\n readonly durationMs?: number;\n}\n\ninterface ToolCallInProgress {\n readonly toolName: string;\n readonly input?: unknown;\n readonly toolCallId: string;\n}\n\nexport function parseCopilotEvents(eventsJsonl: string): ParsedCopilotSession {\n const messages: Message[] = [];\n const meta: {\n sessionId: string;\n model: string;\n cwd: string;\n repository?: string;\n branch?: string;\n startedAt?: string;\n } = { sessionId: '', model: '', cwd: '' };\n\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let hasUsage = false;\n let startTimestamp: string | undefined;\n let endTimestamp: string | undefined;\n\n const toolCallsInProgress = new Map<string, ToolCallInProgress>();\n\n const lines = eventsJsonl.split('\\n').filter((l) => l.trim().length > 0);\n\n for (const line of lines) {\n let event: Record<string, unknown>;\n try {\n event = JSON.parse(line);\n } catch {\n continue;\n }\n\n const eventType = event.type as string | undefined;\n if (!eventType) continue;\n\n // All event payloads are nested under event.data\n const data = (event.data ?? {}) as Record<string, unknown>;\n\n switch (eventType) {\n case 'session.start': {\n meta.sessionId = String(data.sessionId ?? '');\n const ctx = data.context as Record<string, unknown> | undefined;\n meta.cwd = String(ctx?.cwd ?? '');\n meta.repository = ctx?.repository ? String(ctx.repository) : undefined;\n meta.branch = ctx?.branch ? String(ctx.branch) : undefined;\n // timestamp is at event top level; startTime is in data\n const ts = event.timestamp ?? data.startTime;\n meta.startedAt = ts ? String(ts) : undefined;\n startTimestamp = ts ? String(ts) : undefined;\n break;\n }\n\n case 'user.message': {\n messages.push({\n role: 'user',\n content: data.content != null ? String(data.content) : '',\n });\n break;\n }\n\n case 'assistant.message': {\n const toolRequests = data.toolRequests as readonly Record<string, unknown>[] | undefined;\n\n const toolCalls: ToolCall[] = (toolRequests ?? []).map((req) =>\n normalizeToolCall('copilot-log', {\n tool: String(req.name ?? req.toolName ?? ''),\n input: req.arguments,\n id: req.toolCallId ? String(req.toolCallId) : undefined,\n }),\n );\n\n messages.push({\n role: 'assistant',\n content: data.content != null ? String(data.content) : undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n });\n break;\n }\n\n case 'skill.invoked': {\n const skillName = String(data.name ?? '');\n messages.push({\n role: 'assistant',\n toolCalls: [\n {\n tool: 'Skill',\n input: { skill: skillName },\n },\n ],\n });\n break;\n }\n\n case 'tool.execution_start': {\n const toolCallId = String(data.toolCallId ?? '');\n if (toolCallId) {\n toolCallsInProgress.set(toolCallId, {\n toolName: String(data.toolName ?? ''),\n input: data.arguments,\n toolCallId,\n });\n }\n break;\n }\n\n case 'tool.execution_complete': {\n const toolCallId = String(data.toolCallId ?? '');\n const started = toolCallsInProgress.get(toolCallId);\n // Orphaned completes (no matching start) are silently dropped —\n // orphaned starts (session crashed mid-tool) are also discarded\n // since incomplete tool calls provide no useful evaluation signal.\n if (started) {\n toolCallsInProgress.delete(toolCallId);\n messages.push({\n role: 'assistant',\n toolCalls: [\n normalizeToolCall('copilot-log', {\n tool: started.toolName,\n input: started.input,\n output: data.result,\n id: toolCallId,\n }),\n ],\n });\n }\n break;\n }\n\n case 'session.shutdown': {\n endTimestamp = event.timestamp ? String(event.timestamp) : undefined;\n\n // Extract token usage from modelMetrics\n const modelMetrics = data.modelMetrics as\n | Record<string, { usage?: { inputTokens?: number; outputTokens?: number } }>\n | undefined;\n if (modelMetrics) {\n for (const metrics of Object.values(modelMetrics)) {\n if (metrics.usage) {\n hasUsage = true;\n totalInputTokens += Number(metrics.usage.inputTokens ?? 0);\n totalOutputTokens += Number(metrics.usage.outputTokens ?? 0);\n }\n }\n }\n\n // Extract model name from currentModel\n const currentModel = data.currentModel;\n if (currentModel && !meta.model) {\n meta.model = String(currentModel);\n }\n break;\n }\n }\n }\n\n let durationMs: number | undefined;\n if (startTimestamp && endTimestamp) {\n durationMs = new Date(endTimestamp).getTime() - new Date(startTimestamp).getTime();\n }\n\n return {\n messages,\n meta,\n tokenUsage: hasUsage ? { input: totalInputTokens, output: totalOutputTokens } : undefined,\n durationMs,\n };\n}\n","/**\n * Copilot CLI session discovery.\n *\n * Scans ~/.copilot/session-state/ for session directories containing\n * workspace.yaml and events.jsonl. Returns sessions sorted by recency.\n *\n * Each session directory is a UUID containing:\n * workspace.yaml — session metadata (cwd, repository)\n * events.jsonl — event transcript\n *\n * To extend filtering:\n * 1. Add a new option to DiscoverOptions\n * 2. Add filter logic in the sessions.filter() chain\n */\n\nimport { readFile, readdir, stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\n\nimport { parseYamlValue } from '../yaml-loader.js';\n\nexport interface CopilotSession {\n readonly sessionId: string;\n readonly sessionDir: string;\n readonly cwd: string;\n readonly repository?: string;\n readonly updatedAt: Date;\n readonly isActive: boolean;\n}\n\nexport interface DiscoverOptions {\n /** Filter sessions by working directory (exact match). */\n readonly cwd?: string;\n /** Filter sessions by repository name (exact match). */\n readonly repository?: string;\n /** Maximum number of sessions to return (default: 10). */\n readonly limit?: number;\n /** Override the default ~/.copilot/session-state directory. */\n readonly sessionStateDir?: string;\n}\n\nconst DEFAULT_SESSION_STATE_DIR = () => path.join(homedir(), '.copilot', 'session-state');\n\nexport async function discoverCopilotSessions(opts?: DiscoverOptions): Promise<CopilotSession[]> {\n const sessionStateDir = opts?.sessionStateDir ?? DEFAULT_SESSION_STATE_DIR();\n const limit = opts?.limit ?? 10;\n\n let entries: string[];\n try {\n entries = await readdir(sessionStateDir);\n } catch {\n return [];\n }\n\n const sessions: CopilotSession[] = [];\n\n for (const entry of entries) {\n const sessionDir = path.join(sessionStateDir, entry);\n const workspacePath = path.join(sessionDir, 'workspace.yaml');\n const eventsPath = path.join(sessionDir, 'events.jsonl');\n\n try {\n const workspaceContent = await readFile(workspacePath, 'utf8');\n const workspace = (parseYamlValue(workspaceContent) ?? {}) as Record<string, unknown>;\n\n const cwd = String(workspace.cwd ?? '');\n\n let updatedAt: Date;\n try {\n const eventsStat = await stat(eventsPath);\n updatedAt = eventsStat.mtime;\n } catch {\n updatedAt = new Date(0);\n }\n\n // Check whether the session has ended by looking for \"session.shutdown\"\n // in the last 4 KB of the events file. The shutdown event is always the\n // final event, so reading only the tail avoids loading multi-MB transcripts.\n let isActive = true;\n try {\n const fd = await import('node:fs/promises').then((fs) => fs.open(eventsPath, 'r'));\n try {\n const fstat = await fd.stat();\n const tailSize = Math.min(fstat.size, 4096);\n const buf = Buffer.alloc(tailSize);\n await fd.read(buf, 0, tailSize, Math.max(0, fstat.size - tailSize));\n isActive = !buf.toString('utf8').includes('\"session.shutdown\"');\n } finally {\n await fd.close();\n }\n } catch {\n // No events file — treat as active\n }\n\n sessions.push({\n sessionId: entry,\n sessionDir,\n cwd,\n repository: workspace.repository ? String(workspace.repository) : undefined,\n updatedAt,\n isActive,\n });\n } catch {}\n }\n\n let filtered = sessions;\n if (opts?.cwd) {\n filtered = filtered.filter((s) => s.cwd === opts.cwd);\n }\n if (opts?.repository) {\n filtered = filtered.filter((s) => s.repository === opts.repository);\n }\n\n filtered.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n\n return filtered.slice(0, limit);\n}\n","import { randomUUID } from 'node:crypto';\nimport { existsSync } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { captureSessionArtifacts } from '../workspace/file-changes.js';\nimport { recordCopilotSdkLogEntry } from './copilot-sdk-log-tracker.js';\nimport {\n CopilotStreamLogger,\n buildLogFilename,\n isLogStreamingDisabled,\n resolvePlatformCliPath,\n} from './copilot-utils.js';\nimport { normalizeToolCall } from './normalize-tool-call.js';\nimport { buildPromptDocument, normalizeInputFiles } from './preread.js';\nimport type { CopilotSdkResolvedConfig } from './targets.js';\nimport type {\n Message,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ProviderTokenUsage,\n ToolCall,\n} from './types.js';\n\n// Lazy-loaded module to avoid bundling issues with dynamic requires\n// biome-ignore lint/suspicious/noExplicitAny: dynamic import type\nlet copilotSdkModule: any = null;\n\nasync function loadCopilotSdk(): Promise<typeof import('@github/copilot-sdk')> {\n if (!copilotSdkModule) {\n try {\n copilotSdkModule = await import('@github/copilot-sdk');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('vscode-jsonrpc')) {\n throw new Error(\n `Failed to load @github/copilot-sdk due to a known ESM compatibility issue with vscode-jsonrpc (https://github.com/github/copilot-sdk/issues/710).\\n\\nWorkarounds:\\n - Use the copilot-cli target instead (recommended): set target type to \"copilot-cli\" in your eval YAML\\n - If running under Node.js 24+: set NODE_OPTIONS=\"--experimental-specifier-resolution=node\"\\n - Wait for vscode-jsonrpc@9.0.0 stable to be released upstream`,\n );\n }\n throw new Error(\n `Failed to load @github/copilot-sdk. Please install it:\\n npm install @github/copilot-sdk\\n\\nOriginal error: ${message}`,\n );\n }\n }\n return copilotSdkModule;\n}\n\ninterface ToolCallInProgress {\n readonly tool: string;\n readonly input?: unknown;\n readonly id?: string;\n readonly startTime: string;\n readonly startMs: number;\n}\n\n/**\n * Copilot SDK provider using the @github/copilot-sdk library directly.\n * This provides typed event access for structured tool calls, token usage, and clean session lifecycle.\n *\n * Note: The SDK is loaded lazily on first use to avoid bundling issues.\n * Users must install @github/copilot-sdk separately.\n */\nexport class CopilotSdkProvider implements Provider {\n readonly id: string;\n readonly kind = 'copilot-sdk' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: CopilotSdkResolvedConfig;\n // biome-ignore lint/suspicious/noExplicitAny: SDK client type is dynamically loaded\n private client: any = null;\n\n constructor(targetName: string, config: CopilotSdkResolvedConfig) {\n this.id = `copilot-sdk:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Copilot SDK request was aborted before execution');\n }\n\n const sdk = await loadCopilotSdk();\n const client = await this.getOrCreateClient(sdk);\n\n const startTime = new Date().toISOString();\n const startMs = Date.now();\n\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n\n // Create a fresh session for this invocation\n // biome-ignore lint/suspicious/noExplicitAny: SDK session type is dynamically loaded\n const sessionOptions: any = {\n onPermissionRequest: () => ({ kind: 'approved' }),\n };\n\n if (this.config.model) {\n sessionOptions.model = this.config.model;\n }\n\n const cwd = this.resolveCwd(request.cwd);\n if (cwd) {\n sessionOptions.workingDirectory = cwd;\n // Auto-discover skill directories from the workspace so the SDK loads\n // SKILL.md files into the session context (see copilot-sdk docs/features/skills.md).\n sessionOptions.skillDirectories = resolveSkillDirectories(cwd);\n }\n\n const systemPrompt = this.config.systemPrompt;\n\n if (systemPrompt) {\n sessionOptions.systemMessage = {\n mode: 'append',\n content: systemPrompt,\n };\n }\n\n // BYOK — pass a provider block to route requests through a user-provided endpoint\n // instead of GitHub's Copilot infrastructure. See copilot-sdk docs/auth/byok.md.\n if (this.config.byokBaseUrl) {\n const byokType = this.config.byokType ?? 'openai';\n // biome-ignore lint/suspicious/noExplicitAny: SDK provider config shape is dynamic\n const provider: any = {\n type: byokType,\n baseUrl: normalizeByokBaseUrl(this.config.byokBaseUrl, byokType),\n };\n if (this.config.byokBearerToken) {\n provider.bearerToken = this.config.byokBearerToken;\n } else if (this.config.byokApiKey) {\n provider.apiKey = this.config.byokApiKey;\n }\n if (this.config.byokWireApi) {\n provider.wireApi = this.config.byokWireApi;\n }\n if (this.config.byokType === 'azure' && this.config.byokApiVersion) {\n provider.azure = { apiVersion: this.config.byokApiVersion };\n }\n sessionOptions.provider = provider;\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: SDK session type is dynamically loaded\n let session: any;\n try {\n session = await client.createSession(sessionOptions);\n } catch (error) {\n throw new Error(\n `Failed to create Copilot SDK session: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n // Track events\n const toolCallsInProgress = new Map<string, ToolCallInProgress>();\n const completedToolCalls: ToolCall[] = [];\n let finalContent = '';\n let tokenUsage: ProviderTokenUsage | undefined;\n let costUsd: number | undefined;\n\n // Subscribe to events via catch-all handler\n const unsubscribe = session.on(\n // biome-ignore lint/suspicious/noExplicitAny: SDK event type is dynamically loaded\n (event: any) => {\n const eventType = event.type as string;\n const data = event.data;\n\n logger?.handleEvent(eventType, data);\n\n if (eventType === 'tool.execution_start') {\n const callId = data?.toolCallId ?? data?.id ?? randomUUID();\n toolCallsInProgress.set(callId, {\n tool: data?.toolName ?? data?.name ?? 'unknown',\n input: data?.input ?? data?.arguments,\n id: callId,\n startTime: new Date().toISOString(),\n startMs: Date.now(),\n });\n }\n\n if (eventType === 'tool.execution_end' || eventType === 'tool.execution_complete') {\n const callId = data?.toolCallId ?? data?.id;\n const inProgress = callId ? toolCallsInProgress.get(callId) : undefined;\n if (inProgress) {\n toolCallsInProgress.delete(callId);\n const endMs = Date.now();\n completedToolCalls.push(\n normalizeToolCall('copilot-sdk', {\n tool: inProgress.tool,\n input: inProgress.input,\n output: data?.output ?? data?.result,\n id: inProgress.id,\n startTime: inProgress.startTime,\n endTime: new Date().toISOString(),\n durationMs: endMs - inProgress.startMs,\n }),\n );\n }\n }\n\n if (eventType === 'assistant.message') {\n const content = data?.content;\n if (typeof content === 'string') {\n finalContent = content;\n }\n }\n\n if (eventType === 'assistant.usage') {\n const inputTokens = data?.inputTokens ?? data?.input ?? 0;\n const outputTokens = data?.outputTokens ?? data?.output ?? 0;\n // Aggregate usage across multiple events\n if (tokenUsage) {\n tokenUsage = {\n input: tokenUsage.input + inputTokens,\n output: tokenUsage.output + outputTokens,\n };\n } else {\n tokenUsage = {\n input: inputTokens,\n output: outputTokens,\n };\n }\n if (typeof data?.costUsd === 'number') {\n costUsd = (costUsd ?? 0) + data.costUsd;\n }\n }\n },\n );\n\n try {\n // Build the prompt\n const inputFiles = normalizeInputFiles(request.inputFiles);\n const prompt = buildPromptDocument(request, inputFiles);\n\n // Send and wait with optional timeout\n if (request.signal) {\n // Handle abort signal\n const abortHandler = () => {\n session.destroy().catch(() => {});\n };\n request.signal.addEventListener('abort', abortHandler, { once: true });\n try {\n await this.sendWithTimeout(session, prompt, this.config.timeoutMs);\n } finally {\n request.signal.removeEventListener('abort', abortHandler);\n }\n } else {\n await this.sendWithTimeout(session, prompt, this.config.timeoutMs);\n }\n\n const endTime = new Date().toISOString();\n const durationMs = Date.now() - startMs;\n\n // Build output messages\n const output: Message[] = [];\n\n if (completedToolCalls.length > 0) {\n output.push({\n role: 'assistant',\n content: finalContent || undefined,\n toolCalls: completedToolCalls,\n });\n } else if (finalContent) {\n output.push({\n role: 'assistant',\n content: finalContent,\n });\n }\n\n // Capture session artifacts from session-state `files/` directory.\n // The SDK's session.workspacePath is the authoritative path to the\n // session state directory (contains files/, checkpoints/, plan.md).\n // Only populated when infinite sessions are enabled on the server.\n const sessionWorkspacePath = session.workspacePath;\n const fileChanges = sessionWorkspacePath\n ? await captureSessionArtifacts(path.join(sessionWorkspacePath, 'files')).catch(\n () => undefined,\n )\n : undefined;\n\n return {\n raw: {\n model: this.config.model,\n cliUrl: this.config.cliUrl,\n logFile: logger?.filePath,\n },\n output,\n tokenUsage,\n costUsd,\n durationMs,\n startTime,\n endTime,\n ...(fileChanges ? { fileChanges } : {}),\n };\n } finally {\n unsubscribe();\n await logger?.close();\n await session.destroy().catch(() => {});\n }\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: SDK client type is dynamically loaded\n private async getOrCreateClient(sdk: any): Promise<any> {\n if (!this.client) {\n // biome-ignore lint/suspicious/noExplicitAny: SDK constructor options are dynamic\n const clientOptions: any = {};\n if (this.config.cliUrl) {\n clientOptions.cliUrl = this.config.cliUrl;\n }\n if (this.config.cliPath) {\n clientOptions.cliPath = this.config.cliPath;\n } else {\n // The SDK default getBundledCliPath() resolves to a JS entry that requires\n // node:sqlite (unavailable in Bun). Auto-resolve the platform-specific native\n // binary from @github/copilot-{platform}-{arch} when available.\n const nativePath = resolvePlatformCliPath();\n if (nativePath) {\n clientOptions.cliPath = nativePath;\n }\n }\n if (this.config.githubToken) {\n clientOptions.githubToken = this.config.githubToken;\n }\n this.client = new sdk.CopilotClient(clientOptions);\n await this.client.start();\n }\n return this.client;\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: SDK session type is dynamically loaded\n private async sendWithTimeout(session: any, prompt: string, timeoutMs?: number): Promise<void> {\n if (!timeoutMs) {\n await session.sendAndWait({ prompt });\n return;\n }\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n reject(new Error(`Copilot SDK timed out after ${Math.ceil(timeoutMs / 1000)}s`));\n }, timeoutMs);\n timer.unref?.();\n });\n\n try {\n await Promise.race([session.sendAndWait({ prompt }), timeoutPromise]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n private resolveCwd(cwdOverride?: string): string | undefined {\n if (cwdOverride) {\n return path.resolve(cwdOverride);\n }\n if (this.config.cwd) {\n return path.resolve(this.config.cwd);\n }\n return undefined;\n }\n\n private resolveLogDirectory(): string | undefined {\n if (isLogStreamingDisabled('AGENTV_COPILOT_SDK_STREAM_LOGS')) {\n return undefined;\n }\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'copilot-sdk');\n }\n\n private async createStreamLogger(\n request: ProviderRequest,\n ): Promise<CopilotStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Copilot SDK stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName, 'copilot-sdk'));\n\n try {\n const logger = await CopilotStreamLogger.create(\n {\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n headerLabel: 'Copilot SDK',\n chunkExtractor: extractSdkChunk,\n },\n summarizeSdkEvent,\n );\n recordCopilotSdkLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Copilot SDK stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\n/**\n * Auto-discover skill directories from a workspace.\n * Checks standard skill directory locations and returns any that exist.\n */\nfunction resolveSkillDirectories(cwd: string): string[] {\n const candidates = [\n path.join(cwd, '.claude', 'skills'),\n path.join(cwd, '.agents', 'skills'),\n path.join(cwd, '.codex', 'skills'),\n ];\n return candidates.filter((dir) => existsSync(dir));\n}\n\n/**\n * Normalize a BYOK base URL for the Copilot SDK.\n * For Azure type, if the value is a bare resource name (no https:// prefix),\n * construct the full URL: https://{resourceName}.openai.azure.com\n * This lets users reuse AZURE_OPENAI_ENDPOINT without a separate env var.\n */\nfunction normalizeByokBaseUrl(baseUrl: string, type: string): string {\n const trimmed = baseUrl.trim().replace(/\\/+$/, '');\n if (/^https?:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n if (type === 'azure') {\n return `https://${trimmed}.openai.azure.com`;\n }\n return trimmed;\n}\n\n/**\n * Extracts bufferable text from SDK assistant.message_delta events.\n * Returning a string causes the logger to accumulate the text rather than\n * emit a line per delta. A single [assistant_message] line is written once\n * all deltas for a turn have arrived (on the next non-chunk event or close).\n */\nfunction extractSdkChunk(eventType: string, data: unknown): string | undefined {\n if (eventType !== 'assistant.message_delta') return undefined;\n if (!data || typeof data !== 'object') return undefined;\n const d = data as Record<string, unknown>;\n return typeof d.deltaContent === 'string' ? d.deltaContent : undefined;\n}\n\nfunction summarizeSdkEvent(eventType: string, data: unknown): string | undefined {\n if (!data || typeof data !== 'object') {\n return eventType;\n }\n const d = data as Record<string, unknown>;\n switch (eventType) {\n case 'assistant.message':\n return typeof d.content === 'string'\n ? `${d.content.slice(0, 200)}${d.content.length > 200 ? '...' : ''}`\n : 'message';\n case 'assistant.message_delta':\n return typeof d.deltaContent === 'string' ? d.deltaContent.slice(0, 100) : undefined;\n case 'tool.execution_start':\n return `${d.toolName ?? d.name ?? 'unknown'}`;\n case 'tool.execution_end':\n case 'tool.execution_complete':\n return `${d.toolName ?? d.name ?? 'unknown'} completed`;\n case 'assistant.usage':\n return `input=${d.inputTokens ?? d.input ?? 0} output=${d.outputTokens ?? d.output ?? 0}`;\n case 'session.error':\n return typeof d.message === 'string' ? d.message : 'error';\n default:\n return undefined;\n }\n}\n","export type CopilotSdkLogEntry = {\n readonly filePath: string;\n readonly evalCaseId?: string;\n readonly targetName: string;\n readonly attempt?: number;\n};\n\nconst GLOBAL_LOGS_KEY = Symbol.for('agentv.copilotSdkLogs');\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for('agentv.copilotSdkLogSubscribers');\n\ntype CopilotSdkLogListener = (entry: CopilotSdkLogEntry) => void;\n\ntype GlobalWithCopilotSdkLogs = typeof globalThis & {\n [GLOBAL_LOGS_KEY]?: CopilotSdkLogEntry[];\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<CopilotSdkLogListener>;\n};\n\nfunction getCopilotSdkLogStore(): CopilotSdkLogEntry[] {\n const globalObject = globalThis as GlobalWithCopilotSdkLogs;\n const existing = globalObject[GLOBAL_LOGS_KEY];\n if (existing) {\n return existing;\n }\n const created: CopilotSdkLogEntry[] = [];\n globalObject[GLOBAL_LOGS_KEY] = created;\n return created;\n}\n\nfunction getSubscriberStore(): Set<CopilotSdkLogListener> {\n const globalObject = globalThis as GlobalWithCopilotSdkLogs;\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\n if (existing) {\n return existing;\n }\n const created = new Set<CopilotSdkLogListener>();\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\n return created;\n}\n\nfunction notifySubscribers(entry: CopilotSdkLogEntry): void {\n const subscribers = Array.from(getSubscriberStore());\n for (const listener of subscribers) {\n try {\n listener(entry);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Copilot SDK log subscriber failed: ${message}`);\n }\n }\n}\n\nexport function recordCopilotSdkLogEntry(entry: CopilotSdkLogEntry): void {\n getCopilotSdkLogStore().push(entry);\n notifySubscribers(entry);\n}\n\nexport function consumeCopilotSdkLogEntries(): CopilotSdkLogEntry[] {\n const store = getCopilotSdkLogStore();\n if (store.length === 0) {\n return [];\n }\n return store.splice(0, store.length);\n}\n\nexport function subscribeToCopilotSdkLogEntries(listener: CopilotSdkLogListener): () => void {\n const store = getSubscriberStore();\n store.add(listener);\n return () => {\n store.delete(listener);\n };\n}\n","import type { MockResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst DEFAULT_MOCK_RESPONSE =\n '{\"answer\":\"Mock provider response. Configure targets.yaml to supply a custom value.\"}';\n\nexport class MockProvider implements Provider {\n readonly id: string;\n readonly kind = 'mock' as const;\n readonly targetName: string;\n\n private readonly cannedResponse: string;\n private readonly delayMs: number;\n private readonly delayMinMs: number;\n private readonly delayMaxMs: number;\n\n constructor(targetName: string, config: MockResolvedConfig) {\n this.id = `mock:${targetName}`;\n this.targetName = targetName;\n this.cannedResponse = config.response ?? DEFAULT_MOCK_RESPONSE;\n this.delayMs = config.delayMs ?? 0;\n this.delayMinMs = config.delayMinMs ?? 0;\n this.delayMaxMs = config.delayMaxMs ?? 0;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n const delay = this.calculateDelay();\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n return {\n output: [{ role: 'assistant' as const, content: this.cannedResponse }],\n raw: {\n question: request.question,\n },\n };\n }\n\n private calculateDelay(): number {\n // If range is specified, use uniform random distribution\n if (this.delayMinMs > 0 || this.delayMaxMs > 0) {\n const min = Math.max(0, this.delayMinMs);\n const max = Math.max(min, this.delayMaxMs);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n // Otherwise use fixed delay\n return this.delayMs;\n }\n}\n","/**\n * Pi CLI provider — shells out to the `pi` binary as a subprocess.\n *\n * Use this when you have the Pi CLI installed globally or want to point to\n * a specific binary via the `executable` config field (defaults to `pi` on PATH).\n * Output is captured as JSONL from stdout and parsed into AgentV messages.\n *\n * For the SDK-based approach (no subprocess), use the `pi-coding-agent` provider instead.\n */\n\nimport { execSync, spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { accessSync, createWriteStream, readFileSync } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\n\nimport { trackChild } from '../../runtime/child-tracker.js';\nimport { normalizeToolCall } from './normalize-tool-call.js';\nimport { recordPiLogEntry } from './pi-log-tracker.js';\nimport {\n extractAzureResourceName,\n resolveCliProvider,\n resolveEnvKeyName,\n} from './pi-provider-aliases.js';\nimport { extractPiTextContent, toFiniteNumber } from './pi-utils.js';\nimport { normalizeInputFiles } from './preread.js';\nimport type { PiCliResolvedConfig } from './targets.js';\nimport type {\n Message,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ProviderTokenUsage,\n ToolCall,\n} from './types.js';\n\nconst WORKSPACE_PREFIX = 'agentv-pi-';\nconst PROMPT_FILENAME = 'prompt.md';\n\ninterface PiRunOptions {\n readonly executable: string;\n readonly args: readonly string[];\n readonly cwd: string;\n readonly timeoutMs?: number;\n readonly env: NodeJS.ProcessEnv;\n readonly signal?: AbortSignal;\n readonly onStdoutChunk?: (chunk: string) => void;\n readonly onStderrChunk?: (chunk: string) => void;\n}\n\ninterface PiRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n readonly timedOut?: boolean;\n}\n\ntype PiRunner = (options: PiRunOptions) => Promise<PiRunResult>;\n\nexport class PiCliProvider implements Provider {\n readonly id: string;\n readonly kind = 'pi-cli' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: PiCliResolvedConfig;\n private readonly runPi: PiRunner;\n\n constructor(targetName: string, config: PiCliResolvedConfig, runner: PiRunner = defaultPiRunner) {\n this.id = `pi-cli:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n this.runPi = runner;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Pi CLI request was aborted before execution');\n }\n\n const inputFiles = normalizeInputFiles(request.inputFiles);\n\n const startTime = new Date().toISOString();\n const startMs = Date.now();\n\n // Use eval-materialized workspace (request.cwd) when available, consistent with copilot-cli.\n // Only create a temp workspace when no cwd is provided.\n const hasExternalCwd = !!(request.cwd || this.config.cwd);\n const workspaceRoot = hasExternalCwd ? undefined : await this.createWorkspace();\n const cwd = this.resolveCwd(workspaceRoot, request.cwd);\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n try {\n // Save prompt to file for debugging/logging\n const promptFile = path.join(cwd, PROMPT_FILENAME);\n await writeFile(promptFile, request.question, 'utf8');\n\n const args = this.buildPiArgs(request.question, inputFiles);\n\n const result = await this.executePi(args, cwd, request.signal, logger);\n\n if (result.timedOut) {\n throw new Error(\n `Pi CLI timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n\n if (result.exitCode !== 0) {\n const detail = pickDetail(result.stderr, result.stdout);\n const prefix = `Pi CLI exited with code ${result.exitCode}`;\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\n }\n\n const parsed = parsePiJsonl(result.stdout);\n const output = extractMessages(parsed);\n const tokenUsage = extractTokenUsage(parsed);\n\n // Emit stream callbacks for OTEL trace export (post-hoc from parsed output)\n if (request.streamCallbacks) {\n for (const msg of output) {\n if (msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n request.streamCallbacks.onToolCallEnd?.(\n tc.tool,\n tc.input,\n tc.output,\n tc.durationMs ?? 0,\n tc.id,\n );\n }\n }\n }\n request.streamCallbacks.onLlmCallEnd?.(this.config.model ?? 'pi', tokenUsage);\n }\n\n const endTime = new Date().toISOString();\n const durationMs = Date.now() - startMs;\n\n return {\n raw: {\n response: parsed,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n args,\n executable: this.config.executable,\n promptFile,\n workspace: workspaceRoot ?? cwd,\n inputFiles,\n logFile: logger?.filePath,\n },\n output,\n tokenUsage,\n durationMs,\n startTime,\n endTime,\n };\n } finally {\n await logger?.close();\n if (workspaceRoot) {\n await this.cleanupWorkspace(workspaceRoot);\n }\n }\n }\n\n private resolveCwd(workspaceRoot: string | undefined, cwdOverride?: string): string {\n if (cwdOverride) {\n return path.resolve(cwdOverride);\n }\n if (this.config.cwd) {\n return path.resolve(this.config.cwd);\n }\n if (workspaceRoot) {\n return workspaceRoot;\n }\n return process.cwd();\n }\n\n private buildPiArgs(prompt: string, inputFiles: readonly string[] | undefined): string[] {\n const args: string[] = [];\n\n if (this.config.subprovider) {\n args.push('--provider', resolveCliProvider(this.config.subprovider));\n }\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n // For azure, the API key is passed via AZURE_OPENAI_API_KEY env var in\n // buildEnv(). The --api-key flag would set the wrong provider's key.\n if (this.config.apiKey && this.config.subprovider?.toLowerCase() !== 'azure') {\n args.push('--api-key', this.config.apiKey);\n }\n\n args.push('--mode', 'json');\n args.push('--print');\n args.push('--no-session');\n\n if (this.config.tools) {\n args.push('--tools', this.config.tools);\n }\n if (this.config.thinking) {\n args.push('--thinking', this.config.thinking);\n }\n if (this.config.args && this.config.args.length > 0) {\n args.push(...this.config.args);\n }\n\n if (inputFiles && inputFiles.length > 0) {\n for (const file of inputFiles) {\n args.push(`@${file}`);\n }\n }\n\n const systemPrompt = this.config.systemPrompt;\n const fullPrompt = systemPrompt ? `${systemPrompt}\\n\\n${prompt}` : prompt;\n const escapedPrompt = escapeAtSymbols(fullPrompt);\n args.push(escapedPrompt);\n\n return args;\n }\n\n private async executePi(\n args: readonly string[],\n cwd: string,\n signal: AbortSignal | undefined,\n logger: PiStreamLogger | undefined,\n ): Promise<PiRunResult> {\n try {\n return await this.runPi({\n executable: this.config.executable,\n args,\n cwd,\n timeoutMs: this.config.timeoutMs,\n env: this.buildEnv(),\n signal,\n onStdoutChunk: logger ? (chunk) => logger.handleStdoutChunk(chunk) : undefined,\n onStderrChunk: logger ? (chunk) => logger.handleStderrChunk(chunk) : undefined,\n });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n throw new Error(\n `Pi CLI executable '${this.config.executable}' was not found. Update the target executable or add it to PATH.`,\n );\n }\n throw error;\n }\n }\n\n private buildEnv(): NodeJS.ProcessEnv {\n const env = { ...process.env };\n\n const provider = this.config.subprovider?.toLowerCase() ?? 'google';\n\n if (provider === 'azure') {\n // Pi CLI uses azure-openai-responses with AZURE_OPENAI_RESOURCE_NAME.\n // Extract the resource name from base_url (or use it as-is if already a name).\n if (this.config.apiKey) {\n env.AZURE_OPENAI_API_KEY = this.config.apiKey;\n }\n if (this.config.baseUrl) {\n env.AZURE_OPENAI_RESOURCE_NAME = extractAzureResourceName(this.config.baseUrl);\n }\n } else {\n if (this.config.apiKey) {\n const envKey = resolveEnvKeyName(provider);\n if (envKey) {\n env[envKey] = this.config.apiKey;\n }\n }\n }\n\n // When a subprovider is explicitly configured, remove ambient env vars from\n // other providers that pi-cli auto-detects (e.g., AZURE_OPENAI_* vars override\n // --provider flags). This ensures the configured subprovider is actually used.\n //\n // To add a new provider: add an entry to PROVIDER_OWN_PREFIXES with the env\n // var prefixes that provider uses. All other providers' vars are stripped\n // automatically when that provider is selected.\n if (this.config.subprovider) {\n const resolvedProvider = resolveCliProvider(this.config.subprovider);\n const PROVIDER_OWN_PREFIXES: Record<string, readonly string[]> = {\n openrouter: ['OPENROUTER_'],\n anthropic: ['ANTHROPIC_'],\n openai: ['OPENAI_'],\n 'azure-openai-responses': ['AZURE_OPENAI_'],\n google: ['GEMINI_', 'GOOGLE_GENERATIVE_AI_'],\n gemini: ['GEMINI_', 'GOOGLE_GENERATIVE_AI_'],\n groq: ['GROQ_'],\n xai: ['XAI_'],\n };\n const ownPrefixes = PROVIDER_OWN_PREFIXES[resolvedProvider] ?? [];\n const allOtherPrefixes = Object.entries(PROVIDER_OWN_PREFIXES)\n .filter(([key]) => key !== provider)\n .flatMap(([, prefixes]) => prefixes);\n for (const key of Object.keys(env)) {\n if (\n allOtherPrefixes.some((prefix) => key.startsWith(prefix)) &&\n !ownPrefixes.some((prefix) => key.startsWith(prefix))\n ) {\n delete env[key];\n }\n }\n }\n\n return env;\n }\n\n private async createWorkspace(): Promise<string> {\n return await mkdtemp(path.join(tmpdir(), WORKSPACE_PREFIX));\n }\n\n private async cleanupWorkspace(workspaceRoot: string): Promise<void> {\n try {\n await rm(workspaceRoot, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n\n private resolveLogDirectory(): string | undefined {\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'pi-cli');\n }\n\n private async createStreamLogger(request: ProviderRequest): Promise<PiStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Pi stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\n\n try {\n const logger = await PiStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n });\n recordPiLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Pi stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\nclass PiStreamLogger {\n readonly filePath: string;\n private readonly stream: WriteStream;\n private readonly startedAt = Date.now();\n private stdoutBuffer = '';\n private stderrBuffer = '';\n private readonly format: 'summary' | 'json';\n\n private constructor(filePath: string, format: 'summary' | 'json') {\n this.filePath = filePath;\n this.format = format;\n this.stream = createWriteStream(filePath, { flags: 'a' });\n }\n\n static async create(options: {\n readonly filePath: string;\n readonly targetName: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly format: 'summary' | 'json';\n }): Promise<PiStreamLogger> {\n const logger = new PiStreamLogger(options.filePath, options.format);\n const header = [\n '# Pi CLI stream log',\n `# target: ${options.targetName}`,\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\n `# started: ${new Date().toISOString()}`,\n '',\n ].filter((line): line is string => Boolean(line));\n logger.writeLines(header);\n return logger;\n }\n\n handleStdoutChunk(chunk: string): void {\n this.stdoutBuffer += chunk;\n this.flushBuffer('stdout');\n }\n\n handleStderrChunk(chunk: string): void {\n this.stderrBuffer += chunk;\n this.flushBuffer('stderr');\n }\n\n async close(): Promise<void> {\n this.flushBuffer('stdout');\n this.flushBuffer('stderr');\n this.flushRemainder();\n await new Promise<void>((resolve, reject) => {\n this.stream.once('error', reject);\n this.stream.end(() => resolve());\n });\n }\n\n private writeLines(lines: readonly string[]): void {\n for (const line of lines) {\n this.stream.write(`${line}\\n`);\n }\n }\n\n private flushBuffer(source: 'stdout' | 'stderr'): void {\n const buffer = source === 'stdout' ? this.stdoutBuffer : this.stderrBuffer;\n const lines = buffer.split(/\\r?\\n/);\n const remainder = lines.pop() ?? '';\n if (source === 'stdout') {\n this.stdoutBuffer = remainder;\n } else {\n this.stderrBuffer = remainder;\n }\n for (const line of lines) {\n const formatted = this.formatLine(line, source);\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n }\n\n private formatLine(rawLine: string, source: 'stdout' | 'stderr'): string | undefined {\n const trimmed = rawLine.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n const message =\n this.format === 'json' ? formatPiJsonLog(trimmed) : formatPiLogMessage(trimmed, source);\n return `[+${formatElapsed(this.startedAt)}] [${source}] ${message}`;\n }\n\n private flushRemainder(): void {\n const stdoutRemainder = this.stdoutBuffer.trim();\n if (stdoutRemainder.length > 0) {\n const formatted = this.formatLine(stdoutRemainder, 'stdout');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n const stderrRemainder = this.stderrBuffer.trim();\n if (stderrRemainder.length > 0) {\n const formatted = this.formatLine(stderrRemainder, 'stderr');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n this.stdoutBuffer = '';\n this.stderrBuffer = '';\n }\n}\n\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const evalId = sanitizeForFilename(request.evalCaseId ?? 'pi');\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : '';\n const target = sanitizeForFilename(targetName);\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\n}\n\nfunction sanitizeForFilename(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : 'pi';\n}\n\nfunction formatElapsed(startedAt: number): string {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\n const hours = Math.floor(elapsedSeconds / 3600);\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\n const seconds = elapsedSeconds % 60;\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\nfunction formatPiLogMessage(rawLine: string, source: 'stdout' | 'stderr'): string {\n const parsed = tryParseJsonValue(rawLine);\n if (parsed) {\n const summary = summarizePiEvent(parsed);\n if (summary) {\n return summary;\n }\n }\n if (source === 'stderr') {\n return `stderr: ${rawLine}`;\n }\n return rawLine;\n}\n\nfunction formatPiJsonLog(rawLine: string): string {\n const parsed = tryParseJsonValue(rawLine);\n if (!parsed) {\n return rawLine;\n }\n try {\n return JSON.stringify(parsed, null, 2);\n } catch {\n return rawLine;\n }\n}\n\nfunction summarizePiEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n\n if (!type) {\n return undefined;\n }\n\n switch (type) {\n case 'agent_start':\n return 'agent_start';\n case 'agent_end':\n return 'agent_end';\n case 'turn_start':\n return 'turn_start';\n case 'turn_end':\n return 'turn_end';\n case 'message_start':\n case 'message_end': {\n const message = record.message as Record<string, unknown> | undefined;\n const role = message?.role;\n return `${type}: ${role}`;\n }\n case 'message_update': {\n const evt = record.assistantMessageEvent as Record<string, unknown> | undefined;\n const eventType = evt?.type;\n if (eventType === 'text_delta') {\n const delta = evt?.delta;\n if (typeof delta === 'string') {\n const preview = delta.length > 50 ? `${delta.slice(0, 50)}...` : delta;\n return `text_delta: ${preview}`;\n }\n }\n return `message_update: ${eventType}`;\n }\n case 'tool_execution_start':\n return `tool_start: ${record.toolName}`;\n case 'tool_execution_end':\n return `tool_end: ${record.toolName}`;\n default:\n return type;\n }\n}\n\nfunction tryParseJsonValue(rawLine: string): unknown | undefined {\n try {\n return JSON.parse(rawLine);\n } catch {\n return undefined;\n }\n}\n\nfunction parsePiJsonl(output: string): unknown[] {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n throw new Error('Pi CLI produced no output');\n }\n\n const lines = trimmed\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n const parsed: unknown[] = [];\n for (const line of lines) {\n try {\n parsed.push(JSON.parse(line));\n } catch {\n // Skip non-JSON lines\n }\n }\n\n if (parsed.length === 0) {\n throw new Error('Pi CLI produced no valid JSON output');\n }\n\n return parsed;\n}\n\nfunction extractMessages(events: unknown[]): readonly Message[] {\n let messages: Message[] | undefined;\n\n for (let i = events.length - 1; i >= 0; i--) {\n const event = events[i];\n if (!event || typeof event !== 'object') continue;\n const record = event as Record<string, unknown>;\n if (record.type !== 'agent_end') continue;\n\n const msgs = record.messages;\n if (!Array.isArray(msgs)) continue;\n\n messages = msgs.map(convertPiMessage).filter((m): m is Message => m !== undefined);\n break;\n }\n\n if (!messages) {\n messages = [];\n for (const event of events) {\n if (!event || typeof event !== 'object') continue;\n const record = event as Record<string, unknown>;\n if (record.type === 'turn_end') {\n const converted = convertPiMessage(record.message);\n if (converted) messages.push(converted);\n }\n }\n }\n\n // Some providers (e.g. azure-openai-responses) emit text content only in\n // message_update events, leaving the agent_end assistant message with empty\n // content. Fall back to the last message_end with non-empty content.\n if (messages) {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === 'assistant' && !messages[i].content) {\n // Try to find content from the last message_end event\n for (let j = events.length - 1; j >= 0; j--) {\n const evt = events[j] as Record<string, unknown> | null;\n if (!evt || evt.type !== 'message_end') continue;\n const msg = evt.message as Record<string, unknown> | undefined;\n if (msg?.role !== 'assistant') continue;\n const text = extractPiTextContent(msg.content);\n if (text) {\n messages[i] = { ...messages[i], content: text };\n break;\n }\n }\n break;\n }\n }\n }\n\n // Pi CLI may emit tool_execution_start/tool_execution_end events whose tool\n // calls are absent from the final agent_end messages. Reconstruct them and\n // inject into the last assistant message so evaluators (e.g. skill-trigger)\n // can detect them.\n const eventToolCalls = extractToolCallsFromEvents(events);\n if (eventToolCalls.length > 0) {\n injectEventToolCalls(messages, eventToolCalls);\n }\n\n return messages;\n}\n\n/**\n * Scan JSONL events for tool_execution_start / tool_execution_end pairs and\n * reconstruct ToolCall objects from them.\n */\nfunction extractToolCallsFromEvents(events: unknown[]): ToolCall[] {\n const starts = new Map<string, { tool: string; input: unknown }>();\n const results = new Map<string, unknown>();\n\n for (const event of events) {\n if (!event || typeof event !== 'object') continue;\n const r = event as Record<string, unknown>;\n const type = r.type;\n if (type === 'tool_execution_start' && typeof r.toolName === 'string') {\n const id = typeof r.toolCallId === 'string' ? r.toolCallId : undefined;\n starts.set(id ?? `anon-${starts.size}`, { tool: r.toolName, input: r.args });\n } else if (type === 'tool_execution_end') {\n const id = typeof r.toolCallId === 'string' ? r.toolCallId : undefined;\n if (id) results.set(id, r.result);\n }\n }\n\n const toolCalls: ToolCall[] = [];\n for (const [id, { tool, input }] of starts) {\n toolCalls.push(\n normalizeToolCall('pi-cli', {\n tool,\n input: input as Record<string, unknown> | undefined,\n id: id.startsWith('anon-') ? undefined : id,\n output: results.get(id),\n }),\n );\n }\n return toolCalls;\n}\n\n/**\n * Merge event-sourced tool calls into messages. For each tool call, if it\n * already exists (by id) in some message, skip it. Otherwise, append it to\n * the last assistant message (creating one if needed).\n */\nfunction injectEventToolCalls(messages: Message[], eventToolCalls: ToolCall[]): void {\n const existingIds = new Set<string>();\n const existingTools = new Set<string>();\n for (const msg of messages) {\n if (!msg.toolCalls) continue;\n for (const tc of msg.toolCalls) {\n if (tc.id) existingIds.add(tc.id);\n // Track tool+input combos to avoid duplicates when there's no id\n existingTools.add(`${tc.tool}:${JSON.stringify(tc.input)}`);\n }\n }\n\n const missing = eventToolCalls.filter((tc) => {\n if (tc.id && existingIds.has(tc.id)) return false;\n if (existingTools.has(`${tc.tool}:${JSON.stringify(tc.input)}`)) return false;\n return true;\n });\n\n if (missing.length === 0) return;\n\n // Find the last assistant message and replace it with an enriched copy\n let targetIdx = -1;\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === 'assistant') {\n targetIdx = i;\n break;\n }\n }\n\n if (targetIdx >= 0) {\n const target = messages[targetIdx];\n messages[targetIdx] = { ...target, toolCalls: [...(target.toolCalls ?? []), ...missing] };\n } else {\n // No assistant message — create a synthetic one\n messages.push({ role: 'assistant', content: '', toolCalls: missing });\n }\n}\n\nfunction extractTokenUsage(events: unknown[]): ProviderTokenUsage | undefined {\n for (let i = events.length - 1; i >= 0; i--) {\n const event = events[i];\n if (!event || typeof event !== 'object') continue;\n const record = event as Record<string, unknown>;\n if (record.type !== 'agent_end') continue;\n\n const usage = record.usage;\n if (usage && typeof usage === 'object') {\n const u = usage as Record<string, unknown>;\n const input = toFiniteNumber(u.input_tokens ?? u.inputTokens ?? u.input);\n const output = toFiniteNumber(u.output_tokens ?? u.outputTokens ?? u.output);\n if (input !== undefined || output !== undefined) {\n const result: ProviderTokenUsage = { input: input ?? 0, output: output ?? 0 };\n const cached = toFiniteNumber(u.cache_read_input_tokens ?? u.cached ?? u.cachedTokens);\n const reasoning = toFiniteNumber(u.reasoning_tokens ?? u.reasoningTokens ?? u.reasoning);\n return {\n ...result,\n ...(cached !== undefined ? { cached } : {}),\n ...(reasoning !== undefined ? { reasoning } : {}),\n };\n }\n }\n\n const messages = record.messages;\n if (Array.isArray(messages)) {\n return aggregateUsageFromMessages(messages);\n }\n }\n\n return undefined;\n}\n\nfunction aggregateUsageFromMessages(messages: unknown[]): ProviderTokenUsage | undefined {\n let totalInput = 0;\n let totalOutput = 0;\n let totalCached: number | undefined;\n let found = false;\n\n for (const msg of messages) {\n if (!msg || typeof msg !== 'object') continue;\n const m = msg as Record<string, unknown>;\n const usage = m.usage;\n if (!usage || typeof usage !== 'object') continue;\n\n const u = usage as Record<string, unknown>;\n const input = toFiniteNumber(u.input_tokens ?? u.inputTokens ?? u.input);\n const output = toFiniteNumber(u.output_tokens ?? u.outputTokens ?? u.output);\n\n if (input !== undefined || output !== undefined) {\n found = true;\n totalInput += input ?? 0;\n totalOutput += output ?? 0;\n const cached = toFiniteNumber(u.cache_read_input_tokens ?? u.cached ?? u.cachedTokens);\n if (cached !== undefined) {\n totalCached = (totalCached ?? 0) + cached;\n }\n }\n }\n\n if (!found) return undefined;\n\n const result: ProviderTokenUsage = { input: totalInput, output: totalOutput };\n if (totalCached !== undefined) {\n return { ...result, cached: totalCached };\n }\n return result;\n}\n\nfunction convertPiMessage(message: unknown): Message | undefined {\n if (!message || typeof message !== 'object') return undefined;\n\n const msg = message as Record<string, unknown>;\n const role = msg.role;\n if (typeof role !== 'string') return undefined;\n\n const content = extractPiTextContent(msg.content);\n const toolCalls = extractToolCalls(msg.content);\n\n const startTime =\n typeof msg.timestamp === 'number'\n ? new Date(msg.timestamp).toISOString()\n : typeof msg.timestamp === 'string'\n ? msg.timestamp\n : undefined;\n\n const metadata: Record<string, unknown> = {};\n if (msg.api) metadata.api = msg.api;\n if (msg.provider) metadata.provider = msg.provider;\n if (msg.model) metadata.model = msg.model;\n if (msg.usage) metadata.usage = msg.usage;\n if (msg.stopReason) metadata.stopReason = msg.stopReason;\n\n return {\n role,\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n startTime,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n };\n}\n\nfunction extractToolCalls(content: unknown): readonly ToolCall[] {\n if (!Array.isArray(content)) return [];\n\n const toolCalls: ToolCall[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') continue;\n const p = part as Record<string, unknown>;\n if (p.type === 'tool_use' && typeof p.name === 'string') {\n toolCalls.push(\n normalizeToolCall('pi-cli', {\n tool: p.name,\n input: p.input,\n id: typeof p.id === 'string' ? p.id : undefined,\n }),\n );\n } else if ((p.type === 'toolCall' || p.type === 'tool_call') && typeof p.name === 'string') {\n toolCalls.push(\n normalizeToolCall('pi-cli', {\n tool: p.name,\n input: p.arguments ?? p.input,\n id: typeof p.id === 'string' ? p.id : undefined,\n }),\n );\n } else if (p.type === 'tool_result' && typeof p.tool_use_id === 'string') {\n const existing = toolCalls.find((tc) => tc.id === p.tool_use_id);\n if (existing) {\n const idx = toolCalls.indexOf(existing);\n toolCalls[idx] = { ...existing, output: p.content };\n }\n }\n }\n\n return toolCalls;\n}\n\nfunction escapeAtSymbols(prompt: string): string {\n return prompt.replace(/@\\[([^\\]]+)\\]:/g, '[[$1]]:');\n}\n\nfunction pickDetail(stderr: string, stdout: string): string | undefined {\n const errorText = stderr.trim();\n if (errorText.length > 0) return errorText;\n const stdoutText = stdout.trim();\n return stdoutText.length > 0 ? stdoutText : undefined;\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) return '';\n return ` after ${Math.ceil(timeoutMs / 1000)}s`;\n}\n\n/**\n * On Windows, npm/bun global installs create `.cmd` and `.sh` wrappers.\n * Bun's spawn can't capture stdout from sh-script wrappers (the forked\n * node process writes to a different stdout). Resolve to the underlying\n * node script so we can spawn `node script.js` directly.\n */\nfunction resolveWindowsCmd(executable: string): [string, string[]] {\n if (process.platform !== 'win32') return [executable, []];\n\n // If already pointing at node/bun or a .js file, no resolution needed\n const lower = executable.toLowerCase();\n if (lower.endsWith('.js') || lower.endsWith('.exe')) return [executable, []];\n\n // Find the executable's full path using `where`\n let fullPath: string;\n try {\n fullPath = execSync(`where ${executable}`, { encoding: 'utf-8' })\n .trim()\n .split(/\\r?\\n/)[0]\n .trim();\n } catch {\n return [executable, []];\n }\n\n // Try .cmd wrapper first (has the script path embedded)\n const cmdPath = fullPath.endsWith('.cmd') ? fullPath : `${fullPath}.cmd`;\n try {\n const content = readFileSync(cmdPath, 'utf-8');\n // npm .cmd wrappers end with: \"%_prog%\" \"%dp0%\\path\\to\\script.js\" %*\n const match = content.match(/\"?%_prog%\"?\\s+\"([^\"]+\\.js)\"/);\n if (match) {\n const dp0 = path.dirname(path.resolve(cmdPath));\n const scriptPath = match[1].replace(/%dp0%[/\\\\]?/gi, `${dp0}${path.sep}`);\n try {\n accessSync(scriptPath);\n return ['node', [scriptPath]];\n } catch {\n // Script not found at resolved path, fall through\n }\n }\n } catch {\n // No .cmd wrapper, fall through\n }\n\n return [executable, []];\n}\n\nasync function defaultPiRunner(options: PiRunOptions): Promise<PiRunResult> {\n return await new Promise<PiRunResult>((resolve, reject) => {\n const parts = options.executable.split(/\\s+/);\n const [resolvedExe, prefixArgs] = resolveWindowsCmd(parts[0]);\n const executableArgs = [...prefixArgs, ...parts.slice(1)];\n const allArgs = [...executableArgs, ...options.args];\n\n const child = spawn(resolvedExe, allArgs, {\n cwd: options.cwd,\n env: options.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n trackChild(child);\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const onAbort = (): void => {\n child.kill('SIGTERM');\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeoutMs);\n timeoutHandle.unref?.();\n }\n\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk) => {\n stdout += chunk;\n options.onStdoutChunk?.(chunk);\n });\n\n child.stderr.setEncoding('utf8');\n child.stderr.on('data', (chunk) => {\n stderr += chunk;\n options.onStderrChunk?.(chunk);\n });\n\n child.stdin.end();\n\n const cleanup = (): void => {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n if (options.signal) options.signal.removeEventListener('abort', onAbort);\n };\n\n child.on('error', (error) => {\n cleanup();\n reject(error);\n });\n\n child.on('close', (code) => {\n cleanup();\n resolve({\n stdout,\n stderr,\n exitCode: typeof code === 'number' ? code : -1,\n timedOut,\n });\n });\n });\n}\n\n/** @internal Exported for testing only. */\nexport const _internal = {\n extractMessages,\n extractToolCallsFromEvents,\n parsePiJsonl,\n};\n","export type PiLogEntry = {\n readonly filePath: string;\n readonly evalCaseId?: string;\n readonly targetName: string;\n readonly attempt?: number;\n};\n\nconst GLOBAL_LOGS_KEY = Symbol.for('agentv.piLogs');\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for('agentv.piLogSubscribers');\n\ntype PiLogListener = (entry: PiLogEntry) => void;\n\ntype GlobalWithPiLogs = typeof globalThis & {\n [GLOBAL_LOGS_KEY]?: PiLogEntry[];\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<PiLogListener>;\n};\n\nfunction getPiLogStore(): PiLogEntry[] {\n const globalObject = globalThis as GlobalWithPiLogs;\n const existing = globalObject[GLOBAL_LOGS_KEY];\n if (existing) {\n return existing;\n }\n const created: PiLogEntry[] = [];\n globalObject[GLOBAL_LOGS_KEY] = created;\n return created;\n}\n\nfunction getSubscriberStore(): Set<PiLogListener> {\n const globalObject = globalThis as GlobalWithPiLogs;\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\n if (existing) {\n return existing;\n }\n const created = new Set<PiLogListener>();\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\n return created;\n}\n\nfunction notifySubscribers(entry: PiLogEntry): void {\n const subscribers = Array.from(getSubscriberStore());\n for (const listener of subscribers) {\n try {\n listener(entry);\n } catch (error) {\n // Avoid surfacing subscriber errors to providers; log for visibility.\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Pi log subscriber failed: ${message}`);\n }\n }\n}\n\nexport function recordPiLogEntry(entry: PiLogEntry): void {\n getPiLogStore().push(entry);\n notifySubscribers(entry);\n}\n\nexport function consumePiLogEntries(): PiLogEntry[] {\n const store = getPiLogStore();\n if (store.length === 0) {\n return [];\n }\n return store.splice(0, store.length);\n}\n\nexport function subscribeToPiLogEntries(listener: PiLogListener): () => void {\n const store = getSubscriberStore();\n store.add(listener);\n return () => {\n store.delete(listener);\n };\n}\n","/**\n * Shared alias map for pi-ai subprovider names.\n *\n * Target configs use `subprovider: azure` for Azure OpenAI. The behavior\n * differs between the SDK and CLI:\n *\n * **pi-coding-agent SDK:** When a `base_url` is provided (Azure v1 endpoints\n * like .services.ai.azure.com/…/openai/v1), uses the standard OpenAI client\n * (openai-responses) since v1 endpoints don't accept api-version params.\n * Without base_url, uses the native azure-openai-responses provider.\n *\n * **pi CLI:** Always uses azure-openai-responses with AZURE_OPENAI_RESOURCE_NAME.\n * The CLI's azure provider builds the correct URL internally.\n */\n\n/** Short alias → pi-ai SDK provider name (when no base_url override). */\nconst SUBPROVIDER_ALIASES: Record<string, string> = {\n azure: 'azure-openai-responses',\n};\n\n/** Short alias → pi-ai SDK provider name (when base_url is set). */\nconst SUBPROVIDER_ALIASES_WITH_BASE_URL: Record<string, string> = {\n // Azure v1 endpoints are OpenAI-compatible; use the standard client\n // to avoid AzureOpenAI adding api-version query params.\n azure: 'openai-responses',\n};\n\n/** Short alias → environment variable for API key. */\nexport const ENV_KEY_MAP: Record<string, string> = {\n google: 'GEMINI_API_KEY',\n gemini: 'GEMINI_API_KEY',\n anthropic: 'ANTHROPIC_API_KEY',\n openai: 'OPENAI_API_KEY',\n groq: 'GROQ_API_KEY',\n xai: 'XAI_API_KEY',\n openrouter: 'OPENROUTER_API_KEY',\n azure: 'AZURE_OPENAI_API_KEY',\n};\n\n/** Short alias → environment variable for base URL / endpoint. */\nexport const ENV_BASE_URL_MAP: Record<string, string> = {\n openai: 'OPENAI_BASE_URL',\n azure: 'AZURE_OPENAI_BASE_URL',\n openrouter: 'OPENROUTER_BASE_URL',\n};\n\n/**\n * Resolve a subprovider config value to the SDK's canonical name.\n * When `hasBaseUrl` is true and the provider is \"azure\", uses the standard\n * OpenAI client (openai-responses) instead of AzureOpenAI to avoid\n * api-version conflicts with /v1 endpoints.\n */\nexport function resolveSubprovider(name: string, hasBaseUrl = false): string {\n const lower = name.toLowerCase();\n if (hasBaseUrl) {\n const alias = SUBPROVIDER_ALIASES_WITH_BASE_URL[lower];\n if (alias) return alias;\n }\n return SUBPROVIDER_ALIASES[lower] ?? name;\n}\n\n/**\n * Resolve a subprovider config value for the pi CLI --provider flag.\n * For azure, always uses azure-openai-responses — the CLI handles URL\n * construction via AZURE_OPENAI_RESOURCE_NAME.\n */\nexport function resolveCliProvider(name: string): string {\n const lower = name.toLowerCase();\n if (lower === 'azure') return 'azure-openai-responses';\n return name;\n}\n\n/**\n * Resolve the environment variable name for the API key.\n * When azure + base_url (SDK path), the key goes to OPENAI_API_KEY.\n * For CLI path, always AZURE_OPENAI_API_KEY.\n */\nexport function resolveEnvKeyName(provider: string, hasBaseUrl = false): string | undefined {\n const lower = provider.toLowerCase();\n if (hasBaseUrl && lower === 'azure') return 'OPENAI_API_KEY';\n return ENV_KEY_MAP[lower];\n}\n\n/**\n * Resolve the environment variable name for the base URL.\n * When azure + base_url (SDK path), goes to OPENAI_BASE_URL.\n * For CLI path, goes to AZURE_OPENAI_RESOURCE_NAME.\n */\nexport function resolveEnvBaseUrlName(provider: string, hasBaseUrl = false): string | undefined {\n const lower = provider.toLowerCase();\n if (hasBaseUrl && lower === 'azure') return 'OPENAI_BASE_URL';\n return ENV_BASE_URL_MAP[lower];\n}\n\n/**\n * For pi-cli azure, extract resource name from base_url and set\n * AZURE_OPENAI_RESOURCE_NAME. The pi CLI builds the full URL internally.\n */\nexport function extractAzureResourceName(baseUrl: string): string {\n // Handle full URL: https://resource.openai.azure.com/... or https://resource.services.ai.azure.com/...\n const urlMatch = baseUrl.match(/^https?:\\/\\/([^./]+)/);\n if (urlMatch) return urlMatch[1];\n // Already a resource name\n return baseUrl;\n}\n\n/**\n * For pi-coding-agent SDK azure, normalize either a bare resource name or an\n * Azure endpoint URL into the OpenAI-compatible v1 base URL expected by the\n * SDK's openai-responses path.\n */\nexport function normalizeAzureSdkBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim().replace(/\\/+$/, '');\n if (!trimmed) {\n return trimmed;\n }\n if (!/^https?:\\/\\//i.test(trimmed)) {\n return `https://${trimmed}.openai.azure.com/openai/v1`;\n }\n if (/\\/openai\\/v1$/i.test(trimmed)) {\n return trimmed;\n }\n if (/\\/openai$/i.test(trimmed)) {\n return `${trimmed}/v1`;\n }\n return `${trimmed}/openai/v1`;\n}\n","/**\n * Shared utilities for the pi-coding-agent provider.\n *\n * Provides helpers for extracting text content from Pi's message format\n * and safe numeric conversions.\n */\n\nimport type { Content } from '../content.js';\n\n/**\n * Extract text content from Pi's content array format.\n * Pi uses: content: [{ type: \"text\", text: \"...\" }, ...]\n */\nexport function extractPiTextContent(content: unknown): string | undefined {\n if (typeof content === 'string') {\n return content;\n }\n\n if (!Array.isArray(content)) {\n return undefined;\n }\n\n const textParts: string[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === 'text' && typeof p.text === 'string') {\n textParts.push(p.text);\n }\n }\n\n return textParts.length > 0 ? textParts.join('\\n') : undefined;\n}\n\n/**\n * Convert Pi's content array to `Content[]`, preserving non-text blocks.\n *\n * Returns `undefined` when content is a plain string or contains only text\n * blocks — callers should fall back to the text-only string representation.\n */\nexport function toPiContentArray(content: unknown): Content[] | undefined {\n if (!Array.isArray(content)) return undefined;\n\n let hasNonText = false;\n const blocks: Content[] = [];\n\n for (const part of content) {\n if (!part || typeof part !== 'object') continue;\n const p = part as Record<string, unknown>;\n\n if (p.type === 'text' && typeof p.text === 'string') {\n blocks.push({ type: 'text', text: p.text });\n } else if (p.type === 'image') {\n const mediaType =\n typeof p.media_type === 'string' ? p.media_type : 'application/octet-stream';\n\n let source = '';\n if (typeof p.source === 'object' && p.source !== null) {\n const src = p.source as Record<string, unknown>;\n const srcMediaType = typeof src.media_type === 'string' ? src.media_type : mediaType;\n source = typeof src.data === 'string' ? `data:${srcMediaType};base64,${src.data}` : '';\n }\n if (!source && typeof p.url === 'string') {\n source = p.url;\n }\n\n if (source) {\n blocks.push({ type: 'image', media_type: mediaType, source });\n hasNonText = true;\n }\n } else if (p.type === 'tool_use' || p.type === 'tool_result') {\n // Handled separately — skip\n }\n }\n\n return hasNonText && blocks.length > 0 ? blocks : undefined;\n}\n\n/**\n * Safely convert an unknown value to a finite number, or undefined.\n */\nexport function toFiniteNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n return undefined;\n}\n","/**\n * Pi Coding Agent provider using the @earendil-works/pi-coding-agent SDK directly.\n *\n * Uses `createAgentSession` from the SDK instead of spawning the Pi CLI as a subprocess.\n * Events are consumed via `session.subscribe()` to extract messages, tool calls, and token usage.\n *\n * Dependencies are lazy-loaded on first use to avoid bundling issues.\n * The package `@earendil-works/pi-coding-agent` must be installed.\n */\n\nimport { execSync } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { accessSync, createWriteStream, mkdirSync } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\nimport { createInterface } from 'node:readline';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nimport { getAgentvHome } from '../../paths.js';\nimport { recordPiLogEntry } from './pi-log-tracker.js';\nimport {\n normalizeAzureSdkBaseUrl,\n resolveEnvBaseUrlName,\n resolveEnvKeyName,\n resolveSubprovider,\n} from './pi-provider-aliases.js';\nimport { extractPiTextContent, toFiniteNumber, toPiContentArray } from './pi-utils.js';\nimport { normalizeInputFiles } from './preread.js';\nimport type { PiCodingAgentResolvedConfig } from './targets.js';\nimport type {\n Message,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ProviderTokenUsage,\n ToolCall,\n} from './types.js';\n\n// Lazy-loaded SDK modules — guarded by a shared promise so concurrent workers\n// all wait on a single load attempt (and at most one interactive prompt).\nlet piCodingAgentModule: typeof import('@earendil-works/pi-coding-agent') | null = null;\nlet piAiModule: typeof import('@earendil-works/pi-ai') | null = null;\nlet loadingPromise: Promise<void> | null = null;\n\nasync function promptInstall(): Promise<boolean> {\n if (!process.stdout.isTTY) return false;\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n return await new Promise<boolean>((resolve) => {\n rl.question(\n '@earendil-works/pi-coding-agent is not installed. Install it now? (y/N) ',\n (answer) => resolve(answer.trim().toLowerCase() === 'y'),\n );\n });\n } finally {\n rl.close();\n }\n}\n\n/** Resolve agentv's own package root (where npm install should add peer deps). */\nfunction findAgentvRoot(): string {\n const thisFile = fileURLToPath(import.meta.url);\n let dir = path.dirname(thisFile);\n // Walk up until we find a package.json (covers both src and dist layouts)\n for (let i = 0; i < 10; i++) {\n try {\n const pkg = path.join(dir, 'package.json');\n // existsSync-free check: if readFileSync throws, keep walking\n accessSync(pkg);\n return dir;\n } catch {\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n }\n // Fallback: current file's directory\n return path.dirname(thisFile);\n}\n\nfunction findManagedSdkInstallRoot(): string {\n return path.join(getAgentvHome(), 'deps', 'pi-sdk');\n}\n\nfunction resolveGlobalNpmRoot(): string | undefined {\n try {\n const root = execSync('npm root -g', {\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n }).trim();\n return root.length > 0 ? root : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction buildGlobalModuleEntry(moduleName: string, globalNpmRoot: string): string {\n return path.join(globalNpmRoot, ...moduleName.split('/'), 'dist', 'index.js');\n}\n\nfunction findAccessiblePath(paths: readonly string[]): string | undefined {\n for (const candidate of paths) {\n try {\n accessSync(candidate);\n return candidate;\n } catch {}\n }\n return undefined;\n}\n\nasync function tryImportLocalSdkModules(): Promise<boolean> {\n try {\n [piCodingAgentModule, piAiModule] = await Promise.all([\n import('@earendil-works/pi-coding-agent'),\n import('@earendil-works/pi-ai'),\n ]);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function tryImportManagedSdkModules(): Promise<boolean> {\n const managedRoot = findManagedSdkInstallRoot();\n const piCodingAgentEntry = findAccessiblePath([\n path.join(\n managedRoot,\n 'node_modules',\n '@earendil-works',\n 'pi-coding-agent',\n 'dist',\n 'index.js',\n ),\n ]);\n const piAiEntry = findAccessiblePath([\n path.join(managedRoot, 'node_modules', '@earendil-works', 'pi-ai', 'dist', 'index.js'),\n path.join(\n managedRoot,\n 'node_modules',\n '@earendil-works',\n 'pi-coding-agent',\n 'node_modules',\n '@earendil-works',\n 'pi-ai',\n 'dist',\n 'index.js',\n ),\n ]);\n\n if (!piCodingAgentEntry || !piAiEntry) return false;\n\n try {\n [piCodingAgentModule, piAiModule] = await Promise.all([\n import(pathToFileURL(piCodingAgentEntry).href),\n import(pathToFileURL(piAiEntry).href),\n ]);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function tryImportGlobalSdkModules(): Promise<boolean> {\n const globalNpmRoot = resolveGlobalNpmRoot();\n if (!globalNpmRoot) return false;\n\n const piCodingAgentEntry = findAccessiblePath([\n buildGlobalModuleEntry('@earendil-works/pi-coding-agent', globalNpmRoot),\n ]);\n const piAiEntry = findAccessiblePath([\n buildGlobalModuleEntry('@earendil-works/pi-ai', globalNpmRoot),\n path.join(\n globalNpmRoot,\n '@earendil-works',\n 'pi-coding-agent',\n 'node_modules',\n '@earendil-works',\n 'pi-ai',\n 'dist',\n 'index.js',\n ),\n ]);\n\n if (!piCodingAgentEntry || !piAiEntry) return false;\n\n try {\n [piCodingAgentModule, piAiModule] = await Promise.all([\n import(pathToFileURL(piCodingAgentEntry).href),\n import(pathToFileURL(piAiEntry).href),\n ]);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction installSdkModules(installDir: string): void {\n console.error(`Installing @earendil-works/pi-coding-agent into ${installDir} via npm...`);\n mkdirSync(installDir, { recursive: true });\n execSync('npm install --no-save --no-package-lock @earendil-works/pi-coding-agent', {\n cwd: installDir,\n stdio: 'inherit',\n });\n}\n\nasync function doLoadSdkModules(): Promise<void> {\n if (\n (await tryImportLocalSdkModules()) ||\n (await tryImportManagedSdkModules()) ||\n (await tryImportGlobalSdkModules())\n ) {\n return;\n }\n\n if (await promptInstall()) {\n const installDir = findManagedSdkInstallRoot();\n installSdkModules(installDir);\n if (await tryImportManagedSdkModules()) {\n return;\n }\n }\n\n throw new Error(\n 'pi-coding-agent SDK is not installed. Install it with:\\n npm install @earendil-works/pi-coding-agent',\n );\n}\n\nasync function loadSdkModules() {\n if (!piCodingAgentModule || !piAiModule) {\n if (!loadingPromise) {\n loadingPromise = doLoadSdkModules().catch((err) => {\n loadingPromise = null;\n throw err;\n });\n }\n await loadingPromise;\n }\n // After doLoadSdkModules resolves, both modules are guaranteed non-null.\n const piSdk = piCodingAgentModule as NonNullable<typeof piCodingAgentModule>;\n const piAi = piAiModule as NonNullable<typeof piAiModule>;\n const toolMap: Record<string, unknown> = {\n read: piSdk.readTool,\n bash: piSdk.bashTool,\n edit: piSdk.editTool,\n write: piSdk.writeTool,\n grep: piSdk.grepTool,\n find: piSdk.findTool,\n ls: piSdk.lsTool,\n };\n return {\n createAgentSession: piSdk.createAgentSession,\n codingTools: piSdk.codingTools,\n toolMap,\n SessionManager: piSdk.SessionManager,\n getModel: piAi.getModel,\n // biome-ignore lint/suspicious/noExplicitAny: registerBuiltInApiProviders exists at runtime but not in type defs\n registerBuiltInApiProviders: (piAi as any).registerBuiltInApiProviders as () => void,\n };\n}\n\n/** Tracks in-flight tool executions for timing. */\ninterface ToolExecTracker {\n readonly toolCallId: string;\n readonly toolName: string;\n readonly args: unknown;\n readonly startMs: number;\n readonly startTime: string;\n}\n\nexport class PiCodingAgentProvider implements Provider {\n readonly id: string;\n readonly kind = 'pi-coding-agent' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: PiCodingAgentResolvedConfig;\n\n constructor(targetName: string, config: PiCodingAgentResolvedConfig) {\n this.id = `pi-coding-agent:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Pi coding agent request was aborted before execution');\n }\n\n const inputFiles = normalizeInputFiles(request.inputFiles);\n\n const startTime = new Date().toISOString();\n const startMs = Date.now();\n\n const sdk = await loadSdkModules();\n // Ensure pi-ai API providers (openai, azure, etc.) are registered for getModel/streaming.\n sdk.registerBuiltInApiProviders();\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n\n try {\n const cwd = this.resolveCwd(request.cwd);\n const rawProvider = this.config.subprovider ?? 'google';\n const normalizedBaseUrl = this.normalizeSdkBaseUrl(rawProvider, this.config.baseUrl);\n const hasBaseUrl = !!normalizedBaseUrl;\n const providerName = resolveSubprovider(rawProvider, hasBaseUrl);\n const modelId = this.config.model ?? 'gemini-2.5-flash';\n\n // Set provider-specific env vars so the SDK can find them\n this.setApiKeyEnv(rawProvider, hasBaseUrl);\n this.setBaseUrlEnv(rawProvider, normalizedBaseUrl, hasBaseUrl);\n\n // Build model using pi-ai's getModel (requires type assertion for runtime strings).\n // biome-ignore lint/suspicious/noExplicitAny: runtime string config requires any cast\n let model = (sdk.getModel as any)(providerName, modelId);\n if (model && normalizedBaseUrl) {\n model = { ...model, baseUrl: normalizedBaseUrl };\n }\n if (!model) {\n // Model not in the pi-ai registry — construct a minimal model descriptor.\n // This is common for Azure deployments whose names don't match standard model IDs.\n // The `provider` field must match pi-ai's getEnvApiKey map (e.g. \"openai\", not\n // \"openai-responses\") so the SDK can find the API key from env vars.\n const envProvider = providerName.replace(/-responses$/, '');\n model = {\n id: modelId,\n name: modelId,\n api: providerName,\n provider: envProvider,\n baseUrl: normalizedBaseUrl ?? '',\n reasoning: false,\n input: ['text'],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: 128000,\n maxTokens: 16384,\n };\n }\n\n // Select tools based on config\n const tools = this.resolveTools(sdk);\n\n // Create agent session using the SDK\n const { session } = await sdk.createAgentSession({\n cwd,\n model,\n tools,\n thinkingLevel: this.config.thinking as\n | 'off'\n | 'minimal'\n | 'low'\n | 'medium'\n | 'high'\n | 'xhigh'\n | undefined,\n sessionManager: sdk.SessionManager.inMemory(cwd),\n });\n\n // Track token usage, cost, and tool timing from events\n let tokenUsage: ProviderTokenUsage | undefined;\n let costUsd: number | undefined;\n const toolTrackers = new Map<string, ToolExecTracker>();\n const completedToolResults = new Map<string, { output: unknown; durationMs: number }>();\n\n const unsubscribe = session.subscribe((event) => {\n // Log events for stream logging\n logger?.handleEvent(event);\n\n switch (event.type) {\n case 'message_end': {\n const msg = event.message;\n if (\n msg &&\n typeof msg === 'object' &&\n 'role' in msg &&\n msg.role === 'assistant' &&\n 'usage' in msg\n ) {\n const usage = (msg as unknown as Record<string, unknown>).usage;\n if (usage && typeof usage === 'object') {\n const u = usage as Record<string, unknown>;\n const input = toFiniteNumber(u.input);\n const output = toFiniteNumber(u.output);\n const cached = toFiniteNumber(u.cacheRead);\n\n let callDelta: ProviderTokenUsage | undefined;\n if (input !== undefined || output !== undefined) {\n callDelta = {\n input: input ?? 0,\n output: output ?? 0,\n ...(cached !== undefined ? { cached } : {}),\n };\n tokenUsage = {\n input: (tokenUsage?.input ?? 0) + callDelta.input,\n output: (tokenUsage?.output ?? 0) + callDelta.output,\n ...(cached !== undefined\n ? { cached: (tokenUsage?.cached ?? 0) + cached }\n : tokenUsage?.cached !== undefined\n ? { cached: tokenUsage.cached }\n : {}),\n };\n }\n\n // Extract cost from usage.cost object\n const cost = (u as Record<string, unknown>).cost;\n if (cost && typeof cost === 'object') {\n const total = toFiniteNumber((cost as Record<string, unknown>).total);\n if (total !== undefined) {\n costUsd = (costUsd ?? 0) + total;\n }\n }\n\n // Emit per-call delta for OTel spans\n request.streamCallbacks?.onLlmCallEnd?.(modelId, callDelta);\n }\n }\n break;\n }\n\n case 'tool_execution_start': {\n toolTrackers.set(event.toolCallId, {\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: event.args,\n startMs: Date.now(),\n startTime: new Date().toISOString(),\n });\n request.streamCallbacks?.onToolCallStart?.(event.toolName, event.toolCallId);\n break;\n }\n\n case 'tool_execution_end': {\n const tracker = toolTrackers.get(event.toolCallId);\n const durationMs = tracker ? Date.now() - tracker.startMs : 0;\n completedToolResults.set(event.toolCallId, {\n output: event.result,\n durationMs,\n });\n request.streamCallbacks?.onToolCallEnd?.(\n event.toolName,\n tracker?.args,\n event.result,\n durationMs,\n event.toolCallId,\n );\n toolTrackers.delete(event.toolCallId);\n break;\n }\n }\n });\n\n try {\n // Build prompt with optional system prompt and input files\n const systemPrompt = this.config.systemPrompt;\n let prompt = request.question;\n if (systemPrompt) {\n prompt = `${systemPrompt}\\n\\n${prompt}`;\n }\n if (inputFiles && inputFiles.length > 0) {\n const fileList = inputFiles.map((f) => `@${f}`).join('\\n');\n prompt = `${prompt}\\n\\nFiles:\\n${fileList}`;\n }\n\n // Run with timeout\n if (this.config.timeoutMs) {\n const timeoutMs = this.config.timeoutMs;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(\n () =>\n reject(\n new Error(`Pi coding agent timed out after ${Math.ceil(timeoutMs / 1000)}s`),\n ),\n timeoutMs,\n );\n });\n try {\n await Promise.race([session.prompt(prompt), timeoutPromise]);\n } finally {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n }\n } else {\n await session.prompt(prompt);\n }\n\n // Extract messages from agent state\n const agentMessages = session.agent.state.messages;\n\n // Detect SDK errors: check if the last assistant message ended with stopReason \"error\".\n // Without this, the provider silently returns empty/echoed content as a quality failure\n // instead of reporting the actual execution error.\n const lastAssistant = [...agentMessages]\n .reverse()\n .find(\n (m): m is Record<string, unknown> =>\n !!m && typeof m === 'object' && (m as Record<string, unknown>).role === 'assistant',\n ) as Record<string, unknown> | undefined;\n if (lastAssistant?.stopReason === 'error') {\n const errorMsg =\n typeof lastAssistant.errorMessage === 'string'\n ? lastAssistant.errorMessage\n : 'unknown SDK error';\n throw new Error(\n `pi-coding-agent SDK error (provider: ${lastAssistant.provider ?? providerName}, model: ${lastAssistant.model ?? modelId}): ${errorMsg}`,\n );\n }\n\n const output: Message[] = [];\n for (const msg of agentMessages) {\n output.push(convertAgentMessage(msg, toolTrackers, completedToolResults));\n }\n\n const endTime = new Date().toISOString();\n const durationMs = Date.now() - startMs;\n\n return {\n raw: {\n messages: agentMessages,\n model: this.config.model,\n provider: this.config.subprovider,\n },\n output,\n tokenUsage,\n costUsd,\n durationMs,\n startTime,\n endTime,\n };\n } finally {\n unsubscribe();\n session.dispose();\n }\n } finally {\n await logger?.close();\n }\n }\n\n /** Maps config apiKey to the provider-specific env var the SDK reads. */\n private setApiKeyEnv(providerName: string, hasBaseUrl = false): void {\n if (!this.config.apiKey) return;\n const envKey = resolveEnvKeyName(providerName, hasBaseUrl);\n if (envKey) {\n process.env[envKey] = this.config.apiKey;\n }\n }\n\n /** Maps config baseUrl to the provider-specific env var the SDK reads. */\n private setBaseUrlEnv(\n providerName: string,\n baseUrl: string | undefined = this.config.baseUrl,\n hasBaseUrl = false,\n ): void {\n const normalizedBaseUrl = this.normalizeSdkBaseUrl(providerName, baseUrl);\n if (!normalizedBaseUrl) return;\n const envKey = resolveEnvBaseUrlName(providerName, hasBaseUrl);\n if (envKey) {\n process.env[envKey] = normalizedBaseUrl;\n }\n }\n\n private normalizeSdkBaseUrl(providerName: string, baseUrl?: string): string | undefined {\n if (!baseUrl) return undefined;\n if (providerName.toLowerCase() === 'azure') {\n return normalizeAzureSdkBaseUrl(baseUrl);\n }\n return baseUrl;\n }\n\n private resolveCwd(cwdOverride?: string): string {\n if (cwdOverride) {\n return path.resolve(cwdOverride);\n }\n if (this.config.cwd) {\n return path.resolve(this.config.cwd);\n }\n return process.cwd();\n }\n\n private resolveTools(sdk: Awaited<ReturnType<typeof loadSdkModules>>) {\n if (!this.config.tools) {\n return sdk.codingTools;\n }\n\n const toolNames = this.config.tools.split(',').map((t) => t.trim().toLowerCase());\n const selected = [];\n for (const name of toolNames) {\n if (name in sdk.toolMap) {\n selected.push(sdk.toolMap[name]);\n }\n }\n // biome-ignore lint/suspicious/noExplicitAny: tools are typed dynamically from SDK\n return selected.length > 0 ? (selected as any[]) : sdk.codingTools;\n }\n\n private resolveLogDirectory(): string | undefined {\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'pi-coding-agent');\n }\n\n private async createStreamLogger(request: ProviderRequest): Promise<PiStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Pi stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\n\n try {\n const logger = await PiStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n });\n recordPiLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Pi stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\nclass PiStreamLogger {\n readonly filePath: string;\n private readonly stream: WriteStream;\n private readonly startedAt = Date.now();\n private readonly format: 'summary' | 'json';\n\n private constructor(filePath: string, format: 'summary' | 'json') {\n this.filePath = filePath;\n this.format = format;\n this.stream = createWriteStream(filePath, { flags: 'a' });\n }\n\n static async create(options: {\n readonly filePath: string;\n readonly targetName: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly format: 'summary' | 'json';\n }): Promise<PiStreamLogger> {\n const logger = new PiStreamLogger(options.filePath, options.format);\n const header = [\n '# Pi Coding Agent stream log',\n `# target: ${options.targetName}`,\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\n `# started: ${new Date().toISOString()}`,\n '',\n ].filter((line): line is string => Boolean(line));\n for (const line of header) {\n logger.stream.write(`${line}\\n`);\n }\n return logger;\n }\n\n handleEvent(event: unknown): void {\n if (!event || typeof event !== 'object') return;\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n if (!type) return;\n\n const message =\n this.format === 'json' ? JSON.stringify(event, null, 2) : summarizeSdkEvent(event);\n if (message) {\n this.stream.write(`[+${formatElapsed(this.startedAt)}] ${message}\\n`);\n }\n }\n\n async close(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.stream.once('error', reject);\n this.stream.end(() => resolve());\n });\n }\n}\n\nfunction summarizeSdkEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') return undefined;\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n if (!type) return undefined;\n\n switch (type) {\n case 'agent_start':\n case 'agent_end':\n case 'turn_start':\n case 'turn_end':\n return type;\n case 'message_start':\n case 'message_end': {\n const msg = record.message as Record<string, unknown> | undefined;\n return `${type}: ${msg?.role ?? 'unknown'}`;\n }\n case 'tool_execution_start':\n return `tool_start: ${record.toolName}`;\n case 'tool_execution_end':\n return `tool_end: ${record.toolName}`;\n default:\n return type;\n }\n}\n\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const evalId = sanitizeForFilename(request.evalCaseId ?? 'pi');\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : '';\n const target = sanitizeForFilename(targetName);\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\n}\n\nfunction sanitizeForFilename(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : 'pi';\n}\n\nfunction formatElapsed(startedAt: number): string {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\n const hours = Math.floor(elapsedSeconds / 3600);\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\n const seconds = elapsedSeconds % 60;\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\n/**\n * Convert a pi-agent message to AgentV Message format.\n * Enriches with token usage, metadata, and tool call timing from event trackers.\n */\nfunction convertAgentMessage(\n message: unknown,\n toolTrackers: Map<string, ToolExecTracker>,\n completedToolResults: Map<string, { output: unknown; durationMs: number }>,\n): Message {\n if (!message || typeof message !== 'object') {\n return { role: 'unknown', content: String(message) };\n }\n\n const msg = message as Record<string, unknown>;\n const role = typeof msg.role === 'string' ? msg.role : 'unknown';\n const structuredContent = toPiContentArray(msg.content);\n const content = structuredContent ?? extractPiTextContent(msg.content);\n const toolCalls = extractToolCalls(msg.content, toolTrackers, completedToolResults);\n const startTimeVal =\n typeof msg.timestamp === 'number'\n ? new Date(msg.timestamp).toISOString()\n : typeof msg.timestamp === 'string'\n ? msg.timestamp\n : undefined;\n\n // Extract per-message token usage from AssistantMessage.usage\n let msgTokenUsage: ProviderTokenUsage | undefined;\n if (msg.usage && typeof msg.usage === 'object') {\n const u = msg.usage as Record<string, unknown>;\n const input = toFiniteNumber(u.input);\n const output = toFiniteNumber(u.output);\n if (input !== undefined || output !== undefined) {\n msgTokenUsage = {\n input: input ?? 0,\n output: output ?? 0,\n ...(toFiniteNumber(u.cacheRead) !== undefined\n ? { cached: toFiniteNumber(u.cacheRead) }\n : {}),\n };\n }\n }\n\n const metadata: Record<string, unknown> = {};\n if (msg.api) metadata.api = msg.api;\n if (msg.provider) metadata.provider = msg.provider;\n if (msg.model) metadata.model = msg.model;\n if (msg.stopReason) metadata.stopReason = msg.stopReason;\n\n return {\n role,\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n startTime: startTimeVal,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n tokenUsage: msgTokenUsage,\n };\n}\n\n/**\n * Extract tool calls from pi-agent content array format.\n * Enriches with output and timing from completed tool result trackers.\n */\nfunction extractToolCalls(\n content: unknown,\n toolTrackers: Map<string, ToolExecTracker>,\n completedToolResults: Map<string, { output: unknown; durationMs: number }>,\n): readonly ToolCall[] {\n if (!Array.isArray(content)) {\n return [];\n }\n\n const toolCalls: ToolCall[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === 'toolCall' && typeof p.name === 'string') {\n const id = typeof p.id === 'string' ? p.id : undefined;\n const tracker = id ? toolTrackers.get(id) : undefined;\n const completed = id ? completedToolResults.get(id) : undefined;\n toolCalls.push({\n tool: p.name,\n input: p.arguments,\n id,\n output: completed?.output,\n durationMs: completed?.durationMs,\n startTime: tracker?.startTime,\n endTime:\n tracker?.startTime && completed?.durationMs !== undefined\n ? new Date(new Date(tracker.startTime).getTime() + completed.durationMs).toISOString()\n : undefined,\n });\n }\n }\n\n return toolCalls;\n}\n\n/** @internal Exported for testing only. */\nexport const _internal = {\n buildGlobalModuleEntry,\n findAgentvRoot,\n findManagedSdkInstallRoot,\n resolveGlobalNpmRoot,\n};\n","/**\n * Extensible provider registry.\n *\n * Replaces the hardcoded switch/case dispatch in createProvider() with\n * a registry of named factory functions. Built-in providers are registered\n * at startup; users can add custom providers via the registry API or by\n * dropping files in `.agentv/providers/`.\n */\n\nimport type { ResolvedTarget } from './targets.js';\nimport type { Provider } from './types.js';\n\n/**\n * Factory function that creates a Provider instance from a resolved target.\n */\nexport type ProviderFactoryFn = (target: ResolvedTarget) => Provider;\n\n/**\n * Registry of provider factory functions keyed by provider kind.\n *\n * Built-in providers are registered at startup. Custom providers can be\n * registered via the `register()` method.\n */\nexport class ProviderRegistry {\n private readonly factories = new Map<string, ProviderFactoryFn>();\n\n /** Register a factory function for a provider kind. */\n register(kind: string, factory: ProviderFactoryFn): this {\n this.factories.set(kind, factory);\n return this;\n }\n\n /** Get the factory function for a provider kind. */\n get(kind: string): ProviderFactoryFn | undefined {\n return this.factories.get(kind);\n }\n\n /** Check if a factory is registered for the given kind. */\n has(kind: string): boolean {\n return this.factories.has(kind);\n }\n\n /** List all registered provider kind names. */\n list(): string[] {\n return [...this.factories.keys()];\n }\n\n /**\n * Create a provider instance from a resolved target.\n * Falls back to CLI provider for unknown kinds (custom provider escape hatch).\n */\n create(target: ResolvedTarget): Provider {\n const factory = this.factories.get(target.kind);\n if (!factory) {\n throw new Error(\n `Unknown provider kind: \"${target.kind}\". Registered kinds: ${this.list().join(', ')}`,\n );\n }\n return factory(target);\n }\n}\n","import { exec } from 'node:child_process';\nimport { constants, access } from 'node:fs/promises';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\nimport {\n dispatchAgentSession,\n dispatchBatchAgent,\n getSubagentRoot,\n provisionSubagents,\n} from './vscode/index.js';\n\nimport { readTextFile } from '../file-utils.js';\nimport type { VSCodeResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\nimport { AGENTV_BATCH_REQUEST_TEMPLATE, AGENTV_REQUEST_TEMPLATE } from './vscode-templates.js';\n\nconst execAsync = promisify(exec);\n\nexport class VSCodeProvider implements Provider {\n readonly id: string;\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly targetName: string;\n readonly supportsBatch = true;\n\n private readonly config: VSCodeResolvedConfig;\n private environmentCheck?: Promise<void>;\n\n constructor(\n targetName: string,\n config: VSCodeResolvedConfig,\n kind: 'vscode' | 'vscode-insiders',\n ) {\n this.id = `${kind}:${targetName}`;\n this.kind = kind;\n this.targetName = targetName;\n this.config = config;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('VS Code provider request was aborted before dispatch');\n }\n\n await this.ensureEnvironmentReady();\n\n const inputFiles = normalizeAttachments(request.inputFiles);\n const promptContent = buildPromptDocument(request, inputFiles);\n\n // Use workspace file resolved from eval-level workspace.template.\n const workspaceTemplate = request.workspaceFile;\n\n // Measure wall-clock time for duration\n const startTime = Date.now();\n const session = await dispatchAgentSession({\n userQuery: promptContent,\n extraAttachments: inputFiles,\n requestTemplate: AGENTV_REQUEST_TEMPLATE,\n wait: this.config.waitForResponse,\n dryRun: this.config.dryRun,\n vscodeCmd: this.config.executable,\n subagentRoot: this.config.subagentRoot,\n workspaceTemplate,\n cwd: request.cwd,\n silent: true,\n timeoutMs: this.config.timeoutMs,\n });\n const durationMs = Date.now() - startTime;\n\n if (session.exitCode !== 0 || !session.responseFile) {\n const failure = session.error ?? 'VS Code subagent did not produce a response';\n throw new Error(failure);\n }\n\n if (this.config.dryRun) {\n return {\n output: [{ role: 'assistant' as const, content: '{}' }],\n durationMs,\n tokenUsage: { input: 0, output: 0 },\n raw: {\n session,\n inputFiles,\n },\n };\n }\n\n const responseText = await readTextFile(session.responseFile);\n\n return {\n output: [{ role: 'assistant', content: responseText }],\n durationMs,\n raw: {\n session,\n inputFiles,\n },\n };\n }\n\n async invokeBatch(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]> {\n if (requests.length === 0) {\n return [];\n }\n\n await this.ensureEnvironmentReady();\n\n const normalizedRequests = requests.map((req) => ({\n request: req,\n inputFiles: normalizeAttachments(req.inputFiles),\n }));\n\n const combinedInputFiles = mergeAttachments(\n normalizedRequests.map(({ inputFiles }) => inputFiles),\n );\n const userQueries = normalizedRequests.map(({ request, inputFiles }) =>\n buildPromptDocument(request, inputFiles),\n );\n\n // Measure wall-clock time for batch duration\n const startTime = Date.now();\n const session = await dispatchBatchAgent({\n userQueries,\n extraAttachments: combinedInputFiles,\n requestTemplate: AGENTV_BATCH_REQUEST_TEMPLATE,\n wait: this.config.waitForResponse,\n dryRun: this.config.dryRun,\n vscodeCmd: this.config.executable,\n subagentRoot: this.config.subagentRoot,\n workspaceTemplate: undefined,\n silent: true,\n timeoutMs: this.config.timeoutMs,\n });\n const totalDurationMs = Date.now() - startTime;\n\n // Calculate per-request duration (total time / number of requests)\n const perRequestDurationMs = Math.round(totalDurationMs / requests.length);\n\n if (session.exitCode !== 0 || !session.responseFiles) {\n const failure = session.error ?? 'VS Code subagent did not produce batch responses';\n throw new Error(failure);\n }\n\n if (this.config.dryRun) {\n return normalizedRequests.map(({ inputFiles }) => ({\n output: [{ role: 'assistant' as const, content: '{}' }],\n durationMs: perRequestDurationMs,\n tokenUsage: { input: 0, output: 0 },\n raw: {\n session,\n inputFiles,\n allInputFiles: combinedInputFiles,\n },\n }));\n }\n\n if (session.responseFiles.length !== requests.length) {\n throw new Error(\n `VS Code batch returned ${session.responseFiles.length} responses for ${requests.length} requests`,\n );\n }\n\n const responses: ProviderResponse[] = [];\n for (const [index, responseFile] of session.responseFiles.entries()) {\n const responseText = await readTextFile(responseFile);\n responses.push({\n output: [{ role: 'assistant', content: responseText }],\n durationMs: perRequestDurationMs,\n raw: {\n session,\n inputFiles: normalizedRequests[index]?.inputFiles,\n allInputFiles: combinedInputFiles,\n responseFile,\n },\n });\n }\n\n return responses;\n }\n\n private async ensureEnvironmentReady(): Promise<void> {\n if (!this.environmentCheck) {\n this.environmentCheck = this.validateEnvironment();\n }\n await this.environmentCheck;\n }\n\n private async validateEnvironment(): Promise<void> {\n await locateVSCodeExecutable(this.config.executable);\n }\n}\n\nasync function locateVSCodeExecutable(candidate: string): Promise<string> {\n const includesPathSeparator = candidate.includes('/') || candidate.includes('\\\\');\n if (includesPathSeparator) {\n const resolved = path.isAbsolute(candidate) ? candidate : path.resolve(candidate);\n try {\n await access(resolved, constants.F_OK);\n return resolved;\n } catch {\n throw new Error(\n `VS Code executable not found at '${resolved}'. Check the 'executable' setting in your target configuration.`,\n );\n }\n }\n\n const locator = process.platform === 'win32' ? 'where' : 'which';\n try {\n const { stdout } = await execAsync(`${locator} ${candidate}`);\n const lines = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length > 0 && lines[0]) {\n await access(lines[0], constants.F_OK);\n return lines[0];\n }\n } catch {\n // ignore and fall back to error below\n }\n\n throw new Error(\n `VS Code executable '${candidate}' was not found on PATH. Check the 'executable' setting in your target configuration.`,\n );\n}\n\n// VS Code provider uses request.question (not chatPrompt) because VS Code handles\n// conversation structure via workspace attachments, making structured chat prompts redundant.\nfunction buildPromptDocument(\n request: ProviderRequest,\n attachments: readonly string[] | undefined,\n): string {\n const parts: string[] = [];\n\n // Agent providers incorporate systemPrompt into the question\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\n parts.push(request.systemPrompt.trim());\n }\n\n const attachmentFiles = collectAttachmentFiles(attachments);\n\n const prereadBlock = buildMandatoryPrereadBlock(attachmentFiles);\n if (prereadBlock.length > 0) {\n parts.push('\\n', prereadBlock);\n }\n\n parts.push('\\n[[ ## user_query ## ]]\\n', request.question.trim());\n\n return parts.join('\\n').trim();\n}\n\nfunction buildMandatoryPrereadBlock(attachmentFiles: readonly string[]): string {\n if (attachmentFiles.length === 0) {\n return '';\n }\n\n const buildList = (files: readonly string[]): string[] =>\n files.map((absolutePath) => {\n const fileName = path.basename(absolutePath);\n const fileUri = pathToFileUri(absolutePath);\n return `* [${fileName}](${fileUri})`;\n });\n\n const sections: string[] = [];\n\n if (attachmentFiles.length > 0) {\n sections.push(`Read all attachment files:\\n${buildList(attachmentFiles).join('\\n')}.`);\n }\n\n sections.push(\n 'If any file is missing, fail with ERROR: missing-file <filename> and stop.',\n 'Then apply system_instructions on the user query below.',\n );\n\n return sections.join('\\n');\n}\n\nfunction collectAttachmentFiles(attachments: readonly string[] | undefined): string[] {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n const unique = new Map<string, string>();\n for (const attachment of attachments) {\n const absolutePath = path.resolve(attachment);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n return Array.from(unique.values());\n}\n\nfunction pathToFileUri(filePath: string): string {\n // Convert to absolute path if relative\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n\n // On Windows, convert backslashes to forward slashes\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n\n // Handle Windows drive letters (e.g., C:/ becomes file:///C:/)\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n\n // Unix-like paths\n return `file://${normalizedPath}`;\n}\n\nfunction _composeUserQuery(request: ProviderRequest): string {\n return request.question.trim();\n}\n\nfunction normalizeAttachments(attachments: readonly string[] | undefined): string[] | undefined {\n if (!attachments || attachments.length === 0) {\n return undefined;\n }\n const deduped = new Set<string>();\n for (const attachment of attachments) {\n deduped.add(path.resolve(attachment));\n }\n return Array.from(deduped);\n}\n\nfunction mergeAttachments(all: readonly (readonly string[] | undefined)[]): string[] | undefined {\n const deduped = new Set<string>();\n for (const list of all) {\n if (!list) continue;\n for (const inputFile of list) {\n deduped.add(path.resolve(inputFile));\n }\n }\n return deduped.size > 0 ? Array.from(deduped) : undefined;\n}\n\nexport interface EnsureSubagentsOptions {\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly count: number;\n readonly verbose?: boolean;\n readonly vscodeCmd?: string;\n}\n\nexport interface EnsureSubagentsResult {\n readonly provisioned: boolean;\n readonly message?: string;\n}\n\n/**\n * Ensures the required number of VSCode subagents are provisioned using the subagent package.\n * This guarantees version compatibility by using the same subagent package version.\n *\n * @param options - Configuration for subagent provisioning\n * @returns Information about the provisioning result\n */\nexport async function ensureVSCodeSubagents(\n options: EnsureSubagentsOptions,\n): Promise<EnsureSubagentsResult> {\n const { kind, count, verbose = false, vscodeCmd: customCmd } = options;\n const vscodeCmd = customCmd ?? (kind === 'vscode-insiders' ? 'code-insiders' : 'code');\n const subagentRoot = getSubagentRoot(vscodeCmd);\n\n try {\n if (verbose) {\n console.log(`Provisioning ${count} subagent(s) via: subagent ${vscodeCmd} provision`);\n }\n\n const result = await provisionSubagents({\n targetRoot: subagentRoot,\n subagents: count,\n dryRun: false,\n });\n\n if (verbose) {\n if (result.created.length > 0) {\n console.log(`Created ${result.created.length} new subagent(s)`);\n }\n if (result.skippedExisting.length > 0) {\n console.log(`Reusing ${result.skippedExisting.length} existing unlocked subagent(s)`);\n }\n console.log(\n `\\ntotal unlocked subagents available: ${result.created.length + result.skippedExisting.length}`,\n );\n }\n\n return {\n provisioned: true,\n message: `Provisioned ${count} subagent(s): ${result.created.length} created, ${result.skippedExisting.length} reused`,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Don't fail if provisioning fails - agents might already exist\n if (verbose) {\n console.warn(`Provisioning failed (continuing anyway): ${errorMessage}`);\n }\n\n return {\n provisioned: false,\n message: `Provisioning failed: ${errorMessage}`,\n };\n }\n}\n","import { stat, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { pathExists } from '../utils/fs.js';\nimport { pathToFileUri } from '../utils/path.js';\nimport {\n createBatchOrchestratorPrompt,\n createBatchRequestPrompt,\n createRequestPrompt,\n loadDefaultBatchOrchestratorTemplate,\n loadDefaultBatchRequestTemplate,\n loadDefaultRequestTemplate,\n} from './promptBuilder.js';\nimport { waitForBatchResponses, waitForResponseOutput } from './responseWaiter.js';\nimport { launchVsCodeWithBatchChat, launchVsCodeWithChat } from './vscodeProcess.js';\nimport {\n findUnlockedSubagent,\n getSubagentRoot,\n prepareSubagentDirectory,\n removeSubagentLock,\n} from './workspaceManager.js';\n\nfunction generateTimestamp(): string {\n return new Date()\n .toISOString()\n .replace(/[-:TZ.]/g, '')\n .slice(0, 14);\n}\n\nasync function resolvePromptFile(promptFile: string | undefined): Promise<string | undefined> {\n if (!promptFile) {\n return undefined;\n }\n\n const resolvedPrompt = path.resolve(promptFile);\n if (!(await pathExists(resolvedPrompt))) {\n throw new Error(`Prompt file not found: ${resolvedPrompt}`);\n }\n\n const promptStats = await stat(resolvedPrompt);\n if (!promptStats.isFile()) {\n throw new Error(`Prompt file must be a file, not a directory: ${resolvedPrompt}`);\n }\n\n return resolvedPrompt;\n}\n\nasync function resolveAttachments(\n extraAttachments: readonly string[] | undefined,\n): Promise<string[]> {\n if (!extraAttachments) {\n return [];\n }\n\n const resolved: string[] = [];\n for (const attachment of extraAttachments) {\n const resolvedPath = path.resolve(attachment);\n if (!(await pathExists(resolvedPath))) {\n throw new Error(`Attachment not found: ${resolvedPath}`);\n }\n resolved.push(resolvedPath);\n }\n return resolved;\n}\n\nexport interface DispatchOptions {\n userQuery: string;\n promptFile?: string;\n requestTemplate?: string;\n extraAttachments?: readonly string[];\n workspaceTemplate?: string;\n cwd?: string;\n dryRun?: boolean;\n wait?: boolean;\n vscodeCmd?: string;\n subagentRoot?: string;\n silent?: boolean;\n timeoutMs?: number;\n}\n\nexport interface BatchDispatchOptions extends Omit<DispatchOptions, 'userQuery'> {\n userQueries: string[];\n}\n\nexport interface BatchDispatchResult {\n readonly exitCode: number;\n readonly subagentName?: string;\n readonly requestFiles: string[];\n readonly responseFiles?: string[];\n readonly queryCount: number;\n readonly error?: string;\n}\n\nexport interface DispatchSessionResult {\n readonly exitCode: number;\n readonly subagentName?: string;\n readonly responseFile?: string;\n readonly tempFile?: string;\n readonly error?: string;\n}\n\nexport async function dispatchAgentSession(\n options: DispatchOptions,\n): Promise<DispatchSessionResult> {\n const {\n userQuery,\n promptFile,\n requestTemplate,\n extraAttachments,\n workspaceTemplate,\n cwd,\n dryRun = false,\n wait = true,\n vscodeCmd = 'code',\n subagentRoot,\n silent = false,\n timeoutMs,\n } = options;\n\n try {\n let resolvedPrompt: string | undefined;\n try {\n resolvedPrompt = await resolvePromptFile(promptFile);\n } catch (error) {\n return {\n exitCode: 1,\n error: (error as Error).message,\n };\n }\n\n const templateContent = requestTemplate ?? loadDefaultRequestTemplate();\n\n const subagentRootPath = subagentRoot ?? getSubagentRoot(vscodeCmd);\n const subagentDir = await findUnlockedSubagent(subagentRootPath);\n if (!subagentDir) {\n return {\n exitCode: 1,\n error:\n 'No unlocked subagents available. Provision additional subagents with: subagent code provision --subagents <desired_total>',\n };\n }\n\n const subagentName = path.basename(subagentDir);\n const chatId = Math.random().toString(16).slice(2, 10);\n const preparationResult = await prepareSubagentDirectory(\n subagentDir,\n resolvedPrompt,\n chatId,\n workspaceTemplate,\n dryRun,\n cwd,\n );\n if (preparationResult !== 0) {\n return {\n exitCode: preparationResult,\n subagentName,\n error: 'Failed to prepare subagent workspace',\n };\n }\n\n let attachments: string[];\n try {\n attachments = await resolveAttachments(extraAttachments);\n } catch (attachmentError) {\n return {\n exitCode: 1,\n subagentName,\n error: (attachmentError as Error).message,\n };\n }\n\n const timestamp = generateTimestamp();\n const messagesDir = path.join(subagentDir, 'messages');\n const responseFileTmp = path.join(messagesDir, `${timestamp}_res.tmp.md`);\n const responseFileFinal = path.join(messagesDir, `${timestamp}_res.md`);\n\n const requestInstructions = createRequestPrompt(\n userQuery,\n responseFileTmp,\n responseFileFinal,\n templateContent,\n );\n\n if (dryRun) {\n return {\n exitCode: 0,\n subagentName,\n responseFile: responseFileFinal,\n tempFile: responseFileTmp,\n };\n }\n\n await launchVsCodeWithChat(\n subagentDir,\n chatId,\n attachments,\n requestInstructions,\n timestamp,\n vscodeCmd,\n );\n\n if (!wait) {\n return {\n exitCode: 0,\n subagentName,\n responseFile: responseFileFinal,\n tempFile: responseFileTmp,\n };\n }\n\n const received = await waitForResponseOutput(responseFileFinal, 1000, silent, timeoutMs);\n if (!received) {\n return {\n exitCode: 1,\n subagentName,\n responseFile: responseFileFinal,\n tempFile: responseFileTmp,\n error: 'Timed out waiting for agent response',\n };\n }\n\n await removeSubagentLock(subagentDir);\n\n return {\n exitCode: 0,\n subagentName,\n responseFile: responseFileFinal,\n tempFile: responseFileTmp,\n };\n } catch (error) {\n return {\n exitCode: 1,\n error: (error as Error).message,\n };\n }\n}\n\nexport async function dispatchBatchAgent(\n options: BatchDispatchOptions,\n): Promise<BatchDispatchResult> {\n const {\n userQueries,\n promptFile,\n requestTemplate,\n extraAttachments,\n workspaceTemplate,\n dryRun = false,\n wait = false,\n vscodeCmd = 'code',\n subagentRoot,\n silent = false,\n timeoutMs,\n } = options;\n\n if (!userQueries || userQueries.length === 0) {\n return {\n exitCode: 1,\n requestFiles: [],\n queryCount: 0,\n error: 'At least one query is required for batch dispatch',\n };\n }\n\n const queryCount = userQueries.length;\n let requestFiles: string[] = [];\n let responseFilesFinal: string[] = [];\n let subagentName: string | undefined;\n\n try {\n let resolvedPrompt: string | undefined;\n try {\n resolvedPrompt = await resolvePromptFile(promptFile);\n } catch (error) {\n return {\n exitCode: 1,\n requestFiles,\n queryCount,\n error: (error as Error).message,\n };\n }\n\n const batchRequestTemplateContent = requestTemplate ?? loadDefaultBatchRequestTemplate();\n\n const orchestratorTemplateContent = loadDefaultBatchOrchestratorTemplate();\n\n const subagentRootPath = subagentRoot ?? getSubagentRoot(vscodeCmd);\n const subagentDir = await findUnlockedSubagent(subagentRootPath);\n if (!subagentDir) {\n return {\n exitCode: 1,\n requestFiles,\n queryCount,\n error:\n 'No unlocked subagents available. Provision additional subagents with: subagent code provision --subagents <desired_total>',\n };\n }\n\n subagentName = path.basename(subagentDir);\n const chatId = Math.random().toString(16).slice(2, 10);\n const preparationResult = await prepareSubagentDirectory(\n subagentDir,\n resolvedPrompt,\n chatId,\n workspaceTemplate,\n dryRun,\n );\n if (preparationResult !== 0) {\n return {\n exitCode: preparationResult,\n subagentName,\n requestFiles,\n queryCount,\n error: 'Failed to prepare subagent workspace',\n };\n }\n\n let attachments: string[];\n try {\n attachments = await resolveAttachments(extraAttachments);\n } catch (attachmentError) {\n return {\n exitCode: 1,\n subagentName,\n requestFiles,\n queryCount,\n error: (attachmentError as Error).message,\n };\n }\n\n const timestamp = generateTimestamp();\n const messagesDir = path.join(subagentDir, 'messages');\n\n requestFiles = userQueries.map((_, index) =>\n path.join(messagesDir, `${timestamp}_${index}_req.md`),\n );\n const responseTmpFiles = userQueries.map((_, index) =>\n path.join(messagesDir, `${timestamp}_${index}_res.tmp.md`),\n );\n responseFilesFinal = userQueries.map((_, index) =>\n path.join(messagesDir, `${timestamp}_${index}_res.md`),\n );\n const orchestratorFile = path.join(messagesDir, `${timestamp}_orchestrator.md`);\n\n if (!dryRun) {\n await Promise.all(\n userQueries.map((query, index) => {\n const reqFile = requestFiles[index] as string;\n const tmpFile = responseTmpFiles[index] as string;\n const finalFile = responseFilesFinal[index] as string;\n return writeFile(\n reqFile,\n createBatchRequestPrompt(query, tmpFile, finalFile, batchRequestTemplateContent),\n { encoding: 'utf8' },\n );\n }),\n );\n\n const orchestratorContent = createBatchOrchestratorPrompt(\n requestFiles,\n responseFilesFinal,\n orchestratorTemplateContent,\n );\n await writeFile(orchestratorFile, orchestratorContent, { encoding: 'utf8' });\n }\n\n const chatAttachments = [orchestratorFile, ...attachments];\n const orchestratorUri = pathToFileUri(orchestratorFile);\n const chatInstruction = `Follow instructions in [${timestamp}_orchestrator.md](${orchestratorUri}). Use #runSubagent tool.`;\n\n if (dryRun) {\n return {\n exitCode: 0,\n subagentName,\n requestFiles,\n responseFiles: wait ? responseFilesFinal : undefined,\n queryCount,\n };\n }\n\n await launchVsCodeWithBatchChat(\n subagentDir,\n chatId,\n chatAttachments,\n chatInstruction,\n vscodeCmd,\n );\n\n if (!wait) {\n return {\n exitCode: 0,\n subagentName,\n requestFiles,\n queryCount,\n };\n }\n\n const responsesCompleted = await waitForBatchResponses(\n responseFilesFinal,\n 1000,\n silent,\n timeoutMs,\n );\n if (!responsesCompleted) {\n return {\n exitCode: 1,\n subagentName,\n requestFiles,\n responseFiles: responseFilesFinal,\n queryCount,\n error: 'Timed out waiting for batch responses',\n };\n }\n\n await removeSubagentLock(subagentDir);\n\n return {\n exitCode: 0,\n subagentName,\n requestFiles,\n responseFiles: responseFilesFinal,\n queryCount,\n };\n } catch (error) {\n return {\n exitCode: 1,\n subagentName,\n requestFiles,\n responseFiles: responseFilesFinal.length > 0 ? responseFilesFinal : undefined,\n queryCount,\n error: (error as Error).message,\n };\n }\n}\n\nexport { getSubagentRoot } from './workspaceManager.js';\n","import { constants } from 'node:fs';\nimport { access, mkdir, readdir, rm, stat } from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function pathExists(target: string): Promise<boolean> {\n try {\n await access(target, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(target: string): Promise<void> {\n await mkdir(target, { recursive: true });\n}\n\nexport interface DirectoryEntry {\n name: string;\n absolutePath: string;\n isDirectory: boolean;\n}\n\nexport async function readDirEntries(target: string): Promise<DirectoryEntry[]> {\n const entries = await readdir(target, { withFileTypes: true });\n return entries.map((entry) => ({\n name: entry.name,\n absolutePath: path.join(target, entry.name),\n isDirectory: entry.isDirectory(),\n }));\n}\n\nexport async function isDirectory(target: string): Promise<boolean> {\n try {\n const result = await stat(target);\n return result.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function removeIfExists(target: string): Promise<void> {\n try {\n await rm(target, { force: true, recursive: false });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n}\n","import path from 'node:path';\n\nexport function pathToFileUri(filePath: string): string {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n\n return `file://${normalizedPath}`;\n}\n","import path from 'node:path';\n\nimport { renderTemplate } from '../utils/template.js';\nimport {\n DEFAULT_BATCH_ORCHESTRATOR_TEMPLATE,\n DEFAULT_BATCH_REQUEST_TEMPLATE,\n DEFAULT_REQUEST_TEMPLATE,\n} from './templates.js';\n\nexport function loadDefaultRequestTemplate(): string {\n return DEFAULT_REQUEST_TEMPLATE;\n}\n\nexport function loadDefaultBatchRequestTemplate(): string {\n return DEFAULT_BATCH_REQUEST_TEMPLATE;\n}\n\nexport function loadDefaultBatchOrchestratorTemplate(): string {\n return DEFAULT_BATCH_ORCHESTRATOR_TEMPLATE;\n}\n\nexport function createRequestPrompt(\n userQuery: string,\n responseFileTmp: string,\n responseFileFinal: string,\n templateContent: string,\n): string {\n return renderTemplate(templateContent, {\n userQuery,\n responseFileTmp,\n responseFileFinal,\n });\n}\n\nexport function createBatchRequestPrompt(\n userQuery: string,\n responseFileTmp: string,\n responseFileFinal: string,\n templateContent: string,\n): string {\n return renderTemplate(templateContent, {\n userQuery,\n responseFileTmp,\n responseFileFinal,\n });\n}\n\nexport function createBatchOrchestratorPrompt(\n requestFiles: readonly string[],\n responseFiles: readonly string[],\n templateContent: string,\n): string {\n const requestLines = requestFiles\n .map((file, index) => `${index + 1}. messages/${path.basename(file)}`)\n .join('\\n');\n const responseList = responseFiles.map((file) => `\"${path.basename(file)}\"`).join(', ');\n\n return renderTemplate(templateContent, {\n requestFiles: requestLines,\n responseList,\n });\n}\n","export function renderTemplate(content: string, variables: Record<string, string>): string {\n if (!content) {\n return content;\n }\n\n const variableLookup = new Map<string, string>();\n for (const [key, value] of Object.entries(variables)) {\n variableLookup.set(key.toLowerCase(), value);\n }\n\n const referencedVariables = new Set<string>();\n\n const result = content.replace(/\\{\\{([a-zA-Z_]+)\\}\\}/gi, (match, variableName: string) => {\n const lowerCaseKey = variableName.toLowerCase();\n referencedVariables.add(lowerCaseKey);\n\n if (!variableLookup.has(lowerCaseKey)) {\n throw new Error(\n `Template variable '${variableName}' is not provided in the variables object`,\n );\n }\n\n return variableLookup.get(lowerCaseKey) as string;\n });\n\n return result;\n}\n","export const DEFAULT_REQUEST_TEMPLATE = `[[ ## task ## ]]\n\n{{userQuery}}\n\n[[ ## system_instructions ## ]]\n\n**IMPORTANT**: Follow these exact steps:\n1. Create and write your complete response to: {{responseFileTmp}}\n2. When completely finished, run these PowerShell commands to signal completion:\n\\`\\`\\`\nMove-Item -LiteralPath '{{responseFileTmp}}' -Destination '{{responseFileFinal}}'\nif (Test-Path subagent.lock) { del subagent.lock }\n\\`\\`\\`\n\nDo not proceed to step 2 until your response is completely written to the temporary file.\n`;\n\nexport const DEFAULT_BATCH_REQUEST_TEMPLATE = `[[ ## task ## ]]\n\n{{userQuery}}\n\n[[ ## system_instructions ## ]]\n\n**IMPORTANT**: Follow these exact steps:\n1. Create and write your complete response to: {{responseFileTmp}}\n2. When completely finished and the response is stable, rename it to: {{responseFileFinal}}\n3. Do not unlock the workspace from this request; batch orchestration will handle unlocking after all responses are ready.\n`;\n\nexport const DEFAULT_BATCH_ORCHESTRATOR_TEMPLATE = `MANDATORY: Run #runSubagent tool in your Available Actions for each request file to process them in isolated contexts.\nDO NOT read the request files yourself - only pass the file paths to each subagent:\n\n{{requestFiles}}\n\nAfter ALL queries complete, verify all responses exist and unlock:\n\n\\`\\`\\`powershell\n$responses = @({{responseList}})\n$missing = $responses | Where-Object { -not (Test-Path \"messages/$_\") }\nif ($missing.Count -eq 0) { del subagent.lock }\n\\`\\`\\`\n`;\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { pathExists } from '../utils/fs.js';\nimport { sleep } from '../utils/time.js';\n\nconst DEFAULT_TIMEOUT_MS = 600_000; // 10 minutes\n\nexport async function waitForResponseOutput(\n responseFileFinal: string,\n pollInterval = 1000,\n silent = false,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n): Promise<boolean> {\n if (!silent) {\n console.error(`waiting for agent to finish: ${responseFileFinal}`);\n }\n\n const deadline = Date.now() + timeoutMs;\n\n try {\n while (!(await pathExists(responseFileFinal))) {\n if (Date.now() >= deadline) {\n if (!silent) {\n console.error(\n `error: timed out after ${Math.round(timeoutMs / 1000)}s waiting for response: ${responseFileFinal}`,\n );\n }\n return false;\n }\n await sleep(pollInterval);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return false;\n }\n throw error;\n }\n\n let attempts = 0;\n const maxAttempts = 10;\n while (attempts < maxAttempts) {\n try {\n const content = await readFile(responseFileFinal, { encoding: 'utf8' });\n if (!silent) {\n process.stdout.write(`${content}\\n`);\n }\n return true;\n } catch (error) {\n attempts += 1;\n if ((error as NodeJS.ErrnoException).code !== 'EBUSY' || attempts >= maxAttempts) {\n if (!silent) {\n console.error(`error: failed to read agent response: ${(error as Error).message}`);\n }\n return false;\n }\n await sleep(pollInterval);\n }\n }\n\n return false;\n}\n\nexport async function waitForBatchResponses(\n responseFilesFinal: readonly string[],\n pollInterval = 1000,\n silent = false,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n): Promise<boolean> {\n if (!silent) {\n const fileList = responseFilesFinal.map((file) => path.basename(file)).join(', ');\n console.error(`waiting for ${responseFilesFinal.length} batch response(s): ${fileList}`);\n }\n\n const deadline = Date.now() + timeoutMs;\n\n try {\n const pending = new Set(responseFilesFinal);\n while (pending.size > 0) {\n if (Date.now() >= deadline) {\n if (!silent) {\n const remaining = [...pending].map((f) => path.basename(f)).join(', ');\n console.error(\n `error: timed out after ${Math.round(timeoutMs / 1000)}s waiting for batch responses. Still pending: ${remaining}`,\n );\n }\n return false;\n }\n\n for (const file of [...pending]) {\n if (await pathExists(file)) {\n pending.delete(file);\n }\n }\n\n if (pending.size > 0) {\n await sleep(pollInterval);\n }\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return false;\n }\n throw error;\n }\n\n for (const file of responseFilesFinal) {\n let attempts = 0;\n const maxAttempts = 10;\n while (attempts < maxAttempts) {\n try {\n const content = await readFile(file, { encoding: 'utf8' });\n if (!silent) {\n process.stdout.write(`${content}\\n`);\n }\n break;\n } catch (error) {\n attempts += 1;\n if ((error as NodeJS.ErrnoException).code !== 'EBUSY' || attempts >= maxAttempts) {\n if (!silent) {\n console.error(`error: failed to read agent response: ${(error as Error).message}`);\n }\n return false;\n }\n await sleep(pollInterval);\n }\n }\n }\n\n return true;\n}\n","export function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","import { type ChildProcess, exec, spawn } from 'node:child_process';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { trackChild } from '../../../../runtime/child-tracker.js';\nimport { pathExists, removeIfExists } from '../utils/fs.js';\nimport { pathToFileUri } from '../utils/path.js';\nimport { sleep } from '../utils/time.js';\nimport { DEFAULT_ALIVE_FILENAME } from './constants.js';\n\nconst execAsync = promisify(exec);\n\n/** Quote a command path for shell usage if it contains spaces. */\nfunction shellQuote(cmd: string): string {\n return cmd.includes(' ') ? `\"${cmd}\"` : cmd;\n}\n\nconst DEFAULT_WAKEUP_CONTENT = `---\ndescription: 'Wake-up Signal'\nmodel: Grok Code Fast 1 (copilot)\n---`;\n\n/**\n * Spawn VS Code with an `error` event listener so ENOENT / EACCES don't go unhandled.\n * Returns the ChildProcess for further use.\n */\nfunction spawnVsCode(\n vscodeCmd: string,\n args: string[],\n options?: { shell?: boolean; label?: string },\n): ChildProcess {\n const useShell = options?.shell ?? true;\n const command = useShell ? shellQuote(vscodeCmd) : vscodeCmd;\n const child = spawn(command, args, {\n windowsHide: true,\n shell: useShell,\n detached: false,\n });\n trackChild(child);\n child.on('error', (error) => {\n const label = options?.label ?? 'spawn';\n const renderedArgs = args.map((value) => JSON.stringify(value)).join(' ');\n console.error(\n `[vscode] ${label} failed: command=${JSON.stringify(vscodeCmd)} args=${renderedArgs} error=${error.message}`,\n );\n });\n return child;\n}\n\n/**\n * Wait briefly after spawning to detect immediate failures (ENOENT, EACCES).\n * Rejects if the process emits an `error` event within the grace period.\n */\nasync function raceSpawnError(child: ChildProcess, graceMs = 200): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const onError = (err: Error) => {\n if (!settled) {\n settled = true;\n reject(err);\n }\n };\n\n child.on('error', onError);\n\n setTimeout(() => {\n if (!settled) {\n settled = true;\n child.removeListener('error', onError);\n resolve();\n }\n }, graceMs);\n });\n}\n\nexport async function checkWorkspaceOpened(\n workspaceName: string,\n vscodeCmd: string,\n): Promise<boolean> {\n try {\n const { stdout } = await execAsync(`${shellQuote(vscodeCmd)} --status`, {\n timeout: 10_000,\n windowsHide: true,\n });\n return stdout.includes(workspaceName);\n } catch {\n return false;\n }\n}\n\nexport async function ensureWorkspaceFocused(\n workspacePath: string,\n workspaceName: string,\n subagentDir: string,\n vscodeCmd: string,\n pollInterval = 1,\n timeout = 60,\n): Promise<boolean> {\n const alreadyOpen = await checkWorkspaceOpened(workspaceName, vscodeCmd);\n\n if (alreadyOpen) {\n const child = spawnVsCode(vscodeCmd, [workspacePath], { label: 'focus-existing-workspace' });\n await raceSpawnError(child);\n return true;\n }\n\n const aliveFile = path.join(subagentDir, DEFAULT_ALIVE_FILENAME);\n await removeIfExists(aliveFile);\n\n const githubAgentsDir = path.join(subagentDir, '.github', 'agents');\n await mkdir(githubAgentsDir, { recursive: true });\n const wakeupDst = path.join(githubAgentsDir, 'wakeup.md');\n await writeFile(wakeupDst, DEFAULT_WAKEUP_CONTENT, 'utf8');\n\n const workspaceChild = spawnVsCode(vscodeCmd, [workspacePath], {\n label: 'open-workspace',\n });\n await raceSpawnError(workspaceChild);\n await sleep(100);\n\n const wakeupChatId = 'wakeup';\n const chatArgs = [\n '-r',\n 'chat',\n '-m',\n wakeupChatId,\n `create a file named .alive in the ${path.basename(subagentDir)} folder`,\n ];\n const wakeupChild = spawnVsCode(vscodeCmd, chatArgs, { label: 'send-wakeup-chat' });\n await raceSpawnError(wakeupChild);\n\n const start = Date.now();\n while (!(await pathExists(aliveFile))) {\n if (Date.now() - start > timeout * 1000) {\n console.error(`warning: Workspace readiness timeout after ${timeout}s`);\n return false;\n }\n await sleep(pollInterval * 1000);\n }\n\n return true;\n}\n\nexport async function launchVsCodeWithChat(\n subagentDir: string,\n chatId: string,\n attachmentPaths: string[],\n requestInstructions: string,\n timestamp: string,\n vscodeCmd: string,\n): Promise<void> {\n const workspacePath = path.join(subagentDir, `${path.basename(subagentDir)}.code-workspace`);\n const messagesDir = path.join(subagentDir, 'messages');\n await mkdir(messagesDir, { recursive: true });\n\n const reqFile = path.join(messagesDir, `${timestamp}_req.md`);\n await writeFile(reqFile, requestInstructions, { encoding: 'utf8' });\n\n const reqUri = pathToFileUri(reqFile);\n const chatArgs = ['-r', 'chat', '-m', chatId];\n for (const attachment of attachmentPaths) {\n chatArgs.push('-a', attachment);\n }\n chatArgs.push('-a', reqFile);\n chatArgs.push(`Follow instructions in [${path.basename(reqFile)}](${reqUri})`);\n\n const workspaceReady = await ensureWorkspaceFocused(\n workspacePath,\n path.basename(subagentDir),\n subagentDir,\n vscodeCmd,\n );\n if (!workspaceReady) {\n throw new Error(\n `VS Code workspace '${path.basename(subagentDir)}' failed to become ready within the timeout. Check that '${vscodeCmd}' can open workspaces.`,\n );\n }\n\n await sleep(500);\n const child = spawnVsCode(vscodeCmd, chatArgs, { label: 'send-chat' });\n await raceSpawnError(child);\n}\n\nexport async function launchVsCodeWithBatchChat(\n subagentDir: string,\n chatId: string,\n attachmentPaths: string[],\n chatInstruction: string,\n vscodeCmd: string,\n): Promise<void> {\n const workspacePath = path.join(subagentDir, `${path.basename(subagentDir)}.code-workspace`);\n const messagesDir = path.join(subagentDir, 'messages');\n await mkdir(messagesDir, { recursive: true });\n\n const chatArgs = ['-r', 'chat', '-m', chatId];\n for (const attachment of attachmentPaths) {\n chatArgs.push('-a', attachment);\n }\n chatArgs.push(chatInstruction);\n\n const workspaceReady = await ensureWorkspaceFocused(\n workspacePath,\n path.basename(subagentDir),\n subagentDir,\n vscodeCmd,\n );\n if (!workspaceReady) {\n throw new Error(\n `VS Code workspace '${path.basename(subagentDir)}' failed to become ready within the timeout. Check that '${vscodeCmd}' can open workspaces.`,\n );\n }\n\n await sleep(500);\n const child = spawnVsCode(vscodeCmd, chatArgs, { label: 'send-batch-chat' });\n await raceSpawnError(child);\n}\n","import path from 'node:path';\nimport { getSubagentsRoot } from '../../../../paths.js';\n\nexport const DEFAULT_LOCK_NAME = 'subagent.lock';\nexport const DEFAULT_ALIVE_FILENAME = '.alive';\n\nexport function getDefaultSubagentRoot(vscodeCmd = 'code'): string {\n const folder = vscodeCmd === 'code-insiders' ? 'vscode-insiders-agents' : 'vscode-agents';\n return path.join(getSubagentsRoot(), folder);\n}\n\nexport const DEFAULT_SUBAGENT_ROOT = getDefaultSubagentRoot();\n","import { copyFile, mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { pathExists, readDirEntries, removeIfExists } from '../utils/fs.js';\nimport { transformWorkspacePaths } from '../utils/workspace.js';\nimport { DEFAULT_LOCK_NAME, getDefaultSubagentRoot } from './constants.js';\n\nconst DEFAULT_WORKSPACE_TEMPLATE = {\n folders: [\n {\n path: '.',\n },\n ],\n};\n\nexport function getSubagentRoot(vscodeCmd = 'code'): string {\n return getDefaultSubagentRoot(vscodeCmd);\n}\n\nexport async function findUnlockedSubagent(subagentRoot: string): Promise<string | null> {\n if (!(await pathExists(subagentRoot))) {\n return null;\n }\n\n const entries = await readDirEntries(subagentRoot);\n const subagents = entries\n .filter((entry) => entry.isDirectory && entry.name.startsWith('subagent-'))\n .map((entry) => ({\n absolutePath: entry.absolutePath,\n number: Number.parseInt(entry.name.split('-')[1] ?? '', 10),\n }))\n .filter((entry) => Number.isInteger(entry.number))\n .sort((a, b) => a.number - b.number);\n\n for (const subagent of subagents) {\n const lockFile = path.join(subagent.absolutePath, DEFAULT_LOCK_NAME);\n if (!(await pathExists(lockFile))) {\n return subagent.absolutePath;\n }\n }\n\n return null;\n}\n\nexport async function copyAgentConfig(\n subagentDir: string,\n workspaceTemplate?: string,\n cwd?: string,\n): Promise<{ workspace: string; messagesDir: string }> {\n let workspaceContent: unknown;\n\n if (workspaceTemplate) {\n const workspaceSrc = path.resolve(workspaceTemplate);\n\n if (!(await pathExists(workspaceSrc))) {\n throw new Error(`workspace template not found: ${workspaceSrc}`);\n }\n\n const stats = await stat(workspaceSrc);\n if (!stats.isFile()) {\n throw new Error(`workspace template must be a file, not a directory: ${workspaceSrc}`);\n }\n\n const templateText = await readFile(workspaceSrc, 'utf8');\n workspaceContent = JSON.parse(templateText);\n } else {\n workspaceContent = DEFAULT_WORKSPACE_TEMPLATE;\n }\n\n const workspaceName = `${path.basename(subagentDir)}.code-workspace`;\n const workspaceDst = path.join(subagentDir, workspaceName);\n const templateDir = workspaceTemplate\n ? path.dirname(path.resolve(workspaceTemplate))\n : subagentDir;\n const workspaceJson = JSON.stringify(workspaceContent, null, 2);\n let transformedContent = transformWorkspacePaths(workspaceJson, templateDir);\n\n if (cwd) {\n const absCwd = path.resolve(cwd);\n const parsed = JSON.parse(transformedContent) as { folders: { path: string }[] };\n const alreadyPresent = parsed.folders.some((f) => f.path === absCwd);\n if (!alreadyPresent) {\n parsed.folders.push({ path: absCwd });\n transformedContent = JSON.stringify(parsed, null, 2);\n }\n }\n\n await writeFile(workspaceDst, transformedContent, 'utf8');\n\n const messagesDir = path.join(subagentDir, 'messages');\n await mkdir(messagesDir, { recursive: true });\n\n return { workspace: workspaceDst, messagesDir };\n}\n\nexport async function createSubagentLock(subagentDir: string): Promise<string> {\n const messagesDir = path.join(subagentDir, 'messages');\n if (await pathExists(messagesDir)) {\n const files = await readdir(messagesDir);\n await Promise.all(\n files.map(async (file) => {\n const target = path.join(messagesDir, file);\n await removeIfExists(target);\n }),\n );\n }\n\n const githubAgentsDir = path.join(subagentDir, '.github', 'agents');\n if (await pathExists(githubAgentsDir)) {\n const agentFiles = await readdir(githubAgentsDir);\n const preservedFiles = new Set(['wakeup.md', 'subagent.md']);\n await Promise.all(\n agentFiles\n .filter((file) => file.endsWith('.md') && !preservedFiles.has(file))\n .map((file) => removeIfExists(path.join(githubAgentsDir, file))),\n );\n }\n\n const lockFile = path.join(subagentDir, DEFAULT_LOCK_NAME);\n await writeFile(lockFile, '', { encoding: 'utf8' });\n return lockFile;\n}\n\nexport async function removeSubagentLock(subagentDir: string): Promise<void> {\n const lockFile = path.join(subagentDir, DEFAULT_LOCK_NAME);\n await removeIfExists(lockFile);\n}\n\nexport async function prepareSubagentDirectory(\n subagentDir: string,\n promptFile: string | undefined,\n chatId: string,\n workspaceTemplate: string | undefined,\n dryRun: boolean,\n cwd?: string,\n): Promise<number> {\n if (dryRun) {\n return 0;\n }\n\n try {\n await copyAgentConfig(subagentDir, workspaceTemplate, cwd);\n } catch (error) {\n console.error(`error: ${(error as Error).message}`);\n return 1;\n }\n\n try {\n await createSubagentLock(subagentDir);\n } catch (error) {\n console.error(`error: Failed to create subagent lock: ${(error as Error).message}`);\n return 1;\n }\n\n if (promptFile) {\n const githubAgentsDir = path.join(subagentDir, '.github', 'agents');\n await mkdir(githubAgentsDir, { recursive: true });\n const agentFile = path.join(githubAgentsDir, `${chatId}.md`);\n try {\n await copyFile(promptFile, agentFile);\n } catch (error) {\n console.error(`error: Failed to copy prompt file to agent mode: ${(error as Error).message}`);\n return 1;\n }\n }\n\n return 0;\n}\n","import path from 'node:path';\nimport JSON5 from 'json5';\n\nexport interface WorkspaceFolder {\n path: string;\n name?: string;\n}\n\nexport interface WorkspaceConfig {\n folders: WorkspaceFolder[];\n settings?: {\n 'chat.promptFilesLocations'?: Record<string, boolean>;\n 'chat.instructionsFilesLocations'?: Record<string, boolean>;\n 'chat.modeFilesLocations'?: Record<string, boolean>;\n [key: string]: unknown;\n };\n extensions?: {\n recommendations?: string[];\n };\n}\n\nexport function transformWorkspacePaths(workspaceContent: string, templateDir: string): string {\n let workspace: WorkspaceConfig;\n\n try {\n workspace = JSON5.parse(workspaceContent) as WorkspaceConfig;\n } catch (error) {\n throw new Error(`Invalid workspace JSON: ${(error as Error).message}`);\n }\n\n if (!workspace.folders) {\n throw new Error(\"Workspace file must contain a 'folders' array\");\n }\n\n if (!Array.isArray(workspace.folders)) {\n throw new Error(\"Workspace 'folders' must be an array\");\n }\n\n const transformedFolders = workspace.folders.map((folder) => {\n const folderPath = folder.path;\n\n if (path.isAbsolute(folderPath)) {\n return folder;\n }\n\n const absolutePath = path.resolve(templateDir, folderPath);\n\n return {\n ...folder,\n path: absolutePath,\n };\n });\n\n const updatedFolders = [{ path: '.' }, ...transformedFolders];\n\n let transformedSettings = workspace.settings;\n if (workspace.settings) {\n transformedSettings = {\n ...workspace.settings,\n };\n\n const chatSettingsKeys = [\n 'chat.promptFilesLocations',\n 'chat.instructionsFilesLocations',\n 'chat.modeFilesLocations',\n ] as const;\n\n for (const settingKey of chatSettingsKeys) {\n const locationMap = workspace.settings[settingKey] as Record<string, boolean> | undefined;\n if (locationMap && typeof locationMap === 'object') {\n const transformedMap: Record<string, boolean> = {};\n\n for (const [locationPath, value] of Object.entries(locationMap)) {\n const isAbsolute = path.isAbsolute(locationPath);\n\n if (isAbsolute) {\n transformedMap[locationPath] = value as boolean;\n } else {\n const firstGlobIndex = locationPath.search(/[*]/);\n\n if (firstGlobIndex === -1) {\n const resolvedPath = path.resolve(templateDir, locationPath).replace(/\\\\/g, '/');\n transformedMap[resolvedPath] = value as boolean;\n } else {\n const basePathEnd = locationPath.lastIndexOf('/', firstGlobIndex);\n const basePath = basePathEnd !== -1 ? locationPath.substring(0, basePathEnd) : '.';\n const patternPath = locationPath.substring(basePathEnd !== -1 ? basePathEnd : 0);\n\n const resolvedPath = (path.resolve(templateDir, basePath) + patternPath).replace(\n /\\\\/g,\n '/',\n );\n transformedMap[resolvedPath] = value as boolean;\n }\n }\n }\n\n transformedSettings[settingKey] = transformedMap;\n }\n }\n }\n\n const transformedWorkspace: WorkspaceConfig = {\n ...workspace,\n folders: updatedFolders,\n settings: transformedSettings,\n };\n\n return JSON.stringify(transformedWorkspace, null, 2);\n}\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { ensureDir, pathExists, readDirEntries, removeIfExists } from '../utils/fs.js';\nimport { DEFAULT_LOCK_NAME } from './constants.js';\n\nconst DEFAULT_WORKSPACE_TEMPLATE = {\n folders: [\n {\n path: '.',\n },\n ],\n settings: {\n 'chat.modeFilesLocations': {\n '.github/agents/**/*.md': true,\n },\n },\n};\n\nconst DEFAULT_WAKEUP_CONTENT = `---\ndescription: 'Wake-up Signal'\ntools: ['edit', 'runNotebooks', 'search', 'new', 'runCommands', 'runTasks', 'usages', 'vscodeAPI', 'problems', 'changes', 'testFailure', 'openSimpleBrowser', 'fetch', 'githubRepo']\nmodel: GPT-4.1 (copilot)\n---`;\n\nexport interface ProvisionOptions {\n targetRoot: string;\n subagents: number;\n lockName?: string;\n force?: boolean;\n dryRun?: boolean;\n workspaceTemplate?: Record<string, unknown>;\n wakeupContent?: string;\n}\n\nexport interface ProvisionResult {\n created: string[];\n skippedExisting: string[];\n skippedLocked: string[];\n}\n\nexport async function provisionSubagents(options: ProvisionOptions): Promise<ProvisionResult> {\n const {\n targetRoot,\n subagents,\n lockName = DEFAULT_LOCK_NAME,\n force = false,\n dryRun = false,\n workspaceTemplate = DEFAULT_WORKSPACE_TEMPLATE,\n wakeupContent = DEFAULT_WAKEUP_CONTENT,\n } = options;\n\n if (!Number.isInteger(subagents) || subagents < 1) {\n throw new Error('subagents must be a positive integer');\n }\n\n const targetPath = path.resolve(targetRoot);\n\n if (!dryRun) {\n await ensureDir(targetPath);\n }\n\n let highestNumber = 0;\n const lockedSubagents = new Set<string>();\n const existingSubagents: Array<{ number: number; absolutePath: string }> = [];\n\n if (await pathExists(targetPath)) {\n const entries = await readDirEntries(targetPath);\n for (const entry of entries) {\n if (!entry.isDirectory || !entry.name.startsWith('subagent-')) {\n continue;\n }\n\n const suffix = entry.name.split('-')[1];\n if (!suffix) continue;\n const parsed = Number.parseInt(suffix, 10);\n if (!Number.isInteger(parsed)) {\n continue;\n }\n\n highestNumber = Math.max(highestNumber, parsed);\n const lockFile = path.join(entry.absolutePath, lockName);\n const locked = await pathExists(lockFile);\n if (locked) {\n lockedSubagents.add(entry.absolutePath);\n }\n\n existingSubagents.push({ number: parsed, absolutePath: entry.absolutePath });\n }\n\n existingSubagents.sort((a, b) => a.number - b.number);\n }\n\n const created: string[] = [];\n const skippedExisting: string[] = [];\n\n let subagentsProvisioned = 0;\n\n for (const subagent of existingSubagents) {\n if (subagentsProvisioned >= subagents) {\n break;\n }\n\n const subagentDir = subagent.absolutePath;\n const githubAgentsDir = path.join(subagentDir, '.github', 'agents');\n const lockFile = path.join(subagentDir, lockName);\n const workspaceDst = path.join(subagentDir, `${path.basename(subagentDir)}.code-workspace`);\n const wakeupDst = path.join(githubAgentsDir, 'wakeup.md');\n\n const isLocked = await pathExists(lockFile);\n if (isLocked && !force) {\n continue;\n }\n\n if (isLocked && force) {\n if (!dryRun) {\n await removeIfExists(lockFile);\n await ensureDir(githubAgentsDir);\n await writeFile(workspaceDst, JSON.stringify(workspaceTemplate, null, 2), 'utf8');\n await writeFile(wakeupDst, wakeupContent, 'utf8');\n }\n created.push(subagentDir);\n lockedSubagents.delete(subagentDir);\n subagentsProvisioned += 1;\n continue;\n }\n\n if (!isLocked && force) {\n if (!dryRun) {\n await ensureDir(githubAgentsDir);\n await writeFile(workspaceDst, JSON.stringify(workspaceTemplate, null, 2), 'utf8');\n await writeFile(wakeupDst, wakeupContent, 'utf8');\n }\n created.push(subagentDir);\n subagentsProvisioned += 1;\n continue;\n }\n\n if (!dryRun && !(await pathExists(workspaceDst))) {\n await ensureDir(githubAgentsDir);\n await writeFile(workspaceDst, JSON.stringify(workspaceTemplate, null, 2), 'utf8');\n await writeFile(wakeupDst, wakeupContent, 'utf8');\n }\n\n skippedExisting.push(subagentDir);\n subagentsProvisioned += 1;\n }\n\n let nextIndex = highestNumber;\n while (subagentsProvisioned < subagents) {\n nextIndex += 1;\n const subagentDir = path.join(targetPath, `subagent-${nextIndex}`);\n const githubAgentsDir = path.join(subagentDir, '.github', 'agents');\n const workspaceDst = path.join(subagentDir, `${path.basename(subagentDir)}.code-workspace`);\n const wakeupDst = path.join(githubAgentsDir, 'wakeup.md');\n\n if (!dryRun) {\n await ensureDir(subagentDir);\n await ensureDir(githubAgentsDir);\n await writeFile(workspaceDst, JSON.stringify(workspaceTemplate, null, 2), 'utf8');\n await writeFile(wakeupDst, wakeupContent, 'utf8');\n }\n\n created.push(subagentDir);\n subagentsProvisioned += 1;\n }\n\n return {\n created,\n skippedExisting,\n skippedLocked: Array.from(lockedSubagents).sort(),\n };\n}\n","/**\n * Custom request templates for AgentV evaluation workflows\n * These templates are used when dispatching to VSCode via subagent\n */\n\nexport const AGENTV_REQUEST_TEMPLATE = `[[ ## task ## ]]\n\n{{userQuery}}\n\n[[ ## system_instructions ## ]]\n\n**IMPORTANT**: Follow these exact steps:\n1. Create and write your complete response to: {{responseFileTmp}}\n2. When completely finished, run these PowerShell commands to signal completion:\n\\`\\`\\`\nMove-Item -LiteralPath '{{responseFileTmp}}' -Destination '{{responseFileFinal}}'\nif (Test-Path subagent.lock) { del subagent.lock }\n\\`\\`\\`\n\nDo not proceed to step 2 until your response is completely written to the temporary file.\n`;\n\nexport const AGENTV_BATCH_REQUEST_TEMPLATE = `[[ ## task ## ]]\n\n{{userQuery}}\n\n[[ ## system_instructions ## ]]\n\n**IMPORTANT**: Follow these exact steps:\n1. Create and write your complete response to: {{responseFileTmp}}\n2. When completely finished and the response is stable, rename it to: {{responseFileFinal}}\n3. Do not unlock the workspace from this request; batch orchestration will handle unlocking after all responses are ready.\n`;\n\nexport const AGENTV_BATCH_ORCHESTRATOR_TEMPLATE = `MANDATORY: Run #runSubagent tool in your Available Actions for each request file to process them in isolated contexts.\nDO NOT read the request files yourself - only pass the file paths to each subagent:\n\n{{requestFiles}}\n\nAfter ALL queries complete, verify all responses exist and unlock:\n\n\\`\\`\\`powershell\n$responses = @({{responseList}})\n$missing = $responses | Where-Object { -not (Test-Path \"messages/$_\") }\nif ($missing.Count -eq 0) { del subagent.lock }\n\\`\\`\\`\n`;\n","import { constants } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { parseYamlValue } from '../yaml-loader.js';\nimport { TARGETS_SCHEMA_V2 } from './types.js';\nimport type { TargetDefinition } from './types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction extractTargetsArray(parsed: Record<string, unknown>, absolutePath: string): unknown[] {\n const targets = parsed.targets;\n if (!Array.isArray(targets)) {\n throw new Error(`targets.yaml at ${absolutePath} must have a 'targets' array`);\n }\n return targets;\n}\n\nfunction assertTargetDefinition(value: unknown, index: number, filePath: string): TargetDefinition {\n if (!isRecord(value)) {\n throw new Error(`targets.yaml entry at index ${index} in ${filePath} must be an object`);\n }\n\n const name = value.name;\n const provider = value.provider;\n\n if (typeof name !== 'string' || name.trim().length === 0) {\n throw new Error(\n `targets.yaml entry at index ${index} in ${filePath} is missing a valid 'name'`,\n );\n }\n\n const hasUseTarget = typeof value.use_target === 'string' && value.use_target.trim().length > 0;\n if (!hasUseTarget && (typeof provider !== 'string' || provider.trim().length === 0)) {\n throw new Error(\n `targets.yaml entry '${name}' in ${filePath} is missing a valid 'provider' (or use use_target for delegation)`,\n );\n }\n\n // Pass through all properties from the YAML to support the flattened schema\n // This includes all provider-specific settings at the top level\n return value as unknown as TargetDefinition;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readTargetDefinitions(\n filePath: string,\n): Promise<readonly TargetDefinition[]> {\n const absolutePath = path.resolve(filePath);\n if (!(await fileExists(absolutePath))) {\n throw new Error(`targets.yaml not found at ${absolutePath}`);\n }\n\n const raw = await readFile(absolutePath, 'utf8');\n const parsed = parseYamlValue(raw);\n\n if (!isRecord(parsed)) {\n throw new Error(`targets.yaml at ${absolutePath} must be a YAML object with a 'targets' field`);\n }\n\n const targets = extractTargetsArray(parsed, absolutePath);\n const definitions = targets.map((entry, index) =>\n assertTargetDefinition(entry, index, absolutePath),\n );\n return definitions;\n}\n\nexport function listTargetNames(definitions: readonly TargetDefinition[]): readonly string[] {\n return definitions.map((definition) => definition.name);\n}\n","/**\n * Convention-based discovery of custom provider scripts.\n *\n * Scans `.agentv/providers/` for TypeScript/JavaScript files and registers\n * them as CLI-like providers in the registry. The file name (without\n * extension) becomes the provider kind name.\n *\n * Example: `.agentv/providers/my-llm.ts` -> provider kind \"my-llm\" in targets.yaml\n */\n\nimport path from 'node:path';\nimport fg from 'fast-glob';\n\nimport { CliProvider } from './cli.js';\nimport type { ProviderRegistry } from './provider-registry.js';\n\n/**\n * Discover custom provider scripts from `.agentv/providers/` and register\n * them as provider kinds in the registry.\n *\n * Each discovered script is registered as a CLI-like provider that runs\n * via `bun run <filePath> {PROMPT}`. The script receives the prompt as\n * a CLI argument and should print its response to stdout.\n *\n * @param registry - The provider registry to register discovered providers into\n * @param baseDir - The base directory to search from (typically project root or eval file dir)\n * @returns Names of discovered provider kinds\n */\nexport async function discoverProviders(\n registry: ProviderRegistry,\n baseDir: string,\n): Promise<string[]> {\n const patterns = ['*.ts', '*.js', '*.mts', '*.mjs'];\n\n // Search baseDir and its ancestors for .agentv/providers/\n const candidateDirs: string[] = [];\n let dir = path.resolve(baseDir);\n const root = path.parse(dir).root;\n while (dir !== root) {\n candidateDirs.push(path.join(dir, '.agentv', 'providers'));\n dir = path.dirname(dir);\n }\n\n let files: string[] = [];\n for (const providersDir of candidateDirs) {\n try {\n const found = await fg(patterns, {\n cwd: providersDir,\n absolute: true,\n onlyFiles: true,\n });\n files = files.concat(found);\n } catch {\n // Directory doesn't exist — skip\n }\n }\n\n const discoveredKinds: string[] = [];\n\n for (const filePath of files) {\n const basename = path.basename(filePath);\n const kindName = basename.replace(/\\.(ts|js|mts|mjs)$/, '');\n\n // Don't override built-in kinds\n if (registry.has(kindName)) {\n continue;\n }\n\n registry.register(kindName, (target) => {\n return new CliProvider(target.name, {\n command: `bun run ${filePath} {PROMPT}`,\n });\n });\n discoveredKinds.push(kindName);\n }\n\n return discoveredKinds;\n}\n","import { AgentvProvider } from './agentv-provider.js';\nimport { ClaudeCliProvider } from './claude-cli.js';\nimport { ClaudeSdkProvider } from './claude-sdk.js';\nimport { ClaudeProvider } from './claude.js';\nimport { CliProvider } from './cli.js';\nimport { CodexProvider } from './codex.js';\nimport { CopilotCliProvider } from './copilot-cli.js';\nimport { CopilotLogProvider } from './copilot-log.js';\nimport { CopilotSdkProvider } from './copilot-sdk.js';\nimport {\n AnthropicProvider,\n AzureProvider,\n GeminiProvider,\n OpenAIProvider,\n OpenRouterProvider,\n} from './llm-providers.js';\nimport { MockProvider } from './mock.js';\nimport { PiCliProvider } from './pi-cli.js';\nimport { PiCodingAgentProvider } from './pi-coding-agent.js';\nimport { ProviderRegistry } from './provider-registry.js';\nimport type { ResolvedTarget } from './targets.js';\nimport {\n COMMON_TARGET_SETTINGS,\n resolveDelegatedTargetDefinition,\n resolveTargetDefinition,\n} from './targets.js';\nimport type { EnvLookup, Provider, TargetDefinition } from './types.js';\nimport { VSCodeProvider } from './vscode-provider.js';\n\nexport type {\n EnvLookup,\n Message,\n OutputMessage,\n Provider,\n ProviderKind,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamCallbacks,\n ProviderTokenUsage,\n TargetDefinition,\n ToolCall,\n} from './types.js';\n\nexport { extractLastAssistantContent } from './types.js';\n\nexport type {\n AgentVResolvedConfig,\n AnthropicResolvedConfig,\n ApiFormat,\n AzureResolvedConfig,\n ClaudeResolvedConfig,\n CliResolvedConfig,\n CopilotCliResolvedConfig,\n CopilotLogResolvedConfig,\n CopilotSdkResolvedConfig,\n GeminiResolvedConfig,\n MockResolvedConfig,\n OpenAIResolvedConfig,\n OpenRouterResolvedConfig,\n PiCliResolvedConfig,\n PiCodingAgentResolvedConfig,\n ResolvedTarget,\n VSCodeResolvedConfig,\n} from './targets.js';\n\nexport { COMMON_TARGET_SETTINGS, resolveDelegatedTargetDefinition, resolveTargetDefinition };\nexport { readTargetDefinitions, listTargetNames } from './targets-file.js';\nexport {\n ensureVSCodeSubagents,\n type EnsureSubagentsOptions,\n type EnsureSubagentsResult,\n} from './vscode-provider.js';\nexport { consumeCodexLogEntries, subscribeToCodexLogEntries } from './codex-log-tracker.js';\nexport { consumePiLogEntries, subscribeToPiLogEntries } from './pi-log-tracker.js';\nexport {\n consumeClaudeLogEntries,\n subscribeToClaudeLogEntries,\n} from './claude-log-tracker.js';\nexport {\n consumeCopilotSdkLogEntries,\n subscribeToCopilotSdkLogEntries,\n} from './copilot-sdk-log-tracker.js';\nexport {\n consumeCopilotCliLogEntries,\n subscribeToCopilotCliLogEntries,\n} from './copilot-cli-log-tracker.js';\n\nexport {\n ProviderRegistry,\n type ProviderFactoryFn,\n} from './provider-registry.js';\n\nexport { discoverProviders } from './provider-discovery.js';\nexport { discoverCopilotSessions, type CopilotSession } from './copilot-session-discovery.js';\n\n/**\n * Create and return the default provider registry with all built-in providers.\n */\nexport function createBuiltinProviderRegistry(): ProviderRegistry {\n const registry = new ProviderRegistry();\n\n registry\n .register('openai', (t) => new OpenAIProvider(t.name, t.config as never))\n .register('openrouter', (t) => new OpenRouterProvider(t.name, t.config as never))\n .register('azure', (t) => new AzureProvider(t.name, t.config as never))\n .register('anthropic', (t) => new AnthropicProvider(t.name, t.config as never))\n .register('gemini', (t) => new GeminiProvider(t.name, t.config as never))\n .register('cli', (t) => new CliProvider(t.name, t.config as never))\n .register('codex', (t) => new CodexProvider(t.name, t.config as never))\n .register('copilot-sdk', (t) => new CopilotSdkProvider(t.name, t.config as never))\n .register('copilot-cli', (t) => new CopilotCliProvider(t.name, t.config as never))\n .register('copilot-log', (t) => new CopilotLogProvider(t.name, t.config as never))\n .register('pi-coding-agent', (t) => new PiCodingAgentProvider(t.name, t.config as never))\n .register('pi-cli', (t) => new PiCliProvider(t.name, t.config as never))\n // claude-cli is the new default subprocess provider; claude is an alias\n .register('claude-cli', (t) => new ClaudeCliProvider(t.name, t.config as never))\n .register('claude', (t) => new ClaudeCliProvider(t.name, t.config as never))\n // claude-sdk is the explicit SDK provider (requires @anthropic-ai/claude-agent-sdk)\n .register('claude-sdk', (t) => new ClaudeSdkProvider(t.name, t.config as never))\n .register('mock', (t) => new MockProvider(t.name, t.config as never))\n .register('agentv', (t) => new AgentvProvider(t.name, t.config as never))\n .register('vscode', (t) => new VSCodeProvider(t.name, t.config as never, 'vscode'))\n .register(\n 'vscode-insiders',\n (t) => new VSCodeProvider(t.name, t.config as never, 'vscode-insiders'),\n );\n\n return registry;\n}\n\n/** Singleton registry instance used by createProvider(). */\nconst defaultProviderRegistry = createBuiltinProviderRegistry();\n\n/**\n * Create a provider from a resolved target using the default registry.\n * Custom providers can be registered via `createBuiltinProviderRegistry().register()`.\n */\nexport function createProvider(target: ResolvedTarget): Provider {\n return defaultProviderRegistry.create(target);\n}\n\nexport function resolveAndCreateProvider(\n definition: TargetDefinition,\n env: EnvLookup = process.env,\n): Provider {\n const resolved = resolveTargetDefinition(definition, env);\n return createProvider(resolved);\n}\n","/**\n * Extensible grader registry.\n *\n * Replaces the hardcoded switch/case dispatch in the orchestrator with\n * a registry of named factory functions. Built-in evaluators are registered\n * at startup; users can add custom evaluators via `defineAssertion()` in\n * `@agentv/eval` or by dropping files in `.agentv/assertions/`.\n */\n\nimport type { EvaluationContext, EvaluationScore, Grader } from '../graders/types.js';\nimport type { TargetResolver } from '../graders/types.js';\nimport type { Provider } from '../providers/types.js';\nimport type { GraderConfig } from '../types.js';\n\n/**\n * Context passed to grader factory functions during creation.\n * Contains shared resources needed by evaluator instances.\n */\nexport interface GraderDispatchContext {\n /** Shared LLM grader provider (resolved at suite level) */\n readonly graderProvider?: Provider;\n /** @deprecated Use `graderProvider` instead */\n readonly judgeProvider?: Provider;\n /** Function to resolve target names to providers */\n readonly targetResolver?: TargetResolver;\n /** Available target names for code graders */\n readonly availableTargets?: readonly string[];\n /** Agent timeout in ms */\n readonly agentTimeoutMs?: number;\n /** Directory containing the eval file (for composite member resolution) */\n readonly evalFileDir?: string;\n /** Shared LLM grader evaluator instance */\n readonly llmGrader: Grader;\n /** @deprecated Use `llmGrader` instead */\n readonly llmJudge?: Grader;\n /** Reference to the registry itself (for composite evaluators that need to create children) */\n readonly registry: GraderRegistry;\n}\n\n/**\n * Factory function that creates an Grader instance from a config.\n *\n * Factory functions handle all type-specific initialization logic:\n * - Reading prompt files for LLM graders\n * - Resolving script paths for code graders\n * - Creating adapter evaluators for deterministic assertions\n */\nexport type GraderFactoryFn = (\n config: GraderConfig,\n context: GraderDispatchContext,\n) => Grader | Promise<Grader>;\n\n/**\n * Registry of grader factory functions keyed by grader type name.\n *\n * Built-in evaluators are registered at startup. Custom evaluators can be\n * registered via the `register()` method or discovered from `.agentv/assertions/`.\n */\nexport class GraderRegistry {\n private readonly factories = new Map<string, GraderFactoryFn>();\n\n /** Register a factory function for an grader type. */\n register(type: string, factory: GraderFactoryFn): this {\n this.factories.set(type, factory);\n return this;\n }\n\n /** Get the factory function for an grader type. */\n get(type: string): GraderFactoryFn | undefined {\n return this.factories.get(type);\n }\n\n /** Check if a factory is registered for the given type. */\n has(type: string): boolean {\n return this.factories.has(type);\n }\n\n /** List all registered grader type names. */\n list(): string[] {\n return [...this.factories.keys()];\n }\n\n /**\n * Create an evaluator instance from a config, using the registered factory.\n * Throws if no factory is registered for the grader type.\n */\n async create(config: GraderConfig, context: GraderDispatchContext): Promise<Grader> {\n const factory = this.factories.get(config.type);\n if (!factory) {\n throw new Error(\n `Unknown grader type: \"${config.type}\". Registered types: ${this.list().join(', ')}`,\n );\n }\n return factory(config, context);\n }\n}\n\n/**\n * Adapter that wraps a synchronous assertion function as an Grader.\n * Used for deterministic assertions (contains, regex, is-json, equals).\n */\nexport class DeterministicAssertionGrader implements Grader {\n readonly kind: string;\n\n constructor(\n kind: string,\n private readonly assertFn: (context: EvaluationContext) => EvaluationScore,\n ) {\n this.kind = kind;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n return this.assertFn(context);\n }\n}\n","import type { AssertFn } from '../assertions.js';\nimport type { JsonObject } from '../types.js';\nimport { clampScore, scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Grader } from './types.js';\n\n/**\n * Grader that wraps an inline AssertFn and runs it in-process.\n * No subprocess, no stdin/stdout -- just calls the function directly.\n */\nexport class InlineAssertGrader implements Grader {\n readonly kind = 'inline-assert';\n\n constructor(\n private readonly fn: AssertFn,\n private readonly name: string,\n ) {}\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n const result = await this.fn({\n input: context.evalCase.question,\n output: context.candidate,\n expectedOutput: context.evalCase.reference_answer,\n criteria: context.evalCase.criteria,\n metadata: context.evalCase.metadata as Record<string, unknown> | undefined,\n });\n\n const score = clampScore(result.score);\n\n return {\n score,\n verdict: scoreToVerdict(score),\n assertions: [{ text: result.name, passed: score >= 0.5 }],\n expectedAspectCount: 1,\n details: result.metadata ? (result.metadata as JsonObject) : undefined,\n };\n }\n}\n","/**\n * Prompt resolution utilities for LLM judge evaluators.\n *\n * Extracted from orchestrator.ts to enable reuse by the grader registry.\n *\n * Key behavior: When a user writes `prompt: \"some text\"` in an assertion,\n * `resolveCustomPrompt()` returns that text. The caller must then decide\n * whether the text is a **full template** (contains `{{output}}` etc.) or\n * **bare criteria** (no template variables). Use `containsTemplateVariables()`\n * to distinguish: full templates become `graderTemplateOverride`, while\n * bare criteria are injected into the default template's `{{criteria}}` slot.\n */\n\nimport path from 'node:path';\n\nimport { toSnakeCaseDeep } from '../case-conversion.js';\nimport { readTextFile } from '../file-utils.js';\nimport type { Message } from '../providers/types.js';\nimport { VALID_TEMPLATE_VARIABLES } from '../template-variables.js';\nimport type { TraceSummary } from '../trace.js';\nimport type { EvalTest, PromptScriptConfig } from '../types.js';\nimport { executeScript } from './code-grader.js';\n\nexport interface ResolveCustomPromptContext {\n readonly evalCase: EvalTest;\n readonly candidate: string;\n readonly output?: readonly Message[];\n readonly trace?: TraceSummary;\n readonly config?: Record<string, unknown>;\n readonly fileChanges?: string;\n readonly workspacePath?: string;\n}\n\nexport async function resolveCustomPrompt(\n promptConfig: {\n readonly prompt?: string | PromptScriptConfig;\n readonly promptPath?: string;\n readonly resolvedPromptPath?: string;\n readonly resolvedPromptScript?: readonly string[];\n readonly config?: Record<string, unknown>;\n },\n context?: ResolveCustomPromptContext,\n timeoutMs?: number,\n): Promise<string | undefined> {\n if (promptConfig.resolvedPromptScript && promptConfig.resolvedPromptScript.length > 0) {\n if (!context) {\n throw new Error('Context required for executable prompt templates');\n }\n return executePromptTemplate(\n promptConfig.resolvedPromptScript,\n context,\n promptConfig.config,\n timeoutMs,\n );\n }\n\n const promptPath = promptConfig.resolvedPromptPath ?? promptConfig.promptPath;\n\n if (promptPath) {\n try {\n const content = await readTextFile(promptPath);\n return content;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Could not read custom prompt at ${promptPath}: ${message}`);\n }\n }\n\n const promptValue = promptConfig.prompt;\n if (typeof promptValue === 'string') {\n return promptValue;\n }\n\n return undefined;\n}\n\n/**\n * Checks whether a prompt string contains any known `{{ variable }}` template\n * placeholders (e.g. `{{output}}`, `{{input}}`). If it does, the string is a\n * full grader template and should replace the default template. If not,\n * it's bare criteria text and should be injected into the `{{criteria}}` slot\n * of the default template.\n */\nexport function containsTemplateVariables(text: string): boolean {\n const variablePattern = /\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g;\n for (const match of text.matchAll(variablePattern)) {\n if (VALID_TEMPLATE_VARIABLES.has(match[1])) {\n return true;\n }\n }\n return false;\n}\n\nasync function executePromptTemplate(\n script: readonly string[],\n context: ResolveCustomPromptContext,\n config?: Record<string, unknown>,\n timeoutMs?: number,\n): Promise<string> {\n const payload = {\n criteria: context.evalCase.criteria,\n expectedOutput: context.evalCase.expected_output,\n output: context.output ?? null,\n inputFiles: context.evalCase.file_paths,\n input: context.evalCase.input,\n trace: context.trace ?? null,\n fileChanges: context.fileChanges ?? null,\n workspacePath: context.workspacePath ?? null,\n config: config ?? context.config ?? null,\n };\n\n const inputJson = JSON.stringify(toSnakeCaseDeep(payload), null, 2);\n\n const scriptPath = script[script.length - 1];\n const cwd = path.dirname(scriptPath);\n\n try {\n const stdout = await executeScript(script, inputJson, timeoutMs, cwd);\n const prompt = stdout.trim();\n\n if (!prompt) {\n throw new Error('Prompt template produced empty output');\n }\n\n return prompt;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Prompt template execution failed: ${message}`);\n }\n}\n","/**\n * Factory functions for all built-in grader types.\n *\n * Each factory creates an Grader instance from an GraderConfig,\n * handling type-specific initialization logic. These are registered into\n * the GraderRegistry at startup.\n */\n\nimport {\n CodeGrader,\n CompositeGrader,\n CostGrader,\n ExecutionMetricsGrader,\n FieldAccuracyGrader,\n type Grader,\n LatencyGrader,\n LlmGrader,\n SkillTriggerGrader,\n TokenUsageGrader,\n ToolTrajectoryGrader,\n runContainsAllAssertion,\n runContainsAnyAssertion,\n runContainsAssertion,\n runEndsWithAssertion,\n runEqualsAssertion,\n runIcontainsAllAssertion,\n runIcontainsAnyAssertion,\n runIcontainsAssertion,\n runIsJsonAssertion,\n runRegexAssertion,\n runStartsWithAssertion,\n} from '../graders.js';\nimport { InlineAssertGrader } from '../graders/inline-assert.js';\nimport { containsTemplateVariables, resolveCustomPrompt } from '../graders/prompt-resolution.js';\nimport { isAgentProvider } from '../providers/types.js';\nimport type { Provider } from '../providers/types.js';\nimport type { ToolTrajectoryGraderConfig } from '../trace.js';\nimport type {\n CodeGraderConfig,\n CompositeGraderConfig,\n ContainsAllGraderConfig,\n ContainsAnyGraderConfig,\n ContainsGraderConfig,\n CostGraderConfig,\n EndsWithGraderConfig,\n EqualsGraderConfig,\n ExecutionMetricsGraderConfig,\n FieldAccuracyGraderConfig,\n GraderConfig,\n IcontainsAllGraderConfig,\n IcontainsAnyGraderConfig,\n IcontainsGraderConfig,\n IsJsonGraderConfig,\n LatencyGraderConfig,\n LlmGraderConfig,\n RegexGraderConfig,\n SkillTriggerGraderConfig,\n StartsWithGraderConfig,\n TokenUsageGraderConfig,\n} from '../types.js';\nimport {\n DeterministicAssertionGrader,\n type GraderDispatchContext,\n type GraderFactoryFn,\n GraderRegistry,\n} from './grader-registry.js';\n\n/** Symbol for attaching inline AssertFn to GraderConfig objects */\nexport const INLINE_ASSERT_FN = Symbol.for('agentv.inline-assert-fn');\n\n/**\n * Factory for `llm-grader` evaluators.\n * Creates a wrapper that resolves custom prompts at evaluation time and\n * optionally overrides the grader target per evaluator.\n *\n * Auto-detects mode based on the resolved grader provider:\n * - LLM providers (azure, anthropic, gemini): structured JSON mode\n * - Agent providers (claude-cli, copilot, etc.): delegate mode\n * - agentv provider: built-in AI SDK agent mode with filesystem tools\n */\nexport const llmGraderFactory: GraderFactoryFn = (config, context) => {\n const c = config as LlmGraderConfig;\n const { llmGrader, graderProvider, judgeProvider, targetResolver, agentTimeoutMs } = context;\n\n let evaluator = llmGrader;\n if (c.target) {\n let graderTargetProvider: Provider | undefined;\n if (targetResolver) {\n graderTargetProvider = targetResolver(c.target);\n }\n if (!graderTargetProvider) {\n throw new Error(\n `llm-grader evaluator '${c.name}': target '${c.target}' not found in targets`,\n );\n }\n // Only pass graderTargetProvider for agent providers (delegate mode).\n // LLM providers use the normal resolveGraderProvider path for structured JSON mode.\n // The agentv provider drives the built-in agent loop directly, so include\n // it alongside AGENT_PROVIDER_KINDS even though it doesn't spawn a subprocess.\n const isAgent = isAgentProvider(graderTargetProvider) || graderTargetProvider.kind === 'agentv';\n evaluator = new LlmGrader({\n resolveGraderProvider: async (evalContext) => {\n if (graderTargetProvider) return graderTargetProvider;\n if (evalContext.graderProvider) return evalContext.graderProvider;\n return graderProvider ?? judgeProvider;\n },\n maxSteps: c.max_steps,\n temperature: c.temperature,\n ...(isAgent ? { graderTargetProvider } : {}),\n });\n }\n\n return {\n kind: 'llm-grader',\n async evaluate(evalContext) {\n const customPrompt = await resolveCustomPrompt(\n c,\n {\n evalCase: evalContext.evalCase,\n candidate: evalContext.candidate,\n output: evalContext.output,\n trace: evalContext.trace,\n config: c.config,\n fileChanges: evalContext.fileChanges,\n workspacePath: evalContext.workspacePath,\n },\n agentTimeoutMs,\n );\n\n // Determine whether the resolved prompt should replace the entire\n // grader template or be injected as the {{criteria}} in the default\n // template.\n //\n // Script-based prompts (resolvedPromptScript) and file-based prompts\n // (resolvedPromptPath/promptPath) are always treated as full template\n // overrides — they're expected to produce the complete grader prompt.\n //\n // Inline `prompt:` strings are checked for template variables like\n // {{output}}, {{input}}, etc. If present, the string is a full custom\n // template. If absent, it's bare criteria text (e.g. \"Check if the\n // response shows step-by-step work\") and gets injected into the default\n // template's {{criteria}} slot so the grader still receives the\n // candidate output, input, and reference answer. (#982)\n const isFromInlinePrompt =\n !c.resolvedPromptScript?.length && !c.resolvedPromptPath && !c.promptPath;\n\n let graderTemplateOverride: string | undefined;\n let evalCase = evalContext.evalCase;\n if (customPrompt) {\n if (!isFromInlinePrompt || containsTemplateVariables(customPrompt)) {\n graderTemplateOverride = customPrompt;\n } else {\n // Bare inline text — use as criteria in the default template\n evalCase = { ...evalCase, criteria: customPrompt };\n }\n }\n\n return evaluator.evaluate({\n ...evalContext,\n evalCase,\n graderTemplateOverride,\n evaluator: c,\n });\n },\n };\n};\n\n/** Factory for `code-grader` evaluators. */\nexport const codeFactory: GraderFactoryFn = (config, context) => {\n const c = config as CodeGraderConfig;\n return new CodeGrader({\n command: c.command ?? c.script ?? [],\n cwd: c.resolvedCwd ?? c.cwd,\n agentTimeoutMs: context.agentTimeoutMs,\n config: c.config,\n target: c.target,\n });\n};\n\n/** Factory for `composite` evaluators. */\nexport const compositeFactory: GraderFactoryFn = (config, context) => {\n const c = config as CompositeGraderConfig;\n const evalFileDir = context.evalFileDir ?? process.cwd();\n\n return new CompositeGrader({\n config: c,\n cwd: evalFileDir,\n evaluatorFactory: {\n create: (memberConfig: GraderConfig) => {\n const factory = context.registry.get(memberConfig.type);\n if (!factory) {\n throw new Error(`Unsupported grader type in composite: ${memberConfig.type}`);\n }\n // Factory functions may return a promise; for composite sync creation,\n // we handle the common synchronous cases directly.\n const result = factory(memberConfig, context);\n if (result instanceof Promise) {\n throw new Error(\n `Grader factory for type \"${memberConfig.type}\" is async — not supported inside composite members. Use synchronous factories for composite child evaluators.`,\n );\n }\n return result;\n },\n },\n });\n};\n\n/** Factory for `tool-trajectory` evaluators. */\nexport const toolTrajectoryFactory: GraderFactoryFn = (config) => {\n return new ToolTrajectoryGrader({\n config: config as ToolTrajectoryGraderConfig,\n });\n};\n\n/** Factory for `field-accuracy` evaluators. */\nexport const fieldAccuracyFactory: GraderFactoryFn = (config) => {\n return new FieldAccuracyGrader({\n config: config as FieldAccuracyGraderConfig,\n });\n};\n\n/** Factory for `latency` evaluators. */\nexport const latencyFactory: GraderFactoryFn = (config) => {\n return new LatencyGrader({ config: config as LatencyGraderConfig });\n};\n\n/** Factory for `cost` evaluators. */\nexport const costFactory: GraderFactoryFn = (config) => {\n return new CostGrader({ config: config as CostGraderConfig });\n};\n\n/** Factory for `token-usage` evaluators. */\nexport const tokenUsageFactory: GraderFactoryFn = (config) => {\n return new TokenUsageGrader({ config: config as TokenUsageGraderConfig });\n};\n\n/** Factory for `execution-metrics` evaluators. */\nexport const executionMetricsFactory: GraderFactoryFn = (config) => {\n return new ExecutionMetricsGrader({\n config: config as ExecutionMetricsGraderConfig,\n });\n};\n\n/** Factory for `skill-trigger` evaluator. */\nexport const skillTriggerFactory: GraderFactoryFn = (config) => {\n return new SkillTriggerGrader(config as SkillTriggerGraderConfig);\n};\n\n/** Factory for `contains` deterministic assertion. */\nexport const containsFactory: GraderFactoryFn = (config) => {\n const c = config as ContainsGraderConfig;\n return new DeterministicAssertionGrader('contains', (ctx) => {\n const result = runContainsAssertion(ctx.candidate, c.value);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n assertions: result.assertions,\n expectedAspectCount: 1,\n };\n });\n};\n\n/** Factory for `regex` deterministic assertion. */\nexport const regexFactory: GraderFactoryFn = (config) => {\n const c = config as RegexGraderConfig;\n return new DeterministicAssertionGrader('regex', (ctx) => {\n const result = runRegexAssertion(ctx.candidate, c.value, c.flags);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n assertions: result.assertions,\n expectedAspectCount: 1,\n };\n });\n};\n\n/** Factory for `is-json` deterministic assertion. */\nexport const isJsonFactory: GraderFactoryFn = () => {\n return new DeterministicAssertionGrader('is-json', (ctx) => {\n const result = runIsJsonAssertion(ctx.candidate);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n assertions: result.assertions,\n expectedAspectCount: 1,\n };\n });\n};\n\n/** Factory for `equals` deterministic assertion. */\nexport const equalsFactory: GraderFactoryFn = (config) => {\n const c = config as EqualsGraderConfig;\n return new DeterministicAssertionGrader('equals', (ctx) => {\n const result = runEqualsAssertion(ctx.candidate, c.value);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n assertions: result.assertions,\n expectedAspectCount: 1,\n };\n });\n};\n\n/** Factory for `contains-any` deterministic assertion. */\nexport const containsAnyFactory: GraderFactoryFn = (config) => {\n const c = config as ContainsAnyGraderConfig;\n return new DeterministicAssertionGrader('contains-any', (ctx) => {\n const result = runContainsAnyAssertion(ctx.candidate, c.value);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n assertions: result.assertions,\n expectedAspectCount: 1,\n };\n });\n};\n\n/** Factory for `contains-all` deterministic assertion. */\nexport const containsAllFactory: GraderFactoryFn = (config) => {\n const c = config as ContainsAllGraderConfig;\n return new DeterministicAssertionGrader('contains-all', (ctx) => {\n const result = runContainsAllAssertion(ctx.candidate, c.value);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n assertions: result.assertions,\n expectedAspectCount: 1,\n };\n });\n};\n\n/** Factory for `icontains` deterministic assertion. */\nexport const icontainsFactory: GraderFactoryFn = (config) => {\n const c = config as IcontainsGraderConfig;\n return new DeterministicAssertionGrader('icontains', (ctx) => {\n const result = runIcontainsAssertion(ctx.candidate, c.value);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n assertions: result.assertions,\n expectedAspectCount: 1,\n };\n });\n};\n\n/** Factory for `icontains-any` deterministic assertion. */\nexport const icontainsAnyFactory: GraderFactoryFn = (config) => {\n const c = config as IcontainsAnyGraderConfig;\n return new DeterministicAssertionGrader('icontains-any', (ctx) => {\n const result = runIcontainsAnyAssertion(ctx.candidate, c.value);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n assertions: result.assertions,\n expectedAspectCount: 1,\n };\n });\n};\n\n/** Factory for `icontains-all` deterministic assertion. */\nexport const icontainsAllFactory: GraderFactoryFn = (config) => {\n const c = config as IcontainsAllGraderConfig;\n return new DeterministicAssertionGrader('icontains-all', (ctx) => {\n const result = runIcontainsAllAssertion(ctx.candidate, c.value);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n assertions: result.assertions,\n expectedAspectCount: 1,\n };\n });\n};\n\n/** Factory for `starts-with` deterministic assertion. */\nexport const startsWithFactory: GraderFactoryFn = (config) => {\n const c = config as StartsWithGraderConfig;\n return new DeterministicAssertionGrader('starts-with', (ctx) => {\n const result = runStartsWithAssertion(ctx.candidate, c.value);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n assertions: result.assertions,\n expectedAspectCount: 1,\n };\n });\n};\n\n/** Factory for `ends-with` deterministic assertion. */\nexport const endsWithFactory: GraderFactoryFn = (config) => {\n const c = config as EndsWithGraderConfig;\n return new DeterministicAssertionGrader('ends-with', (ctx) => {\n const result = runEndsWithAssertion(ctx.candidate, c.value);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n assertions: result.assertions,\n expectedAspectCount: 1,\n };\n });\n};\n\n/**\n * Create a new GraderRegistry with all built-in grader types registered.\n */\nexport function createBuiltinRegistry(): GraderRegistry {\n const registry = new GraderRegistry();\n\n registry\n .register('llm-grader', llmGraderFactory)\n .register('code-grader', codeFactory)\n .register('composite', compositeFactory)\n .register('tool-trajectory', toolTrajectoryFactory)\n .register('field-accuracy', fieldAccuracyFactory)\n .register('latency', latencyFactory)\n .register('cost', costFactory)\n .register('token-usage', tokenUsageFactory)\n .register('execution-metrics', executionMetricsFactory)\n .register('skill-trigger', skillTriggerFactory)\n .register('contains', containsFactory)\n .register('contains-any', containsAnyFactory)\n .register('contains-all', containsAllFactory)\n .register('icontains', icontainsFactory)\n .register('icontains-any', icontainsAnyFactory)\n .register('icontains-all', icontainsAllFactory)\n .register('starts-with', startsWithFactory)\n .register('ends-with', endsWithFactory)\n .register('regex', regexFactory)\n .register('is-json', isJsonFactory)\n .register('equals', equalsFactory)\n .register('inline-assert', (config) => {\n // biome-ignore lint/suspicious/noExplicitAny: symbol key access requires any\n const fn = (config as any)[INLINE_ASSERT_FN] as\n | import('../assertions.js').AssertFn\n | undefined;\n if (!fn) {\n throw new Error(\n `No inline assert function found on config for \"${config.name}\". Inline assert functions must be attached via INLINE_ASSERT_FN symbol.`,\n );\n }\n return new InlineAssertGrader(fn, config.name ?? 'inline-assert');\n });\n\n return registry;\n}\n","/**\n * Convention-based discovery of custom assertion scripts.\n *\n * Scans `.agentv/assertions/` for TypeScript/JavaScript files and registers\n * them as code graders in the registry. The file name (without\n * extension) becomes the grader type name.\n *\n * Example: `.agentv/assertions/sentiment.ts` → type \"sentiment\" in EVAL.yaml\n */\n\nimport path from 'node:path';\nimport fg from 'fast-glob';\n\nimport { CodeGrader } from '../graders/code-grader.js';\nimport type { GraderFactoryFn } from './grader-registry.js';\nimport type { GraderRegistry } from './grader-registry.js';\n\n/**\n * Discover custom assertion scripts from `.agentv/assertions/` and register\n * them as grader types in the registry.\n *\n * @param registry - The grader registry to register discovered assertions into\n * @param baseDir - The base directory to search from (typically project root or eval file dir)\n * @returns Names of discovered assertion types\n */\nexport async function discoverAssertions(\n registry: GraderRegistry,\n baseDir: string,\n): Promise<string[]> {\n const patterns = ['*.ts', '*.js', '*.mts', '*.mjs'];\n\n // Search baseDir and its ancestors for .agentv/assertions/\n const candidateDirs: string[] = [];\n let dir = path.resolve(baseDir);\n const root = path.parse(dir).root;\n while (dir !== root) {\n candidateDirs.push(path.join(dir, '.agentv', 'assertions'));\n dir = path.dirname(dir);\n }\n\n let files: string[] = [];\n for (const assertionsDir of candidateDirs) {\n try {\n const found = await fg(patterns, {\n cwd: assertionsDir,\n absolute: true,\n onlyFiles: true,\n });\n files = files.concat(found);\n } catch {\n // Directory doesn't exist — skip\n }\n }\n\n const discoveredTypes: string[] = [];\n\n for (const filePath of files) {\n const basename = path.basename(filePath);\n const typeName = basename.replace(/\\.(ts|js|mts|mjs)$/, '');\n\n // Don't override built-in types\n if (registry.has(typeName)) {\n continue;\n }\n\n const factory: GraderFactoryFn = (_config, context) => {\n return new CodeGrader({\n command: ['bun', 'run', filePath],\n agentTimeoutMs: context.agentTimeoutMs,\n });\n };\n\n registry.register(typeName, factory);\n discoveredTypes.push(typeName);\n }\n\n return discoveredTypes;\n}\n","/**\n * Convention-based discovery of custom grader scripts.\n *\n * Scans `.agentv/graders/` (and legacy `.agentv/judges/`) for TypeScript/JavaScript\n * files and registers them as code graders in the registry. The file name\n * (without extension) becomes the grader type name.\n *\n * Example: `.agentv/graders/custom-grader.ts` → type \"custom-grader\" in EVAL.yaml\n */\n\nimport path from 'node:path';\nimport fg from 'fast-glob';\n\nimport { CodeGrader } from '../graders/code-grader.js';\nimport type { GraderFactoryFn } from './grader-registry.js';\nimport type { GraderRegistry } from './grader-registry.js';\n\n/**\n * Discover custom grader scripts from `.agentv/graders/` (and legacy `.agentv/judges/`)\n * and register them as grader types in the registry.\n *\n * @param registry - The grader registry to register discovered graders into\n * @param baseDir - The base directory to search from (typically project root or eval file dir)\n * @returns Names of discovered grader types\n */\nexport async function discoverGraders(\n registry: GraderRegistry,\n baseDir: string,\n): Promise<string[]> {\n const patterns = ['*.ts', '*.js', '*.mts', '*.mjs'];\n\n // Search baseDir and its ancestors for .agentv/graders/ and .agentv/judges/ (backward compat)\n const candidateDirs: string[] = [];\n let dir = path.resolve(baseDir);\n const root = path.parse(dir).root;\n while (dir !== root) {\n candidateDirs.push(path.join(dir, '.agentv', 'graders'));\n candidateDirs.push(path.join(dir, '.agentv', 'judges'));\n dir = path.dirname(dir);\n }\n\n let files: string[] = [];\n for (const gradersDir of candidateDirs) {\n try {\n const found = await fg(patterns, {\n cwd: gradersDir,\n absolute: true,\n onlyFiles: true,\n });\n files = files.concat(found);\n } catch {\n // Directory doesn't exist — skip\n }\n }\n\n const discoveredTypes: string[] = [];\n\n for (const filePath of files) {\n const basename = path.basename(filePath);\n const typeName = basename.replace(/\\.(ts|js|mts|mjs)$/, '');\n\n // Don't override built-in types\n if (registry.has(typeName)) {\n continue;\n }\n\n const factory: GraderFactoryFn = (_config, context) => {\n return new CodeGrader({\n command: ['bun', 'run', filePath],\n agentTimeoutMs: context.agentTimeoutMs,\n });\n };\n\n registry.register(typeName, factory);\n discoveredTypes.push(typeName);\n }\n\n return discoveredTypes;\n}\n","import type {\n ConfidenceIntervalAggregation,\n MeanAggregation,\n PassAtKAggregation,\n TrialAggregation,\n TrialResult,\n TrialsConfig,\n} from './types.js';\n\n/**\n * Aggregate trial results into a final score and aggregation metadata.\n */\nexport function aggregateTrials(\n trials: readonly TrialResult[],\n config: TrialsConfig,\n): { score: number; aggregation: TrialAggregation } {\n switch (config.strategy) {\n case 'pass_at_k':\n return aggregatePassAtK(trials);\n case 'mean':\n return aggregateMean(trials);\n case 'confidence_interval':\n return aggregateConfidenceInterval(trials);\n }\n}\n\nfunction aggregatePassAtK(trials: readonly TrialResult[]): {\n score: number;\n aggregation: PassAtKAggregation;\n} {\n const passedAttempts = trials.filter((t) => t.verdict === 'pass').length;\n const bestTrial = trials.reduce((best, t) => (t.score > best.score ? t : best), trials[0]);\n\n const aggregation: PassAtKAggregation = {\n strategy: 'pass_at_k',\n passedAttempts,\n totalAttempts: trials.length,\n };\n\n return {\n score: bestTrial.score,\n aggregation,\n };\n}\n\nfunction aggregateMean(trials: readonly TrialResult[]): {\n score: number;\n aggregation: MeanAggregation;\n} {\n const scores = trials.map((t) => t.score);\n const mean = scores.reduce((sum, s) => sum + s, 0) / scores.length;\n const min = Math.min(...scores);\n const max = Math.max(...scores);\n\n const aggregation: MeanAggregation = {\n strategy: 'mean',\n mean,\n min,\n max,\n };\n\n return {\n score: mean,\n aggregation,\n };\n}\n\nfunction aggregateConfidenceInterval(trials: readonly TrialResult[]): {\n score: number;\n aggregation: ConfidenceIntervalAggregation;\n} {\n const scores = trials.map((t) => t.score);\n const n = scores.length;\n const mean = scores.reduce((sum, s) => sum + s, 0) / n;\n\n if (n < 2) {\n // Cannot compute CI with fewer than 2 samples\n const aggregation: ConfidenceIntervalAggregation = {\n strategy: 'confidence_interval',\n mean,\n ci95Lower: clamp01(mean),\n ci95Upper: clamp01(mean),\n stddev: 0,\n };\n return { score: mean, aggregation };\n }\n\n const variance = scores.reduce((sum, s) => sum + (s - mean) ** 2, 0) / (n - 1);\n const stddev = Math.sqrt(variance);\n const standardError = stddev / Math.sqrt(n);\n const tCritical = getTCritical(n - 1);\n const margin = tCritical * standardError;\n\n const aggregation: ConfidenceIntervalAggregation = {\n strategy: 'confidence_interval',\n mean,\n ci95Lower: clamp01(mean - margin),\n ci95Upper: clamp01(mean + margin),\n stddev,\n };\n\n // Use the lower bound of the CI as the conservative score\n return {\n score: aggregation.ci95Lower,\n aggregation,\n };\n}\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\n/**\n * Two-tailed t-distribution critical values for 95% confidence (alpha = 0.05).\n * Array is indexed by df-1 (i.e., index 0 = df=1). For df >= 30, uses z = 1.96.\n */\nconst T_TABLE_95: readonly number[] = [\n 12.706, // df=1\n 4.303, // df=2\n 3.182, // df=3\n 2.776, // df=4\n 2.571, // df=5\n 2.447, // df=6\n 2.365, // df=7\n 2.306, // df=8\n 2.262, // df=9\n 2.228, // df=10\n 2.201, // df=11\n 2.179, // df=12\n 2.16, // df=13\n 2.145, // df=14\n 2.131, // df=15\n 2.12, // df=16\n 2.11, // df=17\n 2.101, // df=18\n 2.093, // df=19\n 2.086, // df=20\n 2.08, // df=21\n 2.074, // df=22\n 2.069, // df=23\n 2.064, // df=24\n 2.06, // df=25\n 2.056, // df=26\n 2.052, // df=27\n 2.048, // df=28\n 2.045, // df=29\n];\n\n/**\n * Get the t-critical value for a given degrees of freedom at 95% confidence.\n */\nexport function getTCritical(df: number): number {\n if (df < 1) return 12.706;\n if (df >= 30) return 1.96;\n return T_TABLE_95[df - 1];\n}\n","import { cp, mkdir, readdir, rm, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { getWorkspacesRoot } from '../../paths.js';\nimport { fileExists } from '../file-utils.js';\n\n/**\n * Error thrown when the template path does not exist.\n */\nexport class TemplateNotFoundError extends Error {\n constructor(templatePath: string) {\n super(`Workspace template not found: ${templatePath}`);\n this.name = 'TemplateNotFoundError';\n }\n}\n\n/**\n * Error thrown when the template path is a file instead of a directory.\n */\nexport class TemplateNotDirectoryError extends Error {\n constructor(templatePath: string) {\n super(`Workspace template is not a directory: ${templatePath}`);\n this.name = 'TemplateNotDirectoryError';\n }\n}\n\n/**\n * Error thrown when there is insufficient disk space or other I/O errors.\n */\nexport class WorkspaceCreationError extends Error {\n constructor(\n message: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = 'WorkspaceCreationError';\n }\n}\n\n/**\n * Check if a path is a directory.\n */\nasync function isDirectory(filePath: string): Promise<boolean> {\n try {\n const stats = await stat(filePath);\n return stats.isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Get the workspace path for a specific eval case.\n *\n * Workspace structure:\n * {workspaceRoot}/{evalRunId}/{caseId}\n *\n * Example:\n * ~/.agentv/workspaces/abc123/case-01\n *\n * @param evalRunId - The unique identifier for the evaluation run\n * @param caseId - The unique identifier for the evaluation case\n * @param workspaceRoot - Optional custom workspace root directory (defaults to ~/.agentv/workspaces)\n * @returns Absolute path to the workspace directory\n */\nexport function getWorkspacePath(\n evalRunId: string,\n caseId: string,\n workspaceRoot?: string,\n): string {\n const root = workspaceRoot ?? getWorkspacesRoot();\n return path.join(root, evalRunId, caseId);\n}\n\n/**\n * Recursively copy a directory, skipping .git directories.\n *\n * @param src - Source directory path\n * @param dest - Destination directory path\n */\nexport async function copyDirectoryRecursive(src: string, dest: string): Promise<void> {\n // Create destination directory\n await mkdir(dest, { recursive: true });\n\n const entries = await readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n // Skip .git directory\n if (entry.name === '.git') {\n continue;\n }\n\n if (entry.isDirectory()) {\n await copyDirectoryRecursive(srcPath, destPath);\n } else {\n // Use cp to preserve permissions\n await cp(srcPath, destPath, { preserveTimestamps: true });\n }\n }\n}\n\n/**\n * Create a temporary workspace by copying a template directory.\n *\n * The workspace is created at ~/.agentv/workspaces/{evalRunId}/{caseId}/\n * The .git directory from the template is skipped during copy.\n *\n * @param templatePath - Absolute path to the template directory\n * @param evalRunId - The unique identifier for the evaluation run\n * @param caseId - The unique identifier for the evaluation case\n * @param workspaceRoot - Optional custom workspace root directory\n * @returns Absolute path to the created workspace directory\n * @throws TemplateNotFoundError if the template path does not exist\n * @throws TemplateNotDirectoryError if the template path is not a directory\n * @throws WorkspaceCreationError if there's an error creating the workspace\n */\nexport async function createTempWorkspace(\n templatePath: string,\n evalRunId: string,\n caseId: string,\n workspaceRoot?: string,\n): Promise<string> {\n // Validate template path\n const resolvedTemplatePath = path.resolve(templatePath);\n\n if (!(await fileExists(resolvedTemplatePath))) {\n throw new TemplateNotFoundError(resolvedTemplatePath);\n }\n\n if (!(await isDirectory(resolvedTemplatePath))) {\n throw new TemplateNotDirectoryError(resolvedTemplatePath);\n }\n\n // Determine workspace path\n const workspacePath = getWorkspacePath(evalRunId, caseId, workspaceRoot);\n\n try {\n // Remove workspace if it already exists (clean slate)\n if (await fileExists(workspacePath)) {\n await rm(workspacePath, { recursive: true, force: true });\n }\n\n // Copy template to workspace, skipping .git\n await copyDirectoryRecursive(resolvedTemplatePath, workspacePath);\n\n return workspacePath;\n } catch (error) {\n // Check for common disk-related errors\n if (error instanceof Error) {\n const errCode = (error as NodeJS.ErrnoException).code;\n\n if (errCode === 'ENOSPC') {\n throw new WorkspaceCreationError(\n `Insufficient disk space to create workspace at ${workspacePath}`,\n error,\n );\n }\n\n if (errCode === 'EACCES' || errCode === 'EPERM') {\n throw new WorkspaceCreationError(\n `Permission denied when creating workspace at ${workspacePath}`,\n error,\n );\n }\n\n // Re-throw our own errors\n if (\n error instanceof TemplateNotFoundError ||\n error instanceof TemplateNotDirectoryError ||\n error instanceof WorkspaceCreationError\n ) {\n throw error;\n }\n\n throw new WorkspaceCreationError(\n `Failed to create workspace at ${workspacePath}: ${error.message}`,\n error,\n );\n }\n\n throw new WorkspaceCreationError(\n `Failed to create workspace at ${workspacePath}: ${String(error)}`,\n );\n }\n}\n\n/**\n * Remove a single workspace directory.\n *\n * @param workspacePath - Absolute path to the workspace directory to remove\n * @throws Error if the cleanup fails\n */\nexport async function cleanupWorkspace(workspacePath: string): Promise<void> {\n if (await fileExists(workspacePath)) {\n await rm(workspacePath, { recursive: true, force: true });\n }\n}\n\n/**\n * Remove all workspaces for an evaluation run.\n *\n * This removes the entire {workspaceRoot}/{evalRunId} directory,\n * cleaning up all case workspaces for that run.\n *\n * @param evalRunId - The unique identifier for the evaluation run\n * @param workspaceRoot - Optional custom workspace root directory\n * @throws Error if the cleanup fails\n */\nexport async function cleanupEvalWorkspaces(\n evalRunId: string,\n workspaceRoot?: string,\n): Promise<void> {\n const root = workspaceRoot ?? getWorkspacesRoot();\n const evalDir = path.join(root, evalRunId);\n\n if (await fileExists(evalDir)) {\n await rm(evalDir, { recursive: true, force: true });\n }\n}\n","import { execFile } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { existsSync } from 'node:fs';\nimport { cp, mkdir, readFile, readdir, rm, unlink, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { getWorkspacePoolRoot } from '../../paths.js';\nimport type { RepoConfig } from '../types.js';\nimport { getRepoCheckoutRef } from './repo-checkout.js';\nimport type { RepoManager } from './repo-manager.js';\n\nconst execFileAsync = promisify(execFile);\n\n/** Environment vars to force non-interactive git, stripped of hook-injected vars */\nfunction gitEnv(): Record<string, string | undefined> {\n const env = { ...process.env };\n for (const key of Object.keys(env)) {\n if (key.startsWith('GIT_') && key !== 'GIT_SSH_COMMAND') {\n delete env[key];\n }\n }\n return {\n ...env,\n GIT_TERMINAL_PROMPT: '0',\n GIT_ASKPASS: '',\n GIT_SSH_COMMAND: 'ssh -o BatchMode=yes',\n };\n}\n\nasync function git(args: string[], opts?: { cwd?: string; timeout?: number }): Promise<string> {\n const { stdout } = await execFileAsync('git', args, {\n cwd: opts?.cwd,\n timeout: opts?.timeout ?? 300_000,\n env: gitEnv(),\n maxBuffer: 50 * 1024 * 1024,\n });\n return stdout.trim();\n}\n\nexport interface AcquireWorkspaceOptions {\n templatePath?: string;\n repos: readonly RepoConfig[];\n maxSlots: number;\n repoManager: RepoManager;\n poolReset?: 'none' | 'fast' | 'strict';\n}\n\nexport interface PoolSlot {\n readonly index: number;\n readonly path: string;\n readonly isExisting: boolean;\n readonly lockPath: string;\n readonly fingerprint: string;\n readonly poolDir: string;\n}\n\ninterface PoolMetadata {\n fingerprint: string;\n templatePath: string | null;\n repos: readonly RepoConfig[];\n createdAt: string;\n}\n\n/**\n * Normalize a repo config into a canonical form for fingerprinting.\n * Git URLs are lowercased with .git suffix stripped; local paths are kept as-is.\n */\nfunction normalizeRepoForFingerprint(repo: RepoConfig): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n if (repo.path) {\n result.path = repo.path;\n }\n\n if (repo.source) {\n result.source =\n repo.source.type === 'git'\n ? { type: 'git', url: repo.source.url.toLowerCase().replace(/\\.git$/, '') }\n : { type: 'local', path: repo.source.path };\n }\n\n result.ref = getRepoCheckoutRef(repo.checkout);\n\n if (repo.clone?.depth !== undefined) {\n result.depth = repo.clone.depth;\n }\n if (repo.clone?.filter !== undefined) {\n result.filter = repo.clone.filter;\n }\n if (repo.clone?.sparse?.length) {\n result.sparse = [...repo.clone.sparse].sort();\n }\n\n return result;\n}\n\n/**\n * Compute a deterministic SHA-256 fingerprint for a workspace configuration.\n * The fingerprint captures only repo materialization inputs (source, checkout, clone options)\n * in a canonical order. Template path is excluded because template files are re-copied on\n * every pool reuse and don't affect the cloned checkout state.\n */\nexport function computeWorkspaceFingerprint(repos: readonly RepoConfig[]): string {\n const canonical = {\n repos: [...repos]\n .sort((a, b) => (a.path ?? '').localeCompare(b.path ?? ''))\n .map(normalizeRepoForFingerprint),\n };\n\n return createHash('sha256').update(JSON.stringify(canonical)).digest('hex');\n}\n\n/**\n * Recursively copy a directory, skipping .git directories and specified directory names.\n */\nasync function copyDirectoryRecursive(\n src: string,\n dest: string,\n skipDirs?: ReadonlySet<string>,\n): Promise<void> {\n await mkdir(dest, { recursive: true });\n const entries = await readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.name === '.git') {\n continue;\n }\n\n if (entry.isDirectory()) {\n if (skipDirs?.has(entry.name)) {\n continue;\n }\n await copyDirectoryRecursive(srcPath, destPath, skipDirs);\n } else {\n await cp(srcPath, destPath, { preserveTimestamps: true, force: true });\n }\n }\n}\n\n/**\n * Pools entire workspaces (template files + git repos) for reuse across eval runs.\n *\n * Pool structure:\n * ```\n * {poolRoot}/\n * {fingerprint}/\n * metadata.json # fingerprint inputs, creation timestamp\n * slot-0/ # complete workspace (template files + repos)\n * slot-0.lock # PID-based lock file\n * slot-1/ # created on concurrent demand\n * slot-1.lock\n * ```\n */\nexport class WorkspacePoolManager {\n private readonly poolRoot: string;\n\n constructor(poolRoot?: string) {\n this.poolRoot = poolRoot ?? getWorkspacePoolRoot();\n }\n\n /**\n * Acquire a workspace slot from the pool.\n *\n * 1. Compute fingerprint from template + repos\n * 2. Check drift (compare stored metadata.json fingerprint vs computed)\n * 3. If drift: warn, remove all slots, rematerialize\n * 4. Acquire a slot (try-lock slot-0, slot-1, ..., up to maxSlots)\n * 5. If slot exists: reset repos, re-copy template files (skip repo directories)\n * 6. If new slot: copy template, materialize all repos, write metadata.json\n * 7. Return the slot (with path, index, isExisting)\n */\n async acquireWorkspace(options: AcquireWorkspaceOptions): Promise<PoolSlot> {\n const { templatePath, repos, maxSlots, repoManager, poolReset } = options;\n\n const fingerprint = computeWorkspaceFingerprint(repos);\n const poolDir = path.join(this.poolRoot, fingerprint);\n await mkdir(poolDir, { recursive: true });\n\n // Check for drift\n const drifted = await this.checkDrift(poolDir, fingerprint);\n if (drifted) {\n console.warn(\n `[workspace-pool] Drift detected for fingerprint ${fingerprint.slice(0, 12)}... Removing stale slots.`,\n );\n await this.removeAllSlots(poolDir);\n }\n\n // Try to acquire a slot\n for (let i = 0; i < maxSlots; i++) {\n const slotPath = path.join(poolDir, `slot-${i}`);\n const lockPath = `${slotPath}.lock`;\n\n const locked = await this.tryLock(lockPath);\n if (!locked) {\n continue;\n }\n\n const slotExists = existsSync(slotPath);\n\n if (slotExists) {\n // Reuse existing slot: reset repos and re-copy template\n await this.resetSlot(slotPath, templatePath, repos, poolReset);\n return {\n index: i,\n path: slotPath,\n isExisting: true,\n lockPath,\n fingerprint,\n poolDir,\n };\n }\n\n // New slot: materialize from scratch\n await mkdir(slotPath, { recursive: true });\n\n if (templatePath) {\n await copyDirectoryRecursive(templatePath, slotPath);\n }\n\n if (repos.length > 0) {\n await repoManager.materializeAll(repos, slotPath);\n }\n\n await this.writeMetadata(poolDir, fingerprint, templatePath ?? null, repos);\n\n return {\n index: i,\n path: slotPath,\n isExisting: false,\n lockPath,\n fingerprint,\n poolDir,\n };\n }\n\n throw new Error(\n `All ${maxSlots} pool slots are locked for fingerprint ${fingerprint.slice(0, 12)}...`,\n );\n }\n\n /** Remove lock file to release a slot. */\n async releaseSlot(slot: PoolSlot): Promise<void> {\n try {\n await unlink(slot.lockPath);\n } catch {\n // Lock file may already be removed\n }\n }\n\n /**\n * Try to acquire a PID-based lock file.\n * On EEXIST, read PID and check if process is alive. If dead, stale lock — remove and retry.\n * Returns true if lock acquired, false if slot is actively locked.\n * Uses a bounded loop (max 3 attempts) to avoid unbounded recursion.\n */\n private async tryLock(lockPath: string): Promise<boolean> {\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n await writeFile(lockPath, String(process.pid), { flag: 'wx' });\n return true;\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') {\n throw err;\n }\n\n // Lock file exists — check if the holding process is still alive\n try {\n const pidStr = await readFile(lockPath, 'utf-8');\n const pid = Number.parseInt(pidStr.trim(), 10);\n\n if (!Number.isNaN(pid)) {\n try {\n process.kill(pid, 0); // Signal 0 checks if process exists\n // Process is alive — slot is actively locked\n return false;\n } catch {\n // Process is dead — stale lock, remove and retry\n await unlink(lockPath).catch(() => {});\n continue;\n }\n }\n } catch {\n // Can't read lock — treat as locked\n }\n\n return false;\n }\n }\n return false; // Exhausted retries\n }\n\n /**\n * Check if the stored fingerprint in metadata.json differs from the computed one.\n * Returns true if drifted, false otherwise.\n * Returns false (no drift) if metadata.json doesn't exist (first use).\n */\n private async checkDrift(poolDir: string, fingerprint: string): Promise<boolean> {\n const metadataPath = path.join(poolDir, 'metadata.json');\n try {\n const raw = await readFile(metadataPath, 'utf-8');\n const metadata = JSON.parse(raw) as PoolMetadata;\n return metadata.fingerprint !== fingerprint;\n } catch {\n // No metadata.json — first use, no drift\n return false;\n }\n }\n\n /** Write metadata.json with fingerprint, inputs, and timestamp. */\n private async writeMetadata(\n poolDir: string,\n fingerprint: string,\n templatePath: string | null,\n repos: readonly RepoConfig[],\n ): Promise<void> {\n const metadata: PoolMetadata = {\n fingerprint,\n templatePath,\n repos,\n createdAt: new Date().toISOString(),\n };\n await writeFile(path.join(poolDir, 'metadata.json'), JSON.stringify(metadata, null, 2));\n }\n\n /** Remove all slot directories and their lock files from a pool directory. */\n private async removeAllSlots(poolDir: string): Promise<void> {\n const entries = await readdir(poolDir);\n for (const entry of entries) {\n if (entry.startsWith('slot-') && !entry.endsWith('.lock')) {\n const lockPath = path.join(poolDir, `${entry}.lock`);\n // Skip slots that are actively locked by a live process\n if (existsSync(lockPath)) {\n try {\n const pidStr = await readFile(lockPath, 'utf-8');\n const pid = Number.parseInt(pidStr.trim(), 10);\n if (!Number.isNaN(pid)) {\n try {\n process.kill(pid, 0);\n console.warn(`[workspace-pool] Skipping slot ${entry}: locked by PID ${pid}`);\n continue; // Skip this slot\n } catch {\n // PID dead — safe to remove\n }\n }\n } catch {\n // Can't read lock — safe to remove\n }\n }\n await rm(path.join(poolDir, entry), { recursive: true, force: true });\n // Also remove the lock file if it exists\n await rm(lockPath, { force: true }).catch(() => {});\n }\n }\n // Remove metadata.json to force re-creation\n await rm(path.join(poolDir, 'metadata.json'), { force: true }).catch(() => {});\n }\n\n /**\n * Reset an existing slot for reuse:\n * 1. Reset repos (fetch from origin when resolve=remote, then git reset --hard && git clean per repo)\n * 2. Re-copy template files (skip repo directories)\n */\n private async resetSlot(\n slotPath: string,\n templatePath: string | undefined,\n repos: readonly RepoConfig[],\n poolReset: 'none' | 'fast' | 'strict' = 'fast',\n ): Promise<void> {\n // Reset each repo (skip source-less repos — they live inside Docker only)\n for (const repo of repos) {\n if (!repo.path || !repo.source) continue;\n const repoDir = path.join(slotPath, repo.path);\n if (!existsSync(repoDir)) {\n continue;\n }\n if (poolReset === 'none') {\n continue;\n }\n const ref = getRepoCheckoutRef(repo.checkout);\n const resolve = repo.checkout?.resolve ?? 'remote';\n\n // When resolve is 'remote', fetch latest from origin before resetting\n // so the pool slot reflects the current remote state at eval start.\n if (resolve === 'remote') {\n const fetchArgs = ['fetch', 'origin', ref];\n if (repo.clone?.depth) {\n fetchArgs.splice(1, 0, '--depth', String(repo.clone.depth));\n }\n await git(fetchArgs, { cwd: repoDir });\n await git(['reset', '--hard', 'FETCH_HEAD'], { cwd: repoDir });\n } else {\n await git(['reset', '--hard', ref], { cwd: repoDir });\n }\n // strict removes .gitignored files (node_modules, build outputs).\n // fast preserves .gitignored files, letting before_all\n // build steps survive across pool reuse cycles and avoiding expensive rebuilds.\n const cleanFlag = poolReset === 'strict' ? '-fdx' : '-fd';\n await git(['clean', cleanFlag], { cwd: repoDir });\n }\n\n // Re-copy template files, skipping repo directories\n if (templatePath) {\n const repoDirNames = new Set(\n repos\n .filter((r) => r.path)\n .map((r) => {\n // Get the top-level directory name from the repo path\n // e.g., './my-repo' -> 'my-repo', 'repos/foo' -> 'repos'\n const normalized = (r.path ?? '').replace(/^\\.\\//, '');\n return normalized.split('/')[0];\n }),\n );\n await copyDirectoryRecursive(templatePath, slotPath, repoDirNames);\n }\n }\n}\n","import { execFile } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport type { RepoConfig, RepoSource } from '../types.js';\nimport { getRepoCheckoutRef } from './repo-checkout.js';\n\n/**\n * Validation error for a local repo source path that doesn't exist or is unresolved.\n */\nexport interface LocalPathValidationError {\n readonly repoPath: string;\n readonly resolvedSourcePath: string;\n readonly reason: 'not_found' | 'empty_path';\n}\n\nconst execFileAsync = promisify(execFile);\nconst DEFAULT_TIMEOUT_MS = 300_000; // 5 minutes\n\n/** Environment vars to force non-interactive git, stripped of hook-injected vars */\nfunction gitEnv(): Record<string, string | undefined> {\n const env = { ...process.env };\n // Remove git hook environment variables that interfere with subprocess git operations\n for (const key of Object.keys(env)) {\n if (key.startsWith('GIT_') && key !== 'GIT_SSH_COMMAND') {\n delete env[key];\n }\n }\n return {\n ...env,\n GIT_TERMINAL_PROMPT: '0',\n GIT_ASKPASS: '',\n GIT_SSH_COMMAND: 'ssh -o BatchMode=yes',\n };\n}\n\nfunction getSourceUrl(source: RepoSource): string {\n return source.type === 'git' ? source.url : source.path;\n}\n\nfunction isFullCommitSha(ref: string | undefined): boolean {\n return typeof ref === 'string' && /^[0-9a-f]{40}$/i.test(ref);\n}\n\nasync function git(args: string[], opts?: { cwd?: string; timeout?: number }): Promise<string> {\n const { stdout } = await execFileAsync('git', args, {\n cwd: opts?.cwd,\n timeout: opts?.timeout ?? DEFAULT_TIMEOUT_MS,\n env: gitEnv(),\n maxBuffer: 50 * 1024 * 1024, // 50MB\n });\n return stdout.trim();\n}\n\nexport class RepoManager {\n private readonly verbose: boolean;\n\n constructor(verbose = false) {\n this.verbose = verbose;\n }\n\n /**\n * Validate that all local repo source paths exist before attempting materialization.\n * Returns an array of validation errors (empty if all paths are valid).\n */\n static validateLocalPaths(repos: readonly RepoConfig[]): readonly LocalPathValidationError[] {\n const errors: LocalPathValidationError[] = [];\n for (const repo of repos) {\n if (!repo.source || repo.source.type !== 'local') continue;\n\n const sourcePath = repo.source.path;\n if (!sourcePath || sourcePath.trim() === '') {\n errors.push({\n repoPath: repo.path ?? '(none)',\n resolvedSourcePath: sourcePath ?? '',\n reason: 'empty_path',\n });\n } else if (!existsSync(sourcePath)) {\n errors.push({\n repoPath: repo.path ?? '(none)',\n resolvedSourcePath: sourcePath,\n reason: 'not_found',\n });\n }\n }\n return errors;\n }\n\n /**\n * Format validation errors into a human-readable warning message.\n */\n static formatValidationErrors(errors: readonly LocalPathValidationError[]): string {\n const lines = errors.map((e) => {\n if (e.reason === 'empty_path') {\n return ` - repo \"${e.repoPath}\": local source path is empty (check that the env var is set)`;\n }\n return ` - repo \"${e.repoPath}\": local source path not found: ${e.resolvedSourcePath}`;\n });\n return `Local repo path validation failed:\\n${lines.join('\\n')}`;\n }\n\n private async runGit(args: string[], opts?: { cwd?: string; timeout?: number }): Promise<string> {\n const startedAt = Date.now();\n if (this.verbose) {\n console.log(`[repo] git start cwd=${opts?.cwd ?? process.cwd()} args=${args.join(' ')}`);\n }\n\n try {\n const output = await git(args, opts);\n if (this.verbose) {\n console.log(`[repo] git ok durationMs=${Date.now() - startedAt} args=${args.join(' ')}`);\n }\n return output;\n } catch (error) {\n if (this.verbose) {\n const message = error instanceof Error ? error.message : String(error);\n console.log(\n `[repo] git fail durationMs=${Date.now() - startedAt} args=${args.join(' ')} error=${message}`,\n );\n }\n throw error;\n }\n }\n\n /**\n * Clone a repo directly from source into the workspace at the configured path.\n * Handles checkout, ref resolution, ancestor walking, shallow clone, sparse checkout.\n */\n async materialize(repo: RepoConfig, workspacePath: string): Promise<void> {\n if (!repo.source || !repo.path) {\n if (this.verbose) {\n console.log(`[repo] materialize skip path=${repo.path ?? '(none)'} (no source or path)`);\n }\n return;\n }\n const targetDir = path.join(workspacePath, repo.path);\n const sourceUrl = getSourceUrl(repo.source);\n const startedAt = Date.now();\n if (this.verbose) {\n console.log(\n `[repo] materialize start path=${repo.path} source=${sourceUrl} workspace=${workspacePath}`,\n );\n }\n\n // Build clone args — clone directly from source\n const cloneArgs = ['clone'];\n\n if (repo.clone?.depth) {\n cloneArgs.push('--depth', String(repo.clone.depth));\n }\n if (repo.clone?.filter) {\n cloneArgs.push('--filter', repo.clone.filter);\n }\n\n // Clone with no checkout so we can control the checkout step\n cloneArgs.push('--no-checkout');\n // Use file:// protocol for local sources with depth/filter (required for smart transport)\n const cloneUrl =\n (repo.clone?.depth || repo.clone?.filter) && repo.source.type === 'local'\n ? `file://${sourceUrl}`\n : sourceUrl;\n cloneArgs.push(cloneUrl, targetDir);\n\n await this.runGit(cloneArgs);\n\n // Sparse checkout setup (before actual checkout)\n if (repo.clone?.sparse?.length) {\n await this.runGit(['sparse-checkout', 'init', '--cone'], { cwd: targetDir });\n await this.runGit(['sparse-checkout', 'set', ...repo.clone.sparse], { cwd: targetDir });\n }\n\n // Resolve ref\n const ref = getRepoCheckoutRef(repo.checkout);\n const resolve = repo.checkout?.resolve ?? 'remote';\n const baseCommit = repo.checkout?.base_commit;\n const shouldResolveLocally =\n resolve === 'local' || (repo.source.type === 'git' && isFullCommitSha(baseCommit));\n\n let resolvedSha: string;\n if (!shouldResolveLocally && repo.source.type === 'git') {\n // Resolve via ls-remote for remote refs\n const url = getSourceUrl(repo.source);\n try {\n const lsOutput = await this.runGit(['ls-remote', url, ref]);\n const match = lsOutput.split('\\t')[0];\n if (!match) {\n throw new Error(`Ref '${ref}' not found on remote ${url}`);\n }\n resolvedSha = match;\n } catch (err) {\n if (err instanceof Error && err.message.includes('not found')) throw err;\n // Might be a SHA already — try direct checkout\n resolvedSha = ref;\n }\n } else {\n // Resolve locally from the cloned repo\n resolvedSha = ref;\n }\n\n // Checkout\n if (this.verbose) {\n console.log(\n `[repo] checkout path=${repo.path} ref=${ref} resolved=${resolvedSha} resolve=${resolve}`,\n );\n }\n await this.runGit(['checkout', resolvedSha], { cwd: targetDir });\n\n // Walk ancestors if requested\n const ancestor = repo.checkout?.ancestor ?? 0;\n if (ancestor > 0) {\n try {\n const ancestorSha = await this.runGit(['rev-parse', `HEAD~${ancestor}`], {\n cwd: targetDir,\n });\n await this.runGit(['checkout', ancestorSha], { cwd: targetDir });\n } catch {\n // Try to deepen if shallow\n if (repo.clone?.depth) {\n await this.runGit(['fetch', '--deepen', String(ancestor)], { cwd: targetDir });\n const ancestorSha = await this.runGit(['rev-parse', `HEAD~${ancestor}`], {\n cwd: targetDir,\n });\n await this.runGit(['checkout', ancestorSha], { cwd: targetDir });\n } else {\n throw new Error(\n `Cannot resolve ancestor ${ancestor} of ref '${ref}'. ` +\n `If using shallow clone, increase clone.depth to at least ${ancestor + 1}.`,\n );\n }\n }\n }\n\n if (this.verbose) {\n console.log(\n `[repo] materialize done path=${repo.path} target=${targetDir} durationMs=${Date.now() - startedAt}`,\n );\n }\n }\n\n /** Materialize all repos into the workspace. Skips repos without source (Docker-only repos). */\n async materializeAll(repos: readonly RepoConfig[], workspacePath: string): Promise<void> {\n const materializableRepos = repos.filter((r) => r.source);\n if (this.verbose) {\n console.log(\n `[repo] materializeAll count=${materializableRepos.length} (${repos.length - materializableRepos.length} skipped, no source) workspace=${workspacePath}`,\n );\n }\n for (const repo of materializableRepos) {\n await this.materialize(repo, workspacePath);\n }\n if (this.verbose) {\n console.log('[repo] materializeAll complete');\n }\n }\n\n /** Reset repos in workspace to their checkout state. Skips repos without path or source. */\n async reset(\n repos: readonly RepoConfig[],\n workspacePath: string,\n reset: 'fast' | 'strict',\n ): Promise<void> {\n const cleanFlag = reset === 'strict' ? '-fdx' : '-fd';\n for (const repo of repos) {\n if (!repo.path || !repo.source) continue;\n const targetDir = path.join(workspacePath, repo.path);\n await this.runGit(['reset', '--hard', 'HEAD'], { cwd: targetDir });\n await this.runGit(['clean', cleanFlag], { cwd: targetDir });\n }\n }\n}\n","import { readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\n\nexport interface ResolvedWorkspaceTemplate {\n /** Directory to copy as the working directory (for createTempWorkspace / request.cwd) */\n readonly dir: string;\n /** Optional .code-workspace file for VS Code providers */\n readonly workspaceFile?: string;\n}\n\n/**\n * Resolves a workspace.template value into a directory + optional .code-workspace file.\n *\n * Resolution rules:\n * - .code-workspace file → dir = parent directory, workspaceFile = the file\n * - Directory with exactly 1 .code-workspace → dir = directory, workspaceFile = that file\n * - Directory with N .code-workspace → dir = directory, workspaceFile = template.code-workspace (if present)\n * - Directory with 0 .code-workspace → dir = directory, workspaceFile = undefined\n */\nexport async function resolveWorkspaceTemplate(\n templatePath: string | undefined,\n): Promise<ResolvedWorkspaceTemplate | undefined> {\n if (!templatePath) {\n return undefined;\n }\n\n const resolved = path.resolve(templatePath);\n const stats = await stat(resolved);\n\n if (stats.isFile()) {\n // Direct .code-workspace file reference\n return {\n dir: path.dirname(resolved),\n workspaceFile: resolved,\n };\n }\n\n if (!stats.isDirectory()) {\n throw new Error(`workspace template is neither a file nor a directory: ${resolved}`);\n }\n\n // Scan for .code-workspace files in the directory (top-level only)\n const entries = await readdir(resolved);\n const workspaceFiles = entries.filter((e) => e.endsWith('.code-workspace'));\n\n if (workspaceFiles.length === 1) {\n return {\n dir: resolved,\n workspaceFile: path.join(resolved, workspaceFiles[0] as string),\n };\n }\n\n if (workspaceFiles.length > 1) {\n const conventionFile = workspaceFiles.find((f) => f === 'template.code-workspace');\n return {\n dir: resolved,\n workspaceFile: conventionFile ? path.join(resolved, conventionFile) : undefined,\n };\n }\n\n // No .code-workspace files\n return { dir: resolved };\n}\n","import { execFileWithStdin } from '../../runtime/exec.js';\nimport type { WorkspaceScriptConfig } from '../types.js';\n\n/**\n * Context passed to workspace lifecycle scripts via stdin.\n */\nexport interface ScriptExecutionContext {\n readonly workspacePath: string;\n readonly testId: string;\n readonly evalRunId: string;\n readonly caseInput?: string;\n readonly caseMetadata?: Record<string, unknown>;\n /** Directory containing the eval YAML file. Used as fallback cwd. */\n readonly evalDir?: string;\n /** Directory containing the workspace file (when workspace is a file reference).\n * Takes priority over evalDir as default cwd so that file-referenced templates\n * resolve relative paths from their own directory. */\n readonly workspaceFileDir?: string;\n}\n\nexport type ScriptFailureMode = 'fatal' | 'warn';\n\n/**\n * Interpolates {{variable}} placeholders in command args with values from the script context.\n * Unrecognized variables are left as-is.\n * Note: optional fields (case_input, case_metadata) coerce to empty string for arg interpolation,\n * while stdin JSON uses null — empty string is more useful as a command arg than \"null\".\n */\nfunction interpolateArgs(args: readonly string[], context: ScriptExecutionContext): string[] {\n const vars: Record<string, string> = {\n workspace_path: context.workspacePath,\n test_id: context.testId,\n eval_run_id: context.evalRunId,\n case_input: context.caseInput ?? '',\n case_metadata: context.caseMetadata ? JSON.stringify(context.caseMetadata) : '',\n };\n\n return args.map((arg) => arg.replace(/\\{\\{(\\w+)\\}\\}/g, (match, name) => vars[name] ?? match));\n}\n\n/**\n * Executes a workspace lifecycle command (before_all, after_all, before_each, after_each).\n *\n * @param config - Workspace command configuration (command, timeout_ms, cwd)\n * @param context - Context passed to command via stdin (JSON)\n * @param failureMode - 'fatal' throws on non-zero exit; 'warn' logs warning\n * @returns Captured stdout from the command\n * @throws Error if command exits with non-zero code (fatal mode) or times out\n */\nexport async function executeWorkspaceScript(\n config: WorkspaceScriptConfig,\n context: ScriptExecutionContext,\n failureMode: ScriptFailureMode = 'fatal',\n): Promise<string> {\n const stdin = JSON.stringify({\n workspace_path: context.workspacePath,\n test_id: context.testId,\n eval_run_id: context.evalRunId,\n case_input: context.caseInput ?? null,\n case_metadata: context.caseMetadata ?? null,\n });\n\n const timeoutMs = config.timeout_ms ?? (failureMode === 'fatal' ? 60000 : 30000);\n const cwd = config.cwd ?? context.workspaceFileDir ?? context.evalDir;\n\n // Support both command (canonical) and script (deprecated alias)\n if (config.script !== undefined && config.command === undefined) {\n console.warn(\n \"\\u001b[33mWarning: 'script' is deprecated in workspace config. Use 'command' instead.\\u001b[0m\",\n );\n }\n const rawCommand = config.command ?? config.script ?? [];\n const commandArray = interpolateArgs(rawCommand, context);\n\n const result = await execFileWithStdin(commandArray, stdin, {\n timeoutMs,\n cwd,\n });\n\n if (result.exitCode !== 0) {\n const stderr = result.stderr.trim();\n const message = stderr ? `${stderr}` : `Process exited with code ${result.exitCode}`;\n if (failureMode === 'fatal') {\n throw new Error(`Script failed: ${message}`);\n }\n console.warn(`Script warning: ${message}`);\n }\n\n return result.stdout;\n}\n","import { readFile, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\n\nimport { collectResolvedInputFilePaths } from './input-message-utils.js';\nimport { interpolateEnv } from './interpolation.js';\nimport { loadTestsFromAgentSkills } from './loaders/agent-skills-parser.js';\nimport {\n expandFileReferences,\n loadCasesFromDirectory,\n loadCasesFromFile,\n} from './loaders/case-file-loader.js';\nimport {\n extractBudgetUsd,\n extractCacheConfig,\n extractFailOnError,\n extractTargetFromSuite,\n extractTargetRefsFromSuite,\n extractTargetsFromSuite,\n extractTargetsFromTestCase,\n extractThreshold,\n extractTrialsConfig,\n extractWorkersFromSuite,\n loadConfig,\n} from './loaders/config-loader.js';\nimport { buildSearchRoots, resolveToAbsolutePath } from './loaders/file-resolver.js';\nimport {\n coerceEvaluator,\n parseGraders,\n parseInlineRubrics,\n parsePreprocessors,\n warnUnconsumedCriteria,\n} from './loaders/grader-parser.js';\nimport { detectFormat, loadTestsFromJsonl } from './loaders/jsonl-parser.js';\nimport { processExpectedMessages, processMessages } from './loaders/message-processor.js';\nimport {\n expandInputShorthand,\n resolveExpectedMessages,\n resolveInputMessages,\n} from './loaders/shorthand-expansion.js';\nimport { parseMetadata } from './metadata.js';\nimport type {\n ConversationAggregation,\n ConversationMode,\n ConversationTurn,\n DockerWorkspaceConfig,\n EvalTest,\n GraderConfig,\n JsonObject,\n JsonValue,\n RepoConfig,\n TestMessage,\n TestMessageContent,\n TrialsConfig,\n TurnFailurePolicy,\n WorkspaceConfig,\n WorkspaceEnvConfig,\n WorkspaceHookConfig,\n WorkspaceHooksConfig,\n WorkspaceScriptConfig,\n} from './types.js';\nimport { isJsonObject, isTestMessage } from './types.js';\nimport { parseRepoConfig } from './workspace/repo-config-parser.js';\nimport { parseYamlValue } from './yaml-loader.js';\n\n// Re-export public APIs from modules\nexport { buildPromptInputs, type PromptInputs } from './formatting/prompt-builder.js';\nexport {\n DEFAULT_EVAL_PATTERNS,\n extractCacheConfig,\n extractFailOnError,\n extractTargetFromSuite,\n extractTargetRefsFromSuite,\n extractTargetsFromSuite,\n extractTargetsFromTestCase,\n extractThreshold,\n extractTrialsConfig,\n extractWorkersFromSuite,\n loadConfig,\n} from './loaders/config-loader.js';\nexport type { AgentVConfig, CacheConfig, ExecutionDefaults } from './loaders/config-loader.js';\nexport { detectFormat } from './loaders/jsonl-parser.js';\nexport type { EvalMetadata } from './metadata.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RED = '\\u001b[31m';\nconst ANSI_RESET = '\\u001b[0m';\n\ntype LoadOptions = {\n readonly verbose?: boolean;\n /** Filter tests by ID pattern(s) (glob supported, e.g., \"summary-*\"). Arrays use OR logic. */\n readonly filter?: string | readonly string[];\n /** Category derived from the eval file's directory path */\n readonly category?: string;\n};\n\nfunction matchesFilter(id: string, filter: string | readonly string[]): boolean {\n return typeof filter === 'string'\n ? micromatch.isMatch(id, filter)\n : filter.some((pattern) => micromatch.isMatch(id, pattern));\n}\n\ntype RawTestSuite = JsonObject & {\n readonly tests?: JsonValue;\n /** @deprecated Use `tests` instead */\n readonly eval_cases?: JsonValue;\n /** @deprecated Use `tests` instead */\n readonly evalcases?: JsonValue;\n readonly target?: JsonValue;\n readonly execution?: JsonValue;\n readonly workspace?: JsonValue;\n readonly assertions?: JsonValue;\n readonly preprocessors?: JsonValue;\n /** @deprecated Use `assertions` instead */\n readonly assert?: JsonValue;\n readonly input?: JsonValue;\n /** Shorthand: list of file paths to prepend as type:file content blocks in each test's user message. */\n readonly input_files?: JsonValue;\n // Suite-level metadata fields\n readonly name?: JsonValue;\n readonly description?: JsonValue;\n readonly category?: string;\n readonly version?: JsonValue;\n readonly author?: JsonValue;\n readonly tags?: JsonValue;\n readonly license?: JsonValue;\n readonly requires?: JsonValue;\n};\n\ntype RawEvalCase = JsonObject & {\n readonly id?: JsonValue;\n readonly conversation_id?: JsonValue;\n readonly criteria?: JsonValue;\n /** @deprecated Use `criteria` instead */\n readonly expected_outcome?: JsonValue;\n readonly input?: JsonValue;\n /** Shorthand: list of file paths to prepend as type:file content blocks in the user message. */\n readonly input_files?: JsonValue;\n readonly expected_output?: JsonValue;\n readonly execution?: JsonValue;\n readonly evaluators?: JsonValue;\n readonly assertions?: JsonValue;\n /** @deprecated Use `assertions` instead */\n readonly assert?: JsonValue;\n readonly rubrics?: JsonValue;\n readonly workspace?: JsonValue;\n readonly metadata?: JsonValue;\n};\n\nfunction resolveTests(suite: RawTestSuite): JsonValue | undefined {\n if (suite.tests !== undefined) return suite.tests;\n if (suite.eval_cases !== undefined) {\n logWarning(\"'eval_cases' is deprecated. Use 'tests' instead.\");\n return suite.eval_cases;\n }\n if (suite.evalcases !== undefined) {\n logWarning(\"'evalcases' is deprecated. Use 'tests' instead.\");\n return suite.evalcases;\n }\n return undefined;\n}\n\n/**\n * Read metadata from a test suite file (like target name).\n * This is a convenience function for CLI tools that need metadata without loading all tests.\n */\nexport async function readTestSuiteMetadata(testFilePath: string): Promise<{\n target?: string;\n targets?: readonly string[];\n targetRefs?: readonly import('./types.js').EvalTargetRef[];\n trials?: TrialsConfig;\n}> {\n try {\n const absolutePath = path.resolve(testFilePath);\n const content = await readFile(absolutePath, 'utf8');\n const parsed = interpolateEnv(parseYamlValue(content), process.env) as unknown;\n\n if (!isJsonObject(parsed)) {\n return {};\n }\n\n return {\n target: extractTargetFromSuite(parsed),\n targets: extractTargetsFromSuite(parsed),\n targetRefs: extractTargetRefsFromSuite(parsed),\n trials: extractTrialsConfig(parsed),\n };\n } catch {\n return {};\n }\n}\n\n/**\n * Load tests from an AgentV specification file (YAML or JSONL).\n * Format is detected by file extension: .yaml/.yml for YAML, .jsonl for JSONL.\n */\nexport type EvalSuiteResult = {\n readonly tests: readonly EvalTest[];\n readonly trials?: TrialsConfig;\n /** Suite-level targets from execution.targets (matrix evaluation) */\n readonly targets?: readonly string[];\n /** Suite-level target refs with hooks from execution.targets (object form) */\n readonly targetRefs?: readonly import('./types.js').EvalTargetRef[];\n /** Suite-level workers from execution.workers */\n readonly workers?: number;\n /** Suite-level cache config from execution.cache */\n readonly cacheConfig?: import('./loaders/config-loader.js').CacheConfig;\n /** Suite-level metadata (name, description, version, etc.) */\n readonly metadata?: import('./metadata.js').EvalMetadata;\n /** Suite-level total cost budget in USD */\n readonly budgetUsd?: number;\n /** Execution error tolerance: true or false */\n readonly failOnError?: import('./types.js').FailOnError;\n /** Suite-level quality threshold (0-1) — suite fails if mean score is below */\n readonly threshold?: number;\n /** Resolved workspace.path from the eval YAML (after env-var expansion), if set */\n readonly workspacePath?: string;\n /** Inline target definition from a TS eval config. */\n readonly inlineTarget?: import('./providers/types.js').TargetDefinition;\n /** Custom provider factory from a TS eval config task(). */\n readonly providerFactory?: import('./providers/provider-registry.js').ProviderFactoryFn;\n};\n\n/**\n * Load tests and suite metadata from a single parse.\n * Prefer this over calling loadTests + readTestSuiteMetadata separately.\n */\nexport async function loadTestSuite(\n evalFilePath: string,\n repoRoot: URL | string,\n options?: LoadOptions,\n): Promise<EvalSuiteResult> {\n const format = detectFormat(evalFilePath);\n if (format === 'jsonl') {\n return { tests: await loadTestsFromJsonl(evalFilePath, repoRoot, options) };\n }\n if (format === 'agent-skills-json') {\n return { tests: await loadTestsFromAgentSkills(evalFilePath) };\n }\n if (format === 'typescript') {\n const { loadTsEvalSuite } = await import('./loaders/ts-eval-loader.js');\n return loadTsEvalSuite(evalFilePath, resolveToAbsolutePath(repoRoot), options);\n }\n const { tests, parsed, suiteWorkspacePath } = await loadTestsFromYaml(\n evalFilePath,\n repoRoot,\n options,\n );\n const metadata = parseMetadata(parsed);\n const failOnError = extractFailOnError(parsed);\n const threshold = extractThreshold(parsed);\n return {\n tests,\n trials: extractTrialsConfig(parsed),\n targets: extractTargetsFromSuite(parsed),\n targetRefs: extractTargetRefsFromSuite(parsed),\n workers: extractWorkersFromSuite(parsed),\n cacheConfig: extractCacheConfig(parsed),\n budgetUsd: extractBudgetUsd(parsed),\n ...(metadata !== undefined && { metadata }),\n ...(failOnError !== undefined && { failOnError }),\n ...(threshold !== undefined && { threshold }),\n ...(suiteWorkspacePath !== undefined && { workspacePath: suiteWorkspacePath }),\n };\n}\n\n/** @deprecated Use `loadTestSuite` instead */\nexport const loadEvalSuite = loadTestSuite;\n\nexport async function loadTests(\n evalFilePath: string,\n repoRoot: URL | string,\n options?: LoadOptions,\n): Promise<readonly EvalTest[]> {\n // Detect format and route to appropriate parser\n const format = detectFormat(evalFilePath);\n if (format === 'jsonl') {\n return loadTestsFromJsonl(evalFilePath, repoRoot, options);\n }\n if (format === 'agent-skills-json') {\n return loadTestsFromAgentSkills(evalFilePath);\n }\n if (format === 'typescript') {\n const { loadTsEvalSuite } = await import('./loaders/ts-eval-loader.js');\n const suite = await loadTsEvalSuite(evalFilePath, resolveToAbsolutePath(repoRoot), options);\n return suite.tests;\n }\n const { tests } = await loadTestsFromYaml(evalFilePath, repoRoot, options);\n return tests;\n}\n\n/** @deprecated Use `loadTests` instead */\nexport const loadEvalCases = loadTests;\n\nasync function loadTestsFromYaml(\n evalFilePath: string,\n repoRoot: URL | string,\n options?: LoadOptions,\n): Promise<{ tests: readonly EvalTest[]; parsed: JsonObject; suiteWorkspacePath?: string }> {\n // YAML parsing (existing implementation)\n const verbose = options?.verbose ?? false;\n const filterPattern = options?.filter;\n const absoluteTestPath = path.resolve(evalFilePath);\n\n const repoRootPath = resolveToAbsolutePath(repoRoot);\n const searchRoots = buildSearchRoots(absoluteTestPath, repoRootPath);\n\n // Load configuration (walks up directory tree to repo root)\n const config = await loadConfig(absoluteTestPath, repoRootPath);\n\n const rawFile = await readFile(absoluteTestPath, 'utf8');\n const interpolated = interpolateEnv(parseYamlValue(rawFile), process.env) as unknown;\n if (!isJsonObject(interpolated)) {\n throw new Error(`Invalid test file format: ${evalFilePath}`);\n }\n\n const suite = interpolated as RawTestSuite;\n const suiteNameFromFile = asString(suite.name)?.trim();\n const fallbackSuiteName =\n path\n .basename(absoluteTestPath)\n .replace(/\\.eval\\.ya?ml$/i, '')\n .replace(/\\.ya?ml$/i, '') || 'eval';\n const suiteName =\n suiteNameFromFile && suiteNameFromFile.length > 0 ? suiteNameFromFile : fallbackSuiteName;\n\n const rawTestCases = resolveTests(suite);\n\n const globalEvaluator = coerceEvaluator(suite.evaluator, 'global') ?? 'llm-grader';\n const suitePreprocessors = await parsePreprocessors(\n suite.preprocessors,\n searchRoots,\n '<suite>',\n absoluteTestPath,\n );\n\n // Parse suite-level workspace config (default for all cases)\n const evalFileDir = path.dirname(absoluteTestPath);\n\n // Resolve tests: string path to external file/directory, inline array, or error\n let expandedTestCases: readonly JsonValue[];\n if (typeof rawTestCases === 'string') {\n const externalPath = path.resolve(evalFileDir, rawTestCases);\n let isDir = false;\n try {\n const pathStat = await stat(externalPath);\n isDir = pathStat.isDirectory();\n } catch {\n // Path doesn't exist — fall through to loadCasesFromFile for its error message\n }\n if (isDir) {\n expandedTestCases = await loadCasesFromDirectory(externalPath);\n } else {\n expandedTestCases = await loadCasesFromFile(externalPath);\n }\n } else if (Array.isArray(rawTestCases)) {\n // Inline array: expand any file:// references\n expandedTestCases = await expandFileReferences(rawTestCases, evalFileDir);\n } else {\n throw new Error(`Invalid test file format: ${evalFilePath} - missing 'tests' field`);\n }\n\n const suiteWorkspace = await resolveWorkspaceConfig(suite.workspace, evalFileDir);\n\n // Suite-level governance block (top-level `governance:` wins over `metadata.governance:`).\n // Merged into each case's `metadata.governance` via mergeSuiteMetadataPayload.\n const suiteGovernance = extractSuiteGovernance(suite);\n\n // Resolve suite-level input (prepended to each test's input messages)\n const suiteInputMessages = expandInputShorthand(suite.input);\n\n // Suite-level input_files: passed to resolveInputMessages for each test\n const suiteInputFiles = suite.input_files;\n\n // Extract global target from execution.target (or legacy root-level target)\n const rawGlobalExecution = isJsonObject(suite.execution) ? suite.execution : undefined;\n const _globalTarget = asString(rawGlobalExecution?.target) ?? asString(suite.target);\n\n // Build global execution context, including suite-level assertions (which is a sibling of execution)\n // Also accept legacy `assert` key with a deprecation warning\n const suiteAssertions = suite.assertions ?? suite.assert;\n if (suite.assert !== undefined && suite.assertions === undefined) {\n logWarning(\"'assert' is deprecated at the suite level. Use 'assertions' instead.\");\n }\n const globalExecution: JsonObject | undefined =\n suiteAssertions !== undefined\n ? { ...(rawGlobalExecution ?? {}), assertions: suiteAssertions }\n : rawGlobalExecution;\n\n const results: EvalTest[] = [];\n\n for (const rawTestCase of expandedTestCases) {\n if (!isJsonObject(rawTestCase)) {\n logWarning('Skipping invalid test entry (expected object)');\n continue;\n }\n\n const testCaseConfig = rawTestCase as RawEvalCase;\n const id = asString(testCaseConfig.id);\n\n // Skip tests that don't match the filter pattern (glob supported)\n if (filterPattern && (!id || !matchesFilter(id, filterPattern))) {\n continue;\n }\n\n const conversationId = asString(testCaseConfig.conversation_id);\n let outcome = asString(testCaseConfig.criteria);\n if (!outcome && testCaseConfig.expected_outcome !== undefined) {\n outcome = asString(testCaseConfig.expected_outcome);\n if (outcome) {\n logWarning(\n `Test '${asString(testCaseConfig.id) ?? 'unknown'}': 'expected_outcome' is deprecated. Use 'criteria' instead.`,\n );\n }\n }\n\n // Extract per-case execution config early (reused below for skip_defaults)\n const caseExecution = isJsonObject(testCaseConfig.execution)\n ? testCaseConfig.execution\n : undefined;\n const skipDefaults = caseExecution?.skip_defaults === true;\n const caseThreshold =\n typeof caseExecution?.threshold === 'number' &&\n (caseExecution.threshold as number) >= 0 &&\n (caseExecution.threshold as number) <= 1\n ? (caseExecution.threshold as number)\n : undefined;\n\n // Resolve input with shorthand support (pass suite-level input_files for merge)\n const effectiveSuiteInputFiles = suiteInputFiles && !skipDefaults ? suiteInputFiles : undefined;\n const testInputMessages = resolveInputMessages(testCaseConfig, effectiveSuiteInputFiles);\n // Resolve expected_output with shorthand support\n const expectedMessages = resolveExpectedMessages(testCaseConfig) ?? [];\n\n // A test is complete when it has id, input, and at least one of: criteria, expected_output, assertions, or turns (conversation mode)\n const hasEvaluationSpec =\n !!outcome ||\n expectedMessages.length > 0 ||\n testCaseConfig.assertions !== undefined ||\n testCaseConfig.assert !== undefined ||\n (Array.isArray(testCaseConfig.turns) && testCaseConfig.turns.length > 0);\n if (!id || !hasEvaluationSpec || !testInputMessages || testInputMessages.length === 0) {\n logError(\n `Skipping incomplete test: ${id ?? 'unknown'}. Missing required fields: id, input, and at least one of criteria/expected_output/assertions/turns`,\n );\n continue;\n }\n\n // Prepend suite-level input to test input (respecting skip_defaults)\n const effectiveSuiteInputMessages =\n suiteInputMessages && !skipDefaults ? suiteInputMessages : undefined;\n\n // expected_output is optional - for outcome-only evaluation\n const hasExpectedMessages = expectedMessages.length > 0;\n\n const inputTextParts: string[] = [];\n\n // Process suite-level input first\n const suiteResolvedInputMessages = effectiveSuiteInputMessages\n ? await processMessages({\n messages: effectiveSuiteInputMessages,\n searchRoots,\n repoRootPath,\n textParts: inputTextParts,\n messageType: 'input',\n verbose,\n })\n : [];\n\n // Process test-level input\n const testResolvedInputMessages = await processMessages({\n messages: testInputMessages,\n searchRoots,\n repoRootPath,\n textParts: inputTextParts,\n messageType: 'input',\n verbose,\n });\n const inputMessages = [...suiteResolvedInputMessages, ...testResolvedInputMessages];\n\n // Process expected_output into segments (only if provided)\n // Preserve full message structure including role and tool_calls for evaluator\n const outputSegments = hasExpectedMessages\n ? await processExpectedMessages({\n messages: expectedMessages,\n searchRoots,\n repoRootPath,\n verbose,\n })\n : [];\n\n // Build reference_answer:\n // Extract the content from the last message in expected_output (similar to answer)\n let referenceAnswer = '';\n if (outputSegments.length > 0) {\n // Get the last message\n const lastMessage = outputSegments[outputSegments.length - 1];\n const content = lastMessage.content;\n const toolCalls = lastMessage.tool_calls;\n\n if (typeof content === 'string') {\n referenceAnswer = content;\n } else if (content !== undefined && content !== null) {\n // Serialize just the content, not the entire message\n referenceAnswer = JSON.stringify(content, null, 2);\n } else if (toolCalls !== undefined && toolCalls !== null) {\n // Message with only tool_calls - serialize just the tool_calls\n referenceAnswer = JSON.stringify(toolCalls, null, 2);\n }\n }\n const question = inputTextParts\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .join(' ');\n\n const testCaseEvaluatorKind = coerceEvaluator(testCaseConfig.evaluator, id) ?? globalEvaluator;\n let evaluators: Awaited<ReturnType<typeof parseGraders>>;\n try {\n evaluators = await parseGraders(\n testCaseConfig,\n globalExecution,\n searchRoots,\n id ?? 'unknown',\n suitePreprocessors,\n );\n } catch (error) {\n // Skip entire test if evaluator validation fails\n const message = error instanceof Error ? error.message : String(error);\n logError(`Skipping test '${id}': ${message}`);\n continue;\n }\n\n // Handle inline rubrics field (deprecated: use assertions: [{type: rubrics, criteria: [...]}] instead)\n const inlineRubrics = testCaseConfig.rubrics;\n if (inlineRubrics !== undefined && Array.isArray(inlineRubrics)) {\n const rubricEvaluator = parseInlineRubrics(inlineRubrics);\n if (rubricEvaluator) {\n // Prepend rubric evaluator to existing evaluators\n evaluators = evaluators ? [rubricEvaluator, ...evaluators] : [rubricEvaluator];\n }\n }\n\n warnUnconsumedCriteria(outcome, evaluators, id ?? 'unknown');\n\n const userFilePaths = collectResolvedInputFilePaths(inputMessages);\n\n // Parse per-case workspace config and merge with suite-level\n const caseWorkspace = await resolveWorkspaceConfig(testCaseConfig.workspace, evalFileDir);\n const mergedWorkspace = mergeWorkspaceConfigs(suiteWorkspace, caseWorkspace);\n\n // Parse per-case metadata, then merge suite-level metadata payload.\n // Arrays concatenate (suite-first, deduplicated), scalars on the case win.\n const rawCaseMetadata = isJsonObject(testCaseConfig.metadata)\n ? (testCaseConfig.metadata as Record<string, unknown>)\n : undefined;\n const suitePayload =\n suiteGovernance !== undefined ? { governance: suiteGovernance } : undefined;\n const metadata = mergeSuiteMetadataPayload(rawCaseMetadata, suitePayload);\n\n // Extract per-test targets override (matrix evaluation)\n const caseTargets = extractTargetsFromTestCase(testCaseConfig as JsonObject);\n\n // Extract dependency fields\n const dependsOn = Array.isArray(testCaseConfig.depends_on)\n ? (testCaseConfig.depends_on as readonly string[]).filter(\n (v): v is string => typeof v === 'string',\n )\n : undefined;\n const onDependencyFailureRaw = asString(testCaseConfig.on_dependency_failure);\n const onDependencyFailure =\n onDependencyFailureRaw === 'skip' ||\n onDependencyFailureRaw === 'fail' ||\n onDependencyFailureRaw === 'run'\n ? (onDependencyFailureRaw as import('./types.js').DependencyFailurePolicy)\n : undefined;\n\n // Extract conversation mode fields\n const modeRaw = asString(testCaseConfig.mode);\n const mode: ConversationMode | undefined =\n modeRaw === 'conversation' ? 'conversation' : undefined;\n const turns = Array.isArray(testCaseConfig.turns)\n ? parseTurns(testCaseConfig.turns as readonly unknown[])\n : undefined;\n const aggregationRaw = asString(testCaseConfig.aggregation);\n const aggregation: ConversationAggregation | undefined =\n aggregationRaw === 'mean' || aggregationRaw === 'min' || aggregationRaw === 'max'\n ? aggregationRaw\n : undefined;\n const onTurnFailureRaw = asString(testCaseConfig.on_turn_failure);\n const onTurnFailure: TurnFailurePolicy | undefined =\n onTurnFailureRaw === 'continue' || onTurnFailureRaw === 'stop' ? onTurnFailureRaw : undefined;\n const windowSize =\n typeof testCaseConfig.window_size === 'number' && testCaseConfig.window_size >= 1\n ? (testCaseConfig.window_size as number)\n : undefined;\n\n const testCase: EvalTest = {\n id,\n suite: suiteName,\n category: suite.category ?? options?.category,\n conversation_id: conversationId,\n question: question,\n input: inputMessages,\n expected_output: outputSegments,\n reference_answer: referenceAnswer,\n file_paths: userFilePaths,\n criteria: outcome ?? '',\n evaluator: testCaseEvaluatorKind,\n assertions: evaluators,\n ...(suitePreprocessors ? { preprocessors: suitePreprocessors } : {}),\n workspace: mergedWorkspace,\n metadata,\n targets: caseTargets,\n ...(caseThreshold !== undefined ? { threshold: caseThreshold } : {}),\n ...(mode ? { mode } : {}),\n ...(turns && turns.length > 0 ? { turns } : {}),\n ...(aggregation ? { aggregation } : {}),\n ...(onTurnFailure ? { on_turn_failure: onTurnFailure } : {}),\n ...(windowSize !== undefined ? { window_size: windowSize } : {}),\n ...(dependsOn && dependsOn.length > 0 ? { depends_on: dependsOn } : {}),\n ...(onDependencyFailure ? { on_dependency_failure: onDependencyFailure } : {}),\n };\n\n results.push(testCase);\n }\n\n return { tests: results, parsed: suite, suiteWorkspacePath: suiteWorkspace?.path };\n}\n\n/**\n * Load a single test by exact ID match.\n * Throws if the ID is not found.\n */\nexport async function loadTestById(\n evalFilePath: string,\n repoRoot: URL | string,\n evalId: string,\n): Promise<EvalTest> {\n const tests = await loadTests(evalFilePath, repoRoot);\n const match = tests.find((c) => c.id === evalId);\n if (!match) {\n const available = tests.map((c) => c.id).join(', ');\n throw new Error(`Test '${evalId}' not found in ${evalFilePath}. Available IDs: ${available}`);\n }\n return match;\n}\n\n/** @deprecated Use `loadTestById` instead */\nexport const loadEvalCaseById = loadTestById;\n\n/**\n * Parse raw turn data from YAML into typed ConversationTurn objects.\n * String assertions are preserved as-is — they become rubric criteria at runtime.\n * Structured assertion objects pass through unchanged.\n */\nfunction parseTurns(rawTurns: readonly unknown[]): ConversationTurn[] {\n return rawTurns.map((rawTurn) => {\n const turn = rawTurn as Record<string, unknown>;\n const input = turn.input as TestMessageContent;\n const expectedOutput = turn.expected_output as TestMessageContent | undefined;\n\n // Parse per-turn assertions (string shorthand or structured evaluator config)\n let assertions: (string | GraderConfig)[] | undefined;\n if (Array.isArray(turn.assertions)) {\n assertions = turn.assertions.map((a: unknown) => {\n if (typeof a === 'string') return a;\n // Structured evaluator config — pass through as-is (validated by Zod schema)\n return a as GraderConfig;\n });\n }\n\n return {\n input,\n ...(expectedOutput !== undefined ? { expected_output: expectedOutput } : {}),\n ...(assertions && assertions.length > 0 ? { assertions } : {}),\n };\n });\n}\n\n/**\n * Normalize a command value from YAML into a string array.\n * Accepts a string (split on whitespace) or an array of strings.\n */\nfunction parseCommandArray(source: unknown): string[] | undefined {\n if (typeof source === 'string') {\n const parts = source.trim().split(/\\s+/);\n return parts.length > 0 && parts[0] !== '' ? parts : undefined;\n }\n if (Array.isArray(source)) {\n const arr = source.filter((s): s is string => typeof s === 'string');\n return arr.length > 0 ? arr : undefined;\n }\n return undefined;\n}\n\n/**\n * Parse a WorkspaceScriptConfig from raw YAML value.\n * Accepts both `command` (preferred) and `script` (deprecated alias).\n * Command can be an array of strings or a single string (auto-split on whitespace).\n * Note: string commands are split naively on whitespace. For arguments containing\n * spaces, use the array form: command: [\"node\", \"path with spaces/setup.mjs\"]\n */\nfunction parseWorkspaceScriptConfig(\n raw: unknown,\n evalFileDir: string,\n): WorkspaceScriptConfig | undefined {\n if (!isJsonObject(raw)) return undefined;\n const obj = raw as Record<string, unknown>;\n // Precedence: command > script (deprecated)\n if (obj.script !== undefined && obj.command === undefined) {\n logWarning(\"'script' is deprecated. Use 'command' instead.\");\n }\n\n const command = parseCommandArray(obj.command ?? obj.script);\n if (!command) return undefined;\n\n const timeoutMs = typeof obj.timeout_ms === 'number' ? obj.timeout_ms : undefined;\n let cwd = typeof obj.cwd === 'string' ? obj.cwd : undefined;\n\n // Resolve relative cwd against eval file directory\n if (cwd && !path.isAbsolute(cwd)) {\n cwd = path.resolve(evalFileDir, cwd);\n }\n\n const config: WorkspaceScriptConfig = { command };\n if (timeoutMs !== undefined) {\n return { ...config, timeout_ms: timeoutMs, ...(cwd !== undefined && { cwd }) };\n }\n return cwd ? { ...config, cwd } : config;\n}\n\nfunction parseWorkspaceHookConfig(\n raw: unknown,\n evalFileDir: string,\n): WorkspaceHookConfig | undefined {\n if (!isJsonObject(raw)) return undefined;\n const script = parseWorkspaceScriptConfig(raw, evalFileDir);\n const obj = raw as Record<string, unknown>;\n const reset =\n obj.reset === 'none' || obj.reset === 'fast' || obj.reset === 'strict' ? obj.reset : undefined;\n if (!script && !reset) return undefined;\n return {\n ...(script ?? {}),\n ...(reset !== undefined && { reset }),\n };\n}\n\nfunction parseWorkspaceHooksConfig(\n raw: unknown,\n evalFileDir: string,\n): WorkspaceHooksConfig | undefined {\n if (!isJsonObject(raw)) return undefined;\n const obj = raw as Record<string, unknown>;\n const enabled = typeof obj.enabled === 'boolean' ? obj.enabled : undefined;\n const beforeAll = parseWorkspaceHookConfig(obj.before_all, evalFileDir);\n const beforeEach = parseWorkspaceHookConfig(obj.before_each, evalFileDir);\n const afterEach = parseWorkspaceHookConfig(obj.after_each, evalFileDir);\n const afterAll = parseWorkspaceHookConfig(obj.after_all, evalFileDir);\n const hooks: WorkspaceHooksConfig = {\n ...(enabled !== undefined && { enabled }),\n ...(beforeAll !== undefined && { before_all: beforeAll }),\n ...(beforeEach !== undefined && { before_each: beforeEach }),\n ...(afterEach !== undefined && { after_each: afterEach }),\n ...(afterAll !== undefined && { after_all: afterAll }),\n };\n return Object.keys(hooks).length > 0 ? hooks : undefined;\n}\n\n/**\n * Resolve a workspace config value: either an inline object or a string path\n * to an external workspace YAML file.\n *\n * When `raw` is a string, the file is loaded and parsed relative to evalFileDir.\n * Relative paths inside the external file (template, cwd, local repo paths)\n * are resolved relative to the workspace file's own directory.\n */\nasync function resolveWorkspaceConfig(\n raw: unknown,\n evalFileDir: string,\n): Promise<WorkspaceConfig | undefined> {\n if (typeof raw === 'string') {\n const workspaceFilePath = path.resolve(evalFileDir, raw);\n let content: string;\n try {\n content = await readFile(workspaceFilePath, 'utf8');\n } catch {\n throw new Error(`Workspace file not found: ${raw} (resolved to ${workspaceFilePath})`);\n }\n const parsed = interpolateEnv(parseYamlValue(content), process.env) as unknown;\n if (!isJsonObject(parsed)) {\n throw new Error(\n `Invalid workspace file format: ${workspaceFilePath} (expected a YAML object)`,\n );\n }\n // Resolve paths relative to the workspace file's directory\n const workspaceFileDir = path.dirname(workspaceFilePath);\n const resolvedWorkspace = parseWorkspaceConfig(parsed, workspaceFileDir);\n if (resolvedWorkspace) {\n return { ...resolvedWorkspace, workspaceFileDir };\n }\n\n const parsedObject = parsed as Record<string, unknown>;\n if ('workspace' in parsedObject && isJsonObject(parsedObject.workspace)) {\n throw new Error(\n [\n `Invalid workspace file format: ${workspaceFilePath}`,\n 'External workspace files must contain the workspace config object directly.',\n 'Remove the top-level \"workspace:\" wrapper.',\n ].join(' '),\n );\n }\n\n return undefined;\n }\n return parseWorkspaceConfig(raw, evalFileDir);\n}\n\n/**\n * Parse a WorkspaceConfig from raw YAML value.\n */\nfunction parseWorkspaceConfig(raw: unknown, evalFileDir: string): WorkspaceConfig | undefined {\n if (!isJsonObject(raw)) return undefined;\n const obj = raw as Record<string, unknown>;\n if ('static_path' in obj) {\n throw new Error(\n 'workspace.static_path has been removed. Use workspace.path with workspace.mode=static.',\n );\n }\n if ('pool' in obj) {\n throw new Error(\"workspace.pool has been removed. Use workspace.mode='pooled' or 'temp'.\");\n }\n if ('static' in obj) {\n throw new Error(\"workspace.static has been removed. Use workspace.mode='static'.\");\n }\n\n let template = typeof obj.template === 'string' ? obj.template : undefined;\n if (template && !path.isAbsolute(template)) {\n template = path.resolve(evalFileDir, template);\n }\n\n const isolation =\n obj.isolation === 'shared' || obj.isolation === 'per_test' ? obj.isolation : undefined;\n\n const repos = Array.isArray(obj.repos)\n ? ((obj.repos as Record<string, unknown>[])\n .map(parseRepoConfig)\n .filter(Boolean) as RepoConfig[])\n : undefined;\n\n const hooks = parseWorkspaceHooksConfig(obj.hooks, evalFileDir);\n const explicitMode =\n obj.mode === 'pooled' || obj.mode === 'temp' || obj.mode === 'static' ? obj.mode : undefined;\n const workspacePath = typeof obj.path === 'string' ? obj.path : undefined;\n const mode = explicitMode ?? (workspacePath ? 'static' : undefined);\n\n const docker = parseDockerWorkspaceConfig(obj.docker);\n const env = parseWorkspaceEnvConfig(obj.env);\n\n if (!template && !isolation && !repos && !hooks && !mode && !workspacePath && !docker && !env)\n return undefined;\n\n return {\n ...(template !== undefined && { template }),\n ...(isolation !== undefined && { isolation }),\n ...(repos !== undefined && { repos }),\n ...(hooks !== undefined && { hooks }),\n ...(mode !== undefined && { mode }),\n ...(workspacePath !== undefined && { path: workspacePath }),\n ...(docker !== undefined && { docker }),\n ...(env !== undefined && { env }),\n };\n}\n\nfunction parseWorkspaceEnvConfig(raw: unknown): WorkspaceEnvConfig | undefined {\n if (!isJsonObject(raw)) return undefined;\n const obj = raw as Record<string, unknown>;\n\n const required_commands = Array.isArray(obj.required_commands)\n ? (obj.required_commands.filter((c) => typeof c === 'string') as string[])\n : undefined;\n const required_python_modules = Array.isArray(obj.required_python_modules)\n ? (obj.required_python_modules.filter((m) => typeof m === 'string') as string[])\n : undefined;\n\n if (!required_commands?.length && !required_python_modules?.length) return undefined;\n\n return {\n ...(required_commands?.length && { required_commands }),\n ...(required_python_modules?.length && { required_python_modules }),\n };\n}\n\n/**\n * Parse a DockerWorkspaceConfig from raw YAML value.\n */\nfunction parseDockerWorkspaceConfig(raw: unknown): DockerWorkspaceConfig | undefined {\n if (!isJsonObject(raw)) return undefined;\n const obj = raw as Record<string, unknown>;\n if (typeof obj.image !== 'string') return undefined;\n\n return {\n image: obj.image,\n ...(typeof obj.timeout === 'number' && { timeout: obj.timeout }),\n ...(typeof obj.memory === 'string' && { memory: obj.memory }),\n ...(typeof obj.cpus === 'number' && { cpus: obj.cpus }),\n };\n}\n\n/**\n * Merge case-level workspace config with suite-level defaults.\n * Strategy: case-level fields replace suite-level fields.\n */\nfunction mergeWorkspaceConfigs(\n suiteLevel: WorkspaceConfig | undefined,\n caseLevel: WorkspaceConfig | undefined,\n): WorkspaceConfig | undefined {\n if (!suiteLevel && !caseLevel) return undefined;\n if (!suiteLevel) return caseLevel;\n if (!caseLevel) return suiteLevel;\n\n const mergeHook = (\n suiteHook: WorkspaceHookConfig | undefined,\n caseHook: WorkspaceHookConfig | undefined,\n ): WorkspaceHookConfig | undefined => {\n if (!suiteHook && !caseHook) return undefined;\n return {\n ...(suiteHook ?? {}),\n ...(caseHook ?? {}),\n };\n };\n const mergedEnabled = caseLevel.hooks?.enabled ?? suiteLevel.hooks?.enabled;\n const mergedHooks = {\n ...(mergedEnabled !== undefined && { enabled: mergedEnabled }),\n before_all: mergeHook(suiteLevel.hooks?.before_all, caseLevel.hooks?.before_all),\n before_each: mergeHook(suiteLevel.hooks?.before_each, caseLevel.hooks?.before_each),\n after_each: mergeHook(suiteLevel.hooks?.after_each, caseLevel.hooks?.after_each),\n after_all: mergeHook(suiteLevel.hooks?.after_all, caseLevel.hooks?.after_all),\n };\n const hasHooks =\n mergedEnabled !== undefined ||\n Object.values(mergedHooks).some((hook) => hook !== undefined && typeof hook === 'object');\n\n return {\n template: caseLevel.template ?? suiteLevel.template,\n isolation: caseLevel.isolation ?? suiteLevel.isolation,\n repos: caseLevel.repos ?? suiteLevel.repos,\n ...(hasHooks && { hooks: mergedHooks as WorkspaceHooksConfig }),\n mode: caseLevel.mode ?? suiteLevel.mode,\n path: caseLevel.path ?? suiteLevel.path,\n docker: caseLevel.docker ?? suiteLevel.docker,\n workspaceFileDir: caseLevel.workspaceFileDir ?? suiteLevel.workspaceFileDir,\n };\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Pull the optional `governance` block out of a suite YAML. Top-level `governance:` wins\n * over the nested `metadata.governance:` form so that authors who already use top-level\n * suite metadata fields (`name`, `description`, `tags`) can keep their existing layout.\n */\nfunction extractSuiteGovernance(suite: RawTestSuite): Record<string, unknown> | undefined {\n const top = (suite as JsonObject).governance;\n if (isJsonObject(top)) {\n return top as Record<string, unknown>;\n }\n const wrapper = (suite as JsonObject).metadata;\n if (isJsonObject(wrapper)) {\n const nested = (wrapper as JsonObject).governance;\n if (isJsonObject(nested)) {\n return nested as Record<string, unknown>;\n }\n }\n return undefined;\n}\n\n/**\n * Merge a suite-level metadata payload into a case's metadata map. The same rules apply to\n * every key in the payload: arrays concatenate suite-first and deduplicate; nested objects\n * recurse; scalar fields on the case win; suite fills in keys the case omits.\n */\nfunction mergeSuiteMetadataPayload(\n caseMetadata: Record<string, unknown> | undefined,\n suitePayload: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (!suitePayload) return caseMetadata;\n\n const result: Record<string, unknown> = { ...(caseMetadata ?? {}) };\n for (const [key, suiteVal] of Object.entries(suitePayload)) {\n const caseVal = result[key];\n if (Array.isArray(suiteVal) && Array.isArray(caseVal)) {\n const seen = new Set<string>();\n const out: unknown[] = [];\n for (const v of [...suiteVal, ...caseVal]) {\n const k = typeof v === 'string' ? v : JSON.stringify(v);\n if (!seen.has(k)) {\n seen.add(k);\n out.push(v);\n }\n }\n result[key] = out;\n } else if (isJsonObject(suiteVal) && isJsonObject(caseVal)) {\n result[key] = mergeSuiteMetadataPayload(\n caseVal as Record<string, unknown>,\n suiteVal as Record<string, unknown>,\n );\n } else if (caseVal === undefined) {\n result[key] = suiteVal;\n }\n }\n return result;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\nfunction logError(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.error(`${ANSI_RED}Error: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.error(`${ANSI_RED}Error: ${message}${ANSI_RESET}`);\n }\n}\n","import type { JsonObject, TestMessage, TestMessageContent } from './types.js';\nimport { isJsonObject } from './types.js';\n\n/**\n * Flatten enriched input messages into prompt-builder-friendly segments.\n */\nexport function flattenInputMessages(messages: readonly TestMessage[]): JsonObject[] {\n return messages.flatMap((message) => extractContentSegments(message.content));\n}\n\n/**\n * Extract resolved file paths carried on parsed input message segments.\n */\nexport function collectResolvedInputFilePaths(messages: readonly TestMessage[]): string[] {\n const filePaths: string[] = [];\n\n for (const message of messages) {\n if (!Array.isArray(message.content)) {\n continue;\n }\n\n for (const segment of message.content) {\n if (\n isJsonObject(segment) &&\n segment.type === 'file' &&\n typeof segment.resolvedPath === 'string'\n ) {\n filePaths.push(segment.resolvedPath);\n }\n }\n }\n\n return filePaths;\n}\n\n/**\n * Normalize a message content payload into formatted prompt segments.\n */\nexport function extractContentSegments(content: TestMessageContent): JsonObject[] {\n if (typeof content === 'string') {\n return content.trim().length > 0 ? [{ type: 'text', value: content }] : [];\n }\n\n if (isJsonObject(content)) {\n const rendered = JSON.stringify(content, null, 2);\n return rendered.trim().length > 0 ? [{ type: 'text', value: rendered }] : [];\n }\n\n if (!Array.isArray(content)) {\n return [];\n }\n\n const segments: JsonObject[] = [];\n\n for (const segment of content) {\n // Plain string items inside a content array are treated as text segments.\n // This matches the validator, which accepts string items in content arrays.\n if (typeof segment === 'string') {\n if (segment.trim().length > 0) {\n segments.push({ type: 'text', value: segment });\n }\n continue;\n }\n if (!isJsonObject(segment)) {\n continue;\n }\n segments.push(cloneJsonObject(segment));\n }\n\n return segments;\n}\n\nexport function cloneJsonObject(source: JsonObject): JsonObject {\n const entries = Object.entries(source).map(([key, value]) => [key, cloneJsonValue(value)]);\n return Object.fromEntries(entries) as JsonObject;\n}\n\nfunction cloneJsonValue(value: unknown): unknown {\n if (value === null) {\n return null;\n }\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneJsonValue(item));\n }\n if (typeof value === 'object') {\n return cloneJsonObject(value as JsonObject);\n }\n return value;\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type { EvalTest, GraderConfig } from '../types.js';\n\nconst ANSI_RED = '\\u001b[31m';\nconst ANSI_RESET = '\\u001b[0m';\n\nfunction logError(msg: string): void {\n console.error(`${ANSI_RED}Error: ${msg}${ANSI_RESET}`);\n}\n\n/**\n * Raw Agent Skills evals.json schema.\n * @see https://agentskills.io/skill-creation/evaluating-skills\n */\ninterface AgentSkillsEvalsFile {\n readonly skill_name?: string;\n readonly evals: readonly AgentSkillsEvalCase[];\n}\n\ninterface AgentSkillsEvalCase {\n readonly id: number;\n readonly prompt: string;\n readonly expected_output?: string;\n readonly files?: readonly string[];\n readonly assertions?: readonly string[];\n}\n\n/**\n * Detect whether a JSON file is in Agent Skills evals.json format.\n * Returns true if the parsed content has an `evals` array.\n */\nexport function isAgentSkillsFormat(parsed: unknown): parsed is AgentSkillsEvalsFile {\n if (typeof parsed !== 'object' || parsed === null) return false;\n const obj = parsed as Record<string, unknown>;\n return Array.isArray(obj.evals);\n}\n\n/**\n * Load and parse an Agent Skills evals.json file into AgentV EvalTest[].\n *\n * Promotion rules:\n * - id (number) → id (string)\n * - prompt → input: [{role: \"user\", content: prompt}]\n * - expected_output → expected_output: [{role: \"assistant\", content}] as JsonObject[]\n * - assertions (string[]) → assertions: GraderConfig[] (each → llm-grader)\n * - files → metadata.agent_skills_files (resolved by #541)\n * - skill_name → metadata.skill_name\n */\nexport async function loadTestsFromAgentSkills(filePath: string): Promise<readonly EvalTest[]> {\n const raw = await readFile(filePath, 'utf8');\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`Invalid Agent Skills evals.json: failed to parse JSON in '${filePath}'`);\n }\n\n return parseAgentSkillsEvals(parsed, filePath, path.dirname(path.resolve(filePath)));\n}\n\n/**\n * Parse already-loaded Agent Skills evals data into EvalTest[].\n * Exported for testing without file I/O.\n */\nexport function parseAgentSkillsEvals(\n parsed: unknown,\n source = 'evals.json',\n baseDir?: string,\n): readonly EvalTest[] {\n if (!isAgentSkillsFormat(parsed)) {\n throw new Error(`Invalid Agent Skills evals.json: missing 'evals' array in '${source}'`);\n }\n\n const { evals, skill_name } = parsed;\n\n if (evals.length === 0) {\n throw new Error(`Invalid Agent Skills evals.json: 'evals' array is empty in '${source}'`);\n }\n\n const tests: EvalTest[] = [];\n\n for (const evalCase of evals) {\n const id = evalCase.id;\n\n if (typeof evalCase.prompt !== 'string' || evalCase.prompt.trim() === '') {\n const caseRef = id !== undefined ? `id=${id}` : 'unknown';\n logError(`Skipping eval case ${caseRef} in '${source}': missing or empty 'prompt'`);\n continue;\n }\n\n // Promote assertions → llm-grader evaluators\n let assertions: readonly GraderConfig[] | undefined;\n if (evalCase.assertions && evalCase.assertions.length > 0) {\n assertions = evalCase.assertions.map(\n (text, i): GraderConfig => ({\n name: `assertion-${i + 1}`,\n type: 'llm-grader',\n prompt: text,\n }),\n );\n }\n\n // Build metadata\n const metadata: Record<string, unknown> = {};\n if (skill_name) {\n metadata.skill_name = skill_name;\n }\n\n // Resolve file paths relative to evals.json location\n const filePaths: string[] = [];\n if (evalCase.files && evalCase.files.length > 0) {\n metadata.agent_skills_files = evalCase.files;\n if (baseDir) {\n metadata.agent_skills_base_dir = baseDir;\n for (const file of evalCase.files) {\n filePaths.push(path.resolve(baseDir, file));\n }\n }\n }\n\n const prompt = evalCase.prompt;\n\n const test: EvalTest = {\n id: String(id),\n question: prompt,\n input: [{ role: 'user', content: prompt }],\n expected_output: evalCase.expected_output\n ? [{ role: 'assistant', content: evalCase.expected_output }]\n : [],\n reference_answer: evalCase.expected_output,\n file_paths: filePaths,\n criteria: evalCase.expected_output ?? '',\n assertions,\n ...(Object.keys(metadata).length > 0 ? { metadata } : {}),\n };\n\n tests.push(test);\n }\n\n return tests;\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { interpolateEnv } from '../interpolation.js';\nimport type {\n EvalTargetRef,\n FailOnError,\n JsonObject,\n TargetHooksConfig,\n TrialStrategy,\n TrialsConfig,\n WorkspaceHookConfig,\n} from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport { parseYamlValue } from '../yaml-loader.js';\nimport { buildDirectoryChain, fileExists } from './file-resolver.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\nexport const DEFAULT_EVAL_PATTERNS: readonly string[] = [\n '**/evals/**/*.eval.yaml',\n '**/evals/**/eval.yaml',\n '**/evals/**/*.eval.ts',\n];\n\nexport type ExecutionDefaults = {\n readonly verbose?: boolean;\n readonly keep_workspaces?: boolean;\n readonly otel_file?: string;\n readonly export_otel?: boolean;\n readonly otel_backend?: string;\n readonly otel_capture_content?: boolean;\n readonly otel_group_turns?: boolean;\n readonly pool_workspaces?: boolean;\n readonly pool_slots?: number;\n};\n\nexport type ResultsExportConfig = {\n readonly repo: string;\n readonly path: string;\n readonly auto_push?: boolean;\n readonly branch_prefix?: string;\n};\n\nexport type HooksConfig = {\n /** Shell command to run once at agentv startup. stdout is parsed for env var exports. */\n readonly before_session?: string;\n};\n\nexport type AgentVConfig = {\n readonly required_version?: string;\n readonly eval_patterns?: readonly string[];\n readonly execution?: ExecutionDefaults;\n readonly results?: {\n readonly export?: ResultsExportConfig;\n };\n readonly hooks?: HooksConfig;\n};\n\n/**\n * Load optional .agentv/config.yaml configuration file.\n * Searches from eval file directory up to repo root.\n */\nexport async function loadConfig(\n evalFilePath: string,\n repoRoot: string,\n): Promise<AgentVConfig | null> {\n const directories = buildDirectoryChain(evalFilePath, repoRoot);\n\n for (const directory of directories) {\n const configPath = path.join(directory, '.agentv', 'config.yaml');\n\n if (!(await fileExists(configPath))) {\n continue;\n }\n\n try {\n const rawConfig = await readFile(configPath, 'utf8');\n const parsed = interpolateEnv(parseYamlValue(rawConfig), process.env) as unknown;\n\n if (!isJsonObject(parsed)) {\n logWarning(`Invalid .agentv/config.yaml format at ${configPath}`);\n continue;\n }\n\n const config = parsed as AgentVConfig;\n\n const requiredVersion = (parsed as Record<string, unknown>).required_version;\n if (requiredVersion !== undefined && typeof requiredVersion !== 'string') {\n logWarning(`Invalid required_version in ${configPath}, expected string`);\n continue;\n }\n\n const evalPatterns = (config as Record<string, unknown>).eval_patterns;\n if (evalPatterns !== undefined && !Array.isArray(evalPatterns)) {\n logWarning(`Invalid eval_patterns in ${configPath}, expected array`);\n continue;\n }\n\n if (Array.isArray(evalPatterns) && !evalPatterns.every((p) => typeof p === 'string')) {\n logWarning(`Invalid eval_patterns in ${configPath}, all entries must be strings`);\n continue;\n }\n\n const executionDefaults = parseExecutionDefaults(\n (parsed as Record<string, unknown>).execution,\n configPath,\n );\n const results = parseResultsConfig((parsed as Record<string, unknown>).results, configPath);\n const hooks = parseHooksConfig((parsed as Record<string, unknown>).hooks, configPath);\n\n return {\n required_version: requiredVersion as string | undefined,\n eval_patterns: evalPatterns as readonly string[] | undefined,\n execution: executionDefaults,\n results,\n ...(hooks && { hooks }),\n };\n } catch (error) {\n logWarning(\n `Could not read .agentv/config.yaml at ${configPath}: ${(error as Error).message}`,\n );\n }\n }\n\n return null;\n}\n\n/**\n * Extract target name from parsed eval suite (checks execution.target then falls back to root-level target).\n */\nexport function extractTargetFromSuite(suite: JsonObject): string | undefined {\n // Check execution.target first (new location), fallback to root-level target (legacy)\n const execution = suite.execution;\n if (execution && typeof execution === 'object' && !Array.isArray(execution)) {\n const executionTarget = (execution as Record<string, unknown>).target;\n if (typeof executionTarget === 'string' && executionTarget.trim().length > 0) {\n return executionTarget.trim();\n }\n }\n\n // Fallback to legacy root-level target\n const targetValue = suite.target;\n if (typeof targetValue === 'string' && targetValue.trim().length > 0) {\n return targetValue.trim();\n }\n\n return undefined;\n}\n\n/**\n * Extract target refs from parsed eval suite.\n * Supports both string shorthand and object form with hooks.\n * Returns undefined when no targets array is specified.\n */\nexport function extractTargetRefsFromSuite(\n suite: JsonObject,\n): readonly EvalTargetRef[] | undefined {\n const execution = suite.execution;\n if (!execution || typeof execution !== 'object' || Array.isArray(execution)) {\n return undefined;\n }\n\n const targets = (execution as Record<string, unknown>).targets;\n if (!Array.isArray(targets)) {\n return undefined;\n }\n\n const refs: EvalTargetRef[] = [];\n for (const t of targets) {\n if (typeof t === 'string' && t.trim().length > 0) {\n refs.push({ name: t.trim() });\n } else if (t && typeof t === 'object' && !Array.isArray(t) && 'name' in t) {\n const obj = t as Record<string, unknown>;\n const name = typeof obj.name === 'string' ? obj.name.trim() : '';\n if (name.length === 0) continue;\n const useTarget = typeof obj.use_target === 'string' ? obj.use_target.trim() : undefined;\n const hooks = parseTargetHooks(obj.hooks);\n refs.push({\n name,\n ...(useTarget && { use_target: useTarget }),\n ...(hooks && { hooks }),\n });\n }\n }\n return refs.length > 0 ? refs : undefined;\n}\n\n/**\n * Extract target names from parsed eval suite (backward-compat wrapper).\n * Precedence: execution.targets (array) > execution.target (singular).\n * Returns undefined when no targets array is specified.\n */\nexport function extractTargetsFromSuite(suite: JsonObject): readonly string[] | undefined {\n const refs = extractTargetRefsFromSuite(suite);\n if (!refs) return undefined;\n const names = refs.map((r) => r.name);\n return names.length > 0 ? names : undefined;\n}\n\n/**\n * Parse a single workspace hook config from a raw object.\n * Accepts both string shorthand (shell command) and object form.\n */\nfunction parseHookConfig(raw: unknown): WorkspaceHookConfig | undefined {\n if (!raw || typeof raw !== 'object') return undefined;\n const obj = raw as Record<string, unknown>;\n\n // Accept command as string (shell command) or array\n let command: readonly string[] | undefined;\n if (typeof obj.command === 'string') {\n command = ['sh', '-c', obj.command];\n } else if (Array.isArray(obj.command)) {\n command = obj.command.filter((s): s is string => typeof s === 'string');\n } else if (typeof obj.script === 'string') {\n command = ['sh', '-c', obj.script];\n } else if (Array.isArray(obj.script)) {\n command = obj.script.filter((s): s is string => typeof s === 'string');\n }\n\n if (!command || command.length === 0) return undefined;\n\n const timeoutMs =\n typeof obj.timeout_ms === 'number'\n ? obj.timeout_ms\n : typeof obj.timeoutMs === 'number'\n ? obj.timeoutMs\n : undefined;\n const cwd = typeof obj.cwd === 'string' ? obj.cwd : undefined;\n\n return {\n command,\n ...(timeoutMs !== undefined && { timeout_ms: timeoutMs }),\n ...(cwd && { cwd }),\n };\n}\n\n/**\n * Parse target hooks from a raw hooks object.\n * Returns undefined if no valid hooks are found.\n */\nfunction parseTargetHooks(raw: unknown): TargetHooksConfig | undefined {\n if (!raw || typeof raw !== 'object') return undefined;\n const obj = raw as Record<string, unknown>;\n\n const beforeAll = parseHookConfig(obj.before_all);\n const beforeEach = parseHookConfig(obj.before_each);\n const afterEach = parseHookConfig(obj.after_each);\n const afterAll = parseHookConfig(obj.after_all);\n\n if (!beforeAll && !beforeEach && !afterEach && !afterAll) return undefined;\n\n return {\n ...(beforeAll && { before_all: beforeAll }),\n ...(beforeEach && { before_each: beforeEach }),\n ...(afterEach && { after_each: afterEach }),\n ...(afterAll && { after_all: afterAll }),\n };\n}\n\n/**\n * Extract workers count from suite-level execution block.\n */\nexport function extractWorkersFromSuite(suite: JsonObject): number | undefined {\n const execution = suite.execution;\n if (!execution || typeof execution !== 'object' || Array.isArray(execution)) {\n return undefined;\n }\n\n const workers = (execution as Record<string, unknown>).workers;\n if (typeof workers === 'number' && Number.isInteger(workers) && workers >= 1 && workers <= 50) {\n return workers;\n }\n\n return undefined;\n}\n\n/**\n * Extract per-test targets array from a raw test case object.\n */\nexport function extractTargetsFromTestCase(testCase: JsonObject): readonly string[] | undefined {\n const execution = testCase.execution;\n if (!execution || typeof execution !== 'object' || Array.isArray(execution)) {\n return undefined;\n }\n\n const targets = (execution as Record<string, unknown>).targets;\n if (Array.isArray(targets)) {\n const valid = targets.filter((t): t is string => typeof t === 'string' && t.trim().length > 0);\n return valid.length > 0 ? valid.map((t) => t.trim()) : undefined;\n }\n\n return undefined;\n}\n\nconst VALID_TRIAL_STRATEGIES: ReadonlySet<string> = new Set([\n 'pass_at_k',\n 'mean',\n 'confidence_interval',\n]);\n\n/**\n * Extract trials configuration from parsed eval suite's execution block.\n * Returns undefined when count is 1 or not specified (no-op).\n */\nexport function extractTrialsConfig(suite: JsonObject): TrialsConfig | undefined {\n const execution = suite.execution;\n if (!execution || typeof execution !== 'object' || Array.isArray(execution)) {\n return undefined;\n }\n\n const trials = (execution as Record<string, unknown>).trials;\n if (!trials || typeof trials !== 'object' || Array.isArray(trials)) {\n return undefined;\n }\n\n const trialsObj = trials as Record<string, unknown>;\n const count = trialsObj.count;\n\n if (count === undefined || count === null) {\n return undefined;\n }\n\n if (typeof count !== 'number' || !Number.isInteger(count) || count < 1) {\n logWarning(\n `Invalid trials.count: ${count}, must be a positive integer. Ignoring trials config.`,\n );\n return undefined;\n }\n\n if (count === 1) {\n return undefined;\n }\n\n // Parse strategy (default: pass_at_k)\n const rawStrategy = trialsObj.strategy;\n let strategy: TrialStrategy = 'pass_at_k';\n if (rawStrategy !== undefined && rawStrategy !== null) {\n if (typeof rawStrategy !== 'string' || !VALID_TRIAL_STRATEGIES.has(rawStrategy)) {\n logWarning(\n `Invalid trials.strategy: '${rawStrategy}'. Must be one of: pass_at_k, mean, confidence_interval. Defaulting to pass_at_k.`,\n );\n } else {\n strategy = rawStrategy as TrialStrategy;\n }\n }\n\n // Parse cost_limit_usd (accepts both snake_case and camelCase)\n const rawCostLimit = trialsObj.cost_limit_usd ?? trialsObj.costLimitUsd;\n let costLimitUsd: number | undefined;\n if (rawCostLimit !== undefined && rawCostLimit !== null) {\n if (typeof rawCostLimit === 'number' && rawCostLimit > 0) {\n costLimitUsd = rawCostLimit;\n } else {\n logWarning(\n `Invalid trials.cost_limit_usd: ${rawCostLimit}. Must be a positive number. Ignoring.`,\n );\n }\n }\n\n return { count, strategy, costLimitUsd };\n}\n\n/**\n * Cache configuration parsed from execution block.\n */\nexport interface CacheConfig {\n readonly enabled: boolean;\n readonly cachePath?: string;\n}\n\n/**\n * Extract cache configuration from parsed eval suite's execution block.\n * Returns undefined when no cache config is specified.\n */\nexport function extractCacheConfig(suite: JsonObject): CacheConfig | undefined {\n const execution = suite.execution;\n if (!execution || typeof execution !== 'object' || Array.isArray(execution)) {\n return undefined;\n }\n\n const executionObj = execution as Record<string, unknown>;\n const cache = executionObj.cache;\n\n if (cache === undefined || cache === null) {\n return undefined;\n }\n\n if (typeof cache !== 'boolean') {\n logWarning(`Invalid execution.cache: ${cache}. Must be a boolean. Ignoring.`);\n return undefined;\n }\n\n const cachePath = executionObj.cache_path ?? executionObj.cachePath;\n const resolvedCachePath =\n typeof cachePath === 'string' && cachePath.trim().length > 0 ? cachePath.trim() : undefined;\n\n return { enabled: cache, cachePath: resolvedCachePath };\n}\n\n/**\n * Extract suite-level total budget from parsed eval suite's execution block.\n * Returns undefined when not specified.\n */\nexport function extractBudgetUsd(suite: JsonObject): number | undefined {\n const execution = suite.execution;\n if (!execution || typeof execution !== 'object' || Array.isArray(execution)) {\n return undefined;\n }\n\n const executionObj = execution as Record<string, unknown>;\n\n // Reject the old key with a clear error\n if ('total_budget_usd' in executionObj || 'totalBudgetUsd' in executionObj) {\n throw new Error(\n 'execution.total_budget_usd has been renamed to execution.budget_usd. Update your eval YAML.',\n );\n }\n\n const rawBudget = executionObj.budget_usd ?? executionObj.budgetUsd;\n\n if (rawBudget === undefined || rawBudget === null) {\n return undefined;\n }\n\n if (typeof rawBudget === 'number' && rawBudget > 0) {\n return rawBudget;\n }\n\n logWarning(`Invalid execution.budget_usd: ${rawBudget}. Must be a positive number. Ignoring.`);\n return undefined;\n}\n\n/**\n * Extract `execution.fail_on_error` from parsed eval suite.\n * Accepts `true` or `false`.\n * Returns undefined when not specified.\n */\nexport function extractFailOnError(suite: JsonObject): FailOnError | undefined {\n const execution = suite.execution;\n if (!execution || typeof execution !== 'object' || Array.isArray(execution)) {\n return undefined;\n }\n\n const executionObj = execution as Record<string, unknown>;\n const raw = executionObj.fail_on_error ?? executionObj.failOnError;\n\n if (raw === undefined || raw === null) {\n return undefined;\n }\n\n if (typeof raw === 'boolean') {\n return raw;\n }\n\n logWarning(`Invalid execution.fail_on_error: ${raw}. Must be true or false. Ignoring.`);\n return undefined;\n}\n\n/**\n * Extract `execution.threshold` from parsed eval suite.\n * Accepts a number in [0, 1] range.\n * Returns undefined when not specified.\n */\nexport function extractThreshold(suite: JsonObject): number | undefined {\n const execution = suite.execution;\n if (!execution || typeof execution !== 'object' || Array.isArray(execution)) {\n return undefined;\n }\n\n const executionObj = execution as Record<string, unknown>;\n const raw = executionObj.threshold;\n\n if (raw === undefined || raw === null) {\n return undefined;\n }\n\n if (typeof raw === 'number' && raw >= 0 && raw <= 1) {\n return raw;\n }\n\n logWarning(`Invalid execution.threshold: ${raw}. Must be a number between 0 and 1. Ignoring.`);\n return undefined;\n}\n\nexport function parseExecutionDefaults(\n raw: unknown,\n configPath: string,\n): ExecutionDefaults | undefined {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return undefined;\n }\n\n const obj = raw as Record<string, unknown>;\n const result: Record<string, unknown> = {};\n\n if (typeof obj.verbose === 'boolean') {\n result.verbose = obj.verbose;\n } else if (obj.verbose !== undefined) {\n logWarning(`Invalid execution.verbose in ${configPath}, expected boolean`);\n }\n\n if (typeof obj.keep_workspaces === 'boolean') {\n result.keep_workspaces = obj.keep_workspaces;\n } else if (obj.keep_workspaces !== undefined) {\n logWarning(`Invalid execution.keep_workspaces in ${configPath}, expected boolean`);\n }\n\n const otelFile = obj.otel_file;\n if (typeof otelFile === 'string' && otelFile.trim().length > 0) {\n result.otel_file = otelFile.trim();\n } else if (otelFile !== undefined) {\n logWarning(`Invalid execution.otel_file in ${configPath}, expected non-empty string`);\n }\n\n if (typeof obj.export_otel === 'boolean') {\n result.export_otel = obj.export_otel;\n } else if (obj.export_otel !== undefined) {\n logWarning(`Invalid execution.export_otel in ${configPath}, expected boolean`);\n }\n\n const otelBackend = obj.otel_backend;\n if (typeof otelBackend === 'string' && otelBackend.trim().length > 0) {\n result.otel_backend = otelBackend.trim();\n } else if (otelBackend !== undefined) {\n logWarning(`Invalid execution.otel_backend in ${configPath}, expected non-empty string`);\n }\n\n if (typeof obj.otel_capture_content === 'boolean') {\n result.otel_capture_content = obj.otel_capture_content;\n } else if (obj.otel_capture_content !== undefined) {\n logWarning(`Invalid execution.otel_capture_content in ${configPath}, expected boolean`);\n }\n\n if (typeof obj.otel_group_turns === 'boolean') {\n result.otel_group_turns = obj.otel_group_turns;\n } else if (obj.otel_group_turns !== undefined) {\n logWarning(`Invalid execution.otel_group_turns in ${configPath}, expected boolean`);\n }\n\n if (typeof obj.pool_workspaces === 'boolean') {\n result.pool_workspaces = obj.pool_workspaces;\n } else if (obj.pool_workspaces !== undefined) {\n logWarning(`Invalid execution.pool_workspaces in ${configPath}, expected boolean`);\n }\n\n const poolSlots = obj.pool_slots;\n if (\n typeof poolSlots === 'number' &&\n Number.isInteger(poolSlots) &&\n poolSlots >= 1 &&\n poolSlots <= 50\n ) {\n result.pool_slots = poolSlots;\n } else if (poolSlots !== undefined) {\n logWarning(`Invalid execution.pool_slots in ${configPath}, expected integer 1-50`);\n }\n\n return Object.keys(result).length > 0 ? (result as ExecutionDefaults) : undefined;\n}\n\nexport function parseResultsConfig(\n raw: unknown,\n configPath: string,\n): AgentVConfig['results'] | undefined {\n if (raw === undefined || raw === null) {\n return undefined;\n }\n if (typeof raw !== 'object' || Array.isArray(raw)) {\n logWarning(`Invalid results in ${configPath}, expected object`);\n return undefined;\n }\n\n const obj = raw as Record<string, unknown>;\n const exportConfig = parseResultsExportConfig(obj.export, configPath);\n if (!exportConfig) {\n return undefined;\n }\n\n return { export: exportConfig };\n}\n\nexport function parseResultsExportConfig(\n raw: unknown,\n configPath: string,\n): ResultsExportConfig | undefined {\n if (raw === undefined || raw === null) {\n return undefined;\n }\n if (typeof raw !== 'object' || Array.isArray(raw)) {\n logWarning(`Invalid results.export in ${configPath}, expected object`);\n return undefined;\n }\n\n const obj = raw as Record<string, unknown>;\n const repo = typeof obj.repo === 'string' ? obj.repo.trim() : '';\n const exportPath = typeof obj.path === 'string' ? obj.path.trim() : '';\n\n if (!repo) {\n logWarning(`Invalid results.export.repo in ${configPath}, expected non-empty string`);\n return undefined;\n }\n\n if (!exportPath) {\n logWarning(`Invalid results.export.path in ${configPath}, expected non-empty string`);\n return undefined;\n }\n\n if (obj.auto_push !== undefined && typeof obj.auto_push !== 'boolean') {\n logWarning(`Invalid results.export.auto_push in ${configPath}, expected boolean`);\n return undefined;\n }\n\n let branchPrefix: string | undefined;\n if (obj.branch_prefix !== undefined) {\n if (typeof obj.branch_prefix !== 'string' || obj.branch_prefix.trim().length === 0) {\n logWarning(\n `Invalid results.export.branch_prefix in ${configPath}, expected non-empty string`,\n );\n return undefined;\n }\n branchPrefix = obj.branch_prefix.trim();\n }\n\n return {\n repo,\n path: exportPath,\n ...(typeof obj.auto_push === 'boolean' && { auto_push: obj.auto_push }),\n ...(branchPrefix && { branch_prefix: branchPrefix }),\n };\n}\n\n/**\n * Parse the `hooks` block from .agentv/config.yaml.\n * Currently supports `before_session` only.\n */\nexport function parseHooksConfig(raw: unknown, configPath: string): HooksConfig | undefined {\n if (raw === undefined || raw === null) {\n return undefined;\n }\n if (typeof raw !== 'object' || Array.isArray(raw)) {\n logWarning(`Invalid hooks in ${configPath}, expected object`);\n return undefined;\n }\n\n const obj = raw as Record<string, unknown>;\n\n const beforeSession = obj.before_session;\n if (beforeSession !== undefined) {\n if (typeof beforeSession !== 'string' || beforeSession.trim().length === 0) {\n logWarning(`Invalid hooks.before_session in ${configPath}, expected non-empty string`);\n return undefined;\n }\n return { before_session: beforeSession.trim() };\n }\n\n return undefined;\n}\n\nfunction logWarning(message: string): void {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n}\n","import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Check if a file exists on disk.\n */\nexport async function fileExists(absolutePath: string): Promise<boolean> {\n try {\n await access(absolutePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Convert URL or string to absolute file path.\n */\nexport function resolveToAbsolutePath(candidate: URL | string): string {\n if (candidate instanceof URL) {\n return candidate.protocol === 'file:' ? fileURLToPath(candidate) : candidate.pathname;\n }\n if (typeof candidate === 'string') {\n if (candidate.startsWith('file:')) {\n return fileURLToPath(candidate);\n }\n return path.resolve(candidate);\n }\n throw new TypeError('Unsupported repoRoot value. Expected string or URL.');\n}\n\n/**\n * Build a chain of directories walking from a file's location up to repo root.\n * Used for discovering configuration files.\n */\nexport function buildDirectoryChain(filePath: string, repoRoot: string): readonly string[] {\n const directories: string[] = [];\n const seen = new Set<string>();\n const boundary = path.resolve(repoRoot);\n let current: string | undefined = path.resolve(path.dirname(filePath));\n\n while (current !== undefined) {\n if (!seen.has(current)) {\n directories.push(current);\n seen.add(current);\n }\n if (current === boundary) {\n break;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n if (!seen.has(boundary)) {\n directories.push(boundary);\n }\n\n return directories;\n}\n\n/**\n * Build search roots for file resolution.\n * Searches from eval file directory up to repo root.\n */\nexport function buildSearchRoots(evalPath: string, repoRoot: string): readonly string[] {\n const uniqueRoots: string[] = [];\n const addRoot = (root: string): void => {\n const normalized = path.resolve(root);\n if (!uniqueRoots.includes(normalized)) {\n uniqueRoots.push(normalized);\n }\n };\n\n let currentDir = path.dirname(evalPath);\n let reachedBoundary = false;\n while (!reachedBoundary) {\n addRoot(currentDir);\n const parentDir = path.dirname(currentDir);\n if (currentDir === repoRoot || parentDir === currentDir) {\n reachedBoundary = true;\n } else {\n currentDir = parentDir;\n }\n }\n\n addRoot(repoRoot);\n addRoot(process.cwd());\n return uniqueRoots;\n}\n\n/**\n * Trim leading path separators for display.\n */\nfunction trimLeadingSeparators(value: string): string {\n const trimmed = value.replace(/^[/\\\\]+/, '');\n return trimmed.length > 0 ? trimmed : value;\n}\n\n/**\n * Resolve a file reference using search roots.\n */\nexport async function resolveFileReference(\n rawValue: string,\n searchRoots: readonly string[],\n): Promise<{\n readonly displayPath: string;\n readonly resolvedPath?: string;\n readonly attempted: readonly string[];\n}> {\n const displayPath = trimLeadingSeparators(rawValue);\n const potentialPaths: string[] = [];\n\n if (path.isAbsolute(rawValue)) {\n potentialPaths.push(path.normalize(rawValue));\n }\n\n for (const base of searchRoots) {\n potentialPaths.push(path.resolve(base, displayPath));\n }\n\n const attempted: string[] = [];\n const seen = new Set<string>();\n for (const candidate of potentialPaths) {\n const absoluteCandidate = path.resolve(candidate);\n if (seen.has(absoluteCandidate)) {\n continue;\n }\n seen.add(absoluteCandidate);\n attempted.push(absoluteCandidate);\n if (await fileExists(absoluteCandidate)) {\n return { displayPath, resolvedPath: absoluteCandidate, attempted };\n }\n }\n\n return { displayPath, attempted };\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { normalizePreprocessorType } from '../content-preprocessor.js';\nimport { interpolateEnv } from '../interpolation.js';\nimport type { ToolTrajectoryExpectedItem, ToolTrajectoryGraderConfig } from '../trace.js';\nimport type {\n ContentPreprocessorConfig,\n GraderConfig,\n GraderKind,\n JsonObject,\n JsonValue,\n} from '../types.js';\nimport { isGraderKind } from '../types.js';\nimport { validateCustomPromptContent } from '../validation/prompt-validator.js';\nimport { parseYamlValue } from '../yaml-loader.js';\nimport { resolveFileReference } from './file-resolver.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\nconst MAX_ASSERTION_INCLUDE_DEPTH = 3;\n\n/**\n * Prefix for explicit file references in prompt strings.\n * Consistent with case-file-loader.ts which uses \"file://\" for test-case file references.\n *\n * Usage:\n * prompt: \"file://prompts/grader.md\" → explicit file, error if not found\n * prompt: \"grader.md\" → inline text (never resolved as file)\n * prompt: \"Evaluate the response\" → inline text\n */\nconst PROMPT_FILE_PREFIX = 'file://';\n\n/**\n * Normalize grader type names from legacy snake_case to internal kebab-case.\n * Accepts both forms for backward compatibility:\n * - snake_case: 'llm_grader' -> 'llm-grader' (legacy, still accepted)\n * - kebab-case: 'llm-grader' -> 'llm-grader' (preferred, passes through)\n * - single-word: 'contains' -> 'contains' (unchanged)\n */\nexport function normalizeGraderType(type: string): string {\n return type.replace(/_/g, '-');\n}\n\nfunction isDeprecatedJudgeType(type: string): boolean {\n return type === 'code-judge' || type === 'llm-judge';\n}\n\n/**\n * Parse evaluators from eval case configuration.\n */\nexport async function parseGraders(\n rawEvalCase: JsonObject & {\n readonly execution?: JsonValue;\n readonly assertions?: JsonValue;\n readonly evaluators?: JsonValue;\n readonly assert?: JsonValue;\n },\n globalExecution: JsonObject | undefined,\n searchRoots: readonly string[],\n evalId: string,\n defaultPreprocessors?: readonly ContentPreprocessorConfig[],\n): Promise<readonly GraderConfig[] | undefined> {\n const execution = rawEvalCase.execution;\n const executionObject = isJsonObject(execution) ? execution : undefined;\n\n // Case-level graders priority: assertions > assert > legacy execution/top-level assertion lists\n const caseEvaluators =\n rawEvalCase.assertions ??\n rawEvalCase.assert ??\n (executionObject ? executionObject.evaluators : undefined) ?? // deprecated: use assertions\n rawEvalCase.evaluators; // deprecated: use assertions\n\n // Root-level default graders: assertions > assert > legacy execution assertion list\n const skipDefaults = executionObject?.skip_defaults === true;\n const rootEvaluators = skipDefaults\n ? undefined\n : (globalExecution?.assertions ?? globalExecution?.assert ?? globalExecution?.evaluators); // deprecated: use assertions\n\n // Parse case-level evaluators\n const parsedCase = await parseGraderList(\n caseEvaluators,\n searchRoots,\n evalId,\n defaultPreprocessors,\n );\n // Parse root-level evaluators (appended after case-level)\n const parsedRoot = await parseGraderList(\n rootEvaluators,\n searchRoots,\n evalId,\n defaultPreprocessors,\n );\n\n if (!parsedCase && !parsedRoot) {\n return undefined;\n }\n\n // Case-level evaluators run first, root-level defaults appended\n const evaluators: GraderConfig[] = [...(parsedCase ?? []), ...(parsedRoot ?? [])];\n\n return evaluators.length > 0 ? evaluators : undefined;\n}\n\ninterface IncludeContext {\n readonly depth: number;\n readonly chain: readonly string[];\n}\n\nfunction isIncludeEntry(value: unknown): value is { include: string } {\n return (\n isJsonObject(value) && typeof value.include === 'string' && Object.keys(value).length === 1\n );\n}\n\nfunction isTemplateReference(value: string): boolean {\n return !value.startsWith('.') && !value.includes('/') && !value.includes('\\\\');\n}\n\nasync function resolveAssertionTemplateReference(\n include: string,\n searchRoots: readonly string[],\n): Promise<{\n readonly displayPath: string;\n readonly resolvedPath: string;\n readonly attempted: readonly string[];\n}> {\n const templateCandidates = isTemplateReference(include)\n ? [\n path.join('.agentv', 'templates', `${include}.yaml`),\n path.join('.agentv', 'templates', `${include}.yml`),\n ]\n : [include];\n\n const attempted: string[] = [];\n for (const candidate of templateCandidates) {\n const resolved = await resolveFileReference(candidate, searchRoots);\n attempted.push(...resolved.attempted);\n if (resolved.resolvedPath) {\n return {\n displayPath: resolved.displayPath,\n resolvedPath: resolved.resolvedPath,\n attempted,\n };\n }\n }\n\n return {\n displayPath: templateCandidates[0] ?? include,\n resolvedPath: '',\n attempted,\n };\n}\n\nasync function loadAssertionTemplateEntries(\n include: string,\n searchRoots: readonly string[],\n evalId: string,\n includeContext: IncludeContext,\n): Promise<readonly unknown[]> {\n const nextDepth = includeContext.depth + 1;\n if (nextDepth > MAX_ASSERTION_INCLUDE_DEPTH) {\n const chain = [...includeContext.chain, include].join(' -> ');\n throw new Error(\n `Assertion template include depth exceeded ${MAX_ASSERTION_INCLUDE_DEPTH} in '${evalId}'. Include chain: ${chain}`,\n );\n }\n\n const resolved = await resolveAssertionTemplateReference(include, searchRoots);\n if (!resolved.resolvedPath) {\n const attempted =\n resolved.attempted.length > 0\n ? `\\n${resolved.attempted.map((attempt) => ` Tried: ${attempt}`).join('\\n')}`\n : '';\n throw new Error(\n `Assertion template not found in '${evalId}': ${resolved.displayPath}${attempted}`,\n );\n }\n\n if (includeContext.chain.includes(resolved.resolvedPath)) {\n const cycle = [...includeContext.chain, resolved.resolvedPath].join(' -> ');\n throw new Error(`Assertion template cycle detected in '${evalId}': ${cycle}`);\n }\n\n const content = await readFile(resolved.resolvedPath, 'utf8');\n const parsed = interpolateEnv(parseYamlValue(content), process.env) as unknown;\n if (!isJsonObject(parsed)) {\n throw new Error(\n `Invalid assertion template file in '${evalId}': ${resolved.resolvedPath} (expected a YAML object with an assertions array)`,\n );\n }\n\n const assertions = (parsed as Record<string, unknown>).assertions;\n if (!Array.isArray(assertions)) {\n throw new Error(\n `Invalid assertion template file in '${evalId}': ${resolved.resolvedPath} is missing a top-level assertions array`,\n );\n }\n\n const templateDir = path.dirname(resolved.resolvedPath);\n const nestedSearchRoots = [\n templateDir,\n ...searchRoots.filter((root) => path.resolve(root) !== templateDir),\n ];\n\n return (\n (await expandGraderEntries(assertions, nestedSearchRoots, evalId, {\n depth: nextDepth,\n chain: [...includeContext.chain, resolved.resolvedPath],\n })) ?? []\n );\n}\n\nasync function expandGraderEntries(\n candidateEvaluators: JsonValue | undefined,\n searchRoots: readonly string[],\n evalId: string,\n includeContext: IncludeContext = { depth: 0, chain: [] },\n): Promise<readonly unknown[] | undefined> {\n if (candidateEvaluators === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(candidateEvaluators)) {\n logWarning(`Skipping evaluators for '${evalId}': expected array`);\n return undefined;\n }\n\n const expanded: unknown[] = [];\n for (const rawEvaluator of candidateEvaluators) {\n if (isIncludeEntry(rawEvaluator)) {\n const included = await loadAssertionTemplateEntries(\n rawEvaluator.include,\n searchRoots,\n evalId,\n includeContext,\n );\n expanded.push(...included);\n continue;\n }\n expanded.push(rawEvaluator);\n }\n\n return expanded;\n}\n\n/**\n * Parse a raw evaluator array into typed GraderConfig objects.\n */\nasync function parseGraderList(\n candidateEvaluators: JsonValue | undefined,\n searchRoots: readonly string[],\n evalId: string,\n defaultPreprocessors?: readonly ContentPreprocessorConfig[],\n): Promise<readonly GraderConfig[] | undefined> {\n const expandedEvaluators = await expandGraderEntries(candidateEvaluators, searchRoots, evalId);\n if (!expandedEvaluators) {\n return undefined;\n }\n\n // Pre-process: collect all string entries across the array (regardless of position) and\n // group them into a single rubrics evaluator inserted at the first-string position.\n // Non-string entries are preserved in their original relative order.\n const firstStringIndex = expandedEvaluators.findIndex((e) => typeof e === 'string');\n const processedEvaluators: unknown[] =\n firstStringIndex === -1\n ? [...expandedEvaluators]\n : (() => {\n const PLACEHOLDER = Symbol('rubric-placeholder');\n const strings: string[] = [];\n const result: unknown[] = [];\n let rubricInserted = false;\n for (const item of expandedEvaluators) {\n if (typeof item === 'string') {\n const trimmed = item.trim();\n if (trimmed.length === 0) {\n logWarning(`Skipping empty string criterion in assert array for '${evalId}'`);\n } else {\n strings.push(trimmed);\n }\n if (!rubricInserted) {\n result.push(PLACEHOLDER);\n rubricInserted = true;\n }\n } else {\n result.push(item);\n }\n }\n const placeholderIndex = result.indexOf(PLACEHOLDER);\n if (strings.length > 0 && placeholderIndex !== -1) {\n // Set weight = number of criteria so each user-visible string assertion contributes\n // equal weight to the overall score alongside other explicit graders.\n // e.g. [contains, \"crit1\", \"crit2\", \"crit3\"] → contains(w=1) + rubrics(w=3)\n // → each of the 4 visible assertions counts equally.\n result[placeholderIndex] = {\n type: 'rubrics',\n criteria: strings,\n weight: strings.length,\n };\n } else if (placeholderIndex !== -1) {\n // All strings were empty — remove the placeholder\n result.splice(placeholderIndex, 1);\n }\n return result;\n })();\n\n const evaluators: GraderConfig[] = [];\n\n for (const rawEvaluator of processedEvaluators) {\n if (!isJsonObject(rawEvaluator)) {\n logWarning(`Skipping invalid evaluator entry for '${evalId}' (expected object)`);\n continue;\n }\n\n const rawName = asString(rawEvaluator.name);\n const rawType = rawEvaluator.type;\n // Normalize legacy snake_case YAML type names to internal kebab-case (e.g., 'llm_grader' -> 'llm-grader')\n const typeValue = typeof rawType === 'string' ? normalizeGraderType(rawType) : rawType;\n\n if (typeof typeValue === 'string' && isDeprecatedJudgeType(typeValue)) {\n logWarning(\n `Skipping evaluator '${rawName ?? '<unnamed>'}' in '${evalId}': '${rawType}' is deprecated. Use '${typeValue.replace('-judge', '-grader')}' instead`,\n );\n continue;\n }\n\n // Unknown types are treated as custom assertion types (resolved via registry discovery)\n const isCustomType = typeof typeValue === 'string' && !isGraderKind(typeValue);\n if (typeof typeValue !== 'string') {\n logWarning(`Skipping evaluator with invalid type in '${evalId}'`);\n continue;\n }\n\n const customTypeName = isCustomType ? typeValue : undefined;\n\n // Auto-generate name from type if not provided\n const name =\n rawName ??\n (isCustomType ? typeValue : generateAssertionName(typeValue as GraderKind, rawEvaluator));\n\n if (!name) {\n logWarning(`Skipping evaluator with missing name in '${evalId}'`);\n continue;\n }\n\n const negate = rawEvaluator.negate === true ? true : undefined;\n const mergedPreprocessors = await parseMergedPreprocessors(\n rawEvaluator.preprocessors as JsonValue | undefined,\n defaultPreprocessors,\n searchRoots,\n name,\n evalId,\n );\n\n // Custom assertion types — store with their type name for registry dispatch\n if (isCustomType) {\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n // Collect all properties except known meta-keys as pass-through config\n const knownProps = new Set(['name', 'type', 'weight', 'required', 'min_score', 'negate']);\n const config: Record<string, JsonValue> = {};\n for (const [key, value] of Object.entries(rawEvaluator)) {\n if (!knownProps.has(key) && value !== undefined) {\n config[key] = value as JsonValue;\n }\n }\n evaluators.push({\n name,\n type: customTypeName as unknown as GraderKind,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n ...(Object.keys(config).length > 0 ? { config } : {}),\n } as GraderConfig);\n continue;\n }\n\n if (typeValue === 'code-grader') {\n let command: string[] | undefined;\n // Precedence: command > script (deprecated alias)\n if (rawEvaluator.script !== undefined && rawEvaluator.command === undefined) {\n console.warn(\n `${ANSI_YELLOW}Warning: 'script' is deprecated in evaluator '${name}' in '${evalId}'. Use 'command' instead.${ANSI_RESET}`,\n );\n }\n const rawCommand = rawEvaluator.command ?? rawEvaluator.script;\n\n if (typeof rawCommand === 'string') {\n const trimmed = rawCommand.trim();\n if (trimmed.length === 0) {\n throw new Error(\n `Invalid code-grader command for evaluator '${name}' in '${evalId}': command cannot be empty`,\n );\n }\n command = parseCommandToArgv(trimmed);\n } else {\n command = asStringArray(\n rawCommand,\n `code-grader command for evaluator '${name}' in '${evalId}'`,\n );\n }\n\n if (!command) {\n logWarning(`Skipping code-grader evaluator '${name}' in '${evalId}': missing command`);\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n const cwd = asString(rawEvaluator.cwd);\n let resolvedCwd: string | undefined;\n\n if (cwd) {\n const resolved = await resolveFileReference(cwd, searchRoots);\n if (resolved.resolvedPath) {\n resolvedCwd = path.resolve(resolved.resolvedPath);\n } else {\n logWarning(\n `Code-grader evaluator '${name}' in '${evalId}': cwd not found (${resolved.displayPath})`,\n resolved.attempted.length > 0\n ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`)\n : undefined,\n );\n }\n } else {\n resolvedCwd = searchRoots[0];\n }\n\n // Parse optional target config (enables target proxy access)\n const rawTarget = rawEvaluator.target;\n let targetConfig: import('../types.js').TargetAccessConfig | undefined;\n if (rawTarget !== undefined) {\n if (isJsonObject(rawTarget)) {\n const maxCalls = rawTarget.max_calls;\n if (maxCalls !== undefined && (typeof maxCalls !== 'number' || maxCalls < 0)) {\n logWarning(\n `Invalid target.max_calls for evaluator '${name}' in '${evalId}': must be a non-negative number`,\n );\n } else {\n targetConfig = {\n ...(typeof maxCalls === 'number' ? { max_calls: maxCalls } : {}),\n };\n }\n } else if (rawTarget === true) {\n // Support shorthand: `target: true` to enable with defaults\n targetConfig = {};\n } else {\n logWarning(\n `Invalid target config for evaluator '${name}' in '${evalId}': expected object or true`,\n );\n }\n }\n\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n\n // Collect unrecognized properties as pass-through config\n const knownProps = new Set([\n 'name',\n 'type',\n 'command',\n 'script',\n 'cwd',\n 'weight',\n 'target',\n 'preprocessors',\n 'required',\n 'negate',\n ]);\n const config: Record<string, JsonValue> = {};\n for (const [key, value] of Object.entries(rawEvaluator)) {\n if (!knownProps.has(key) && value !== undefined) {\n config[key] = value as JsonValue;\n }\n }\n\n evaluators.push({\n name,\n type: 'code-grader',\n command,\n cwd,\n resolvedCwd,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n ...(Object.keys(config).length > 0 ? { config } : {}),\n ...(mergedPreprocessors ? { preprocessors: mergedPreprocessors } : {}),\n ...(targetConfig !== undefined ? { target: targetConfig } : {}),\n });\n continue;\n }\n\n if (typeValue === 'composite') {\n // Accept assertions > assert > evaluators (deprecated)\n const rawMembers = rawEvaluator.assertions ?? rawEvaluator.assert ?? rawEvaluator.evaluators; // evaluators deprecated\n if (!Array.isArray(rawMembers)) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': missing assertions (or evaluators) array`,\n );\n continue;\n }\n\n const rawAggregator = rawEvaluator.aggregator;\n if (!isJsonObject(rawAggregator)) {\n logWarning(`Skipping composite evaluator '${name}' in '${evalId}': missing aggregator`);\n continue;\n }\n\n const aggregatorType = asString(rawAggregator.type);\n const normalizedAggregatorType =\n typeof aggregatorType === 'string'\n ? aggregatorType === 'weighted_average' || aggregatorType === 'threshold'\n ? aggregatorType\n : normalizeGraderType(aggregatorType)\n : aggregatorType;\n if (\n typeof normalizedAggregatorType === 'string' &&\n isDeprecatedJudgeType(normalizedAggregatorType)\n ) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': aggregator type '${aggregatorType}' is deprecated. Use '${normalizedAggregatorType.replace('-judge', '-grader')}' instead`,\n );\n continue;\n }\n if (\n normalizedAggregatorType !== 'weighted_average' &&\n normalizedAggregatorType !== 'code-grader' &&\n normalizedAggregatorType !== 'llm-grader' &&\n normalizedAggregatorType !== 'threshold'\n ) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': invalid aggregator type '${aggregatorType}'`,\n );\n continue;\n }\n\n const expandedMembers = await expandGraderEntries(\n rawMembers,\n searchRoots,\n `${evalId}:${name}`,\n );\n if (!expandedMembers) {\n continue;\n }\n\n // Recursively parse member evaluators\n const memberEvaluators: GraderConfig[] = [];\n for (const rawMember of expandedMembers) {\n if (!isJsonObject(rawMember)) {\n logWarning(`Skipping invalid member evaluator in composite '${name}' (expected object)`);\n continue;\n }\n\n const memberName = asString(rawMember.name);\n const memberType = rawMember.type;\n\n if (!memberName || !isGraderKind(memberType)) {\n logWarning(`Skipping member evaluator with invalid name/type in composite '${name}'`);\n continue;\n }\n\n // Parse member evaluator (reuse existing logic for code, llm-grader, code-grader)\n const memberConfigs = await parseGraders(\n { evaluators: [rawMember] },\n undefined,\n searchRoots,\n `${evalId}:${name}:${memberName}`,\n );\n\n if (memberConfigs && memberConfigs.length > 0) {\n memberEvaluators.push(memberConfigs[0]);\n }\n }\n\n if (memberEvaluators.length === 0) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': no valid member evaluators`,\n );\n continue;\n }\n\n // Parse aggregator config\n let aggregator: import('../types.js').CompositeAggregatorConfig;\n\n if (normalizedAggregatorType === 'weighted_average') {\n const weights = isJsonObject(rawAggregator.weights)\n ? (rawAggregator.weights as Record<string, unknown>)\n : undefined;\n const parsedWeights: Record<string, number> = {};\n if (weights) {\n for (const [key, value] of Object.entries(weights)) {\n if (typeof value === 'number') {\n parsedWeights[key] = value;\n }\n }\n }\n aggregator = {\n type: 'weighted_average',\n ...(Object.keys(parsedWeights).length > 0 ? { weights: parsedWeights } : {}),\n };\n } else if (normalizedAggregatorType === 'code-grader') {\n const aggregatorPath = asString(rawAggregator.path);\n if (!aggregatorPath) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': code-grader aggregator missing path`,\n );\n continue;\n }\n\n // Set cwd to eval file directory (first search root)\n // Paths are resolved relative to this directory\n aggregator = {\n type: 'code-grader',\n path: aggregatorPath,\n cwd: searchRoots[0],\n };\n } else if (normalizedAggregatorType === 'threshold') {\n const thresholdValue = rawAggregator.threshold;\n if (typeof thresholdValue !== 'number' || thresholdValue < 0 || thresholdValue > 1) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': threshold must be a number between 0.0 and 1.0`,\n );\n continue;\n }\n aggregator = {\n type: 'threshold',\n threshold: thresholdValue,\n };\n } else {\n // llm-grader aggregator — same file:// prefix logic as evaluator prompts\n const rawAggPrompt = asString(rawAggregator.prompt);\n let aggregatorPrompt: string | undefined;\n let promptPath: string | undefined;\n\n if (rawAggPrompt) {\n if (rawAggPrompt.startsWith(PROMPT_FILE_PREFIX)) {\n // Explicit file reference — error if not found\n const fileRef = rawAggPrompt.slice(PROMPT_FILE_PREFIX.length);\n aggregatorPrompt = fileRef;\n const resolved = await resolveFileReference(fileRef, searchRoots);\n if (resolved.resolvedPath) {\n promptPath = path.resolve(resolved.resolvedPath);\n } else {\n throw new Error(\n `Composite aggregator in '${evalId}': prompt file not found: ${resolved.displayPath}`,\n );\n }\n } else {\n // Bare string — always treat as inline text, no file resolution\n aggregatorPrompt = rawAggPrompt;\n }\n }\n\n aggregator = {\n type: 'llm-grader',\n ...(aggregatorPrompt ? { prompt: aggregatorPrompt } : {}),\n ...(promptPath ? { promptPath } : {}),\n };\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n\n evaluators.push({\n name,\n type: 'composite',\n assertions: memberEvaluators,\n aggregator,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\n continue;\n }\n\n if (typeValue === 'tool-trajectory') {\n const mode = asString(rawEvaluator.mode);\n if (\n mode !== 'any_order' &&\n mode !== 'in_order' &&\n mode !== 'exact' &&\n mode !== 'subset' &&\n mode !== 'superset'\n ) {\n logWarning(\n `Skipping tool-trajectory evaluator '${name}' in '${evalId}': invalid mode '${mode}' (must be any_order, in_order, exact, subset, or superset)`,\n );\n continue;\n }\n\n const rawMinimums = rawEvaluator.minimums;\n let minimums: Record<string, number> | undefined;\n if (rawMinimums !== undefined) {\n if (!isJsonObject(rawMinimums)) {\n logWarning(\n `Skipping tool-trajectory evaluator '${name}' in '${evalId}': minimums must be an object`,\n );\n continue;\n }\n minimums = {};\n for (const [toolName, count] of Object.entries(rawMinimums)) {\n if (typeof count === 'number' && count >= 0) {\n minimums[toolName] = count;\n }\n }\n }\n\n // Parse args_match at evaluator level (snake_case from YAML -> camelCase)\n const rawArgsMatch = rawEvaluator.args_match ?? rawEvaluator.argsMatch;\n let argsMatch: import('../trace.js').ArgsMatchMode | readonly string[] | undefined;\n if (rawArgsMatch !== undefined) {\n if (Array.isArray(rawArgsMatch)) {\n // Field list mode: string array of field paths\n const fieldList = rawArgsMatch.filter(\n (f): f is string => typeof f === 'string' && f.length > 0,\n );\n if (fieldList.length > 0) {\n argsMatch = fieldList;\n }\n } else if (typeof rawArgsMatch === 'string') {\n if (\n rawArgsMatch === 'exact' ||\n rawArgsMatch === 'superset' ||\n rawArgsMatch === 'subset' ||\n rawArgsMatch === 'ignore'\n ) {\n argsMatch = rawArgsMatch;\n } else {\n logWarning(\n `Invalid args_match '${rawArgsMatch}' for tool-trajectory evaluator '${name}' in '${evalId}': must be exact, superset, subset, ignore, or a string array`,\n );\n }\n }\n }\n\n const rawExpected = rawEvaluator.expected;\n let expected: ToolTrajectoryExpectedItem[] | undefined;\n if (rawExpected !== undefined) {\n if (!Array.isArray(rawExpected)) {\n logWarning(\n `Skipping tool-trajectory evaluator '${name}' in '${evalId}': expected must be an array`,\n );\n continue;\n }\n expected = [];\n for (const item of rawExpected) {\n if (isJsonObject(item) && typeof item.tool === 'string') {\n // Parse optional args field: 'any' or Record<string, unknown>\n let args: ToolTrajectoryExpectedItem['args'];\n if (item.args === 'any') {\n args = 'any';\n } else if (isJsonObject(item.args)) {\n args = item.args as Record<string, unknown>;\n }\n\n // Parse optional max_duration_ms (snake_case from YAML -> camelCase)\n const rawMaxDuration = item.max_duration_ms ?? item.maxDurationMs;\n const maxDurationMs =\n typeof rawMaxDuration === 'number' && rawMaxDuration >= 0\n ? rawMaxDuration\n : undefined;\n\n // Parse per-item args_match (snake_case from YAML -> camelCase)\n const rawItemArgsMatch = item.args_match ?? item.argsMatch;\n let itemArgsMatch: import('../trace.js').ArgsMatchMode | readonly string[] | undefined;\n if (rawItemArgsMatch !== undefined) {\n if (Array.isArray(rawItemArgsMatch)) {\n const fieldList = rawItemArgsMatch.filter(\n (f): f is string => typeof f === 'string' && f.length > 0,\n );\n if (fieldList.length > 0) {\n itemArgsMatch = fieldList;\n }\n } else if (typeof rawItemArgsMatch === 'string') {\n if (\n rawItemArgsMatch === 'exact' ||\n rawItemArgsMatch === 'superset' ||\n rawItemArgsMatch === 'subset' ||\n rawItemArgsMatch === 'ignore'\n ) {\n itemArgsMatch = rawItemArgsMatch;\n } else {\n logWarning(\n `Invalid args_match '${rawItemArgsMatch}' for expected item '${item.tool}' in evaluator '${name}' in '${evalId}'`,\n );\n }\n }\n }\n\n expected.push({\n tool: item.tool,\n ...(args !== undefined ? { args } : {}),\n ...(maxDurationMs !== undefined ? { maxDurationMs } : {}),\n ...(itemArgsMatch !== undefined ? { argsMatch: itemArgsMatch } : {}),\n });\n }\n }\n }\n\n // Validate config completeness based on mode\n if (mode === 'any_order' && !minimums) {\n logWarning(\n `Skipping tool-trajectory evaluator '${name}' in '${evalId}': any_order mode requires minimums`,\n );\n continue;\n }\n\n if (\n (mode === 'in_order' || mode === 'exact' || mode === 'subset' || mode === 'superset') &&\n !expected\n ) {\n logWarning(\n `Skipping tool-trajectory evaluator '${name}' in '${evalId}': ${mode} mode requires expected`,\n );\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n\n const config: ToolTrajectoryGraderConfig = {\n name,\n type: 'tool-trajectory',\n mode,\n ...(minimums ? { minimums } : {}),\n ...(expected ? { expected } : {}),\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n ...(argsMatch !== undefined ? { argsMatch } : {}),\n };\n\n evaluators.push(config);\n continue;\n }\n\n if (typeValue === 'field-accuracy') {\n const rawFields = rawEvaluator.fields;\n if (!Array.isArray(rawFields)) {\n logWarning(\n `Skipping field-accuracy evaluator '${name}' in '${evalId}': missing fields array`,\n );\n continue;\n }\n\n if (rawFields.length === 0) {\n logWarning(\n `Skipping field-accuracy evaluator '${name}' in '${evalId}': fields array is empty`,\n );\n continue;\n }\n\n const fields: import('../types.js').FieldConfig[] = [];\n for (const rawField of rawFields) {\n if (!isJsonObject(rawField)) {\n logWarning(\n `Skipping invalid field entry in field-accuracy evaluator '${name}' (expected object)`,\n );\n continue;\n }\n\n const fieldPath = asString(rawField.path);\n const match = asString(rawField.match);\n\n if (!fieldPath) {\n logWarning(\n `Skipping field without path in field-accuracy evaluator '${name}' in '${evalId}'`,\n );\n continue;\n }\n\n if (!match || !isValidFieldMatchType(match)) {\n logWarning(\n `Skipping field '${fieldPath}' with invalid match type '${match}' in evaluator '${name}' (must be exact, numeric_tolerance, or date). For fuzzy matching, use a code-grader evaluator.`,\n );\n continue;\n }\n\n const fieldConfig: import('../types.js').FieldConfig = {\n path: fieldPath,\n match,\n ...(typeof rawField.required === 'boolean' ? { required: rawField.required } : {}),\n ...(typeof rawField.weight === 'number' ? { weight: rawField.weight } : {}),\n ...(typeof rawField.tolerance === 'number' ? { tolerance: rawField.tolerance } : {}),\n ...(typeof rawField.relative === 'boolean' ? { relative: rawField.relative } : {}),\n ...(Array.isArray(rawField.formats)\n ? { formats: rawField.formats.filter((f): f is string => typeof f === 'string') }\n : {}),\n };\n\n fields.push(fieldConfig);\n }\n\n if (fields.length === 0) {\n logWarning(\n `Skipping field-accuracy evaluator '${name}' in '${evalId}': no valid fields found`,\n );\n continue;\n }\n\n const aggregation = asString(rawEvaluator.aggregation);\n const validAggregation = isValidFieldAggregationType(aggregation) ? aggregation : undefined;\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n\n evaluators.push({\n name,\n type: 'field-accuracy',\n fields,\n ...(validAggregation ? { aggregation: validAggregation } : {}),\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\n continue;\n }\n\n if (typeValue === 'latency') {\n const threshold = rawEvaluator.threshold;\n if (typeof threshold !== 'number' || threshold < 0) {\n logWarning(\n `Skipping latency evaluator '${name}' in '${evalId}': threshold must be a non-negative number`,\n );\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n\n evaluators.push({\n name,\n type: 'latency',\n threshold,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\n continue;\n }\n\n if (typeValue === 'cost') {\n const budget = rawEvaluator.budget;\n if (typeof budget !== 'number' || budget < 0) {\n logWarning(\n `Skipping cost evaluator '${name}' in '${evalId}': budget must be a non-negative number`,\n );\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n\n evaluators.push({\n name,\n type: 'cost',\n budget,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\n continue;\n }\n\n if (typeValue === 'token-usage') {\n const maxTotal = rawEvaluator.max_total ?? rawEvaluator.maxTotal;\n const maxInput = rawEvaluator.max_input ?? rawEvaluator.maxInput;\n const maxOutput = rawEvaluator.max_output ?? rawEvaluator.maxOutput;\n\n const limits = [\n ['max_total', maxTotal],\n ['max_input', maxInput],\n ['max_output', maxOutput],\n ] as const;\n\n const validLimits: Partial<Record<'max_total' | 'max_input' | 'max_output', number>> = {};\n\n for (const [key, raw] of limits) {\n if (raw === undefined) continue;\n if (typeof raw !== 'number' || !Number.isFinite(raw) || raw < 0) {\n logWarning(\n `Skipping token-usage evaluator '${name}' in '${evalId}': ${key} must be a non-negative finite number`,\n );\n continue;\n }\n validLimits[key] = raw;\n }\n\n if (\n validLimits.max_total === undefined &&\n validLimits.max_input === undefined &&\n validLimits.max_output === undefined\n ) {\n logWarning(\n `Skipping token-usage evaluator '${name}' in '${evalId}': must set at least one of max_total, max_input, max_output`,\n );\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n\n evaluators.push({\n name,\n type: 'token-usage',\n ...validLimits,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\n continue;\n }\n\n if (typeValue === 'execution-metrics') {\n const maxToolCalls = rawEvaluator.max_tool_calls ?? rawEvaluator.maxToolCalls;\n const maxLlmCalls = rawEvaluator.max_llm_calls ?? rawEvaluator.maxLlmCalls;\n const maxTokens = rawEvaluator.max_tokens ?? rawEvaluator.maxTokens;\n const maxCostUsd = rawEvaluator.max_cost_usd ?? rawEvaluator.maxCostUsd;\n const maxDurationMs = rawEvaluator.max_duration_ms ?? rawEvaluator.maxDurationMs;\n const targetExplorationRatio =\n rawEvaluator.target_exploration_ratio ?? rawEvaluator.targetExplorationRatio;\n const explorationTolerance =\n rawEvaluator.exploration_tolerance ?? rawEvaluator.explorationTolerance;\n\n const thresholds = [\n ['max_tool_calls', maxToolCalls],\n ['max_llm_calls', maxLlmCalls],\n ['max_tokens', maxTokens],\n ['max_cost_usd', maxCostUsd],\n ['max_duration_ms', maxDurationMs],\n ['target_exploration_ratio', targetExplorationRatio],\n ['exploration_tolerance', explorationTolerance],\n ] as const;\n\n type ThresholdKey =\n | 'max_tool_calls'\n | 'max_llm_calls'\n | 'max_tokens'\n | 'max_cost_usd'\n | 'max_duration_ms'\n | 'target_exploration_ratio'\n | 'exploration_tolerance';\n\n const validThresholds: Partial<Record<ThresholdKey, number>> = {};\n let hasError = false;\n\n for (const [key, raw] of thresholds) {\n if (raw === undefined) continue;\n if (typeof raw !== 'number' || !Number.isFinite(raw) || raw < 0) {\n logWarning(\n `Skipping execution-metrics evaluator '${name}' in '${evalId}': ${key} must be a non-negative finite number`,\n );\n hasError = true;\n break;\n }\n validThresholds[key] = raw;\n }\n\n if (hasError) {\n continue;\n }\n\n // Validate that at least one threshold is specified (excluding exploration_tolerance which is only a modifier)\n const hasThreshold =\n validThresholds.max_tool_calls !== undefined ||\n validThresholds.max_llm_calls !== undefined ||\n validThresholds.max_tokens !== undefined ||\n validThresholds.max_cost_usd !== undefined ||\n validThresholds.max_duration_ms !== undefined ||\n validThresholds.target_exploration_ratio !== undefined;\n\n if (!hasThreshold) {\n logWarning(\n `Skipping execution-metrics evaluator '${name}' in '${evalId}': must set at least one threshold (max_tool_calls, max_llm_calls, max_tokens, max_cost_usd, max_duration_ms, or target_exploration_ratio)`,\n );\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n\n evaluators.push({\n name,\n type: 'execution-metrics',\n ...validThresholds,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\n continue;\n }\n\n if (typeValue === 'skill-trigger') {\n const skillName = asString(rawEvaluator.skill);\n if (!skillName) {\n logWarning(`Skipping skill-trigger evaluator '${name}' in '${evalId}': missing skill`);\n continue;\n }\n const rawShouldTrigger = rawEvaluator.should_trigger;\n const shouldTrigger = typeof rawShouldTrigger === 'boolean' ? rawShouldTrigger : undefined;\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n evaluators.push({\n name,\n type: 'skill-trigger',\n skill: skillName,\n ...(shouldTrigger !== undefined ? { should_trigger: shouldTrigger } : {}),\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\n continue;\n }\n\n if (typeValue === 'contains') {\n const value = asString(rawEvaluator.value);\n if (!value) {\n logWarning(`Skipping contains evaluator '${name}' in '${evalId}': missing value`);\n continue;\n }\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n evaluators.push({\n name,\n type: 'contains',\n value,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\n continue;\n }\n\n if (typeValue === 'contains-any' || typeValue === 'contains-all') {\n const value = asStringArrayStrict(rawEvaluator.value);\n if (!value || value.length === 0) {\n logWarning(\n `Skipping ${typeValue} evaluator '${name}' in '${evalId}': value must be a non-empty string array`,\n );\n continue;\n }\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n evaluators.push({\n name,\n type: typeValue,\n value,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n } as import('../types.js').GraderConfig);\n continue;\n }\n\n if (typeValue === 'icontains') {\n const value = asString(rawEvaluator.value);\n if (!value) {\n logWarning(`Skipping icontains evaluator '${name}' in '${evalId}': missing value`);\n continue;\n }\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n evaluators.push({\n name,\n type: 'icontains',\n value,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n } as import('../types.js').GraderConfig);\n continue;\n }\n\n if (typeValue === 'icontains-any' || typeValue === 'icontains-all') {\n const value = asStringArrayStrict(rawEvaluator.value);\n if (!value || value.length === 0) {\n logWarning(\n `Skipping ${typeValue} evaluator '${name}' in '${evalId}': value must be a non-empty string array`,\n );\n continue;\n }\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n evaluators.push({\n name,\n type: typeValue,\n value,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n } as import('../types.js').GraderConfig);\n continue;\n }\n\n if (typeValue === 'starts-with' || typeValue === 'ends-with') {\n const value = asString(rawEvaluator.value);\n if (!value) {\n logWarning(`Skipping ${typeValue} evaluator '${name}' in '${evalId}': missing value`);\n continue;\n }\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n evaluators.push({\n name,\n type: typeValue,\n value,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n } as import('../types.js').GraderConfig);\n continue;\n }\n\n if (typeValue === 'regex') {\n const value = asString(rawEvaluator.value);\n if (!value) {\n logWarning(`Skipping regex evaluator '${name}' in '${evalId}': missing value`);\n continue;\n }\n const flags = asString(rawEvaluator.flags);\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n evaluators.push({\n name,\n type: 'regex',\n value,\n ...(flags !== undefined ? { flags } : {}),\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\n continue;\n }\n\n if (typeValue === 'is-json') {\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n evaluators.push({\n name,\n type: 'is-json',\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\n continue;\n }\n\n if (typeValue === 'equals') {\n const value = asString(rawEvaluator.value);\n if (!value) {\n logWarning(`Skipping equals evaluator '${name}' in '${evalId}': missing value`);\n continue;\n }\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n evaluators.push({\n name,\n type: 'equals',\n value,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\n continue;\n }\n\n const graderTarget = rawEvaluator.target;\n let graderTargetName: string | undefined;\n if (graderTarget !== undefined) {\n if (typeof graderTarget === 'string' && graderTarget.trim().length > 0) {\n graderTargetName = graderTarget;\n } else {\n logWarning(\n `Skipping target override for llm-grader evaluator '${name}' in '${evalId}': target must be a non-empty string`,\n );\n }\n }\n\n if (typeValue === 'rubrics') {\n const rawCriteria = rawEvaluator.criteria;\n if (!Array.isArray(rawCriteria) || rawCriteria.length === 0) {\n logWarning(\n `Skipping rubrics evaluator '${name}' in '${evalId}': criteria must be a non-empty array`,\n );\n continue;\n }\n\n // Normalize string shorthands to objects before passing to parseRubricItems\n const normalizedCriteria = rawCriteria.map((item, index) => {\n if (typeof item === 'string') {\n return { id: `rubric-${index + 1}`, outcome: item, weight: 1.0, required: true };\n }\n return item;\n });\n\n const parsedCriteria = parseRubricItems(normalizedCriteria, name, evalId);\n if (!parsedCriteria || parsedCriteria.length === 0) {\n logWarning(`Skipping rubrics evaluator '${name}' in '${evalId}': no valid criteria found`);\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n\n evaluators.push({\n name,\n type: 'llm-grader',\n rubrics: parsedCriteria,\n ...(graderTargetName ? { target: graderTargetName } : {}),\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n ...(mergedPreprocessors ? { preprocessors: mergedPreprocessors } : {}),\n });\n continue;\n }\n\n // Parse prompt field - can be string (text template) or object (executable script)\n const rawPrompt = rawEvaluator.prompt;\n let prompt: string | undefined;\n let promptPath: string | undefined;\n let resolvedPromptScript: string[] | undefined;\n let promptScriptConfig: Record<string, unknown> | undefined;\n\n if (isJsonObject(rawPrompt)) {\n // Executable prompt template: { command: [...], config: {...} }\n // Precedence: command > script (deprecated alias)\n if (rawPrompt.script !== undefined && rawPrompt.command === undefined) {\n console.warn(\n `${ANSI_YELLOW}Warning: 'prompt.script' is deprecated in evaluator '${name}' in '${evalId}'. Use 'prompt.command' instead.${ANSI_RESET}`,\n );\n }\n const commandArray = asStringArray(\n rawPrompt.command ?? rawPrompt.script,\n `prompt.command for evaluator '${name}' in '${evalId}'`,\n );\n\n if (!commandArray) {\n throw new Error(`Grader '${name}' in '${evalId}': prompt object requires command array`);\n }\n\n // Resolve the command path (last element is typically the file path)\n const commandPath = commandArray[commandArray.length - 1];\n const resolved = await resolveFileReference(commandPath, searchRoots);\n\n if (resolved.resolvedPath) {\n // Replace the last element with the resolved path\n resolvedPromptScript = [...commandArray.slice(0, -1), path.resolve(resolved.resolvedPath)];\n } else {\n throw new Error(\n `Grader '${name}' in '${evalId}': prompt command file not found: ${resolved.displayPath}`,\n );\n }\n\n // Extract config from prompt object\n if (isJsonObject(rawPrompt.config)) {\n promptScriptConfig = rawPrompt.config as Record<string, unknown>;\n }\n } else if (typeof rawPrompt === 'string') {\n // Text template prompt — supports explicit file:// prefix for file references.\n // \"file://prompts/grader.md\" → explicit file reference, error if not found\n // \"grader.md\" → inline text (no file resolution)\n // \"Evaluate the response\" → inline text\n\n if (rawPrompt.startsWith(PROMPT_FILE_PREFIX)) {\n // Explicit file reference — strip prefix and resolve. Error if not found.\n const fileRef = rawPrompt.slice(PROMPT_FILE_PREFIX.length);\n prompt = fileRef;\n const resolved = await resolveFileReference(fileRef, searchRoots);\n if (resolved.resolvedPath) {\n promptPath = path.resolve(resolved.resolvedPath);\n try {\n await validateCustomPromptContent(promptPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Grader '${name}' template (${promptPath}): ${message}`);\n }\n } else {\n throw new Error(\n `Grader '${name}' in '${evalId}': prompt file not found: ${resolved.displayPath}`,\n );\n }\n } else {\n // Bare string — always treat as inline text, no file resolution\n prompt = rawPrompt;\n }\n }\n\n const _model = asString(rawEvaluator.model);\n\n const rawRubrics = rawEvaluator.rubrics;\n const parsedRubrics = Array.isArray(rawRubrics)\n ? parseRubricItems(rawRubrics, name, evalId)\n : undefined;\n\n if (typeValue === 'rubric') {\n if (!parsedRubrics) {\n logWarning(`Skipping rubric evaluator '${name}' in '${evalId}': missing rubrics array`);\n continue;\n }\n if (parsedRubrics.length === 0) {\n logWarning(`Skipping rubric evaluator '${name}' in '${evalId}': no valid rubrics found`);\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n\n // deprecated: `type: rubric` maps to `type: llm-grader` with `rubrics`. Use `type: rubrics` with `criteria` instead.\n evaluators.push({\n name,\n type: 'llm-grader',\n rubrics: parsedRubrics,\n ...(graderTargetName ? { target: graderTargetName } : {}),\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n ...(mergedPreprocessors ? { preprocessors: mergedPreprocessors } : {}),\n });\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const { required, min_score } = parseRequiredAndMinScore(\n rawEvaluator.required,\n (rawEvaluator as Record<string, unknown>).min_score as JsonValue | undefined,\n name,\n evalId,\n );\n\n // Collect unrecognized properties as pass-through config (for text prompt templates)\n // Note: For script prompts, config comes from prompt.config instead\n const knownProps = new Set([\n 'name',\n 'type',\n 'prompt',\n 'model',\n 'rubrics',\n 'target',\n 'weight',\n 'config',\n 'required',\n 'min_score',\n 'negate',\n 'max_steps',\n 'maxSteps',\n 'temperature',\n 'preprocessors',\n ]);\n const config: Record<string, JsonValue> = {};\n for (const [key, value] of Object.entries(rawEvaluator)) {\n if (!knownProps.has(key) && value !== undefined) {\n config[key] = value as JsonValue;\n }\n }\n\n // Merge top-level config with any extra properties (top-level config takes precedence)\n const topLevelConfig = isJsonObject(rawEvaluator.config)\n ? (rawEvaluator.config as Record<string, JsonValue>)\n : {};\n const mergedConfig = { ...config, ...topLevelConfig };\n\n // Determine final config: prompt.config for script prompts, merged config for text prompts\n const finalConfig =\n promptScriptConfig ?? (Object.keys(mergedConfig).length > 0 ? mergedConfig : undefined);\n\n // Parse optional max_steps and temperature (used in agent mode)\n const rawMaxStepsLlm = rawEvaluator.max_steps ?? rawEvaluator.maxSteps;\n const llmMaxSteps =\n typeof rawMaxStepsLlm === 'number' &&\n Number.isInteger(rawMaxStepsLlm) &&\n rawMaxStepsLlm >= 1 &&\n rawMaxStepsLlm <= 50\n ? rawMaxStepsLlm\n : undefined;\n const rawTempLlm = rawEvaluator.temperature;\n const llmTemperature =\n typeof rawTempLlm === 'number' && rawTempLlm >= 0 && rawTempLlm <= 2 ? rawTempLlm : undefined;\n\n evaluators.push({\n name,\n type: 'llm-grader',\n prompt,\n promptPath,\n ...(promptPath ? { resolvedPromptPath: promptPath } : {}),\n ...(resolvedPromptScript ? { resolvedPromptScript } : {}),\n ...(parsedRubrics && parsedRubrics.length > 0 ? { rubrics: parsedRubrics } : {}),\n ...(graderTargetName ? { target: graderTargetName } : {}),\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(min_score !== undefined ? { min_score } : {}),\n ...(negate !== undefined ? { negate } : {}),\n ...(finalConfig ? { config: finalConfig } : {}),\n ...(llmMaxSteps !== undefined ? { max_steps: llmMaxSteps } : {}),\n ...(llmTemperature !== undefined ? { temperature: llmTemperature } : {}),\n ...(mergedPreprocessors ? { preprocessors: mergedPreprocessors } : {}),\n });\n }\n\n return evaluators.length > 0 ? evaluators : undefined;\n}\n\nasync function parseMergedPreprocessors(\n rawValue: JsonValue | undefined,\n defaultPreprocessors: readonly ContentPreprocessorConfig[] | undefined,\n searchRoots: readonly string[],\n evaluatorName: string,\n evalId: string,\n): Promise<readonly ContentPreprocessorConfig[] | undefined> {\n const parsedDefaults = defaultPreprocessors ?? [];\n const parsedOverrides = await parsePreprocessors(rawValue, searchRoots, evaluatorName, evalId);\n\n if (parsedDefaults.length === 0 && (!parsedOverrides || parsedOverrides.length === 0)) {\n return undefined;\n }\n\n const merged = new Map<string, ContentPreprocessorConfig>();\n for (const entry of parsedDefaults) {\n merged.set(normalizePreprocessorType(entry.type), entry);\n }\n for (const entry of parsedOverrides ?? []) {\n merged.set(normalizePreprocessorType(entry.type), entry);\n }\n\n return [...merged.values()];\n}\n\nexport async function parsePreprocessors(\n rawValue: JsonValue | undefined,\n searchRoots: readonly string[],\n evaluatorName: string,\n evalId: string,\n): Promise<readonly ContentPreprocessorConfig[] | undefined> {\n if (rawValue === undefined) {\n return undefined;\n }\n if (!Array.isArray(rawValue)) {\n throw new Error(`Grader '${evaluatorName}' in '${evalId}': preprocessors must be an array`);\n }\n\n const preprocessors: ContentPreprocessorConfig[] = [];\n for (const rawEntry of rawValue) {\n if (!isJsonObject(rawEntry)) {\n throw new Error(\n `Grader '${evaluatorName}' in '${evalId}': each preprocessor must be an object`,\n );\n }\n\n const type = asString(rawEntry.type)?.trim();\n if (!type) {\n throw new Error(`Grader '${evaluatorName}' in '${evalId}': preprocessor.type is required`);\n }\n\n const command = asStringArray(\n rawEntry.command,\n `preprocessor command for evaluator '${evaluatorName}' in '${evalId}'`,\n );\n if (!command || command.length === 0) {\n throw new Error(\n `Grader '${evaluatorName}' in '${evalId}': preprocessor '${type}' requires command`,\n );\n }\n\n const commandPath = command[command.length - 1];\n const resolved = await resolveFileReference(commandPath, searchRoots);\n if (!resolved.resolvedPath) {\n throw new Error(\n `Grader '${evaluatorName}' in '${evalId}': preprocessor command file not found: ${resolved.displayPath}`,\n );\n }\n\n preprocessors.push({\n type,\n command,\n resolvedCommand: [...command.slice(0, -1), path.resolve(resolved.resolvedPath)],\n });\n }\n\n return preprocessors;\n}\n\n/**\n * Generate a descriptive name for evaluators when no explicit name is given.\n * Returns the type name as a fallback so evaluators are never skipped just\n * because the author omitted `name`.\n */\nfunction generateAssertionName(typeValue: string, rawEvaluator: JsonObject): string {\n const value = asString(rawEvaluator.value);\n const arrayValue = Array.isArray(rawEvaluator.value) ? rawEvaluator.value : undefined;\n\n switch (typeValue) {\n case 'skill-trigger': {\n const skillValue = asString(rawEvaluator.skill);\n return skillValue ? `skill-trigger-${skillValue}` : 'skill-trigger';\n }\n case 'contains':\n return value ? `contains-${value}` : 'contains';\n case 'contains-any':\n return arrayValue ? `contains-any-${arrayValue.length}` : 'contains-any';\n case 'contains-all':\n return arrayValue ? `contains-all-${arrayValue.length}` : 'contains-all';\n case 'icontains':\n return value ? `icontains-${value}` : 'icontains';\n case 'icontains-any':\n return arrayValue ? `icontains-any-${arrayValue.length}` : 'icontains-any';\n case 'icontains-all':\n return arrayValue ? `icontains-all-${arrayValue.length}` : 'icontains-all';\n case 'starts-with':\n return value ? `starts-with-${value}` : 'starts-with';\n case 'ends-with':\n return value ? `ends-with-${value}` : 'ends-with';\n case 'regex':\n return value ? `regex-${value.length > 30 ? value.slice(0, 30) : value}` : 'regex';\n case 'is-json':\n return 'is-json';\n case 'equals':\n return value ? `equals-${value}` : 'equals';\n case 'rubrics':\n return 'rubrics';\n default:\n // For all other grader types (llm-grader, code-grader, latency, etc.),\n // use the type name itself as the auto-derived name.\n return typeValue;\n }\n}\n\n/**\n * Coerce evaluator value to valid GraderKind.\n */\nexport function coerceEvaluator(\n candidate: JsonValue | undefined,\n contextId: string,\n): GraderKind | undefined {\n if (typeof candidate !== 'string') {\n return undefined;\n }\n // Normalize legacy snake_case to kebab-case\n const normalized = normalizeGraderType(candidate);\n if (isDeprecatedJudgeType(normalized)) {\n throw new Error(\n `Unsupported grader '${candidate}' in ${contextId}. Use '${normalized.replace('-judge', '-grader')}' instead.`,\n );\n }\n if (isGraderKind(normalized)) {\n return normalized;\n }\n logWarning(`Unknown grader '${candidate}' in ${contextId}, falling back to default`);\n return undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/** Parse a value as a string array (for assertion value fields like contains-any). */\nfunction asStringArrayStrict(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const result = value.filter((v): v is string => typeof v === 'string');\n return result.length > 0 ? result : undefined;\n}\n\nfunction asStringArray(value: unknown, description: string): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n throw new Error(`${description} must be an array of strings (argv tokens)`);\n }\n\n if (value.length === 0) {\n throw new Error(`${description} cannot be empty`);\n }\n\n const result: string[] = [];\n for (const [index, entry] of value.entries()) {\n if (typeof entry !== 'string') {\n throw new Error(`${description}[${index}] must be a string`);\n }\n if (entry.trim().length === 0) {\n throw new Error(`${description}[${index}] cannot be empty`);\n }\n result.push(entry);\n }\n\n return result;\n}\n\nfunction parseCommandToArgv(command: string): string[] {\n if (process.platform === 'win32') {\n return ['cmd.exe', '/c', command];\n }\n return ['sh', '-lc', command];\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Parser-time criteria warnings were removed because custom graders and escape\n * hatches can consume criteria in ways that static config inspection cannot\n * reliably detect.\n */\nexport function warnUnconsumedCriteria(\n _criteria: string | undefined,\n _evaluators: readonly GraderConfig[] | undefined,\n _testId: string,\n): void {\n return;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\n/**\n * Parse a `required` value from raw evaluator config.\n * Accepts `true` (uses default 0.8 threshold) or a number in (0, 1] range.\n * Returns undefined for falsy/invalid values.\n */\nfunction parseRequired(value: JsonValue | undefined): boolean | number | undefined {\n if (value === true) return true;\n if (typeof value === 'number' && value > 0 && value <= 1) return value;\n return undefined;\n}\n\n/**\n * Parse `required` and `min_score` from raw evaluator config, handling deprecated `required: number`.\n *\n * - `required: true` → `{ required: true }`\n * - `required: 0.7` (deprecated) → `{ required: true, min_score: 0.7 }` + deprecation warning\n * - `min_score: 0.7` → `{ min_score: 0.7 }`\n * - Explicit `min_score` takes priority over `required: number`\n */\nfunction parseRequiredAndMinScore(\n rawRequired: JsonValue | undefined,\n rawMinScore: JsonValue | undefined,\n evaluatorName: string,\n evalId: string,\n): { required?: boolean | number; min_score?: number } {\n const result: { required?: boolean | number; min_score?: number } = {};\n\n // Parse min_score (explicit field, takes priority)\n if (typeof rawMinScore === 'number' && rawMinScore > 0 && rawMinScore <= 1) {\n result.min_score = rawMinScore;\n }\n\n // Parse required\n if (rawRequired === true) {\n result.required = true;\n } else if (typeof rawRequired === 'number' && rawRequired > 0 && rawRequired <= 1) {\n // Deprecated: required: number → required: true + min_score\n if (result.min_score === undefined) {\n result.min_score = rawRequired;\n }\n // Keep numeric required for backward compat (orchestrator reads min_score preferentially)\n result.required = rawRequired;\n logWarning(\n `Grader '${evaluatorName}' in '${evalId}': 'required: ${rawRequired}' is deprecated. ` +\n `Use 'required: true' + 'min_score: ${rawRequired}' instead.`,\n );\n }\n\n return result;\n}\n\n/**\n * Validate and extract weight from evaluator config.\n * Throws if weight is invalid (negative, NaN, or Infinity).\n * Returns undefined if weight is not specified.\n */\nfunction validateWeight(\n rawWeight: unknown,\n evaluatorName: string,\n evalId: string,\n): number | undefined {\n if (rawWeight === undefined) {\n return undefined;\n }\n\n if (typeof rawWeight !== 'number') {\n throw new Error(\n `Invalid weight for evaluator '${evaluatorName}' in '${evalId}': must be a number`,\n );\n }\n\n if (!Number.isFinite(rawWeight)) {\n throw new Error(\n `Invalid weight for evaluator '${evaluatorName}' in '${evalId}': must be finite (got ${rawWeight})`,\n );\n }\n\n if (rawWeight < 0) {\n throw new Error(\n `Invalid weight for evaluator '${evaluatorName}' in '${evalId}': must be non-negative (got ${rawWeight})`,\n );\n }\n\n return rawWeight;\n}\n\nconst VALID_FIELD_MATCH_TYPES = new Set(['exact', 'numeric_tolerance', 'date']);\n\nfunction isValidFieldMatchType(value: unknown): value is import('../types.js').FieldMatchType {\n return typeof value === 'string' && VALID_FIELD_MATCH_TYPES.has(value);\n}\n\nconst VALID_FIELD_AGGREGATION_TYPES = new Set(['weighted_average', 'all_or_nothing']);\n\nfunction isValidFieldAggregationType(\n value: unknown,\n): value is import('../types.js').FieldAggregationType {\n return typeof value === 'string' && VALID_FIELD_AGGREGATION_TYPES.has(value);\n}\n\n/**\n * Parse rubric items from raw YAML/JSON data.\n * Supports both checklist rubrics and score-range rubrics.\n */\nfunction parseRubricItems(\n rawRubrics: readonly unknown[],\n evaluatorName: string,\n evalId: string,\n): import('../types.js').RubricItem[] | undefined {\n const items: import('../types.js').RubricItem[] = [];\n\n for (const [index, rawRubric] of rawRubrics.entries()) {\n if (!isJsonObject(rawRubric)) {\n logWarning(\n `Skipping invalid rubric entry at index ${index} in evaluator '${evaluatorName}' (expected object)`,\n );\n continue;\n }\n\n const id = asString(rawRubric.id) ?? `rubric-${index + 1}`;\n const expectedOutcome = asString(rawRubric.outcome) ?? '';\n const weight = typeof rawRubric.weight === 'number' ? rawRubric.weight : 1.0;\n\n // Parse min_score (0-1 scale), required_min_score (deprecated 0-10 scale), and required\n let minScore: number | undefined;\n let requiredMinScore: number | undefined;\n let required: boolean | undefined;\n\n if (typeof rawRubric.min_score === 'number') {\n // New field: 0-1 scale\n const ms = rawRubric.min_score as number;\n if (ms <= 0 || ms > 1) {\n throw new Error(\n `Invalid min_score for rubric '${id}' in evaluator '${evaluatorName}' in '${evalId}': must be in (0, 1] (got ${ms})`,\n );\n }\n minScore = ms;\n // Compute legacy required_min_score for backward compat with llm-grader internals\n requiredMinScore = Math.round(ms * 10);\n } else if (typeof rawRubric.required_min_score === 'number') {\n // Deprecated: 0-10 integer scale\n const rms = rawRubric.required_min_score as number;\n if (!Number.isInteger(rms) || rms < 0 || rms > 10) {\n throw new Error(\n `Invalid required_min_score for rubric '${id}' in evaluator '${evaluatorName}' in '${evalId}': must be an integer 0-10 (got ${rms})`,\n );\n }\n requiredMinScore = rms;\n minScore = rms / 10;\n logWarning(\n `Rubric '${id}' in evaluator '${evaluatorName}' in '${evalId}': 'required_min_score: ${rms}' is deprecated. ` +\n `Use 'min_score: ${rms / 10}' (0-1 scale) instead.`,\n );\n }\n\n if (typeof rawRubric.required === 'boolean') {\n required = rawRubric.required;\n }\n\n // Parse score_ranges if present\n let scoreRanges: import('../types.js').ScoreRange[] | undefined;\n const rawScoreRanges = rawRubric.score_ranges;\n\n if (rawScoreRanges !== undefined) {\n const normalized = normalizeScoreRangesShorthand(rawScoreRanges);\n if (!Array.isArray(normalized)) {\n throw new Error(\n `Invalid score_ranges for rubric '${id}' in evaluator '${evaluatorName}' in '${evalId}': must be an array or shorthand map`,\n );\n }\n\n scoreRanges = parseScoreRanges(normalized, id, evaluatorName, evalId);\n\n // For score-range rubrics, outcome at rubric level is optional\n items.push({\n id,\n weight,\n ...(expectedOutcome.length > 0 ? { outcome: expectedOutcome } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(minScore !== undefined ? { min_score: minScore } : {}),\n ...(requiredMinScore !== undefined ? { required_min_score: requiredMinScore } : {}),\n score_ranges: scoreRanges,\n });\n } else {\n // Checklist rubric: outcome is required\n if (expectedOutcome.length === 0) {\n logWarning(\n `Skipping rubric '${id}' in evaluator '${evaluatorName}' in '${evalId}': missing outcome`,\n );\n continue;\n }\n\n items.push({\n id,\n outcome: expectedOutcome,\n weight,\n // Default to required: true if not specified (backward compatibility)\n required: required ?? true,\n ...(minScore !== undefined ? { min_score: minScore } : {}),\n ...(requiredMinScore !== undefined ? { required_min_score: requiredMinScore } : {}),\n });\n }\n }\n\n return items.length > 0 ? items : undefined;\n}\n\n/**\n * Normalize score_ranges shorthand map format to the canonical array format.\n *\n * Shorthand (map keys are lower bounds 0-10, values are descriptions):\n * { 0: \"Bad\", 3: \"OK\", 7: \"Good\", 10: \"Perfect\" }\n *\n * Normalizes to:\n * [ { score_range: [0, 2], outcome: \"Bad\" },\n * { score_range: [3, 6], outcome: \"OK\" },\n * { score_range: [7, 9], outcome: \"Good\" },\n * { score_range: [10, 10], outcome: \"Perfect\" } ]\n *\n * If input is already an array, returns it unchanged.\n */\nfunction normalizeScoreRangesShorthand(raw: unknown): unknown {\n if (Array.isArray(raw)) return raw;\n if (!isJsonObject(raw)) return raw;\n\n // Check if this looks like a shorthand map (all keys are numeric strings)\n const keys = Object.keys(raw);\n if (keys.length === 0) return raw;\n\n const numericKeys: number[] = [];\n for (const key of keys) {\n const num = Number(key);\n if (!Number.isInteger(num) || num < 0 || num > 10) {\n // Not a shorthand map — could be array-of-objects format parsed as object\n return raw;\n }\n if (typeof raw[key] !== 'string' || (raw[key] as string).length === 0) {\n return raw;\n }\n numericKeys.push(num);\n }\n\n // Sort keys numerically\n numericKeys.sort((a, b) => a - b);\n\n // Validate starts at 0\n if (numericKeys[0] !== 0) {\n throw new Error(`score_ranges shorthand map must start at 0 (got ${numericKeys[0]})`);\n }\n\n // Derive ranges: each key is a lower bound, upper bound is (next key - 1) or 10 for the last\n const result: Array<{ score_range: readonly [number, number]; outcome: string }> = [];\n for (let i = 0; i < numericKeys.length; i++) {\n const min = numericKeys[i];\n const max = i < numericKeys.length - 1 ? numericKeys[i + 1] - 1 : 10;\n result.push({\n score_range: [min, max],\n outcome: raw[String(min)] as string,\n });\n }\n\n return result;\n}\n\n/**\n * Parse and validate score ranges for a rubric criterion.\n * Validates:\n * - Ranges are [min, max] with integers 0-10\n * - min <= max\n * - Non-overlapping ranges\n * - Full coverage of 0-10 (warning if not covered)\n * - Each range has non-empty outcome\n */\nfunction parseScoreRanges(\n rawRanges: readonly unknown[],\n rubricId: string,\n evaluatorName: string,\n evalId: string,\n): import('../types.js').ScoreRange[] {\n const ranges: import('../types.js').ScoreRange[] = [];\n\n for (const [index, rawRange] of rawRanges.entries()) {\n if (!isJsonObject(rawRange)) {\n throw new Error(\n `Invalid score_range entry at index ${index} for rubric '${rubricId}' in evaluator '${evaluatorName}' in '${evalId}': expected object`,\n );\n }\n\n const scoreRangeValue = rawRange.score_range;\n if (\n !Array.isArray(scoreRangeValue) ||\n scoreRangeValue.length !== 2 ||\n typeof scoreRangeValue[0] !== 'number' ||\n typeof scoreRangeValue[1] !== 'number'\n ) {\n throw new Error(\n `Invalid score_range at index ${index} for rubric '${rubricId}' in evaluator '${evaluatorName}' in '${evalId}': must be [min, max] array of two numbers`,\n );\n }\n\n const [min, max] = scoreRangeValue;\n\n // Validate integers in 0-10 range\n if (!Number.isInteger(min) || !Number.isInteger(max)) {\n throw new Error(\n `Invalid score_range at index ${index} for rubric '${rubricId}' in evaluator '${evaluatorName}' in '${evalId}': values must be integers (got [${min}, ${max}])`,\n );\n }\n\n if (min < 0 || min > 10 || max < 0 || max > 10) {\n throw new Error(\n `Invalid score_range at index ${index} for rubric '${rubricId}' in evaluator '${evaluatorName}' in '${evalId}': values must be 0-10 (got [${min}, ${max}])`,\n );\n }\n\n if (min > max) {\n throw new Error(\n `Invalid score_range at index ${index} for rubric '${rubricId}' in evaluator '${evaluatorName}' in '${evalId}': min must be <= max (got [${min}, ${max}])`,\n );\n }\n\n // Validate outcome\n const expectedOutcome = asString(rawRange.outcome) ?? '';\n if (expectedOutcome.length === 0) {\n throw new Error(\n `Missing outcome for score_range [${min}, ${max}] in rubric '${rubricId}' in evaluator '${evaluatorName}' in '${evalId}'`,\n );\n }\n\n ranges.push({\n score_range: [min, max] as const,\n outcome: expectedOutcome,\n });\n }\n\n // Validate non-overlapping ranges\n const sortedRanges = [...ranges].sort((a, b) => a.score_range[0] - b.score_range[0]);\n for (let i = 1; i < sortedRanges.length; i++) {\n const prev = sortedRanges[i - 1];\n const curr = sortedRanges[i];\n if (curr.score_range[0] <= prev.score_range[1]) {\n throw new Error(\n `Overlapping score_ranges in rubric '${rubricId}' in evaluator '${evaluatorName}' in '${evalId}': ` +\n `[${prev.score_range[0]}, ${prev.score_range[1]}] overlaps with [${curr.score_range[0]}, ${curr.score_range[1]}]`,\n );\n }\n }\n\n // Validate full coverage of 0-10 (strict requirement per spec)\n const covered = new Set<number>();\n for (const range of ranges) {\n for (let i = range.score_range[0]; i <= range.score_range[1]; i++) {\n covered.add(i);\n }\n }\n\n const missing: number[] = [];\n for (let i = 0; i <= 10; i++) {\n if (!covered.has(i)) {\n missing.push(i);\n }\n }\n\n if (missing.length > 0) {\n throw new Error(\n `Incomplete score_ranges coverage in rubric '${rubricId}' in evaluator '${evaluatorName}' in '${evalId}': ` +\n `missing coverage for scores: ${missing.join(', ')}. Ranges must cover all integers 0-10.`,\n );\n }\n\n return ranges;\n}\n\n/**\n * Parse inline rubrics field (syntactic sugar at eval case level).\n * Supports:\n * - String shorthand: \"Must be polite\" -> { id: \"rubric-1\", outcome: \"Must be polite\", weight: 1.0, required: true }\n * - Object form with outcome, weight, required, score_ranges, required_min_score\n *\n * Returns an LlmGraderConfig to prepend to evaluators, or undefined if no valid rubrics.\n */\nexport function parseInlineRubrics(\n rawRubrics: readonly unknown[],\n): import('../types.js').LlmGraderConfig | undefined {\n const rubricItems = rawRubrics\n .filter((r): r is JsonObject | string => isJsonObject(r) || typeof r === 'string')\n .map((rubric, index) => {\n if (typeof rubric === 'string') {\n return {\n id: `rubric-${index + 1}`,\n outcome: rubric,\n weight: 1.0,\n required: true,\n };\n }\n\n const expectedOutcome = asString(rubric.outcome) ?? '';\n\n // Parse score_ranges if present (supports shorthand map format)\n const rawScoreRanges = rubric.score_ranges;\n const normalizedScoreRanges =\n rawScoreRanges !== undefined ? normalizeScoreRangesShorthand(rawScoreRanges) : undefined;\n const scoreRanges =\n Array.isArray(normalizedScoreRanges) && normalizedScoreRanges.length > 0\n ? normalizedScoreRanges\n .filter((r): r is JsonObject => isJsonObject(r))\n .map((range) => ({\n score_range: Array.isArray(range.score_range)\n ? (range.score_range as unknown as readonly [number, number])\n : ([0, 10] as const),\n outcome: asString(range.outcome) ?? '',\n }))\n .filter((r) => r.outcome.length > 0)\n : undefined;\n\n const baseRubric = {\n id: asString(rubric.id) ?? `rubric-${index + 1}`,\n weight: typeof rubric.weight === 'number' ? rubric.weight : 1.0,\n };\n\n // Parse min_score (0-1) or required_min_score (deprecated 0-10)\n let inlineMinScore: number | undefined;\n let inlineRequiredMinScore: number | undefined;\n if (typeof rubric.min_score === 'number') {\n inlineMinScore = rubric.min_score as number;\n inlineRequiredMinScore = Math.round(inlineMinScore * 10);\n } else if (typeof rubric.required_min_score === 'number') {\n inlineRequiredMinScore = rubric.required_min_score as number;\n inlineMinScore = inlineRequiredMinScore / 10;\n }\n\n // For score_ranges rubrics, outcome at rubric level is optional\n if (scoreRanges && scoreRanges.length > 0) {\n return {\n ...baseRubric,\n ...(expectedOutcome.length > 0 ? { outcome: expectedOutcome } : {}),\n ...(typeof rubric.required === 'boolean' ? { required: rubric.required } : {}),\n ...(inlineMinScore !== undefined ? { min_score: inlineMinScore } : {}),\n ...(inlineRequiredMinScore !== undefined\n ? { required_min_score: inlineRequiredMinScore }\n : {}),\n score_ranges: scoreRanges,\n };\n }\n\n // Checklist rubric: outcome is required\n return {\n ...baseRubric,\n outcome: expectedOutcome,\n required: typeof rubric.required === 'boolean' ? rubric.required : true,\n ...(inlineMinScore !== undefined ? { min_score: inlineMinScore } : {}),\n ...(inlineRequiredMinScore !== undefined\n ? { required_min_score: inlineRequiredMinScore }\n : {}),\n };\n })\n // Filter: must have outcome OR score_ranges\n .filter((r) => (r.outcome && r.outcome.length > 0) || ('score_ranges' in r && r.score_ranges));\n\n if (rubricItems.length === 0) {\n return undefined;\n }\n\n return {\n name: 'rubrics',\n type: 'llm-grader',\n rubrics: rubricItems,\n };\n}\n","import { readFile } from 'node:fs/promises';\n\nimport {\n DEPRECATED_TEMPLATE_VARIABLES,\n TEMPLATE_VARIABLES,\n VALID_TEMPLATE_VARIABLES,\n} from '../template-variables.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Validate custom prompt template content from a file.\n * Reads the file and checks for valid template variables.\n * Throws an error if required template variables are missing.\n */\nexport async function validateCustomPromptContent(promptPath: string): Promise<void> {\n const content = await readFile(promptPath, 'utf8');\n validateTemplateVariables(content, promptPath);\n}\n\n/**\n * Validate template variables in a custom prompt template string.\n * Exported for testing purposes.\n * @throws Error if required template variables are missing\n */\nexport function validateTemplateVariables(content: string, source: string): void {\n // Extract all template variables from content\n const variablePattern = /\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g;\n const foundVariables = new Set<string>();\n const invalidVariables: string[] = [];\n\n let match: RegExpExecArray | null = variablePattern.exec(content);\n while (match !== null) {\n const varName = match[1];\n foundVariables.add(varName);\n if (!VALID_TEMPLATE_VARIABLES.has(varName)) {\n invalidVariables.push(varName);\n }\n match = variablePattern.exec(content);\n }\n\n // Check if template contains required variables for evaluation.\n // Accept both new names (output, expected_output) and deprecated aliases (output_text, expected_output_text).\n const hasCandidateAnswer =\n foundVariables.has(TEMPLATE_VARIABLES.OUTPUT) ||\n foundVariables.has(TEMPLATE_VARIABLES.OUTPUT_TEXT);\n const hasExpectedOutput =\n foundVariables.has(TEMPLATE_VARIABLES.EXPECTED_OUTPUT) ||\n foundVariables.has(TEMPLATE_VARIABLES.EXPECTED_OUTPUT_TEXT);\n const hasRequiredFields = hasCandidateAnswer || hasExpectedOutput;\n\n // ERROR: Missing required fields - throw error to skip this evaluator/eval case\n if (!hasRequiredFields) {\n throw new Error(\n `Missing required fields. Must include at least one of:\\n - {{ ${TEMPLATE_VARIABLES.OUTPUT} }}\\n - {{ ${TEMPLATE_VARIABLES.EXPECTED_OUTPUT} }}`,\n );\n }\n\n // WARNING: Deprecated variables - show warning but continue\n const deprecatedUsed: string[] = [];\n for (const [deprecated, replacement] of DEPRECATED_TEMPLATE_VARIABLES) {\n if (foundVariables.has(deprecated)) {\n deprecatedUsed.push(`{{ ${deprecated} }} → {{ ${replacement} }}`);\n }\n }\n if (deprecatedUsed.length > 0) {\n console.warn(\n `${ANSI_YELLOW}Warning: Template at ${source} uses deprecated variable names:\\n ${deprecatedUsed.join('\\n ')}\\n These still work but will be removed in a future version.${ANSI_RESET}`,\n );\n }\n\n // WARNING: Invalid variables - show warning but continue\n if (invalidVariables.length > 0) {\n const warningMessage = `${ANSI_YELLOW}Warning: Custom grader template at ${source}\n Contains invalid variables: ${invalidVariables.map((v) => `{{ ${v} }}`).join(', ')}\n Valid variables: ${Array.from(VALID_TEMPLATE_VARIABLES)\n .map((v) => `{{ ${v} }}`)\n .join(', ')}${ANSI_RESET}`;\n\n console.warn(warningMessage);\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\n\nimport { collectResolvedInputFilePaths } from '../input-message-utils.js';\nimport { interpolateEnv } from '../interpolation.js';\nimport type { EvalTest, JsonObject, JsonValue, TestMessage } from '../types.js';\nimport { isJsonObject, isTestMessage } from '../types.js';\nimport { parseYamlValue } from '../yaml-loader.js';\nimport { buildSearchRoots, fileExists, resolveToAbsolutePath } from './file-resolver.js';\nimport {\n coerceEvaluator,\n parseGraders,\n parseInlineRubrics,\n warnUnconsumedCriteria,\n} from './grader-parser.js';\nimport { processExpectedMessages, processMessages } from './message-processor.js';\nimport { resolveExpectedMessages, resolveInputMessages } from './shorthand-expansion.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RED = '\\u001b[31m';\nconst ANSI_RESET = '\\u001b[0m';\n\ntype LoadOptions = {\n readonly verbose?: boolean;\n /** Filter tests by ID pattern(s) (glob supported, e.g., \"summary-*\"). Arrays use OR logic. */\n readonly filter?: string | readonly string[];\n};\n\nfunction matchesFilter(id: string, filter: string | readonly string[]): boolean {\n return typeof filter === 'string'\n ? micromatch.isMatch(id, filter)\n : filter.some((pattern) => micromatch.isMatch(id, pattern));\n}\n\n/**\n * Sidecar metadata structure for JSONL suites.\n */\ntype SidecarMetadata = {\n readonly description?: string;\n readonly name?: string;\n readonly execution?: JsonObject;\n readonly evaluator?: JsonValue;\n};\n\n/**\n * Raw test from JSONL line.\n */\ntype RawJsonlEvalCase = JsonObject & {\n readonly id?: JsonValue;\n readonly conversation_id?: JsonValue;\n readonly criteria?: JsonValue;\n /** @deprecated Use `criteria` instead */\n readonly expected_outcome?: JsonValue;\n readonly input?: JsonValue;\n readonly expected_output?: JsonValue;\n readonly execution?: JsonValue;\n readonly evaluators?: JsonValue;\n readonly rubrics?: JsonValue;\n};\n\n/**\n * Detect file format by extension.\n */\nexport function detectFormat(\n filePath: string,\n): 'yaml' | 'jsonl' | 'agent-skills-json' | 'typescript' {\n const ext = path.extname(filePath).toLowerCase();\n if (ext === '.jsonl') return 'jsonl';\n if (ext === '.yaml' || ext === '.yml') return 'yaml';\n if (ext === '.json') return 'agent-skills-json';\n if (ext === '.ts' || ext === '.mts') return 'typescript';\n throw new Error(\n `Unsupported file format: '${ext}'. Supported formats: .yaml, .yml, .jsonl, .json, .ts`,\n );\n}\n\n/**\n * Load sidecar YAML metadata file for a JSONL suite.\n */\nasync function loadSidecarMetadata(jsonlPath: string, verbose: boolean): Promise<SidecarMetadata> {\n const dir = path.dirname(jsonlPath);\n const base = path.basename(jsonlPath, '.jsonl');\n const sidecarPath = path.join(dir, `${base}.yaml`);\n\n if (!(await fileExists(sidecarPath))) {\n if (verbose) {\n logWarning(`Sidecar metadata file not found: ${sidecarPath} (using defaults)`);\n }\n return {};\n }\n\n try {\n const content = await readFile(sidecarPath, 'utf8');\n const parsed = interpolateEnv(parseYamlValue(content), process.env) as unknown;\n\n if (!isJsonObject(parsed)) {\n logWarning(`Invalid sidecar metadata format in ${sidecarPath}`);\n return {};\n }\n\n return {\n description: asString(parsed.description),\n name: asString(parsed.name),\n execution: isJsonObject(parsed.execution) ? parsed.execution : undefined,\n evaluator: parsed.evaluator,\n };\n } catch (error) {\n logWarning(`Could not read sidecar metadata from ${sidecarPath}: ${(error as Error).message}`);\n return {};\n }\n}\n\n/**\n * Parse JSONL file content into raw eval cases.\n */\nfunction parseJsonlContent(content: string, filePath: string): RawJsonlEvalCase[] {\n const lines = content.split('\\n');\n const cases: RawJsonlEvalCase[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line === '') continue; // Skip empty lines\n\n try {\n const raw = JSON.parse(line) as unknown;\n const parsed = interpolateEnv(raw, process.env);\n if (!isJsonObject(parsed)) {\n throw new Error('Expected JSON object');\n }\n cases.push(parsed as RawJsonlEvalCase);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Line ${i + 1}: Invalid JSON - ${message}\\n File: ${filePath}`);\n }\n }\n\n return cases;\n}\n\n/**\n * Load tests from a JSONL file with optional sidecar YAML metadata.\n */\nexport async function loadTestsFromJsonl(\n evalFilePath: string,\n repoRoot: URL | string,\n options?: LoadOptions,\n): Promise<readonly EvalTest[]> {\n const verbose = options?.verbose ?? false;\n const filterPattern = options?.filter;\n const absoluteTestPath = path.resolve(evalFilePath);\n\n const repoRootPath = resolveToAbsolutePath(repoRoot);\n const searchRoots = buildSearchRoots(absoluteTestPath, repoRootPath);\n\n // Load configuration (walks up directory tree to repo root)\n // Load sidecar metadata\n const sidecar = await loadSidecarMetadata(absoluteTestPath, verbose);\n\n // Parse JSONL content\n const rawFile = await readFile(absoluteTestPath, 'utf8');\n const rawCases = parseJsonlContent(rawFile, evalFilePath);\n\n // Derive suite name: sidecar > filename\n const fallbackSuiteName = path.basename(absoluteTestPath, '.jsonl') || 'eval';\n const suiteName =\n sidecar.name && sidecar.name.trim().length > 0 ? sidecar.name : fallbackSuiteName;\n\n // Global defaults from sidecar\n const globalEvaluator = coerceEvaluator(sidecar.evaluator, 'sidecar') ?? 'llm-grader';\n const globalExecution = sidecar.execution;\n\n if (verbose) {\n console.log(`\\n[JSONL Suite: ${evalFilePath}]`);\n console.log(` Cases: ${rawCases.length}`);\n console.log(` Suite: ${suiteName}`);\n if (sidecar.description) {\n console.log(` Description: ${sidecar.description}`);\n }\n }\n\n const results: EvalTest[] = [];\n\n for (let lineIndex = 0; lineIndex < rawCases.length; lineIndex++) {\n const testCaseConfig = rawCases[lineIndex];\n const lineNumber = lineIndex + 1; // 1-based for user-facing messages\n const id = asString(testCaseConfig.id);\n\n // Skip eval cases that don't match the filter pattern (glob supported)\n if (filterPattern && (!id || !matchesFilter(id, filterPattern))) {\n continue;\n }\n\n const conversationId = asString(testCaseConfig.conversation_id);\n let outcome = asString(testCaseConfig.criteria);\n if (!outcome && testCaseConfig.expected_outcome !== undefined) {\n outcome = asString(testCaseConfig.expected_outcome);\n if (outcome) {\n logWarning(\n `Test '${asString(testCaseConfig.id) ?? 'unknown'}': 'expected_outcome' is deprecated. Use 'criteria' instead.`,\n );\n }\n }\n\n // Resolve input with shorthand support\n const rawInputMessages = resolveInputMessages(testCaseConfig);\n // Resolve expected_output with shorthand support\n const expectedMessages = resolveExpectedMessages(testCaseConfig) ?? [];\n\n // A test is complete when it has id, input, and at least one of: criteria, expected_output, or assert\n const hasEvaluationSpec =\n !!outcome || expectedMessages.length > 0 || testCaseConfig.assert !== undefined;\n if (!id || !hasEvaluationSpec || !rawInputMessages || rawInputMessages.length === 0) {\n logError(\n `Skipping incomplete test at line ${lineNumber}: ${id ?? 'unknown'}. Missing required fields: id, input, and at least one of criteria/expected_output/assert`,\n );\n continue;\n }\n\n // expected_output is optional - for outcome-only evaluation\n const hasExpectedMessages = expectedMessages.length > 0;\n\n const inputTextParts: string[] = [];\n\n // Process all input messages to extract files\n const inputMessages = await processMessages({\n messages: rawInputMessages,\n searchRoots,\n repoRootPath,\n textParts: inputTextParts,\n messageType: 'input',\n verbose,\n });\n\n // Process expected_output into segments (only if provided)\n // Preserve full message structure including role and tool_calls for evaluator\n const outputSegments = hasExpectedMessages\n ? await processExpectedMessages({\n messages: expectedMessages,\n searchRoots,\n repoRootPath,\n verbose,\n })\n : [];\n\n // Build reference_answer:\n // Extract the content from the last message in expected_output (similar to answer)\n let referenceAnswer = '';\n if (outputSegments.length > 0) {\n // Get the last message\n const lastMessage = outputSegments[outputSegments.length - 1];\n const content = lastMessage.content;\n const toolCalls = lastMessage.tool_calls;\n\n if (typeof content === 'string') {\n referenceAnswer = content;\n } else if (content !== undefined && content !== null) {\n // Serialize just the content, not the entire message\n referenceAnswer = JSON.stringify(content, null, 2);\n } else if (toolCalls !== undefined && toolCalls !== null) {\n // Message with only tool_calls - serialize just the tool_calls\n referenceAnswer = JSON.stringify(toolCalls, null, 2);\n }\n }\n const question = inputTextParts\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .join(' ');\n\n // Merge execution config: per-case overrides sidecar\n const caseExecution = isJsonObject(testCaseConfig.execution)\n ? testCaseConfig.execution\n : undefined;\n const mergedExecution = caseExecution ?? globalExecution;\n\n const testCaseEvaluatorKind = coerceEvaluator(testCaseConfig.evaluator, id) ?? globalEvaluator;\n let evaluators: Awaited<ReturnType<typeof parseGraders>>;\n try {\n evaluators = await parseGraders(\n testCaseConfig,\n mergedExecution,\n searchRoots,\n id ?? 'unknown',\n );\n } catch (error) {\n // Skip entire test if evaluator validation fails\n const message = error instanceof Error ? error.message : String(error);\n logError(`Skipping test '${id}' at line ${lineNumber}: ${message}`);\n continue;\n }\n\n // Handle inline rubrics field (deprecated: use assertions: [{type: rubrics, criteria: [...]}] instead)\n const inlineRubrics = testCaseConfig.rubrics;\n if (inlineRubrics !== undefined && Array.isArray(inlineRubrics)) {\n const rubricEvaluator = parseInlineRubrics(inlineRubrics);\n if (rubricEvaluator) {\n // Prepend rubric evaluator to existing evaluators\n evaluators = evaluators ? [rubricEvaluator, ...evaluators] : [rubricEvaluator];\n }\n }\n\n warnUnconsumedCriteria(outcome, evaluators, id ?? 'unknown');\n\n const userFilePaths = collectResolvedInputFilePaths(inputMessages);\n\n const testCase: EvalTest = {\n id,\n suite: suiteName,\n conversation_id: conversationId,\n question: question,\n input: inputMessages,\n expected_output: outputSegments,\n reference_answer: referenceAnswer,\n file_paths: userFilePaths,\n criteria: outcome ?? '',\n evaluator: testCaseEvaluatorKind,\n assertions: evaluators,\n };\n\n results.push(testCase);\n }\n\n return results;\n}\n\n/** @deprecated Use `loadTestsFromJsonl` instead */\nexport const loadEvalCasesFromJsonl = loadTestsFromJsonl;\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\nfunction logError(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.error(`${ANSI_RED}Error: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.error(`${ANSI_RED}Error: ${message}${ANSI_RESET}`);\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { formatFileContents } from '../formatting/segment-formatter.js';\nimport { cloneJsonObject } from '../input-message-utils.js';\nimport type { JsonObject, TestMessage } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport { resolveFileReference } from './file-resolver.js';\n\n/**\n * Maps image file extensions to MIME types.\n * To add a new image format: add the extension (with leading dot) and its MIME type.\n */\nconst IMAGE_MEDIA_TYPES: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.bmp': 'image/bmp',\n};\n\n/**\n * Detect image MIME type from file extension.\n * Returns undefined for unsupported extensions.\n */\nexport function detectImageMediaType(filePath: string): string | undefined {\n const ext = path.extname(filePath).toLowerCase();\n return IMAGE_MEDIA_TYPES[ext];\n}\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\ntype ProcessMessagesOptions = {\n readonly messages: readonly TestMessage[];\n readonly searchRoots: readonly string[];\n readonly repoRootPath: string;\n readonly textParts?: string[];\n readonly messageType: 'input' | 'output';\n readonly verbose: boolean;\n};\n\n/**\n * Process message content into structured segments with file resolution.\n */\nexport async function processMessages(options: ProcessMessagesOptions): Promise<TestMessage[]> {\n const { messages, searchRoots, repoRootPath, textParts, messageType, verbose } = options;\n\n const processedMessages: TestMessage[] = [];\n\n for (const message of messages) {\n const content = message.content;\n if (typeof content === 'string') {\n if (textParts) {\n textParts.push(content);\n }\n processedMessages.push({ ...message, content });\n continue;\n }\n\n // Structured object content (real-world style payloads). Treat as a single text segment.\n // This keeps prompt building deterministic while preserving the full payload for code evaluators\n // via evalCase.input.\n if (isJsonObject(content)) {\n const rendered = JSON.stringify(content, null, 2);\n if (textParts) {\n textParts.push(rendered);\n }\n processedMessages.push({ ...message, content: cloneJsonObject(content) });\n continue;\n }\n\n if (!Array.isArray(content)) {\n continue;\n }\n\n const processedContent: JsonObject[] = [];\n\n for (const rawSegment of content) {\n // Plain string items inside a content array are treated as inline text segments.\n // This matches the validator, which accepts string items alongside structured blocks.\n if (typeof rawSegment === 'string') {\n if (rawSegment.length > 0) {\n processedContent.push({ type: 'text', value: rawSegment });\n if (textParts) {\n textParts.push(rawSegment);\n }\n }\n continue;\n }\n\n if (!isJsonObject(rawSegment)) {\n continue;\n }\n\n const segmentType = asString(rawSegment.type);\n if (segmentType === 'file') {\n const rawValue = asString(rawSegment.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n const context = messageType === 'input' ? '' : ' in expected_output';\n logWarning(`File not found${context}: ${displayPath}`, attempts);\n continue;\n }\n\n try {\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n');\n\n processedContent.push({\n ...cloneJsonObject(rawSegment),\n path: displayPath,\n text: fileContent,\n resolvedPath: path.resolve(resolvedPath),\n });\n\n if (verbose) {\n const label = messageType === 'input' ? '[File]' : '[Expected Output File]';\n console.log(` ${label} Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n } catch (error) {\n const context = messageType === 'input' ? '' : ' expected output';\n logWarning(`Could not read${context} file ${resolvedPath}: ${(error as Error).message}`);\n }\n continue;\n }\n\n if (segmentType === 'image') {\n const rawValue = asString(rawSegment.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n const context = messageType === 'input' ? '' : ' in expected_output';\n logWarning(`Image file not found${context}: ${displayPath}`, attempts);\n continue;\n }\n\n const mediaType = detectImageMediaType(resolvedPath);\n if (!mediaType) {\n logWarning(\n `Unsupported image extension for ${displayPath}. Supported: ${Object.keys(IMAGE_MEDIA_TYPES).join(', ')}`,\n );\n continue;\n }\n\n try {\n const imageBuffer = await readFile(resolvedPath);\n const base64 = imageBuffer.toString('base64');\n\n processedContent.push({\n type: 'image',\n media_type: mediaType,\n source: `data:${mediaType};base64,${base64}`,\n });\n\n if (verbose) {\n const label = messageType === 'input' ? '[Image]' : '[Expected Output Image]';\n console.log(` ${label} Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath} (${mediaType})`);\n }\n } catch (error) {\n const context = messageType === 'input' ? '' : ' expected output';\n logWarning(`Could not read${context} image ${resolvedPath}: ${(error as Error).message}`);\n }\n continue;\n }\n\n const clonedSegment = cloneJsonObject(rawSegment);\n processedContent.push(clonedSegment);\n const inlineValue = clonedSegment.value;\n if (typeof inlineValue === 'string' && textParts) {\n textParts.push(inlineValue);\n }\n }\n\n processedMessages.push({ ...message, content: processedContent });\n }\n\n return processedMessages;\n}\n\n/**\n * Resolve assistant content including file references.\n * Similar to input message processing, but for expected assistant responses.\n */\nexport async function resolveAssistantContent(\n content: TestMessage['content'] | undefined,\n searchRoots: readonly string[],\n verbose: boolean,\n): Promise<string> {\n if (typeof content === 'string') {\n return content;\n }\n if (!content) {\n return '';\n }\n // Handle structured content object (e.g., { recommendation: ..., summary: ... })\n if (!Array.isArray(content)) {\n return JSON.stringify(content, null, 2);\n }\n\n // Track parts with metadata about whether they came from files\n const parts: Array<{ content: string; isFile: boolean; displayPath?: string }> = [];\n\n for (const entry of content) {\n if (typeof entry === 'string') {\n parts.push({ content: entry, isFile: false });\n continue;\n }\n\n if (!isJsonObject(entry)) {\n continue;\n }\n\n const segmentType = asString(entry.type);\n\n // Handle file references\n if (segmentType === 'file') {\n const rawValue = asString(entry.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n logWarning(`File not found in expected_output: ${displayPath}`, attempts);\n continue;\n }\n\n try {\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n').trim();\n parts.push({ content: fileContent, isFile: true, displayPath });\n if (verbose) {\n console.log(` [Expected Assistant File] Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n } catch (error) {\n logWarning(`Could not read file ${resolvedPath}: ${(error as Error).message}`);\n }\n continue;\n }\n\n // Handle text segments\n const textValue = asString(entry.text);\n if (typeof textValue === 'string') {\n parts.push({ content: textValue, isFile: false });\n continue;\n }\n\n const valueValue = asString(entry.value);\n if (typeof valueValue === 'string') {\n parts.push({ content: valueValue, isFile: false });\n continue;\n }\n\n parts.push({ content: JSON.stringify(entry), isFile: false });\n }\n\n return formatFileContents(parts);\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\ntype ProcessExpectedMessagesOptions = {\n readonly messages: readonly TestMessage[];\n readonly searchRoots: readonly string[];\n readonly repoRootPath: string;\n readonly verbose: boolean;\n};\n\n/**\n * Extended message type for expected_output that may include tool_calls.\n */\ntype ExtendedTestMessage = TestMessage & {\n readonly name?: string;\n readonly tool_calls?: readonly JsonObject[];\n};\n\n/**\n * Process expected_output preserving full message structure including role and tool_calls.\n * Resolves file references and processes content.\n */\nexport async function processExpectedMessages(\n options: ProcessExpectedMessagesOptions,\n): Promise<JsonObject[]> {\n const { messages, searchRoots, verbose } = options;\n const segments: JsonObject[] = [];\n\n for (const message of messages) {\n const extendedMessage = message as ExtendedTestMessage;\n const segment: Record<string, unknown> = {\n role: message.role,\n };\n\n // Preserve optional name field\n if (extendedMessage.name) {\n segment.name = extendedMessage.name;\n }\n\n // Process content\n const content = message.content;\n if (typeof content === 'string') {\n segment.content = content;\n } else if (Array.isArray(content)) {\n // Process content array, resolving file references\n const processedContent: JsonObject[] = [];\n for (const rawSegment of content) {\n // Plain string items are treated as inline text segments (matches validator).\n if (typeof rawSegment === 'string') {\n if (rawSegment.length > 0) {\n processedContent.push({ type: 'text', value: rawSegment });\n }\n continue;\n }\n\n if (!isJsonObject(rawSegment)) {\n continue;\n }\n\n const segmentType = asString(rawSegment.type);\n if (segmentType === 'file') {\n const rawValue = asString(rawSegment.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n logWarning(`File not found in expected_output: ${displayPath}`, attempts);\n continue;\n }\n\n try {\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n');\n processedContent.push({\n type: 'file',\n path: displayPath,\n text: fileContent,\n resolvedPath: path.resolve(resolvedPath),\n });\n\n if (verbose) {\n console.log(` [Expected Output File] Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n } catch (error) {\n logWarning(\n `Could not read expected output file ${resolvedPath}: ${(error as Error).message}`,\n );\n }\n continue;\n }\n\n if (segmentType === 'image') {\n const rawValue = asString(rawSegment.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n logWarning(`Image file not found in expected_output: ${displayPath}`, attempts);\n continue;\n }\n\n const mediaType = detectImageMediaType(resolvedPath);\n if (!mediaType) {\n logWarning(\n `Unsupported image extension for ${displayPath}. Supported: ${Object.keys(IMAGE_MEDIA_TYPES).join(', ')}`,\n );\n continue;\n }\n\n try {\n const imageBuffer = await readFile(resolvedPath);\n const base64 = imageBuffer.toString('base64');\n processedContent.push({\n type: 'image',\n media_type: mediaType,\n source: `data:${mediaType};base64,${base64}`,\n });\n\n if (verbose) {\n console.log(` [Expected Output Image] Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath} (${mediaType})`);\n }\n } catch (error) {\n logWarning(\n `Could not read expected output image ${resolvedPath}: ${(error as Error).message}`,\n );\n }\n continue;\n }\n\n processedContent.push(cloneJsonObject(rawSegment));\n }\n segment.content = processedContent;\n } else if (isJsonObject(content)) {\n // Handle structured content object (e.g., { recommendation: ..., summary: ... })\n segment.content = cloneJsonObject(content);\n }\n\n // Preserve tool_calls if present\n if (extendedMessage.tool_calls && Array.isArray(extendedMessage.tool_calls)) {\n segment.tool_calls = extendedMessage.tool_calls.map((tc) =>\n isJsonObject(tc) ? cloneJsonObject(tc) : tc,\n );\n }\n\n segments.push(segment as JsonObject);\n }\n\n return segments;\n}\n","import type { JsonObject } from '../types.js';\n\n/**\n * Formatting mode for segment content.\n * - 'agent': File references only (for providers with filesystem access)\n * - 'lm': Embedded file content with XML tags (for language model providers)\n */\nexport type FormattingMode = 'agent' | 'lm';\n\n/**\n * Format file contents with XML tags for all files.\n */\nexport function formatFileContents(\n parts: Array<{ content: string; isFile: boolean; displayPath?: string }>,\n): string {\n const fileCount = parts.filter((p) => p.isFile).length;\n\n // Use XML tags if any files are present\n if (fileCount > 0) {\n return parts\n .map((part) => {\n if (part.isFile && part.displayPath) {\n return `<file path=\"${part.displayPath}\">\\n${part.content}\\n</file>`;\n }\n return part.content;\n })\n .join('\\n\\n');\n }\n\n // Otherwise, join normally\n return parts.map((p) => p.content).join(' ');\n}\n\n/**\n * Format a segment into its display string.\n * Text segments return their value; file segments return formatted file content with header.\n *\n * @param segment - The segment to format\n * @param mode - Formatting mode: 'agent' for file references, 'lm' for embedded content\n */\nexport function formatSegment(\n segment: JsonObject,\n mode: FormattingMode = 'lm',\n): string | undefined {\n const type = asString(segment.type);\n\n if (type === 'text') {\n return asString(segment.value);\n }\n\n if (type === 'file') {\n const filePath = asString(segment.path);\n if (!filePath) {\n return undefined;\n }\n\n // Agent mode: return file reference with absolute path so agents can locate\n // the file regardless of their working directory. resolvedPath is set by\n // message-processor.ts during file resolution; fall back to the display\n // path when it is absent (e.g. in unit tests with synthetic segments).\n if (mode === 'agent') {\n const absolutePath = asString(segment.resolvedPath) ?? filePath;\n return `<file: path=\"${absolutePath}\">`;\n }\n\n // LM mode: return embedded content with XML tags\n const text = asString(segment.text);\n if (text && filePath) {\n // Use formatFileContents for consistent XML formatting\n return formatFileContents([{ content: text.trim(), isFile: true, displayPath: filePath }]);\n }\n }\n\n return undefined;\n}\n\n/**\n * Check if processed segments contain visible content (text or file attachments).\n */\nexport function hasVisibleContent(segments: readonly JsonObject[]): boolean {\n return segments.some((segment) => {\n const type = asString(segment.type);\n\n if (type === 'text') {\n const value = asString(segment.value);\n return value !== undefined && value.trim().length > 0;\n }\n\n if (type === 'file') {\n const text = asString(segment.text);\n return text !== undefined && text.trim().length > 0;\n }\n\n return false;\n });\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","/**\n * Shorthand expansion utilities for input/expected_output fields.\n *\n * Supports:\n * - `input` with string shorthand or message array\n * - `input_files` shorthand (string input only): expands to type:file + type:text content blocks\n * - `expected_output` with string/object shorthand or message array\n */\n\nimport type { JsonObject, JsonValue, TestMessage } from '../types.js';\nimport { isJsonObject, isTestMessage } from '../types.js';\n\n/**\n * Expand the `input` shorthand into a message array.\n *\n * Supports:\n * - String: \"What is 2+2?\" -> [{ role: 'user', content: \"What is 2+2?\" }]\n * - Array of messages: Already in message format, passthrough\n *\n * @param value The raw `input` value from YAML/JSONL\n * @returns Expanded message array or undefined if invalid\n */\nexport function expandInputShorthand(value: JsonValue | undefined): TestMessage[] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n // String shorthand: single user message\n if (typeof value === 'string') {\n return [{ role: 'user', content: value }];\n }\n\n // Array: should be message array\n if (Array.isArray(value)) {\n const messages = value.filter((msg): msg is TestMessage => isTestMessage(msg));\n return messages.length > 0 ? messages : undefined;\n }\n\n return undefined;\n}\n\n/**\n * Expand the `expected_output` shorthand into a message array.\n *\n * Supports:\n * - String: \"Answer\" -> [{ role: 'assistant', content: \"Answer\" }]\n * - Object (without role key): { riskLevel: 'High' } -> [{ role: 'assistant', content: { riskLevel: 'High' } }]\n * - Array of messages: Already in message format, passthrough\n *\n * @param value The raw `expected_output` value from YAML/JSONL\n * @returns Expanded message array or undefined if invalid\n */\nexport function expandExpectedOutputShorthand(\n value: JsonValue | undefined,\n): TestMessage[] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n // String shorthand: single assistant message\n if (typeof value === 'string') {\n return [{ role: 'assistant', content: value }];\n }\n\n // Array: could be message array or other array\n if (Array.isArray(value)) {\n // Check if first element looks like a message (has role property)\n if (value.length > 0 && isJsonObject(value[0]) && 'role' in value[0]) {\n const messages = value.filter((msg): msg is TestMessage => isTestMessage(msg));\n return messages.length > 0 ? messages : undefined;\n }\n // Array that doesn't look like messages - treat as structured content\n return [{ role: 'assistant', content: value as unknown as JsonObject[] }];\n }\n\n // Object shorthand: single assistant message with structured content\n if (isJsonObject(value)) {\n // Check if it looks like a message (has role property)\n if ('role' in value) {\n return isTestMessage(value) ? [value] : undefined;\n }\n // Structured object -> wrap as assistant message content\n return [{ role: 'assistant', content: value }];\n }\n\n return undefined;\n}\n\n/**\n * Expand `input_files` shorthand combined with a string `input` into a single user message\n * whose content is an array of type:file blocks (one per path) followed by a type:text block.\n *\n * Only supported when `input` is a string. Returns undefined if:\n * - `inputFiles` is undefined/null or not an array of strings\n * - `inputText` is not a string (multi-turn array inputs are not supported in v1)\n *\n * Example YAML:\n * ```yaml\n * input_files:\n * - evals/files/sales.csv\n * input: \"Summarize the monthly trends in this CSV.\"\n * ```\n *\n * Expands to:\n * ```yaml\n * input:\n * - role: user\n * content:\n * - type: file\n * value: evals/files/sales.csv\n * - type: text\n * value: \"Summarize the monthly trends in this CSV.\"\n * ```\n *\n * @param inputFiles The raw `input_files` value from YAML\n * @param inputText The raw `input` value from YAML (must be a string)\n * @returns Expanded message array or undefined if preconditions not met\n */\nexport function expandInputFilesShorthand(\n inputFiles: JsonValue | undefined,\n inputText: JsonValue | undefined,\n): TestMessage[] | undefined {\n if (inputFiles === undefined || inputFiles === null) {\n return undefined;\n }\n\n // input_files must be an array of strings\n if (!Array.isArray(inputFiles)) {\n return undefined;\n }\n\n const filePaths = inputFiles.filter((f): f is string => typeof f === 'string');\n if (filePaths.length === 0) {\n return undefined;\n }\n\n // input must be a string (multi-turn arrays not supported in v1)\n if (typeof inputText !== 'string') {\n return undefined;\n }\n\n const contentBlocks: JsonObject[] = [\n ...filePaths.map((filePath): JsonObject => ({ type: 'file', value: filePath })),\n { type: 'text', value: inputText },\n ];\n\n return [{ role: 'user', content: contentBlocks }];\n}\n\n/**\n * Resolve input from raw eval case data, optionally merging suite-level input_files.\n *\n * When `input_files` is present (per-test or suite-level) alongside a string `input`,\n * the shorthand is expanded into a user message with type:file content blocks followed\n * by a type:text block. Per-test `input_files` takes precedence over suite-level.\n * Otherwise, `input` is expanded via the standard shorthand rules.\n *\n * @param raw Raw eval case object from YAML/JSONL\n * @param suiteInputFiles Optional suite-level input_files (used when test has no per-test input_files)\n * @returns Resolved input messages array or undefined if none found\n */\nexport function resolveInputMessages(\n raw: JsonObject,\n suiteInputFiles?: JsonValue,\n): TestMessage[] | undefined {\n // Per-test input_files takes precedence over suite-level\n const effectiveInputFiles = raw.input_files ?? suiteInputFiles;\n if (effectiveInputFiles !== undefined) {\n return expandInputFilesShorthand(effectiveInputFiles, raw.input);\n }\n return expandInputShorthand(raw.input);\n}\n\n/**\n * Resolve expected_output from raw eval case data.\n *\n * @param raw Raw eval case object from YAML/JSONL\n * @returns Resolved expected output messages array or undefined if none found\n */\nexport function resolveExpectedMessages(raw: JsonObject): TestMessage[] | undefined {\n return expandExpectedOutputShorthand(raw.expected_output);\n}\n","import { z } from 'zod';\nimport type { JsonObject } from './types.js';\n\nconst MetadataSchema = z.object({\n name: z\n .string()\n .min(1)\n .max(64)\n .regex(/^[a-z0-9-]+$/)\n .optional(),\n description: z.string().min(1).max(1024).optional(),\n version: z.string().optional(),\n author: z.string().optional(),\n tags: z.array(z.string()).optional(),\n license: z.string().optional(),\n requires: z\n .object({\n agentv: z.string().optional(),\n })\n .optional(),\n});\n\nexport type EvalMetadata = z.infer<typeof MetadataSchema>;\n\nexport function parseMetadata(suite: JsonObject): EvalMetadata | undefined {\n if (typeof suite.name !== 'string') {\n return undefined;\n }\n\n return MetadataSchema.parse({\n name: suite.name,\n description: suite.description,\n version: suite.version,\n author: suite.author,\n tags: suite.tags,\n license: suite.license,\n requires: suite.requires,\n });\n}\n","/**\n * Shared parsers for repo configuration objects (source, checkout, clone).\n *\n * Used by both the full YAML parser (yaml-parser.ts) and the lightweight\n * deps scanner (deps-scanner.ts) to avoid duplicating parsing logic.\n */\nimport type { RepoCheckout, RepoClone, RepoConfig, RepoSource } from '../types.js';\nimport { isJsonObject } from '../types.js';\n\nexport function parseRepoSource(raw: unknown): RepoSource | undefined {\n if (!isJsonObject(raw)) return undefined;\n const obj = raw as Record<string, unknown>;\n if (obj.type === 'git' && typeof obj.url === 'string') {\n return { type: 'git', url: obj.url };\n }\n if (obj.type === 'local' && typeof obj.path === 'string') {\n return { type: 'local', path: obj.path };\n }\n return undefined;\n}\n\nexport function parseRepoCheckout(raw: unknown): RepoCheckout | undefined {\n if (!isJsonObject(raw)) return undefined;\n const obj = raw as Record<string, unknown>;\n const ref = typeof obj.ref === 'string' ? obj.ref : undefined;\n const baseCommit = typeof obj.base_commit === 'string' ? obj.base_commit : undefined;\n const resolve = obj.resolve === 'remote' || obj.resolve === 'local' ? obj.resolve : undefined;\n const ancestor = typeof obj.ancestor === 'number' ? obj.ancestor : undefined;\n if (!ref && !baseCommit && !resolve && ancestor === undefined) return undefined;\n return {\n ...(ref !== undefined && { ref }),\n ...(baseCommit !== undefined && { base_commit: baseCommit }),\n ...(resolve !== undefined && { resolve }),\n ...(ancestor !== undefined && { ancestor }),\n };\n}\n\nexport function parseRepoClone(raw: unknown): RepoClone | undefined {\n if (!isJsonObject(raw)) return undefined;\n const obj = raw as Record<string, unknown>;\n const depth = typeof obj.depth === 'number' ? obj.depth : undefined;\n const filter = typeof obj.filter === 'string' ? obj.filter : undefined;\n const sparse = Array.isArray(obj.sparse)\n ? obj.sparse.filter((s): s is string => typeof s === 'string')\n : undefined;\n if (depth === undefined && !filter && !sparse) return undefined;\n return {\n ...(depth !== undefined && { depth }),\n ...(filter !== undefined && { filter }),\n ...(sparse !== undefined && { sparse }),\n };\n}\n\nexport function parseRepoConfig(raw: unknown): RepoConfig | undefined {\n if (!isJsonObject(raw)) return undefined;\n const obj = raw as Record<string, unknown>;\n const repoPath = typeof obj.path === 'string' ? obj.path : undefined;\n const source = parseRepoSource(obj.source);\n const checkout = parseRepoCheckout(obj.checkout);\n const clone = parseRepoClone(obj.clone);\n // At least one meaningful field must be present\n if (!repoPath && !source && !checkout && !clone) return undefined;\n return {\n ...(repoPath !== undefined && { path: repoPath }),\n ...(source !== undefined && { source }),\n ...(checkout !== undefined && { checkout }),\n ...(clone !== undefined && { clone }),\n };\n}\n","import { extractContentSegments, flattenInputMessages } from '../input-message-utils.js';\nimport type { ChatMessageRole, ChatPrompt } from '../providers/types.js';\nimport type { EvalTest, JsonObject, TestMessage } from '../types.js';\nimport { type FormattingMode, formatSegment, hasVisibleContent } from './segment-formatter.js';\n\n/**\n * Build prompt inputs by consolidating user request context.\n */\nexport interface PromptInputs {\n readonly question: string;\n readonly chatPrompt?: ChatPrompt;\n readonly systemMessage?: string;\n}\n\n/**\n * Build prompt inputs by consolidating user request context.\n *\n * @param testCase - The evaluation test case\n * @param mode - Formatting mode: 'agent' for file references, 'lm' for embedded content (default: 'lm')\n */\nexport async function buildPromptInputs(\n testCase: EvalTest,\n mode: FormattingMode = 'lm',\n): Promise<PromptInputs> {\n // Build segments per message to determine if role markers are needed\n const segmentsByMessage: JsonObject[][] = testCase.input.map((message) =>\n extractContentSegments(message.content),\n );\n\n // Determine if we need role markers based on actual processed content\n const useRoleMarkers = needsRoleMarkers(testCase.input, segmentsByMessage);\n\n let question: string;\n\n if (useRoleMarkers) {\n // Multi-turn format with role markers using pre-computed segments\n const messageParts: string[] = [];\n\n for (let i = 0; i < testCase.input.length; i++) {\n const message = testCase.input[i];\n const segments = segmentsByMessage[i];\n\n if (!hasVisibleContent(segments)) {\n continue;\n }\n\n const roleLabel = message.role.charAt(0).toUpperCase() + message.role.slice(1);\n const contentParts: string[] = [];\n\n for (const segment of segments) {\n const formattedContent = formatSegment(segment, mode);\n if (formattedContent) {\n contentParts.push(formattedContent);\n }\n }\n\n if (contentParts.length > 0) {\n const messageContent = contentParts.join('\\n');\n messageParts.push(`@[${roleLabel}]:\\n${messageContent}`);\n }\n }\n\n question = messageParts.join('\\n\\n');\n } else {\n // Single-turn flat format\n const questionParts: string[] = [];\n for (const segment of flattenInputMessages(testCase.input)) {\n const formattedContent = formatSegment(segment, mode);\n if (formattedContent) {\n questionParts.push(formattedContent);\n }\n }\n\n question = questionParts\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .join('\\n\\n');\n }\n\n const chatPrompt = useRoleMarkers\n ? buildChatPromptFromSegments({\n messages: testCase.input,\n segmentsByMessage,\n mode,\n })\n : undefined;\n\n // Extract system message from leading system-role messages in the input.\n // This is used by the orchestrator to pass the system prompt as a direct field\n // on ProviderRequest and by evaluators that need the system context separately.\n const systemMessage = extractSystemMessage(testCase.input, segmentsByMessage, mode);\n\n // Both question (flat string) and chatPrompt (structured messages) are returned:\n // chatPrompt is used for the API call, question is retained for logging/debugging.\n return { question, chatPrompt, systemMessage };\n}\n\n/**\n * Detect if role markers are needed based on conversational structure.\n *\n * Role markers ([System]:, [User]:, etc.) are added when:\n * 1. There are assistant/tool messages (true multi-turn conversation), OR\n * 2. There are multiple messages that will produce visible content in the formatted output\n */\nfunction needsRoleMarkers(\n messages: readonly TestMessage[],\n processedSegmentsByMessage: readonly (readonly JsonObject[])[],\n): boolean {\n // Check for multi-turn conversation (assistant/tool messages)\n if (messages.some((msg) => msg.role === 'assistant' || msg.role === 'tool')) {\n return true;\n }\n\n // Count how many messages have actual content after processing\n let messagesWithContent = 0;\n\n for (const segments of processedSegmentsByMessage) {\n if (hasVisibleContent(segments)) {\n messagesWithContent++;\n }\n }\n\n return messagesWithContent > 1;\n}\n\n/**\n * Extract the system message text from leading system-role messages in the input.\n * Returns undefined if no system messages are present.\n */\nfunction extractSystemMessage(\n messages: readonly TestMessage[],\n segmentsByMessage: readonly JsonObject[][],\n mode: FormattingMode,\n): string | undefined {\n const systemParts: string[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].role !== 'system') {\n break;\n }\n\n const segments = segmentsByMessage[i];\n const contentParts: string[] = [];\n\n for (const segment of segments) {\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length > 0) {\n systemParts.push(contentParts.join('\\n'));\n }\n }\n\n return systemParts.length > 0 ? systemParts.join('\\n\\n') : undefined;\n}\n\nfunction buildChatPromptFromSegments(options: {\n readonly messages: readonly TestMessage[];\n readonly segmentsByMessage: readonly JsonObject[][];\n readonly systemPrompt?: string;\n readonly mode?: FormattingMode;\n}): ChatPrompt | undefined {\n const { messages, segmentsByMessage, systemPrompt, mode = 'lm' } = options;\n\n if (messages.length === 0) {\n return undefined;\n }\n\n const systemSegments: string[] = [];\n\n if (systemPrompt && systemPrompt.trim().length > 0) {\n systemSegments.push(systemPrompt.trim());\n }\n\n let startIndex = 0;\n while (startIndex < messages.length && messages[startIndex].role === 'system') {\n const segments = segmentsByMessage[startIndex];\n const contentParts: string[] = [];\n\n for (const segment of segments) {\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length > 0) {\n systemSegments.push(contentParts.join('\\n'));\n }\n\n startIndex += 1;\n }\n\n const chatPrompt: Array<ChatPrompt[number]> = [];\n\n if (systemSegments.length > 0) {\n chatPrompt.push({\n role: 'system',\n content: systemSegments.join('\\n\\n'),\n });\n }\n\n for (let i = startIndex; i < messages.length; i++) {\n const message = messages[i];\n const segments = segmentsByMessage[i];\n const contentParts: string[] = [];\n\n let role: ChatMessageRole = message.role as ChatMessageRole;\n\n if (role === 'system') {\n role = 'assistant';\n contentParts.push('@[System]:');\n } else if (role === 'tool') {\n role = 'assistant';\n contentParts.push('@[Tool]:');\n }\n\n for (const segment of segments) {\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length === 0) {\n continue;\n }\n\n const content = contentParts.join('\\n');\n\n chatPrompt.push({\n role,\n content,\n });\n }\n\n return chatPrompt.length > 0 ? (chatPrompt as ChatPrompt) : undefined;\n}\n","import type { Provider, ProviderKind, ProviderRequest, ProviderResponse } from './types.js';\n\n/**\n * Wraps a user-provided task function as a Provider.\n * Used by evaluate() when `task` is specified instead of `target`.\n */\nexport function createFunctionProvider(\n taskFn: (input: string) => string | Promise<string>,\n): Provider {\n return {\n id: 'function-provider',\n kind: 'mock' as ProviderKind,\n targetName: 'custom-task',\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n const startTime = new Date().toISOString();\n const start = Date.now();\n const result = await taskFn(request.question);\n const endTime = new Date().toISOString();\n return {\n output: [{ role: 'assistant', content: result }],\n durationMs: Date.now() - start,\n startTime,\n endTime,\n };\n },\n };\n}\n"],"mappings":"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","names":["path","pathToFileURL","existsSync","path","micromatch","execFile","createHash","randomUUID","existsSync","copyFile","mkdir","readdir","stat","path","promisify","micromatch","url","extractLastAssistantContent","path","path","path","data","score","assertions","path","stat","path","path","path","path","path","randomUUID","createWriteStream","mkdir","path","extractToolCalls","path","mkdir","buildLogFilename","createWriteStream","formatElapsed","sanitizeForFilename","randomUUID","fs","os","path","z","z","formatTimeoutSuffix","fs","normalizeInputFiles","path","os","randomUUID","createWriteStream","mkdir","path","GLOBAL_LOGS_KEY","GLOBAL_SUBSCRIBERS_KEY","getSubscriberStore","notifySubscribers","path","mkdir","buildLogFilename","createWriteStream","formatElapsed","summarizeEvent","sanitizeForFilename","randomUUID","randomUUID","mkdir","homedir","path","spawn","readFile","path","promisify","execAsync","GLOBAL_LOGS_KEY","GLOBAL_SUBSCRIBERS_KEY","getSubscriberStore","notifySubscribers","randomUUID","createWriteStream","readdirSync","path","fileURLToPath","os","buildLogFilename","sanitizeForFilename","formatElapsed","elapsed","spawn","randomUUID","path","homedir","mkdir","buildLogFilename","readFile","homedir","path","readFile","readdir","stat","homedir","path","path","homedir","readdir","readFile","stat","fs","path","readFile","homedir","randomUUID","existsSync","mkdir","path","GLOBAL_LOGS_KEY","GLOBAL_SUBSCRIBERS_KEY","getSubscriberStore","notifySubscribers","randomUUID","path","mkdir","buildLogFilename","existsSync","spawn","randomUUID","createWriteStream","mkdir","mkdtemp","rm","writeFile","tmpdir","path","GLOBAL_LOGS_KEY","GLOBAL_SUBSCRIBERS_KEY","getSubscriberStore","notifySubscribers","path","writeFile","formatTimeoutSuffix","mkdtemp","tmpdir","rm","mkdir","buildLogFilename","createWriteStream","formatElapsed","sanitizeForFilename","randomUUID","extractToolCalls","spawn","execSync","randomUUID","accessSync","createWriteStream","mkdir","path","fileURLToPath","path","execSync","accessSync","mkdir","buildLogFilename","PiStreamLogger","createWriteStream","summarizeSdkEvent","formatElapsed","sanitizeForFilename","randomUUID","extractToolCalls","exec","constants","access","path","promisify","stat","writeFile","path","mkdir","readdir","rm","stat","path","rm","path","pathToFileUri","path","renderTemplate","renderTemplate","path","readFile","path","readFile","path","spawn","mkdir","writeFile","path","promisify","path","path","execAsync","promisify","spawn","path","mkdir","writeFile","pathToFileUri","mkdir","readFile","readdir","stat","writeFile","path","path","path","stat","readFile","writeFile","mkdir","readdir","path","stat","writeFile","pathToFileUri","writeFile","path","DEFAULT_WORKSPACE_TEMPLATE","DEFAULT_WAKEUP_CONTENT","path","writeFile","execAsync","promisify","exec","buildPromptDocument","path","access","constants","buildMandatoryPrereadBlock","pathToFileUri","path","constants","access","readFile","path","fileExists","access","constants","path","readFile","path","path","path","path","path","fg","path","fg","path","fg","path","fg","aggregation","mkdir","readdir","rm","stat","path","stat","path","mkdir","readdir","rm","existsSync","cp","mkdir","readFile","readdir","rm","writeFile","path","promisify","promisify","copyDirectoryRecursive","mkdir","readdir","path","cp","existsSync","writeFile","readFile","rm","execFile","existsSync","path","promisify","execFileAsync","promisify","execFile","DEFAULT_TIMEOUT_MS","gitEnv","git","existsSync","path","readdir","stat","path","readFile","stat","path","micromatch","readFile","path","ANSI_RESET","readFile","path","constants","access","path","fileURLToPath","fileExists","buildDirectoryChain","ANSI_YELLOW","ANSI_RESET","buildDirectoryChain","path","fileExists","readFile","readFile","path","readFile","ANSI_YELLOW","ANSI_RESET","readFile","ANSI_YELLOW","ANSI_RESET","isJsonObject","path","readFile","logWarning","weight","required","min_score","knownProps","config","promptPath","argsMatch","logWarning","isJsonObject","readFile","path","readFile","path","asString","path","ANSI_YELLOW","ANSI_RESET","asString","logWarning","readFile","asString","logWarning","ANSI_YELLOW","ANSI_RESET","readFile","path","ANSI_YELLOW","ANSI_RED","ANSI_RESET","path","fileExists","logWarning","readFile","asString","logError","asString","logWarning","ANSI_YELLOW","ANSI_RESET","logError","ANSI_RED","z","ANSI_YELLOW","ANSI_RED","ANSI_RESET","matchesFilter","micromatch","logWarning","path","readFile","loadTsEvalSuite","asString","stat","logError","execFileAsync","promisify","execFile","existsSync","path","randomUUID","AgentvProvider","stat","readdir","mkdir","toDependencyResult","checkDependencies","extractEvaluationCostUsd","copyFile","sleep","score","matchesFilter","micromatch","captureFileChanges","createHash","path","tests","matchesFilter","micromatch","existsSync","readFileSync","path","pathToFileURL"]}
|