@agentv/core 2.6.0 → 2.7.1-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-SSPAANFZ.js → chunk-6W5E3VR6.js} +383 -54
- package/dist/chunk-6W5E3VR6.js.map +1 -0
- package/dist/chunk-HFSYZHGF.js +82 -0
- package/dist/chunk-HFSYZHGF.js.map +1 -0
- package/dist/chunk-HMXZ2AX4.js +112 -0
- package/dist/chunk-HMXZ2AX4.js.map +1 -0
- package/dist/esm-5Q4BZALM.js +968 -0
- package/dist/esm-5Q4BZALM.js.map +1 -0
- package/dist/evaluation/validation/index.cjs +337 -70
- package/dist/evaluation/validation/index.cjs.map +1 -1
- package/dist/evaluation/validation/index.js +294 -69
- package/dist/evaluation/validation/index.js.map +1 -1
- package/dist/index.cjs +9221 -4037
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1717 -234
- package/dist/index.d.ts +1717 -234
- package/dist/index.js +6559 -3140
- package/dist/index.js.map +1 -1
- package/dist/otlp-json-file-exporter-77FDBRSY.js +7 -0
- package/dist/otlp-json-file-exporter-77FDBRSY.js.map +1 -0
- package/dist/simple-trace-file-exporter-S76DMABU.js +7 -0
- package/dist/simple-trace-file-exporter-S76DMABU.js.map +1 -0
- package/package.json +16 -3
- package/dist/chunk-SSPAANFZ.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/evaluation/types.ts","../src/evaluation/trace.ts","../src/evaluation/yaml-parser.ts","../src/evaluation/loaders/config-loader.ts","../src/evaluation/loaders/file-resolver.ts","../src/evaluation/loaders/evaluator-parser.ts","../src/evaluation/validation/prompt-validator.ts","../src/evaluation/template-variables.ts","../src/evaluation/loaders/jsonl-parser.ts","../src/evaluation/loaders/message-processor.ts","../src/evaluation/formatting/segment-formatter.ts","../src/evaluation/loaders/shorthand-expansion.ts","../src/evaluation/formatting/prompt-builder.ts","../src/evaluation/providers/ai-sdk.ts","../src/evaluation/providers/claude-code.ts","../src/evaluation/providers/claude-code-log-tracker.ts","../src/evaluation/providers/preread.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/providers/copilot-cli-log-tracker.ts","../src/evaluation/providers/mock.ts","../src/evaluation/providers/pi-agent-sdk.ts","../src/evaluation/providers/pi-coding-agent.ts","../src/evaluation/providers/pi-log-tracker.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/index.ts","../src/evaluation/evaluators/scoring.ts","../src/runtime/exec.ts","../src/runtime/target-proxy.ts","../src/evaluation/case-conversion.ts","../src/evaluation/evaluators/code-evaluator.ts","../src/evaluation/evaluators/composite.ts","../src/evaluation/evaluators/llm-judge.ts","../src/evaluation/evaluators/cost.ts","../src/evaluation/evaluators/field-accuracy.ts","../src/evaluation/evaluators/latency.ts","../src/evaluation/evaluators/token-usage.ts","../src/evaluation/evaluators/tool-trajectory.ts","../src/evaluation/orchestrator.ts","../../../node_modules/.bun/yocto-queue@1.2.2/node_modules/yocto-queue/index.js","../../../node_modules/.bun/p-limit@6.2.0/node_modules/p-limit/index.js","../src/evaluation/generators/rubric-generator.ts","../src/index.ts"],"sourcesContent":["import type { ToolTrajectoryEvaluatorConfig, TraceSummary } from './trace.js';\n\n/**\n * JSON primitive values appearing in AgentV payloads.\n */\nexport type JsonPrimitive = string | number | boolean | null;\n\n/**\n * Immutable JSON object representation for test fixtures.\n */\nexport interface JsonObject {\n readonly [key: string]: JsonValue;\n}\n\n/**\n * Recursive JSON value supporting nested structures.\n */\nexport type JsonValue = JsonPrimitive | JsonObject | readonly JsonValue[];\n\nconst TEST_MESSAGE_ROLE_VALUES = ['system', 'user', 'assistant', 'tool'] as const;\n\n/**\n * Immutable list of supported message roles.\n */\nexport const TEST_MESSAGE_ROLES = TEST_MESSAGE_ROLE_VALUES;\n\n/**\n * Role literals used by test messages.\n */\nexport type TestMessageRole = (typeof TEST_MESSAGE_ROLE_VALUES)[number];\n\nconst TEST_MESSAGE_ROLE_SET: ReadonlySet<string> = new Set(TEST_MESSAGE_ROLE_VALUES);\n\n/**\n * Text or structured payload attached to a message.\n */\nexport type TestMessageContent = string | JsonObject | readonly JsonObject[];\n\n/**\n * System-authored instruction message.\n */\nexport type SystemTestMessage = {\n readonly role: 'system';\n readonly content: TestMessageContent;\n};\n\n/**\n * User-authored prompt message.\n */\nexport type UserTestMessage = {\n readonly role: 'user';\n readonly content: TestMessageContent;\n};\n\n/**\n * Assistant response message.\n */\nexport type AssistantTestMessage = {\n readonly role: 'assistant';\n readonly content: TestMessageContent;\n};\n\n/**\n * Tool invocation message.\n */\nexport type ToolTestMessage = {\n readonly role: 'tool';\n readonly content: TestMessageContent;\n};\n\n/**\n * Conversation message union with role discrimination.\n */\nexport type TestMessage =\n | SystemTestMessage\n | UserTestMessage\n | AssistantTestMessage\n | ToolTestMessage;\n\n/**\n * Guard validating supported message roles.\n */\nexport function isTestMessageRole(value: unknown): value is TestMessageRole {\n return typeof value === 'string' && TEST_MESSAGE_ROLE_SET.has(value);\n}\n\n/**\n * Guard matching AgentV JSON objects.\n */\nexport function isJsonObject(value: unknown): value is JsonObject {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n return Object.values(value as Record<string, unknown>).every(isJsonValue);\n}\n\n/**\n * Guard matching AgentV JSON values.\n */\nexport function isJsonValue(value: unknown): value is JsonValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n if (typeof value === 'object') {\n return isJsonObject(value);\n }\n return false;\n}\n\n/**\n * Guard validating raw test messages.\n * A valid test message has:\n * - A valid role (system, user, assistant, tool)\n * - Either content (string or array of objects) OR tool_calls (for assistant messages)\n */\nexport function isTestMessage(value: unknown): value is TestMessage {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const candidate = value as { role?: unknown; content?: unknown; tool_calls?: unknown };\n if (!isTestMessageRole(candidate.role)) {\n return false;\n }\n // Check for valid content\n if (typeof candidate.content === 'string') {\n return true;\n }\n if (Array.isArray(candidate.content) && candidate.content.every(isJsonObject)) {\n return true;\n }\n // Allow messages with tool_calls but no content (for expected_messages format)\n if (Array.isArray(candidate.tool_calls) && candidate.tool_calls.length > 0) {\n return true;\n }\n // Allow messages with structured content object (e.g., { recommendation: ..., summary: ... })\n if (isJsonObject(candidate.content)) {\n return true;\n }\n return false;\n}\n\nconst EVALUATOR_KIND_VALUES = [\n 'code_judge',\n 'llm_judge',\n 'rubric',\n 'composite',\n 'tool_trajectory',\n 'field_accuracy',\n 'latency',\n 'cost',\n 'token_usage',\n] as const;\n\nexport type EvaluatorKind = (typeof EVALUATOR_KIND_VALUES)[number];\n\nconst EVALUATOR_KIND_SET: ReadonlySet<string> = new Set(EVALUATOR_KIND_VALUES);\n\nexport function isEvaluatorKind(value: unknown): value is EvaluatorKind {\n return typeof value === 'string' && EVALUATOR_KIND_SET.has(value);\n}\n\n/**\n * Configuration for enabling target access in code_judge evaluators.\n * When present, the runtime will start a local proxy server that allows\n * the script to invoke configured targets without direct credential access.\n */\nexport type TargetAccessConfig = {\n /** Maximum number of target invocations allowed per execution (default: 50) */\n readonly max_calls?: number;\n};\n\nexport type CodeEvaluatorConfig = {\n readonly name: string;\n readonly type: 'code';\n readonly script: readonly string[];\n readonly resolvedScriptPath?: string;\n readonly cwd?: string;\n readonly resolvedCwd?: string;\n readonly weight?: number;\n /** Pass-through configuration for the code_judge script (any unrecognized YAML properties) */\n readonly config?: JsonObject;\n /** When present, enables target access for the script via local proxy */\n readonly target?: TargetAccessConfig;\n};\n\n/**\n * Executable prompt template configuration.\n * Matches code_judge pattern for consistency.\n */\nexport type PromptScriptConfig = {\n /** Command array to execute (e.g., [\"bun\", \"run\", \"template.ts\"]) */\n readonly script: readonly string[];\n /** Pass-through configuration for the prompt template */\n readonly config?: Record<string, unknown>;\n};\n\nexport type LlmJudgeEvaluatorConfig = {\n readonly name: string;\n readonly type: 'llm_judge';\n /** Text prompt (inline or file path) or executable script config */\n readonly prompt?: string | PromptScriptConfig;\n readonly promptPath?: string;\n /** Resolved absolute path for prompt file (used for text template prompts) */\n readonly resolvedPromptPath?: string;\n /** Resolved script array for executable prompts (matches code_judge pattern) */\n readonly resolvedPromptScript?: readonly string[];\n readonly rubrics?: readonly RubricItem[];\n readonly weight?: number;\n /** Pass-through configuration for custom evaluator prompts (legacy, prefer prompt.config) */\n readonly config?: Record<string, unknown>;\n};\n\n/**\n * Score range definition for analytic rubric scoring.\n * Each range maps an integer score band (0-10) to an expected outcome description.\n */\nexport type ScoreRange = {\n /** Inclusive integer range [min, max] within 0-10 */\n readonly score_range: readonly [number, number];\n /** Description of what this score range represents */\n readonly expected_outcome: string;\n};\n\n/**\n * Rubric item for LLM judge evaluation.\n * Supports two modes:\n * - Checklist mode: boolean satisfied/not-satisfied with `expected_outcome`\n * - Score-range mode: 0-10 integer scoring with `score_ranges`\n */\nexport type RubricItem = {\n readonly id: string;\n /**\n * For checklist rubrics: the expected outcome text (required).\n * For score-range rubrics: optional overall criterion description.\n */\n readonly expected_outcome?: string;\n readonly weight: number;\n /**\n * Legacy boolean gating (deprecated, treated as required_min_score: 10).\n * Use required_min_score instead for finer control.\n */\n readonly required?: boolean;\n /**\n * Minimum score (0-10) required to pass this criterion.\n * If the criterion score is below this threshold, the overall verdict is 'fail'.\n */\n readonly required_min_score?: number;\n /**\n * Score range definitions for analytic rubric scoring.\n * When present, the judge outputs an integer 0-10 score per criterion.\n * Ranges must be non-overlapping and cover 0-10 inclusive.\n */\n readonly score_ranges?: readonly ScoreRange[];\n};\n\nexport type CompositeAggregatorConfig =\n | { readonly type: 'weighted_average'; readonly weights?: Record<string, number> }\n | { readonly type: 'code_judge'; readonly path: string; readonly cwd?: string }\n | {\n readonly type: 'llm_judge';\n readonly prompt?: string;\n readonly promptPath?: string;\n readonly model?: string;\n };\n\nexport type CompositeEvaluatorConfig = {\n readonly name: string;\n readonly type: 'composite';\n readonly evaluators: readonly EvaluatorConfig[];\n readonly aggregator: CompositeAggregatorConfig;\n readonly weight?: number;\n};\n\n/**\n * Match type for field accuracy evaluation.\n * Note: For fuzzy string matching (Levenshtein, Jaro-Winkler, etc.), use a code_judge evaluator.\n * See examples/features/document-extraction/fuzzy_match.ts for an example.\n */\nexport type FieldMatchType = 'exact' | 'numeric_tolerance' | 'date';\n\n/**\n * Aggregation strategy for combining field scores.\n */\nexport type FieldAggregationType = 'weighted_average' | 'all_or_nothing';\n\n/**\n * Configuration for a single field to evaluate.\n */\nexport type FieldConfig = {\n /** Dot-notation path to the field (e.g., \"invoice.vendor.name\" or \"items[0].amount\") */\n readonly path: string;\n /** Match strategy for this field */\n readonly match: FieldMatchType;\n /** Whether this field is required (missing required fields count as failures) */\n readonly required?: boolean;\n /** Weight for aggregation (default: 1.0) */\n readonly weight?: number;\n /** Tolerance for numeric matching (absolute value unless relative is true) */\n readonly tolerance?: number;\n /** Whether tolerance is relative (percentage) vs absolute */\n readonly relative?: boolean;\n /** Date formats to try when parsing (default: common formats) */\n readonly formats?: readonly string[];\n};\n\n/**\n * Configuration for the field_accuracy evaluator.\n */\nexport type FieldAccuracyEvaluatorConfig = {\n readonly name: string;\n readonly type: 'field_accuracy';\n /** Fields to compare between candidate and expected */\n readonly fields: readonly FieldConfig[];\n /** Strategy for combining field scores (default: weighted_average) */\n readonly aggregation?: FieldAggregationType;\n readonly weight?: number;\n};\n\n/**\n * Configuration for the latency evaluator.\n * Checks execution duration against a threshold.\n */\nexport type LatencyEvaluatorConfig = {\n readonly name: string;\n readonly type: 'latency';\n /** Maximum allowed duration in milliseconds */\n readonly threshold: number;\n readonly weight?: number;\n};\n\n/**\n * Configuration for the cost evaluator.\n * Checks execution cost against a budget.\n */\nexport type CostEvaluatorConfig = {\n readonly name: string;\n readonly type: 'cost';\n /** Maximum allowed cost in USD */\n readonly budget: number;\n readonly weight?: number;\n};\n\n/**\n * Configuration for the token_usage evaluator.\n * Checks provider-reported token usage against configured limits.\n */\nexport type TokenUsageEvaluatorConfig = {\n readonly name: string;\n readonly type: 'token_usage';\n /** Maximum allowed total tokens (input + output + cached, when present) */\n readonly max_total?: number;\n /** Maximum allowed input tokens (prompt) */\n readonly max_input?: number;\n /** Maximum allowed output tokens (completion) */\n readonly max_output?: number;\n readonly weight?: number;\n};\n\nexport type EvaluatorConfig =\n | CodeEvaluatorConfig\n | LlmJudgeEvaluatorConfig\n | CompositeEvaluatorConfig\n | ToolTrajectoryEvaluatorConfig\n | FieldAccuracyEvaluatorConfig\n | LatencyEvaluatorConfig\n | CostEvaluatorConfig\n | TokenUsageEvaluatorConfig;\n\n/**\n * Eval case definition sourced from AgentV specs.\n */\nexport interface EvalCase {\n readonly id: string;\n readonly dataset?: string;\n readonly conversation_id?: string;\n readonly question: string;\n readonly input_messages: readonly TestMessage[];\n readonly input_segments: readonly JsonObject[];\n readonly expected_messages: readonly JsonObject[];\n readonly reference_answer?: string;\n readonly guideline_paths: readonly string[];\n readonly guideline_patterns?: readonly string[];\n readonly file_paths: readonly string[];\n readonly expected_outcome: string;\n readonly evaluator?: EvaluatorKind;\n readonly evaluators?: readonly EvaluatorConfig[];\n}\n\n/**\n * Evaluator scorecard for a single eval case run.\n */\nexport interface EvaluationResult {\n readonly timestamp: string;\n readonly evalId: string;\n readonly dataset?: string;\n readonly conversationId?: string;\n readonly score: number;\n readonly hits: readonly string[];\n readonly misses: readonly string[];\n readonly candidateAnswer: string;\n readonly target: string;\n readonly reasoning?: string;\n readonly agentProviderRequest?: JsonObject;\n readonly lmProviderRequest?: JsonObject;\n readonly evaluatorProviderRequest?: JsonObject;\n readonly evaluatorResults?: readonly EvaluatorResult[];\n readonly error?: string;\n /** Lightweight summary of the execution trace (always included when available) */\n readonly traceSummary?: TraceSummary;\n}\n\nexport type EvaluationVerdict = 'pass' | 'fail' | 'borderline';\n\nexport interface EvaluatorResult {\n readonly name: string;\n readonly type: EvaluatorKind;\n readonly score: number;\n readonly weight?: number;\n readonly verdict?: EvaluationVerdict;\n readonly hits: readonly string[];\n readonly misses: readonly string[];\n readonly reasoning?: string;\n readonly rawRequest?: JsonObject;\n readonly evaluatorProviderRequest?: JsonObject;\n readonly evaluatorResults?: readonly EvaluatorResult[];\n /** Optional structured details from code judges (e.g., TP/TN/FP/FN counts). */\n readonly details?: JsonObject;\n}\n\n/**\n * Convenience accessor matching the Python hit_count property.\n */\nexport function getHitCount(result: Pick<EvaluationResult, 'hits'>): number {\n return result.hits.length;\n}\n","/**\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}\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 /** Unique tool names, sorted alphabetically */\n readonly toolNames: readonly string[];\n /** Map of tool name to call count */\n readonly toolCallsByName: Readonly<Record<string, number>>;\n /** Number of error events */\n readonly errorCount: number;\n /** Token usage metrics (optional, from provider) */\n readonly tokenUsage?: TokenUsage;\n /** Total cost in USD (optional, from provider) */\n readonly costUsd?: number;\n /** Total execution duration in milliseconds (optional) */\n readonly durationMs?: number;\n /** Per-tool duration arrays in milliseconds (optional) */\n readonly toolDurations?: Readonly<Record<string, readonly number[]>>;\n}\n\n/**\n * Configuration for tool_trajectory evaluator.\n */\nexport interface ToolTrajectoryEvaluatorConfig {\n readonly name: string;\n readonly type: 'tool_trajectory';\n /** Matching mode */\n readonly mode: 'any_order' | 'in_order' | 'exact';\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 modes) */\n readonly expected?: readonly ToolTrajectoryExpectedItem[];\n /** Optional weight for top-level aggregation (defaults to 1.0) */\n readonly weight?: number;\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}\n\n/**\n * Simplified input type for computeTraceSummary.\n * Matches OutputMessage structure without requiring full provider/types import.\n */\ninterface OutputMessageLike {\n readonly toolCalls?: readonly {\n readonly tool: string;\n }[];\n}\n\n/**\n * Compute a lightweight summary from output messages.\n * Used for default result persistence without payload bloat.\n */\nexport function computeTraceSummary(messages: readonly OutputMessageLike[]): TraceSummary {\n const toolCallCounts: Record<string, number> = {};\n let totalToolCalls = 0;\n\n for (const message of messages) {\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 }\n\n const toolNames = Object.keys(toolCallCounts).sort();\n\n return {\n eventCount: totalToolCalls,\n toolNames,\n toolCallsByName: toolCallCounts,\n errorCount: 0,\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.toolCallsByName[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): number | undefined {\n if (!summary.tokenUsage || summary.eventCount === 0) return undefined;\n\n const totalTokens = summary.tokenUsage.input + summary.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}\n\n/**\n * Merge execution metrics from provider response into a trace summary.\n * Returns a new TraceSummary with metrics fields populated.\n *\n * @param summary - Base trace summary from computeTraceSummary\n * @param metrics - Optional execution metrics from provider\n * @returns TraceSummary with merged metrics\n */\nexport function mergeExecutionMetrics(\n summary: TraceSummary,\n metrics?: ExecutionMetrics,\n): TraceSummary {\n if (!metrics) return summary;\n\n return {\n ...summary,\n tokenUsage: metrics.tokenUsage,\n costUsd: metrics.costUsd,\n durationMs: metrics.durationMs,\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\nimport { parse } from 'yaml';\n\nimport { extractTargetFromSuite, loadConfig } from './loaders/config-loader.js';\nimport {\n coerceEvaluator,\n parseEvaluators,\n parseInlineRubrics,\n} from './loaders/evaluator-parser.js';\nimport { buildSearchRoots, resolveToAbsolutePath } from './loaders/file-resolver.js';\nimport { detectFormat, loadEvalCasesFromJsonl } from './loaders/jsonl-parser.js';\nimport { processExpectedMessages, processMessages } from './loaders/message-processor.js';\nimport { resolveExpectedMessages, resolveInputMessages } from './loaders/shorthand-expansion.js';\nimport type { EvalCase, JsonObject, JsonValue, TestMessage } from './types.js';\nimport { isJsonObject, isTestMessage } from './types.js';\n\n// Re-export public APIs from modules\nexport { buildPromptInputs, type PromptInputs } from './formatting/prompt-builder.js';\nexport { isGuidelineFile } from './loaders/config-loader.js';\nexport { detectFormat } from './loaders/jsonl-parser.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 eval cases by ID pattern (glob supported, e.g., \"summary-*\") */\n readonly filter?: string;\n};\n\ntype RawTestSuite = JsonObject & {\n readonly evalcases?: JsonValue;\n readonly target?: JsonValue;\n readonly execution?: JsonValue;\n readonly dataset?: JsonValue;\n};\n\ntype RawEvalCase = JsonObject & {\n readonly id?: JsonValue;\n readonly conversation_id?: JsonValue;\n readonly outcome?: JsonValue;\n readonly expected_outcome?: JsonValue;\n readonly input_messages?: JsonValue;\n readonly expected_messages?: JsonValue;\n // Aliases for input_messages/expected_messages\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 * Read metadata from a test suite file (like target name).\n * This is a convenience function for CLI tools that need metadata without loading all eval cases.\n */\nexport async function readTestSuiteMetadata(testFilePath: string): Promise<{ target?: string }> {\n try {\n const absolutePath = path.resolve(testFilePath);\n const content = await readFile(absolutePath, 'utf8');\n const parsed = parse(content) as unknown;\n\n if (!isJsonObject(parsed)) {\n return {};\n }\n\n return { target: extractTargetFromSuite(parsed) };\n } catch {\n return {};\n }\n}\n\n/**\n * Load eval cases from a AgentV specification file (YAML or JSONL).\n * Format is detected by file extension: .yaml/.yml for YAML, .jsonl for JSONL.\n */\nexport async function loadEvalCases(\n evalFilePath: string,\n repoRoot: URL | string,\n options?: LoadOptions,\n): Promise<readonly EvalCase[]> {\n // Detect format and route to appropriate parser\n const format = detectFormat(evalFilePath);\n if (format === 'jsonl') {\n return loadEvalCasesFromJsonl(evalFilePath, repoRoot, options);\n }\n\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 const guidelinePatterns = config?.guideline_patterns;\n\n const rawFile = await readFile(absoluteTestPath, 'utf8');\n const parsed = parse(rawFile) as unknown;\n if (!isJsonObject(parsed)) {\n throw new Error(`Invalid test file format: ${evalFilePath}`);\n }\n\n const suite = parsed as RawTestSuite;\n const datasetNameFromSuite = asString(suite.dataset)?.trim();\n const fallbackDataset = path.basename(absoluteTestPath).replace(/\\.ya?ml$/i, '') || 'eval';\n const datasetName =\n datasetNameFromSuite && datasetNameFromSuite.length > 0\n ? datasetNameFromSuite\n : fallbackDataset;\n\n const rawTestcases = suite.evalcases;\n if (!Array.isArray(rawTestcases)) {\n throw new Error(`Invalid test file format: ${evalFilePath} - missing 'evalcases' field`);\n }\n\n const globalEvaluator = coerceEvaluator(suite.evaluator, 'global') ?? 'llm_judge';\n\n // Extract global target from execution.target (or legacy root-level target)\n const globalExecution = isJsonObject(suite.execution) ? suite.execution : undefined;\n const _globalTarget = asString(globalExecution?.target) ?? asString(suite.target);\n\n const results: EvalCase[] = [];\n\n for (const rawEvalcase of rawTestcases) {\n if (!isJsonObject(rawEvalcase)) {\n logWarning('Skipping invalid eval case entry (expected object)');\n continue;\n }\n\n const evalcase = rawEvalcase as RawEvalCase;\n const id = asString(evalcase.id);\n\n // Skip eval cases that don't match the filter pattern (glob supported)\n if (filterPattern && (!id || !micromatch.isMatch(id, filterPattern))) {\n continue;\n }\n\n const conversationId = asString(evalcase.conversation_id);\n // Support both expected_outcome and outcome (backward compatibility)\n const outcome = asString(evalcase.expected_outcome) ?? asString(evalcase.outcome);\n\n // Resolve input_messages with alias/shorthand support (canonical takes precedence)\n const inputMessages = resolveInputMessages(evalcase);\n // Resolve expected_messages with alias/shorthand support (canonical takes precedence)\n const expectedMessages = resolveExpectedMessages(evalcase) ?? [];\n\n if (!id || !outcome || !inputMessages || inputMessages.length === 0) {\n logError(\n `Skipping incomplete eval case: ${id ?? 'unknown'}. Missing required fields: id, outcome, and/or input_messages (or input)`,\n );\n continue;\n }\n\n // expected_messages is optional - for outcome-only evaluation\n const hasExpectedMessages = expectedMessages.length > 0;\n\n const guidelinePaths: string[] = [];\n const inputTextParts: string[] = [];\n\n // Process all input messages to extract files and guidelines\n const inputSegments = await processMessages({\n messages: inputMessages,\n searchRoots,\n repoRootPath,\n guidelinePatterns,\n guidelinePaths,\n textParts: inputTextParts,\n messageType: 'input',\n verbose,\n });\n\n // Process expected_messages into segments (only if provided)\n // Preserve full message structure including role and tool_calls for expected_messages 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_messages (similar to candidate_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 evalCaseEvaluatorKind = coerceEvaluator(evalcase.evaluator, id) ?? globalEvaluator;\n let evaluators: Awaited<ReturnType<typeof parseEvaluators>>;\n try {\n evaluators = await parseEvaluators(evalcase, globalExecution, searchRoots, id ?? 'unknown');\n } catch (error) {\n // Skip entire eval case if evaluator validation fails\n const message = error instanceof Error ? error.message : String(error);\n logError(`Skipping eval case '${id}': ${message}`);\n continue;\n }\n\n // Handle inline rubrics field (syntactic sugar)\n const inlineRubrics = evalcase.rubrics;\n if (inlineRubrics !== undefined && Array.isArray(inlineRubrics)) {\n const rubricEvaluator = parseInlineRubrics(inlineRubrics);\n if (rubricEvaluator) {\n // Prepend rubric evaluator to existing evaluators\n evaluators = evaluators ? [rubricEvaluator, ...evaluators] : [rubricEvaluator];\n }\n }\n\n // Extract file paths from all input segments (non-guideline files)\n const userFilePaths: string[] = [];\n for (const segment of inputSegments) {\n if (segment.type === 'file' && typeof segment.resolvedPath === 'string') {\n userFilePaths.push(segment.resolvedPath);\n }\n }\n\n // Combine all file paths (guidelines + regular files)\n const allFilePaths = [\n ...guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\n ...userFilePaths,\n ];\n\n const testCase: EvalCase = {\n id,\n dataset: datasetName,\n conversation_id: conversationId,\n question: question,\n input_messages: inputMessages,\n input_segments: inputSegments,\n expected_messages: outputSegments,\n reference_answer: referenceAnswer,\n guideline_paths: guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\n guideline_patterns: guidelinePatterns,\n file_paths: allFilePaths,\n expected_outcome: outcome,\n evaluator: evalCaseEvaluatorKind,\n evaluators,\n };\n\n if (verbose) {\n console.log(`\\n[Eval Case: ${id}]`);\n if (testCase.guideline_paths.length > 0) {\n console.log(` Guidelines used: ${testCase.guideline_paths.length}`);\n for (const guidelinePath of testCase.guideline_paths) {\n console.log(` - ${guidelinePath}`);\n }\n } else {\n console.log(' No guidelines found');\n }\n }\n\n results.push(testCase);\n }\n\n return results;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\nfunction logError(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.error(`${ANSI_RED}Error: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.error(`${ANSI_RED}Error: ${message}${ANSI_RESET}`);\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\nimport { parse } from 'yaml';\n\nimport type { JsonObject } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport { buildDirectoryChain, fileExists } from './file-resolver.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\nexport type AgentVConfig = {\n readonly guideline_patterns?: readonly string[];\n};\n\n/**\n * Load optional .agentv/config.yaml configuration file.\n * Searches from eval file directory up to repo root.\n */\nexport async function loadConfig(\n evalFilePath: string,\n repoRoot: string,\n): Promise<AgentVConfig | null> {\n const directories = buildDirectoryChain(evalFilePath, repoRoot);\n\n for (const directory of directories) {\n const configPath = path.join(directory, '.agentv', 'config.yaml');\n\n if (!(await fileExists(configPath))) {\n continue;\n }\n\n try {\n const rawConfig = await readFile(configPath, 'utf8');\n const parsed = parse(rawConfig) as unknown;\n\n if (!isJsonObject(parsed)) {\n logWarning(`Invalid .agentv/config.yaml format at ${configPath}`);\n continue;\n }\n\n const config = parsed as AgentVConfig;\n\n const guidelinePatterns = config.guideline_patterns;\n if (guidelinePatterns !== undefined && !Array.isArray(guidelinePatterns)) {\n logWarning(`Invalid guideline_patterns in ${configPath}, expected array`);\n continue;\n }\n\n if (\n Array.isArray(guidelinePatterns) &&\n !guidelinePatterns.every((p) => typeof p === 'string')\n ) {\n logWarning(`Invalid guideline_patterns in ${configPath}, all entries must be strings`);\n continue;\n }\n\n return {\n guideline_patterns: guidelinePatterns as readonly string[] | undefined,\n };\n } catch (error) {\n logWarning(\n `Could not read .agentv/config.yaml at ${configPath}: ${(error as Error).message}`,\n );\n }\n }\n\n return null;\n}\n\n/**\n * Determine whether a path references guideline content (instructions or prompts).\n */\nexport function isGuidelineFile(filePath: string, patterns?: readonly string[]): boolean {\n const normalized = filePath.split('\\\\').join('/');\n const patternsToUse = patterns ?? [];\n\n return micromatch.isMatch(normalized, patternsToUse as string[]);\n}\n\n/**\n * Extract target name from parsed eval suite (checks execution.target then falls back to root-level target).\n */\nexport function extractTargetFromSuite(suite: JsonObject): string | undefined {\n // Check execution.target first (new location), fallback to root-level target (legacy)\n const execution = suite.execution;\n if (execution && typeof execution === 'object' && !Array.isArray(execution)) {\n const executionTarget = (execution as Record<string, unknown>).target;\n if (typeof executionTarget === 'string' && executionTarget.trim().length > 0) {\n return executionTarget.trim();\n }\n }\n\n // Fallback to legacy root-level target\n const targetValue = suite.target;\n if (typeof targetValue === 'string' && targetValue.trim().length > 0) {\n return targetValue.trim();\n }\n\n return undefined;\n}\n\nfunction logWarning(message: string): void {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n}\n","import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport path from 'node:path';\n\n/**\n * Check if a file exists on disk.\n */\nexport async function fileExists(absolutePath: string): Promise<boolean> {\n try {\n await access(absolutePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Convert URL or string to absolute file path.\n */\nexport function resolveToAbsolutePath(candidate: URL | string): string {\n if (candidate instanceof URL) {\n return new URL(candidate).pathname;\n }\n if (typeof candidate === 'string') {\n if (candidate.startsWith('file://')) {\n return new URL(candidate).pathname;\n }\n return path.resolve(candidate);\n }\n throw new TypeError('Unsupported repoRoot value. Expected string or URL.');\n}\n\n/**\n * Build a chain of directories walking from a file's location up to repo root.\n * Used for discovering configuration files.\n */\nexport function buildDirectoryChain(filePath: string, repoRoot: string): readonly string[] {\n const directories: string[] = [];\n const seen = new Set<string>();\n const boundary = path.resolve(repoRoot);\n let current: string | undefined = path.resolve(path.dirname(filePath));\n\n while (current !== undefined) {\n if (!seen.has(current)) {\n directories.push(current);\n seen.add(current);\n }\n if (current === boundary) {\n break;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n if (!seen.has(boundary)) {\n directories.push(boundary);\n }\n\n return directories;\n}\n\n/**\n * Build search roots for file resolution.\n * Searches from eval file directory up to repo root.\n */\nexport function buildSearchRoots(evalPath: string, repoRoot: string): readonly string[] {\n const uniqueRoots: string[] = [];\n const addRoot = (root: string): void => {\n const normalized = path.resolve(root);\n if (!uniqueRoots.includes(normalized)) {\n uniqueRoots.push(normalized);\n }\n };\n\n let currentDir = path.dirname(evalPath);\n let reachedBoundary = false;\n while (!reachedBoundary) {\n addRoot(currentDir);\n const parentDir = path.dirname(currentDir);\n if (currentDir === repoRoot || parentDir === currentDir) {\n reachedBoundary = true;\n } else {\n currentDir = parentDir;\n }\n }\n\n addRoot(repoRoot);\n addRoot(process.cwd());\n return uniqueRoots;\n}\n\n/**\n * Trim leading path separators for display.\n */\nfunction trimLeadingSeparators(value: string): string {\n const trimmed = value.replace(/^[/\\\\]+/, '');\n return trimmed.length > 0 ? trimmed : value;\n}\n\n/**\n * Resolve a file reference using search roots.\n */\nexport async function resolveFileReference(\n rawValue: string,\n searchRoots: readonly string[],\n): Promise<{\n readonly displayPath: string;\n readonly resolvedPath?: string;\n readonly attempted: readonly string[];\n}> {\n const displayPath = trimLeadingSeparators(rawValue);\n const potentialPaths: string[] = [];\n\n if (path.isAbsolute(rawValue)) {\n potentialPaths.push(path.normalize(rawValue));\n }\n\n for (const base of searchRoots) {\n potentialPaths.push(path.resolve(base, displayPath));\n }\n\n const attempted: string[] = [];\n const seen = new Set<string>();\n for (const candidate of potentialPaths) {\n const absoluteCandidate = path.resolve(candidate);\n if (seen.has(absoluteCandidate)) {\n continue;\n }\n seen.add(absoluteCandidate);\n attempted.push(absoluteCandidate);\n if (await fileExists(absoluteCandidate)) {\n return { displayPath, resolvedPath: absoluteCandidate, attempted };\n }\n }\n\n return { displayPath, attempted };\n}\n","import path from 'node:path';\n\nimport type { ToolTrajectoryEvaluatorConfig, ToolTrajectoryExpectedItem } from '../trace.js';\nimport type { EvaluatorConfig, EvaluatorKind, JsonObject, JsonValue } from '../types.js';\nimport { isEvaluatorKind } from '../types.js';\nimport { validateCustomPromptContent } from '../validation/prompt-validator.js';\nimport { resolveFileReference } from './file-resolver.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Parse evaluators from eval case configuration.\n */\nexport async function parseEvaluators(\n rawEvalCase: JsonObject & {\n readonly execution?: JsonValue;\n readonly evaluators?: JsonValue;\n },\n globalExecution: JsonObject | undefined,\n searchRoots: readonly string[],\n evalId: string,\n): Promise<readonly EvaluatorConfig[] | undefined> {\n const execution = rawEvalCase.execution;\n const executionObject = isJsonObject(execution) ? execution : undefined;\n\n // Priority: case-level execution.evaluators > case-level evaluators > global execution.evaluators\n // Note: If a case has an execution object but omits evaluators, we MUST still fall back to the\n // suite-level execution.evaluators (otherwise adding constraints at case-level disables inheritance).\n const candidateEvaluators =\n (executionObject ? executionObject.evaluators : undefined) ??\n rawEvalCase.evaluators ??\n globalExecution?.evaluators;\n if (candidateEvaluators === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(candidateEvaluators)) {\n logWarning(`Skipping evaluators for '${evalId}': expected array`);\n return undefined;\n }\n\n const evaluators: EvaluatorConfig[] = [];\n\n for (const rawEvaluator of candidateEvaluators) {\n if (!isJsonObject(rawEvaluator)) {\n logWarning(`Skipping invalid evaluator entry for '${evalId}' (expected object)`);\n continue;\n }\n\n const name = asString(rawEvaluator.name);\n const typeValue = rawEvaluator.type;\n\n if (!name || !isEvaluatorKind(typeValue)) {\n logWarning(`Skipping evaluator with invalid name/type in '${evalId}'`);\n continue;\n }\n\n if (typeValue === 'code_judge') {\n let script: string[] | undefined;\n const rawScript = rawEvaluator.script;\n\n if (typeof rawScript === 'string') {\n const trimmed = rawScript.trim();\n if (trimmed.length === 0) {\n throw new Error(\n `Invalid code_judge script for evaluator '${name}' in '${evalId}': script cannot be empty`,\n );\n }\n script = parseCommandToArgv(trimmed);\n } else {\n script = asStringArray(\n rawScript,\n `code_judge script for evaluator '${name}' in '${evalId}'`,\n );\n }\n\n if (!script) {\n logWarning(`Skipping code_judge evaluator '${name}' in '${evalId}': missing script`);\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_judge evaluator '${name}' in '${evalId}': cwd not found (${resolved.displayPath})`,\n resolved.attempted.length > 0\n ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`)\n : undefined,\n );\n }\n } else {\n resolvedCwd = searchRoots[0];\n }\n\n // 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 // Collect unrecognized properties as pass-through config\n const knownProps = new Set(['name', 'type', 'script', 'cwd', 'weight', 'target']);\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',\n script,\n cwd,\n resolvedCwd,\n ...(weight !== undefined ? { weight } : {}),\n ...(Object.keys(config).length > 0 ? { config } : {}),\n ...(targetConfig !== undefined ? { target: targetConfig } : {}),\n });\n continue;\n }\n\n if (typeValue === 'composite') {\n const rawMembers = rawEvaluator.evaluators;\n if (!Array.isArray(rawMembers)) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': missing evaluators array`,\n );\n continue;\n }\n\n const rawAggregator = rawEvaluator.aggregator;\n if (!isJsonObject(rawAggregator)) {\n logWarning(`Skipping composite evaluator '${name}' in '${evalId}': missing aggregator`);\n continue;\n }\n\n const aggregatorType = asString(rawAggregator.type);\n if (\n aggregatorType !== 'weighted_average' &&\n aggregatorType !== 'code_judge' &&\n aggregatorType !== 'llm_judge'\n ) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': invalid aggregator type '${aggregatorType}'`,\n );\n continue;\n }\n\n // Recursively parse member evaluators\n const memberEvaluators: EvaluatorConfig[] = [];\n for (const rawMember of rawMembers) {\n if (!isJsonObject(rawMember)) {\n logWarning(`Skipping invalid member evaluator in composite '${name}' (expected object)`);\n continue;\n }\n\n const memberName = asString(rawMember.name);\n const memberType = rawMember.type;\n\n if (!memberName || !isEvaluatorKind(memberType)) {\n logWarning(`Skipping member evaluator with invalid name/type in composite '${name}'`);\n continue;\n }\n\n // Parse member evaluator (reuse existing logic for code, llm_judge, code_judge)\n const memberConfigs = await parseEvaluators(\n { evaluators: [rawMember] },\n undefined,\n searchRoots,\n `${evalId}:${name}:${memberName}`,\n );\n\n if (memberConfigs && memberConfigs.length > 0) {\n memberEvaluators.push(memberConfigs[0]);\n }\n }\n\n if (memberEvaluators.length === 0) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': no valid member evaluators`,\n );\n continue;\n }\n\n // Parse aggregator config\n let aggregator: import('../types.js').CompositeAggregatorConfig;\n\n if (aggregatorType === 'weighted_average') {\n const weights = isJsonObject(rawAggregator.weights)\n ? (rawAggregator.weights as Record<string, unknown>)\n : undefined;\n const parsedWeights: Record<string, number> = {};\n if (weights) {\n for (const [key, value] of Object.entries(weights)) {\n if (typeof value === 'number') {\n parsedWeights[key] = value;\n }\n }\n }\n aggregator = {\n type: 'weighted_average',\n ...(Object.keys(parsedWeights).length > 0 ? { weights: parsedWeights } : {}),\n };\n } else if (aggregatorType === 'code_judge') {\n const aggregatorPath = asString(rawAggregator.path);\n if (!aggregatorPath) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': code_judge aggregator missing path`,\n );\n continue;\n }\n\n // Set cwd to eval file directory (first search root)\n // Paths are resolved relative to this directory\n aggregator = {\n type: 'code_judge',\n path: aggregatorPath,\n cwd: searchRoots[0],\n };\n } else {\n // llm_judge aggregator\n const aggregatorPrompt = asString(rawAggregator.prompt);\n let promptPath: string | undefined;\n\n if (aggregatorPrompt) {\n const resolved = await resolveFileReference(aggregatorPrompt, searchRoots);\n if (resolved.resolvedPath) {\n promptPath = path.resolve(resolved.resolvedPath);\n }\n }\n\n aggregator = {\n type: 'llm_judge',\n ...(aggregatorPrompt ? { prompt: aggregatorPrompt } : {}),\n ...(promptPath ? { promptPath } : {}),\n };\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n evaluators.push({\n name,\n type: 'composite',\n evaluators: memberEvaluators,\n aggregator,\n ...(weight !== undefined ? { weight } : {}),\n });\n continue;\n }\n\n if (typeValue === 'tool_trajectory') {\n const mode = asString(rawEvaluator.mode);\n if (mode !== 'any_order' && mode !== 'in_order' && mode !== 'exact') {\n logWarning(\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': invalid mode '${mode}' (must be any_order, in_order, or exact)`,\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 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 expected.push({ tool: item.tool, ...(args !== undefined ? { args } : {}) });\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 ((mode === 'in_order' || mode === 'exact') && !expected) {\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\n const config: ToolTrajectoryEvaluatorConfig = {\n name,\n type: 'tool_trajectory',\n mode,\n ...(minimums ? { minimums } : {}),\n ...(expected ? { expected } : {}),\n ...(weight !== undefined ? { weight } : {}),\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_judge 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\n evaluators.push({\n name,\n type: 'field_accuracy',\n fields,\n ...(validAggregation ? { aggregation: validAggregation } : {}),\n ...(weight !== undefined ? { weight } : {}),\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\n evaluators.push({\n name,\n type: 'latency',\n threshold,\n ...(weight !== undefined ? { weight } : {}),\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\n evaluators.push({\n name,\n type: 'cost',\n budget,\n ...(weight !== undefined ? { weight } : {}),\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\n evaluators.push({\n name,\n type: 'token_usage',\n ...validLimits,\n ...(weight !== undefined ? { weight } : {}),\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: { script: [...], config: {...} }\n const scriptArray = asStringArray(\n rawPrompt.script,\n `prompt.script for evaluator '${name}' in '${evalId}'`,\n );\n\n if (!scriptArray) {\n throw new Error(`Evaluator '${name}' in '${evalId}': prompt object requires script array`);\n }\n\n // Resolve the script path (last element is typically the file path)\n const scriptPath = scriptArray[scriptArray.length - 1];\n const resolved = await resolveFileReference(scriptPath, searchRoots);\n\n if (resolved.resolvedPath) {\n // Replace the last element with the resolved path\n resolvedPromptScript = [...scriptArray.slice(0, -1), path.resolve(resolved.resolvedPath)];\n } else {\n throw new Error(\n `Evaluator '${name}' in '${evalId}': prompt script 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 (existing behavior)\n prompt = rawPrompt;\n const resolved = await resolveFileReference(prompt, searchRoots);\n if (resolved.resolvedPath) {\n promptPath = path.resolve(resolved.resolvedPath);\n // Validate custom prompt content upfront - throws error if validation fails\n try {\n await validateCustomPromptContent(promptPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n // Add context and re-throw for the caller to handle\n throw new Error(`Evaluator '${name}' template (${promptPath}): ${message}`);\n }\n } else {\n logWarning(\n `Inline prompt used for evaluator '${name}' in '${evalId}' (file not found: ${resolved.displayPath})`,\n resolved.attempted.length > 0\n ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`)\n : undefined,\n );\n }\n }\n\n const _model = asString(rawEvaluator.model);\n\n const rawRubrics = rawEvaluator.rubrics;\n const parsedRubrics = Array.isArray(rawRubrics)\n ? 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\n // Back-compat: `type: rubric` maps to `type: llm_judge` with `rubrics`.\n evaluators.push({\n name,\n type: 'llm_judge',\n rubrics: parsedRubrics,\n ...(weight !== undefined ? { weight } : {}),\n });\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\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(['name', 'type', 'prompt', 'model', 'rubrics', 'weight', 'config']);\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 evaluators.push({\n name,\n type: 'llm_judge',\n prompt,\n promptPath,\n ...(promptPath ? { resolvedPromptPath: promptPath } : {}),\n ...(resolvedPromptScript ? { resolvedPromptScript } : {}),\n ...(parsedRubrics && parsedRubrics.length > 0 ? { rubrics: parsedRubrics } : {}),\n ...(weight !== undefined ? { weight } : {}),\n ...(finalConfig ? { config: finalConfig } : {}),\n });\n }\n\n return evaluators.length > 0 ? evaluators : undefined;\n}\n\n/**\n * Coerce evaluator value to valid EvaluatorKind.\n */\nexport function coerceEvaluator(\n candidate: JsonValue | undefined,\n contextId: string,\n): EvaluatorKind | undefined {\n if (typeof candidate !== 'string') {\n return undefined;\n }\n if (isEvaluatorKind(candidate)) {\n return candidate;\n }\n logWarning(`Unknown evaluator '${candidate}' in ${contextId}, falling back to default`);\n return undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction 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\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 * 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 // Support both expected_outcome and description (backward compatibility)\n const expectedOutcome =\n asString(rawRubric.expected_outcome) ?? asString(rawRubric.description) ?? '';\n const weight = typeof rawRubric.weight === 'number' ? rawRubric.weight : 1.0;\n\n // Parse required_min_score (new) or required (legacy backward compat)\n let requiredMinScore: number | undefined;\n let required: boolean | undefined;\n\n if (typeof rawRubric.required_min_score === 'number') {\n const minScore = rawRubric.required_min_score;\n if (!Number.isInteger(minScore) || minScore < 0 || minScore > 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 ${minScore})`,\n );\n }\n requiredMinScore = minScore;\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, expected_outcome at rubric level is optional\n items.push({\n id,\n weight,\n ...(expectedOutcome.length > 0 ? { expected_outcome: expectedOutcome } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(requiredMinScore !== undefined ? { required_min_score: requiredMinScore } : {}),\n score_ranges: scoreRanges,\n });\n } else {\n // Checklist rubric: expected_outcome is required\n if (expectedOutcome.length === 0) {\n logWarning(\n `Skipping rubric '${id}' in evaluator '${evaluatorName}' in '${evalId}': missing expected_outcome`,\n );\n continue;\n }\n\n items.push({\n id,\n expected_outcome: expectedOutcome,\n weight,\n // Default to required: true if not specified (backward compatibility)\n required: required ?? true,\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], expected_outcome: \"Bad\" },\n * { score_range: [3, 6], expected_outcome: \"OK\" },\n * { score_range: [7, 9], expected_outcome: \"Good\" },\n * { score_range: [10, 10], expected_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]; expected_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 expected_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 expected_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 expected_outcome\n const expectedOutcome =\n asString(rawRange.expected_outcome) ?? asString(rawRange.description) ?? '';\n if (expectedOutcome.length === 0) {\n throw new Error(\n `Missing expected_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 expected_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\", expected_outcome: \"Must be polite\", weight: 1.0, required: true }\n * - Object form with expected_outcome, weight, required, score_ranges, required_min_score\n *\n * Returns an LlmJudgeEvaluatorConfig to prepend to evaluators, or undefined if no valid rubrics.\n */\nexport function parseInlineRubrics(\n rawRubrics: readonly unknown[],\n): import('../types.js').LlmJudgeEvaluatorConfig | 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 expected_outcome: rubric,\n weight: 1.0,\n required: true,\n };\n }\n\n // Support both expected_outcome and description (backward compatibility)\n const expectedOutcome =\n asString(rubric.expected_outcome) ?? asString(rubric.description) ?? '';\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 expected_outcome:\n asString(range.expected_outcome) ?? asString(range.description) ?? '',\n }))\n .filter((r) => r.expected_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 // For score_ranges rubrics, expected_outcome at rubric level is optional\n if (scoreRanges && scoreRanges.length > 0) {\n return {\n ...baseRubric,\n ...(expectedOutcome.length > 0 ? { expected_outcome: expectedOutcome } : {}),\n ...(typeof rubric.required === 'boolean' ? { required: rubric.required } : {}),\n ...(typeof rubric.required_min_score === 'number'\n ? { required_min_score: rubric.required_min_score }\n : {}),\n score_ranges: scoreRanges,\n };\n }\n\n // Checklist rubric: expected_outcome is required\n return {\n ...baseRubric,\n expected_outcome: expectedOutcome,\n required: typeof rubric.required === 'boolean' ? rubric.required : true,\n ...(typeof rubric.required_min_score === 'number'\n ? { required_min_score: rubric.required_min_score }\n : {}),\n };\n })\n // Filter: must have expected_outcome OR score_ranges\n .filter(\n (r) =>\n (r.expected_outcome && r.expected_outcome.length > 0) ||\n ('score_ranges' in r && r.score_ranges),\n );\n\n if (rubricItems.length === 0) {\n return undefined;\n }\n\n return {\n name: 'rubric',\n type: 'llm_judge',\n rubrics: rubricItems,\n };\n}\n","import { readFile } from 'node:fs/promises';\n\nimport { TEMPLATE_VARIABLES, VALID_TEMPLATE_VARIABLES } from '../template-variables.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Validate custom prompt template content from a file.\n * Reads the file and checks for valid template variables.\n * Throws an error if required template variables are missing.\n */\nexport async function validateCustomPromptContent(promptPath: string): Promise<void> {\n const content = await readFile(promptPath, 'utf8');\n validateTemplateVariables(content, promptPath);\n}\n\n/**\n * Validate template variables in a custom prompt template string.\n * Exported for testing purposes.\n * @throws Error if required template variables are missing\n */\nexport function validateTemplateVariables(content: string, source: string): void {\n // Extract all template variables from content\n const variablePattern = /\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g;\n const foundVariables = new Set<string>();\n const invalidVariables: string[] = [];\n\n let match: RegExpExecArray | null = variablePattern.exec(content);\n while (match !== null) {\n const varName = match[1];\n foundVariables.add(varName);\n if (!VALID_TEMPLATE_VARIABLES.has(varName)) {\n invalidVariables.push(varName);\n }\n match = variablePattern.exec(content);\n }\n\n // Check if template contains required variables for evaluation\n const hasCandidateAnswer = foundVariables.has(TEMPLATE_VARIABLES.CANDIDATE_ANSWER);\n const hasExpectedMessages = foundVariables.has(TEMPLATE_VARIABLES.EXPECTED_MESSAGES);\n const hasRequiredFields = hasCandidateAnswer || hasExpectedMessages;\n\n // ERROR: Missing required fields - throw error to skip this evaluator/eval case\n if (!hasRequiredFields) {\n throw new Error(\n `Missing required fields. Must include at least one of:\\n - {{ ${TEMPLATE_VARIABLES.CANDIDATE_ANSWER} }}\\n - {{ ${TEMPLATE_VARIABLES.EXPECTED_MESSAGES} }}`,\n );\n }\n\n // WARNING: Invalid variables - show warning but continue\n if (invalidVariables.length > 0) {\n const warningMessage = `${ANSI_YELLOW}Warning: Custom evaluator template at ${source}\n Contains invalid variables: ${invalidVariables.map((v) => `{{ ${v} }}`).join(', ')}\n Valid variables: ${Array.from(VALID_TEMPLATE_VARIABLES)\n .map((v) => `{{ ${v} }}`)\n .join(', ')}${ANSI_RESET}`;\n\n console.warn(warningMessage);\n }\n}\n","/**\n * Template variable constants for evaluator prompts.\n * These variables can be used in custom evaluator templates with {{ variable_name }} syntax.\n */\nexport const TEMPLATE_VARIABLES = {\n CANDIDATE_ANSWER: 'candidate_answer',\n EXPECTED_MESSAGES: 'expected_messages',\n QUESTION: 'question',\n EXPECTED_OUTCOME: 'expected_outcome',\n REFERENCE_ANSWER: 'reference_answer',\n INPUT_MESSAGES: 'input_messages',\n OUTPUT_MESSAGES: 'output_messages',\n} as const;\n\n/**\n * Type representing all valid template variable names.\n */\nexport type TemplateVariable = (typeof TEMPLATE_VARIABLES)[keyof typeof TEMPLATE_VARIABLES];\n\n/**\n * Set of all valid template variable names for runtime validation.\n */\nexport const VALID_TEMPLATE_VARIABLES = new Set<string>(Object.values(TEMPLATE_VARIABLES));\n\n/**\n * Template variables that are required for meaningful evaluation.\n * At least one of these should be present in a custom evaluator template.\n */\nexport const REQUIRED_TEMPLATE_VARIABLES = new Set<string>([\n TEMPLATE_VARIABLES.CANDIDATE_ANSWER,\n TEMPLATE_VARIABLES.EXPECTED_MESSAGES,\n]);\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\nimport { parse as parseYaml } from 'yaml';\n\nimport type { EvalCase, JsonObject, JsonValue, TestMessage } from '../types.js';\nimport { isJsonObject, isTestMessage } from '../types.js';\nimport { loadConfig } from './config-loader.js';\nimport { coerceEvaluator, parseEvaluators, parseInlineRubrics } from './evaluator-parser.js';\nimport { buildSearchRoots, fileExists, resolveToAbsolutePath } from './file-resolver.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 eval cases by ID pattern (glob supported, e.g., \"summary-*\") */\n readonly filter?: string;\n};\n\n/**\n * Sidecar metadata structure for JSONL datasets.\n */\ntype SidecarMetadata = {\n readonly description?: string;\n readonly dataset?: string;\n readonly execution?: JsonObject;\n readonly evaluator?: JsonValue;\n};\n\n/**\n * Raw eval case from JSONL line.\n */\ntype RawJsonlEvalCase = JsonObject & {\n readonly id?: JsonValue;\n readonly conversation_id?: JsonValue;\n readonly outcome?: JsonValue;\n readonly expected_outcome?: JsonValue;\n readonly input_messages?: JsonValue;\n readonly expected_messages?: JsonValue;\n // Aliases for input_messages/expected_messages\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(filePath: string): 'yaml' | 'jsonl' {\n const ext = path.extname(filePath).toLowerCase();\n if (ext === '.jsonl') return 'jsonl';\n if (ext === '.yaml' || ext === '.yml') return 'yaml';\n throw new Error(`Unsupported file format: '${ext}'. Supported formats: .yaml, .yml, .jsonl`);\n}\n\n/**\n * Load sidecar YAML metadata file for a JSONL dataset.\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 = parseYaml(content) 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 dataset: asString(parsed.dataset),\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 parsed = JSON.parse(line) as unknown;\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 eval cases from a JSONL file with optional sidecar YAML metadata.\n */\nexport async function loadEvalCasesFromJsonl(\n evalFilePath: string,\n repoRoot: URL | string,\n options?: LoadOptions,\n): Promise<readonly EvalCase[]> {\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 const guidelinePatterns = config?.guideline_patterns;\n\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 dataset name: sidecar > filename\n const fallbackDataset = path.basename(absoluteTestPath, '.jsonl') || 'eval';\n const datasetName =\n sidecar.dataset && sidecar.dataset.trim().length > 0 ? sidecar.dataset : fallbackDataset;\n\n // Global defaults from sidecar\n const globalEvaluator = coerceEvaluator(sidecar.evaluator, 'sidecar') ?? 'llm_judge';\n const globalExecution = sidecar.execution;\n\n if (verbose) {\n console.log(`\\n[JSONL Dataset: ${evalFilePath}]`);\n console.log(` Cases: ${rawCases.length}`);\n console.log(` Dataset name: ${datasetName}`);\n if (sidecar.description) {\n console.log(` Description: ${sidecar.description}`);\n }\n }\n\n const results: EvalCase[] = [];\n\n for (let lineIndex = 0; lineIndex < rawCases.length; lineIndex++) {\n const evalcase = rawCases[lineIndex];\n const lineNumber = lineIndex + 1; // 1-based for user-facing messages\n const id = asString(evalcase.id);\n\n // Skip eval cases that don't match the filter pattern (glob supported)\n if (filterPattern && (!id || !micromatch.isMatch(id, filterPattern))) {\n continue;\n }\n\n const conversationId = asString(evalcase.conversation_id);\n // Support both expected_outcome and outcome (backward compatibility)\n const outcome = asString(evalcase.expected_outcome) ?? asString(evalcase.outcome);\n\n // Resolve input_messages with alias/shorthand support (canonical takes precedence)\n const inputMessages = resolveInputMessages(evalcase);\n // Resolve expected_messages with alias/shorthand support (canonical takes precedence)\n const expectedMessages = resolveExpectedMessages(evalcase) ?? [];\n\n if (!id || !outcome || !inputMessages || inputMessages.length === 0) {\n logError(\n `Skipping incomplete eval case at line ${lineNumber}: ${id ?? 'unknown'}. Missing required fields: id, expected_outcome, and/or input_messages (or input)`,\n );\n continue;\n }\n\n // expected_messages is optional - for outcome-only evaluation\n const hasExpectedMessages = expectedMessages.length > 0;\n\n const guidelinePaths: string[] = [];\n const inputTextParts: string[] = [];\n\n // Process all input messages to extract files and guidelines\n const inputSegments = await processMessages({\n messages: inputMessages,\n searchRoots,\n repoRootPath,\n guidelinePatterns,\n guidelinePaths,\n textParts: inputTextParts,\n messageType: 'input',\n verbose,\n });\n\n // Process expected_messages into segments (only if provided)\n // Preserve full message structure including role and tool_calls for expected_messages 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_messages (similar to candidate_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(evalcase.execution) ? evalcase.execution : undefined;\n const mergedExecution = caseExecution ?? globalExecution;\n\n const evalCaseEvaluatorKind = coerceEvaluator(evalcase.evaluator, id) ?? globalEvaluator;\n let evaluators: Awaited<ReturnType<typeof parseEvaluators>>;\n try {\n evaluators = await parseEvaluators(evalcase, mergedExecution, searchRoots, id ?? 'unknown');\n } catch (error) {\n // Skip entire eval case if evaluator validation fails\n const message = error instanceof Error ? error.message : String(error);\n logError(`Skipping eval case '${id}' at line ${lineNumber}: ${message}`);\n continue;\n }\n\n // Handle inline rubrics field (syntactic sugar)\n const inlineRubrics = evalcase.rubrics;\n if (inlineRubrics !== undefined && Array.isArray(inlineRubrics)) {\n const rubricEvaluator = parseInlineRubrics(inlineRubrics);\n if (rubricEvaluator) {\n // Prepend rubric evaluator to existing evaluators\n evaluators = evaluators ? [rubricEvaluator, ...evaluators] : [rubricEvaluator];\n }\n }\n\n // Extract file paths from all input segments (non-guideline files)\n const userFilePaths: string[] = [];\n for (const segment of inputSegments) {\n if (segment.type === 'file' && typeof segment.resolvedPath === 'string') {\n userFilePaths.push(segment.resolvedPath);\n }\n }\n\n // Combine all file paths (guidelines + regular files)\n const allFilePaths = [\n ...guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\n ...userFilePaths,\n ];\n\n const testCase: EvalCase = {\n id,\n dataset: datasetName,\n conversation_id: conversationId,\n question: question,\n input_messages: inputMessages,\n input_segments: inputSegments,\n expected_messages: outputSegments,\n reference_answer: referenceAnswer,\n guideline_paths: guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\n guideline_patterns: guidelinePatterns,\n file_paths: allFilePaths,\n expected_outcome: outcome,\n evaluator: evalCaseEvaluatorKind,\n evaluators,\n };\n\n if (verbose) {\n console.log(`\\n[Eval Case: ${id}]`);\n if (testCase.guideline_paths.length > 0) {\n console.log(` Guidelines used: ${testCase.guideline_paths.length}`);\n for (const guidelinePath of testCase.guideline_paths) {\n console.log(` - ${guidelinePath}`);\n }\n } else {\n console.log(' No guidelines found');\n }\n }\n\n results.push(testCase);\n }\n\n return results;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\nfunction logError(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.error(`${ANSI_RED}Error: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.error(`${ANSI_RED}Error: ${message}${ANSI_RESET}`);\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { formatFileContents } from '../formatting/segment-formatter.js';\nimport type { JsonObject, TestMessage } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport { isGuidelineFile } from './config-loader.js';\nimport { resolveFileReference } from './file-resolver.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\ntype ProcessMessagesOptions = {\n readonly messages: readonly TestMessage[];\n readonly searchRoots: readonly string[];\n readonly repoRootPath: string;\n readonly guidelinePatterns?: readonly string[];\n readonly guidelinePaths?: string[];\n readonly textParts?: string[];\n readonly messageType: 'input' | 'output';\n readonly verbose: boolean;\n};\n\n/**\n * Process message content into structured segments with file resolution.\n */\nexport async function processMessages(options: ProcessMessagesOptions): Promise<JsonObject[]> {\n const {\n messages,\n searchRoots,\n repoRootPath,\n guidelinePatterns,\n guidelinePaths,\n textParts,\n messageType,\n verbose,\n } = options;\n\n const segments: JsonObject[] = [];\n\n for (const message of messages) {\n const content = message.content;\n if (typeof content === 'string') {\n segments.push({ type: 'text', value: content });\n if (textParts) {\n textParts.push(content);\n }\n continue;\n }\n\n // 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_messages.\n if (isJsonObject(content)) {\n const rendered = JSON.stringify(content, null, 2);\n segments.push({ type: 'text', value: rendered });\n if (textParts) {\n textParts.push(rendered);\n }\n continue;\n }\n\n if (!Array.isArray(content)) {\n continue;\n }\n\n for (const rawSegment of content) {\n if (!isJsonObject(rawSegment)) {\n continue;\n }\n\n const segmentType = asString(rawSegment.type);\n if (segmentType === 'file') {\n const rawValue = asString(rawSegment.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n const context = messageType === 'input' ? '' : ' in expected_messages';\n logWarning(`File not found${context}: ${displayPath}`, attempts);\n continue;\n }\n\n try {\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n');\n\n // Only check for guidelines in input messages\n if (messageType === 'input' && guidelinePatterns && guidelinePaths) {\n const relativeToRepo = path.relative(repoRootPath, resolvedPath);\n\n if (isGuidelineFile(relativeToRepo, guidelinePatterns)) {\n guidelinePaths.push(path.resolve(resolvedPath));\n if (verbose) {\n console.log(` [Guideline] Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n continue;\n }\n }\n\n segments.push({\n type: 'file',\n path: displayPath,\n text: fileContent,\n resolvedPath: path.resolve(resolvedPath),\n });\n\n if (verbose) {\n const label = messageType === 'input' ? '[File]' : '[Expected Output File]';\n console.log(` ${label} Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n } catch (error) {\n const context = messageType === 'input' ? '' : ' expected output';\n logWarning(`Could not read${context} file ${resolvedPath}: ${(error as Error).message}`);\n }\n continue;\n }\n\n const clonedSegment = cloneJsonObject(rawSegment);\n segments.push(clonedSegment);\n const inlineValue = clonedSegment.value;\n if (typeof inlineValue === 'string' && textParts) {\n textParts.push(inlineValue);\n }\n }\n }\n\n return segments;\n}\n\n/**\n * Resolve assistant content including file references.\n * Similar to input message processing, but for expected assistant responses.\n */\nexport async function resolveAssistantContent(\n content: TestMessage['content'] | undefined,\n searchRoots: readonly string[],\n verbose: boolean,\n): Promise<string> {\n if (typeof content === 'string') {\n return content;\n }\n if (!content) {\n return '';\n }\n // 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_messages: ${displayPath}`, attempts);\n continue;\n }\n\n try {\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n').trim();\n parts.push({ content: fileContent, isFile: true, displayPath });\n if (verbose) {\n console.log(` [Expected Assistant File] Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n } catch (error) {\n logWarning(`Could not read file ${resolvedPath}: ${(error as Error).message}`);\n }\n continue;\n }\n\n // Handle text segments\n const textValue = asString(entry.text);\n if (typeof textValue === 'string') {\n parts.push({ content: textValue, isFile: false });\n continue;\n }\n\n const valueValue = asString(entry.value);\n if (typeof valueValue === 'string') {\n parts.push({ content: valueValue, isFile: false });\n continue;\n }\n\n parts.push({ content: JSON.stringify(entry), isFile: false });\n }\n\n return formatFileContents(parts);\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction cloneJsonObject(source: JsonObject): JsonObject {\n const entries = Object.entries(source).map(([key, value]) => [key, cloneJsonValue(value)]);\n return Object.fromEntries(entries) as JsonObject;\n}\n\nfunction cloneJsonValue(value: unknown): unknown {\n if (value === null) {\n return null;\n }\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneJsonValue(item));\n }\n if (typeof value === 'object') {\n return cloneJsonObject(value as JsonObject);\n }\n return value;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\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_messages 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_messages 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 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_messages: ${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 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 === 'guideline_ref') {\n const refPath = asString(segment.path);\n return refPath ? `<Attached: ${refPath}>` : undefined;\n }\n\n if (type === 'file') {\n const filePath = asString(segment.path);\n if (!filePath) {\n return undefined;\n }\n\n // Agent mode: return file reference only\n if (mode === 'agent') {\n return `<file: path=\"${filePath}\">`;\n }\n\n // LM mode: return embedded content with XML tags\n const text = asString(segment.text);\n if (text && filePath) {\n // Use formatFileContents for consistent XML formatting\n return formatFileContents([{ content: text.trim(), isFile: true, displayPath: filePath }]);\n }\n }\n\n return undefined;\n}\n\n/**\n * Check if processed segments contain visible content (text or file attachments).\n */\nexport function hasVisibleContent(segments: readonly JsonObject[]): boolean {\n return segments.some((segment) => {\n const type = asString(segment.type);\n\n if (type === 'text') {\n const value = asString(segment.value);\n return value !== undefined && value.trim().length > 0;\n }\n\n if (type === 'guideline_ref') {\n return false;\n }\n\n if (type === 'file') {\n const text = asString(segment.text);\n return text !== undefined && text.trim().length > 0;\n }\n\n return false;\n });\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","/**\n * Shorthand expansion utilities for input/expected_output aliases.\n *\n * Supports:\n * - `input` as alias for `input_messages` with string shorthand\n * - `expected_output` as alias for `expected_messages` with string/object shorthand\n */\n\nimport type { JsonObject, JsonValue, TestMessage } from '../types.js';\nimport { isJsonObject, isTestMessage } from '../types.js';\n\n/**\n * Expand the `input` shorthand/alias into the canonical `input_messages` format.\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/alias into canonical `expected_messages` format.\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 * Resolve input_messages from raw eval case data, supporting the `input` alias.\n *\n * Precedence: input_messages (canonical) > input (alias)\n *\n * @param raw Raw eval case object from YAML/JSONL\n * @returns Resolved input messages array or undefined if none found\n */\nexport function resolveInputMessages(raw: JsonObject): TestMessage[] | undefined {\n // Canonical name takes precedence\n if (raw.input_messages !== undefined) {\n if (Array.isArray(raw.input_messages)) {\n const messages = raw.input_messages.filter((msg): msg is TestMessage => isTestMessage(msg));\n return messages.length > 0 ? messages : undefined;\n }\n return undefined;\n }\n\n // Fall back to alias with shorthand expansion\n return expandInputShorthand(raw.input);\n}\n\n/**\n * Resolve expected_messages from raw eval case data, supporting the `expected_output` alias.\n *\n * Precedence: expected_messages (canonical) > expected_output (alias)\n *\n * @param raw Raw eval case object from YAML/JSONL\n * @returns Resolved expected messages array or undefined if none found\n */\nexport function resolveExpectedMessages(raw: JsonObject): TestMessage[] | undefined {\n // Canonical name takes precedence\n if (raw.expected_messages !== undefined) {\n if (Array.isArray(raw.expected_messages)) {\n const messages = raw.expected_messages.filter((msg): msg is TestMessage =>\n isTestMessage(msg),\n );\n return messages.length > 0 ? messages : undefined;\n }\n return undefined;\n }\n\n // Fall back to alias with shorthand expansion\n return expandExpectedOutputShorthand(raw.expected_output);\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { isGuidelineFile } from '../loaders/config-loader.js';\nimport { fileExists } from '../loaders/file-resolver.js';\nimport type { ChatMessageRole, ChatPrompt } from '../providers/types.js';\nimport type { EvalCase, JsonObject, TestMessage } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport {\n type FormattingMode,\n formatFileContents,\n formatSegment,\n hasVisibleContent,\n} from './segment-formatter.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Build prompt inputs by consolidating user request context and guideline content.\n */\nexport interface PromptInputs {\n readonly question: string;\n readonly guidelines: string;\n readonly chatPrompt?: ChatPrompt;\n readonly systemMessage?: string;\n}\n\n/**\n * Build prompt inputs by consolidating user request context and guideline content.\n *\n * @param testCase - The evaluation test case\n * @param mode - Formatting mode: 'agent' for file references, 'lm' for embedded content (default: 'lm')\n */\nexport async function buildPromptInputs(\n testCase: EvalCase,\n mode: FormattingMode = 'lm',\n): Promise<PromptInputs> {\n const guidelineParts: Array<{ content: string; isFile: boolean; displayPath?: string }> = [];\n for (const rawPath of testCase.guideline_paths) {\n const absolutePath = path.resolve(rawPath);\n if (!(await fileExists(absolutePath))) {\n logWarning(`Could not read guideline file ${absolutePath}: file does not exist`);\n continue;\n }\n\n try {\n const content = (await readFile(absolutePath, 'utf8')).replace(/\\r\\n/g, '\\n').trim();\n guidelineParts.push({\n content,\n isFile: true,\n displayPath: path.basename(absolutePath),\n });\n } catch (error) {\n logWarning(`Could not read guideline file ${absolutePath}: ${(error as Error).message}`);\n }\n }\n\n const guidelines = formatFileContents(guidelineParts);\n\n // Build segments per message to determine if role markers are needed\n const segmentsByMessage: JsonObject[][] = [];\n const fileContentsByPath = new Map<string, string>();\n for (const segment of testCase.input_segments) {\n if (\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n typeof segment.text === 'string'\n ) {\n fileContentsByPath.set(segment.path, segment.text);\n }\n }\n\n for (const message of testCase.input_messages) {\n const messageSegments: JsonObject[] = [];\n\n if (typeof message.content === 'string') {\n if (message.content.trim().length > 0) {\n messageSegments.push({ type: 'text', value: message.content });\n }\n } else if (Array.isArray(message.content)) {\n for (const segment of message.content) {\n if (typeof segment === 'string') {\n if (segment.trim().length > 0) {\n messageSegments.push({ type: 'text', value: segment });\n }\n } else if (isJsonObject(segment)) {\n const type = asString(segment.type);\n\n if (type === 'file') {\n const value = asString(segment.value);\n if (!value) continue;\n\n // Check if this is a guideline file (extracted separately)\n if (\n testCase.guideline_patterns &&\n isGuidelineFile(value, testCase.guideline_patterns)\n ) {\n // Reference marker only - actual content is in guidelines field\n messageSegments.push({ type: 'guideline_ref', path: value });\n continue;\n }\n\n // Find the file content from input_segments\n const fileText = fileContentsByPath.get(value);\n\n if (fileText !== undefined) {\n messageSegments.push({ type: 'file', text: fileText, path: value });\n }\n } else if (type === 'text') {\n const textValue = asString(segment.value);\n if (textValue && textValue.trim().length > 0) {\n messageSegments.push({ type: 'text', value: textValue });\n }\n }\n }\n }\n } else if (isJsonObject(message.content)) {\n const rendered = JSON.stringify(message.content, null, 2);\n if (rendered.trim().length > 0) {\n messageSegments.push({ type: 'text', value: rendered });\n }\n }\n\n segmentsByMessage.push(messageSegments);\n }\n\n // Determine if we need role markers based on actual processed content\n const useRoleMarkers = needsRoleMarkers(testCase.input_messages, segmentsByMessage);\n\n let question: string;\n\n if (useRoleMarkers) {\n // Multi-turn format with role markers using pre-computed segments\n const messageParts: string[] = [];\n\n for (let i = 0; i < testCase.input_messages.length; i++) {\n const message = testCase.input_messages[i];\n const segments = segmentsByMessage[i];\n\n if (!hasVisibleContent(segments)) {\n continue;\n }\n\n const roleLabel = message.role.charAt(0).toUpperCase() + message.role.slice(1);\n const contentParts: string[] = [];\n\n for (const segment of segments) {\n const formattedContent = formatSegment(segment, mode);\n if (formattedContent) {\n contentParts.push(formattedContent);\n }\n }\n\n if (contentParts.length > 0) {\n const messageContent = contentParts.join('\\n');\n messageParts.push(`@[${roleLabel}]:\\n${messageContent}`);\n }\n }\n\n question = messageParts.join('\\n\\n');\n } else {\n // Single-turn flat format\n const questionParts: string[] = [];\n for (const segment of testCase.input_segments) {\n // Skip guideline files - they're in the guidelines field\n if (\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n testCase.guideline_patterns &&\n isGuidelineFile(segment.path, testCase.guideline_patterns)\n ) {\n // Add reference marker for guideline files\n questionParts.push(`<Attached: ${segment.path}>`);\n continue;\n }\n\n const formattedContent = formatSegment(segment, mode);\n if (formattedContent) {\n questionParts.push(formattedContent);\n }\n }\n\n question = questionParts\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .join('\\n\\n');\n }\n\n const chatPrompt = useRoleMarkers\n ? buildChatPromptFromSegments({\n messages: testCase.input_messages,\n segmentsByMessage,\n guidelinePatterns: testCase.guideline_patterns,\n guidelineContent: guidelines,\n mode,\n })\n : undefined;\n\n // 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, guidelines, chatPrompt };\n}\n\n/**\n * Detect if role markers are needed based on conversational structure.\n *\n * Role markers ([System]:, [User]:, etc.) are added when:\n * 1. There are assistant/tool messages (true multi-turn conversation), OR\n * 2. There are multiple messages that will produce visible content in the formatted output\n */\nfunction needsRoleMarkers(\n messages: readonly TestMessage[],\n processedSegmentsByMessage: readonly (readonly JsonObject[])[],\n): boolean {\n // Check for multi-turn conversation (assistant/tool messages)\n if (messages.some((msg) => msg.role === 'assistant' || msg.role === 'tool')) {\n return true;\n }\n\n // Count how many messages have actual content after processing\n let messagesWithContent = 0;\n\n for (const segments of processedSegmentsByMessage) {\n if (hasVisibleContent(segments)) {\n messagesWithContent++;\n }\n }\n\n return messagesWithContent > 1;\n}\n\nfunction buildChatPromptFromSegments(options: {\n readonly messages: readonly TestMessage[];\n readonly segmentsByMessage: readonly JsonObject[][];\n readonly guidelinePatterns?: readonly string[];\n readonly guidelineContent?: string;\n readonly systemPrompt?: string;\n readonly mode?: FormattingMode;\n}): ChatPrompt | undefined {\n const {\n messages,\n segmentsByMessage,\n guidelinePatterns,\n guidelineContent,\n systemPrompt,\n mode = 'lm',\n } = options;\n\n if (messages.length === 0) {\n return undefined;\n }\n\n const systemSegments: string[] = [];\n\n if (systemPrompt && systemPrompt.trim().length > 0) {\n systemSegments.push(systemPrompt.trim());\n }\n\n if (guidelineContent && guidelineContent.trim().length > 0) {\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${guidelineContent.trim()}`);\n }\n\n let startIndex = 0;\n while (startIndex < messages.length && messages[startIndex].role === 'system') {\n const segments = segmentsByMessage[startIndex];\n const contentParts: string[] = [];\n\n for (const segment of segments) {\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length > 0) {\n systemSegments.push(contentParts.join('\\n'));\n }\n\n startIndex += 1;\n }\n\n const chatPrompt: Array<ChatPrompt[number]> = [];\n\n if (systemSegments.length > 0) {\n chatPrompt.push({\n role: 'system',\n content: systemSegments.join('\\n\\n'),\n });\n }\n\n for (let i = startIndex; i < messages.length; i++) {\n const message = messages[i];\n const segments = segmentsByMessage[i];\n const contentParts: string[] = [];\n\n let role: ChatMessageRole = message.role as ChatMessageRole;\n\n if (role === 'system') {\n role = 'assistant';\n contentParts.push('@[System]:');\n } else if (role === 'tool') {\n role = 'assistant';\n contentParts.push('@[Tool]:');\n }\n\n for (const segment of segments) {\n if (segment.type === 'guideline_ref') {\n continue;\n }\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n const isGuidelineRef =\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n guidelinePatterns &&\n isGuidelineFile(segment.path, guidelinePatterns);\n\n if (isGuidelineRef) {\n continue;\n }\n\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length === 0) {\n continue;\n }\n\n const content = contentParts.join('\\n');\n\n chatPrompt.push({\n role,\n content,\n });\n }\n\n return chatPrompt.length > 0 ? (chatPrompt as ChatPrompt) : undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction logWarning(message: string): void {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { type AzureOpenAIProviderSettings, createAzure } from '@ai-sdk/azure';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { type LanguageModel, type ModelMessage, generateText } from 'ai';\n\nimport type { JsonObject } from '../types.js';\nimport type {\n AnthropicResolvedConfig,\n AzureResolvedConfig,\n GeminiResolvedConfig,\n RetryConfig,\n} from './targets.js';\nimport type { ChatPrompt, Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst DEFAULT_SYSTEM_PROMPT =\n 'You are a careful assistant. Follow all provided instructions and do not fabricate results.';\n\ntype TextResult = Awaited<ReturnType<typeof generateText>>;\ntype GenerateTextOptions = Parameters<typeof generateText>[0];\n\ninterface ProviderDefaults {\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly thinkingBudget?: number;\n}\n\nexport class AzureProvider implements Provider {\n readonly id: string;\n readonly kind = 'azure' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: AzureResolvedConfig,\n ) {\n this.id = `azure:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n\n const azure = createAzure(buildAzureOptions(config));\n this.model = azure(config.deploymentName);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nexport class AnthropicProvider implements Provider {\n readonly id: string;\n readonly kind = 'anthropic' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: AnthropicResolvedConfig,\n ) {\n this.id = `anthropic:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n thinkingBudget: config.thinkingBudget,\n };\n this.retryConfig = config.retry;\n\n const anthropic = createAnthropic({\n apiKey: config.apiKey,\n });\n this.model = anthropic(config.model);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n const providerOptions = buildAnthropicProviderOptions(this.defaults);\n\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n providerOptions,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nexport class GeminiProvider implements Provider {\n readonly id: string;\n readonly kind = 'gemini' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: GeminiResolvedConfig,\n ) {\n this.id = `gemini:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n\n const google = createGoogleGenerativeAI({\n apiKey: config.apiKey,\n });\n this.model = google(config.model);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nfunction buildAzureOptions(config: AzureResolvedConfig): AzureOpenAIProviderSettings {\n const options: AzureOpenAIProviderSettings = {\n apiKey: config.apiKey,\n apiVersion: config.version,\n useDeploymentBasedUrls: true,\n };\n\n const baseURL = normalizeAzureBaseUrl(config.resourceName);\n if (baseURL) {\n options.baseURL = baseURL;\n } else {\n options.resourceName = config.resourceName;\n }\n\n return options;\n}\n\nfunction normalizeAzureBaseUrl(resourceName: string): string | undefined {\n const trimmed = resourceName.trim();\n if (!/^https?:\\/\\//i.test(trimmed)) {\n return undefined;\n }\n\n const withoutSlash = trimmed.replace(/\\/+$/, '');\n const normalized = withoutSlash.endsWith('/openai') ? withoutSlash : `${withoutSlash}/openai`;\n return normalized;\n}\n\nfunction buildAnthropicProviderOptions(\n defaults: ProviderDefaults,\n): GenerateTextOptions['providerOptions'] | undefined {\n if (defaults.thinkingBudget === undefined) {\n return undefined;\n }\n\n return {\n anthropic: {\n thinking: {\n type: 'enabled',\n budgetTokens: defaults.thinkingBudget,\n },\n },\n };\n}\n\n// When chatPrompt is provided, guidelines are intentionally excluded (includeGuidelines: false)\n// because they've already been merged into the system message during prompt building.\nfunction buildChatPrompt(request: ProviderRequest): ChatPrompt {\n const provided = request.chatPrompt?.length ? request.chatPrompt : undefined;\n if (provided) {\n const hasSystemMessage = provided.some((message) => message.role === 'system');\n if (hasSystemMessage) {\n return provided;\n }\n\n const systemContent = resolveSystemContent(request, false);\n return [{ role: 'system', content: systemContent }, ...provided];\n }\n\n const systemContent = resolveSystemContent(request, true);\n const userContent = request.question.trim();\n\n const prompt: ChatPrompt = [\n { role: 'system', content: systemContent },\n { role: 'user', content: userContent },\n ];\n\n return prompt;\n}\n\nfunction resolveSystemContent(request: ProviderRequest, includeGuidelines: boolean): string {\n const systemSegments: string[] = [];\n\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\n systemSegments.push(request.systemPrompt.trim());\n } else {\n systemSegments.push(DEFAULT_SYSTEM_PROMPT);\n }\n\n if (includeGuidelines && request.guidelines && request.guidelines.trim().length > 0) {\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${request.guidelines.trim()}`);\n }\n\n return systemSegments.join('\\n\\n');\n}\n\nfunction toModelMessages(chatPrompt: ChatPrompt): ModelMessage[] {\n return chatPrompt.map((message) => {\n if (message.role === 'tool' || message.role === 'function') {\n const prefix = message.name ? `@[${message.name}]: ` : '@[Tool]: ';\n return {\n role: 'assistant',\n content: `${prefix}${message.content}`,\n } satisfies ModelMessage;\n }\n\n if (message.role === 'assistant' || message.role === 'system' || message.role === 'user') {\n return {\n role: message.role,\n content: message.content,\n } satisfies ModelMessage;\n }\n\n return {\n role: 'user',\n content: message.content,\n } satisfies ModelMessage;\n });\n}\n\nfunction resolveModelSettings(\n request: ProviderRequest,\n defaults: ProviderDefaults,\n): { temperature?: number; maxOutputTokens?: number } {\n const temperature = request.temperature ?? defaults.temperature;\n const maxOutputTokens = request.maxOutputTokens ?? defaults.maxOutputTokens;\n return {\n temperature,\n maxOutputTokens,\n };\n}\n\nasync function invokeModel(options: {\n readonly model: LanguageModel;\n readonly request: ProviderRequest;\n readonly defaults: ProviderDefaults;\n readonly retryConfig?: RetryConfig;\n readonly providerOptions?: GenerateTextOptions['providerOptions'];\n}): Promise<ProviderResponse> {\n const { model, request, defaults, retryConfig, providerOptions } = options;\n const chatPrompt = buildChatPrompt(request);\n const { temperature, maxOutputTokens } = resolveModelSettings(request, defaults);\n\n const result = await withRetry(\n () =>\n generateText({\n model,\n messages: toModelMessages(chatPrompt),\n temperature,\n maxOutputTokens,\n maxRetries: 0,\n abortSignal: request.signal,\n ...(providerOptions ? { providerOptions } : {}),\n }),\n retryConfig,\n request.signal,\n );\n\n return mapResponse(result);\n}\n\nfunction mapResponse(result: TextResult): ProviderResponse {\n const content = result.text ?? '';\n return {\n raw: result,\n usage: toJsonObject(result.totalUsage ?? result.usage),\n outputMessages: [{ role: 'assistant' as const, content }],\n };\n}\n\nfunction toJsonObject(value: unknown): JsonObject | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n try {\n return JSON.parse(JSON.stringify(value)) as JsonObject;\n } catch {\n return undefined;\n }\n}\n\nfunction extractStatus(error: unknown): number | undefined {\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n\n const candidate = error as Record<string, unknown>;\n const directStatus = candidate.status ?? candidate.statusCode;\n if (typeof directStatus === 'number' && Number.isFinite(directStatus)) {\n return directStatus;\n }\n\n const responseStatus =\n typeof candidate.response === 'object' && candidate.response\n ? (candidate.response as { status?: unknown }).status\n : undefined;\n if (typeof responseStatus === 'number' && Number.isFinite(responseStatus)) {\n return responseStatus;\n }\n\n const message = typeof candidate.message === 'string' ? candidate.message : undefined;\n if (message) {\n const match = message.match(/HTTP\\s+(\\d{3})/i);\n if (match) {\n const parsed = Number.parseInt(match[1], 10);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n\n return undefined;\n}\n\nfunction isNetworkError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const candidate = error as Record<string, unknown>;\n if (candidate.name === 'AbortError') {\n return false;\n }\n\n const code = candidate.code;\n if (typeof code === 'string' && /^E(AI|CONN|HOST|NET|PIPE|TIME|REFUSED|RESET)/i.test(code)) {\n return true;\n }\n\n const message = typeof candidate.message === 'string' ? candidate.message : undefined;\n if (\n message &&\n /(network|fetch failed|ECONNRESET|ENOTFOUND|EAI_AGAIN|ETIMEDOUT|ECONNREFUSED)/i.test(message)\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction isRetryableError(error: unknown, retryableStatusCodes: readonly number[]): boolean {\n const status = extractStatus(error);\n if (status === 401 || status === 403) {\n return false;\n }\n if (typeof status === 'number') {\n return retryableStatusCodes.includes(status);\n }\n\n return isNetworkError(error);\n}\n\nfunction calculateRetryDelay(attempt: number, config: Required<RetryConfig>): number {\n const delay = Math.min(\n config.maxDelayMs,\n config.initialDelayMs * config.backoffFactor ** attempt,\n );\n return delay * (0.75 + Math.random() * 0.5);\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function withRetry<T>(\n fn: () => Promise<T>,\n retryConfig?: RetryConfig,\n signal?: AbortSignal,\n): Promise<T> {\n const config: Required<RetryConfig> = {\n maxRetries: retryConfig?.maxRetries ?? 3,\n initialDelayMs: retryConfig?.initialDelayMs ?? 1000,\n maxDelayMs: retryConfig?.maxDelayMs ?? 60000,\n backoffFactor: retryConfig?.backoffFactor ?? 2,\n retryableStatusCodes: retryConfig?.retryableStatusCodes ?? [500, 408, 429, 502, 503, 504],\n };\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n if (signal?.aborted) {\n throw new Error(`Request aborted: ${signal.reason ?? 'Unknown reason'}`);\n }\n\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt >= config.maxRetries) {\n break;\n }\n\n if (!isRetryableError(error, config.retryableStatusCodes)) {\n throw error;\n }\n\n const delay = calculateRetryDelay(attempt, config);\n await sleep(delay);\n }\n }\n\n throw lastError;\n}\n","import { spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { createWriteStream } 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 type { JsonObject } from '../types.js';\nimport { recordClaudeCodeLogEntry } from './claude-code-log-tracker.js';\nimport { normalizeInputFiles } from './preread.js';\nimport type { ClaudeCodeResolvedConfig } from './targets.js';\nimport type {\n OutputMessage,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n} from './types.js';\n\nconst WORKSPACE_PREFIX = 'agentv-claude-code-';\nconst PROMPT_FILENAME = 'prompt.md';\n\n/**\n * Default system prompt for Claude Code CLI evaluations.\n * Ensures the agent returns code in its response rather than just writing files.\n */\nconst DEFAULT_SYSTEM_PROMPT = `**IMPORTANT**: Follow these instructions for your response:\n- Do NOT create any additional output files in the workspace.\n- All intended file outputs/changes MUST be written in your response.\n- For each intended file, include the relative path and unified git diff following the convention \\`diff --git ...\\`.\nThis is required for evaluation scoring.`;\n\ninterface ClaudeCodeRunOptions {\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 ClaudeCodeRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n readonly timedOut?: boolean;\n}\n\ntype ClaudeCodeRunner = (options: ClaudeCodeRunOptions) => Promise<ClaudeCodeRunResult>;\n\nexport class ClaudeCodeProvider implements Provider {\n readonly id: string;\n readonly kind = 'claude-code' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: ClaudeCodeResolvedConfig;\n private readonly runClaudeCode: ClaudeCodeRunner;\n\n constructor(\n targetName: string,\n config: ClaudeCodeResolvedConfig,\n runner: ClaudeCodeRunner = defaultClaudeCodeRunner,\n ) {\n this.id = `claude-code:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n this.runClaudeCode = runner;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Claude Code request was aborted before execution');\n }\n\n const inputFiles = normalizeInputFiles(request.inputFiles);\n\n const workspaceRoot = await this.createWorkspace();\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n try {\n // Save prompt to file for debugging/logging\n const promptFile = path.join(workspaceRoot, PROMPT_FILENAME);\n await writeFile(promptFile, request.question, 'utf8');\n\n const args = this.buildClaudeCodeArgs(request.question, inputFiles);\n const cwd = this.resolveCwd();\n\n const result = await this.executeClaudeCode(args, cwd, request.signal, logger);\n\n if (result.timedOut) {\n throw new Error(\n `Claude Code 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 = `Claude Code CLI exited with code ${result.exitCode}`;\n\n // Check for nested Claude Code session auth failure\n // When running AgentV inside a Claude Code session, the nested\n // claude process detects nesting and requires API key authentication\n if (isNestedClaudeCodeAuthError(result.stdout)) {\n throw new Error(\n `${prefix}: Claude Code detected a nested session and requires API key authentication. Set ANTHROPIC_API_KEY environment variable or run AgentV outside of a Claude Code session.`,\n );\n }\n\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\n }\n\n const parsed = parseClaudeCodeJsonl(result.stdout);\n const outputMessages = extractOutputMessages(parsed);\n const usage = extractUsage(parsed);\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,\n inputFiles,\n logFile: logger?.filePath,\n },\n outputMessages,\n usage,\n };\n } finally {\n await logger?.close();\n await this.cleanupWorkspace(workspaceRoot);\n }\n }\n\n private resolveCwd(): string {\n if (!this.config.cwd) {\n // Default to process.cwd() to preserve Claude Code OAuth/local credentials\n // Claude Code stores credentials per-project, so running from a temp dir breaks auth\n return process.cwd();\n }\n return path.resolve(this.config.cwd);\n }\n\n private buildClaudeCodeArgs(prompt: string, inputFiles: readonly string[] | undefined): string[] {\n const args: string[] = [];\n\n // Output mode - always use stream-json for structured output\n args.push('--output-format', 'stream-json');\n\n // Verbose mode for detailed output\n args.push('--verbose');\n\n // Non-interactive mode with prompt flag\n args.push('-p');\n\n // Model configuration\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n\n // Custom args\n if (this.config.args && this.config.args.length > 0) {\n args.push(...this.config.args);\n }\n\n // Prepend system prompt (use default if not configured)\n const systemPrompt = this.config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n const fullPrompt = `${systemPrompt}\\n\\n${prompt}`;\n\n // Add input files as context if present\n let finalPrompt = fullPrompt;\n if (inputFiles && inputFiles.length > 0) {\n const filesContext = inputFiles.map((f) => `[File: ${f}]`).join('\\n');\n finalPrompt = `${fullPrompt}\\n\\n## Input Files\\n${filesContext}`;\n }\n\n // Prompt is passed as the final argument\n args.push(finalPrompt);\n\n return args;\n }\n\n private buildEnv(): NodeJS.ProcessEnv {\n const env = { ...process.env };\n // Remove Claude Code nesting detection env vars to allow proper auth\n // Note: When running inside a Claude Code session, nested Claude Code\n // instances may still use ANTHROPIC_API_KEY auth due to parent process detection\n env.CLAUDECODE = undefined;\n env.CLAUDE_CODE_ENTRYPOINT = undefined;\n return env;\n }\n\n private async executeClaudeCode(\n args: readonly string[],\n cwd: string,\n signal: AbortSignal | undefined,\n logger: ClaudeCodeStreamLogger | undefined,\n ): Promise<ClaudeCodeRunResult> {\n try {\n return await this.runClaudeCode({\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 `Claude Code executable '${this.config.executable}' was not found. Update the target settings.executable or add it to PATH.`,\n );\n }\n throw error;\n }\n }\n\n private async createWorkspace(): Promise<string> {\n return await mkdtemp(path.join(tmpdir(), WORKSPACE_PREFIX));\n }\n\n private async cleanupWorkspace(workspaceRoot: string): Promise<void> {\n try {\n await rm(workspaceRoot, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n\n private resolveLogDirectory(): string | undefined {\n const disabled = isClaudeCodeLogStreamingDisabled();\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-code');\n }\n\n private async createStreamLogger(\n request: ProviderRequest,\n ): Promise<ClaudeCodeStreamLogger | 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 Code 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 ClaudeCodeStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n });\n recordClaudeCodeLogEntry({\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 Code stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\nclass ClaudeCodeStreamLogger {\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<ClaudeCodeStreamLogger> {\n const logger = new ClaudeCodeStreamLogger(options.filePath, options.format);\n const header = [\n '# Claude Code 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'\n ? formatClaudeCodeJsonLog(trimmed)\n : formatClaudeCodeLogMessage(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 isClaudeCodeLogStreamingDisabled(): boolean {\n const envValue = process.env.AGENTV_CLAUDE_CODE_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-code');\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-code';\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 formatClaudeCodeLogMessage(rawLine: string, source: 'stdout' | 'stderr'): string {\n const parsed = tryParseJsonValue(rawLine);\n if (parsed) {\n const summary = summarizeClaudeCodeEvent(parsed);\n if (summary) {\n return summary;\n }\n }\n if (source === 'stderr') {\n return `stderr: ${rawLine}`;\n }\n return rawLine;\n}\n\nfunction formatClaudeCodeJsonLog(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 summarizeClaudeCodeEvent(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 // Handle specific Claude Code event types\n switch (type) {\n case 'system':\n return 'system: init';\n case 'assistant': {\n const message = record.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 `assistant: 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 `assistant: ${preview}`;\n }\n }\n }\n }\n return 'assistant';\n }\n case 'user': {\n const message = record.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 `user: tool_result (${first.tool_use_id})`;\n }\n }\n }\n return 'user';\n }\n case 'result': {\n const cost = record.cost_usd;\n const duration = record.duration_ms;\n if (typeof cost === 'number' && typeof duration === 'number') {\n return `result: $${cost.toFixed(4)}, ${Math.round(duration)}ms`;\n }\n return 'result';\n }\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\n/**\n * Parse Claude Code JSONL output.\n * Returns an array of parsed JSON objects from each line.\n */\nfunction parseClaudeCodeJsonl(output: string): unknown[] {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n throw new Error('Claude Code 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 (e.g., stderr mixed in)\n }\n }\n\n if (parsed.length === 0) {\n throw new Error('Claude Code CLI produced no valid JSON output');\n }\n\n return parsed;\n}\n\n/**\n * Extract OutputMessage array from Claude Code JSONL events.\n * Claude Code emits messages with type: \"assistant\" and type: \"user\" (for tool results).\n */\nfunction extractOutputMessages(events: unknown[]): readonly OutputMessage[] {\n const outputMessages: OutputMessage[] = [];\n\n for (const event of events) {\n if (!event || typeof event !== 'object') {\n continue;\n }\n const record = event as Record<string, unknown>;\n const type = record.type;\n\n if (type === 'assistant' || type === 'user') {\n const message = record.message as Record<string, unknown> | undefined;\n if (message) {\n const converted = convertClaudeCodeMessage(message, type as string);\n if (converted) {\n outputMessages.push(converted);\n }\n }\n }\n }\n\n return outputMessages;\n}\n\n/**\n * Convert a Claude Code message to AgentV OutputMessage format.\n */\nfunction convertClaudeCodeMessage(\n message: Record<string, unknown>,\n type: string,\n): OutputMessage | undefined {\n const role = type === 'assistant' ? 'assistant' : 'user';\n const content = extractTextContent(message.content);\n const toolCalls = extractToolCalls(message.content);\n\n return {\n role,\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n}\n\n/**\n * Extract text content from Claude Code's content array format.\n * Claude uses: content: [{ type: \"text\", text: \"...\" }, ...]\n */\nfunction extractTextContent(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 * Extract tool calls from Claude Code'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\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 tool: p.name,\n input: p.input,\n id: typeof p.id === 'string' ? p.id : undefined,\n });\n }\n // Handle tool_result for output (from user messages)\n if (p.type === 'tool_result' && typeof p.tool_use_id === 'string') {\n toolCalls.push({\n tool: 'tool_result',\n output: p.content,\n id: p.tool_use_id,\n });\n }\n }\n\n return toolCalls;\n}\n\n/**\n * Extract usage metrics from Claude Code result event.\n */\nfunction extractUsage(events: unknown[]): JsonObject | undefined {\n for (let i = events.length - 1; i >= 0; i--) {\n const event = events[i];\n if (!event || typeof event !== 'object') {\n continue;\n }\n const record = event as Record<string, unknown>;\n if (record.type !== 'result') {\n continue;\n }\n\n const usage: Record<string, string | number | boolean | null> = {};\n if (typeof record.cost_usd === 'number') {\n usage.cost_usd = record.cost_usd;\n }\n if (typeof record.duration_ms === 'number') {\n usage.duration_ms = record.duration_ms;\n }\n if (typeof record.duration_api_ms === 'number') {\n usage.duration_api_ms = record.duration_api_ms;\n }\n if (typeof record.input_tokens === 'number') {\n usage.input_tokens = record.input_tokens;\n }\n if (typeof record.output_tokens === 'number') {\n usage.output_tokens = record.output_tokens;\n }\n if (typeof record.session_id === 'string') {\n usage.session_id = record.session_id;\n }\n\n return Object.keys(usage).length > 0 ? usage : undefined;\n }\n\n return undefined;\n}\n\nfunction pickDetail(stderr: string, stdout: string): string | undefined {\n const errorText = stderr.trim();\n if (errorText.length > 0) {\n return errorText;\n }\n const stdoutText = stdout.trim();\n return stdoutText.length > 0 ? stdoutText : undefined;\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n\n/**\n * Detect if the error is due to nested Claude Code session auth failure.\n * This happens when running AgentV inside a Claude Code session,\n * where the nested claude process detects nesting and requires API key auth.\n */\nfunction isNestedClaudeCodeAuthError(stdout: string): boolean {\n try {\n // Look for the system init event with apiKeySource and authentication error\n const lines = stdout.split('\\n');\n let hasApiKeySource = false;\n let hasAuthError = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const event = JSON.parse(trimmed) as Record<string, unknown>;\n if (event.type === 'system' && event.apiKeySource === 'ANTHROPIC_API_KEY') {\n hasApiKeySource = true;\n }\n if (\n event.error === 'authentication_failed' ||\n (event.type === 'result' && event.is_error)\n ) {\n hasAuthError = true;\n }\n } catch {\n // Ignore non-JSON lines\n }\n }\n\n return hasApiKeySource && hasAuthError;\n } catch {\n return false;\n }\n}\n\n/**\n * Escape a string for safe use as a shell argument.\n * Uses single quotes and escapes any embedded single quotes.\n */\nfunction escapeShellArg(arg: string): string {\n // Single quotes prevent all shell interpretation except for single quotes themselves\n // To include a single quote, we end the single-quoted string, add an escaped single quote, and restart\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nasync function defaultClaudeCodeRunner(\n options: ClaudeCodeRunOptions,\n): Promise<ClaudeCodeRunResult> {\n // Create temp files for stdout/stderr to allow fully detached process\n // This is necessary because piped stdio maintains a connection that\n // allows Claude Code to detect parent process nesting\n const tempId = randomUUID();\n const stdoutFile = path.join(tmpdir(), `agentv-cc-${tempId}-stdout`);\n const stderrFile = path.join(tmpdir(), `agentv-cc-${tempId}-stderr`);\n const exitFile = path.join(tmpdir(), `agentv-cc-${tempId}-exit`);\n const pidFile = path.join(tmpdir(), `agentv-cc-${tempId}-pid`);\n\n try {\n return await runClaudeCodeWithTempFiles(options, stdoutFile, stderrFile, exitFile, pidFile);\n } finally {\n // Cleanup temp files\n for (const file of [stdoutFile, stderrFile, exitFile, pidFile]) {\n try {\n await rm(file, { force: true });\n } catch {\n // Best effort cleanup\n }\n }\n }\n}\n\nasync function runClaudeCodeWithTempFiles(\n options: ClaudeCodeRunOptions,\n stdoutFile: string,\n stderrFile: string,\n exitFile: string,\n pidFile: string,\n): Promise<ClaudeCodeRunResult> {\n // Parse executable - may be \"node /path/to/script.js\" or just \"claude\"\n const parts = options.executable.split(/\\s+/);\n const executable = parts[0];\n const executableArgs = parts.slice(1);\n const allArgs = [...executableArgs, ...options.args];\n\n // Build command with proper escaping for shell execution\n // We use setsid to create a new session, breaking parent process detection\n // This is necessary because Claude Code detects nesting via process hierarchy\n // and falls back to API key auth when running inside another Claude Code session\n // Output is redirected to temp files to fully detach the process\n const escapedArgs = allArgs.map((arg) => escapeShellArg(arg));\n const fullCommand = [escapeShellArg(executable), ...escapedArgs].join(' ');\n\n // The bash script:\n // 1. Unsets CLAUDECODE env vars\n // 2. Writes the child PID to pidFile for potential kill\n // 3. Runs the command with output redirected to temp files\n // 4. Writes exit code to exitFile when done\n const bashScript = `\n unset CLAUDECODE CLAUDE_CODE_ENTRYPOINT 2>/dev/null\n ${fullCommand} >${escapeShellArg(stdoutFile)} 2>${escapeShellArg(stderrFile)} &\n CHILD_PID=$!\n echo $CHILD_PID > ${escapeShellArg(pidFile)}\n wait $CHILD_PID\n echo $? > ${escapeShellArg(exitFile)}\n `;\n\n // Spawn detached process\n const child = spawn('setsid', ['bash', '-c', bashScript], {\n cwd: options.cwd,\n env: options.env,\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n\n // Poll for completion\n const pollInterval = 100; // ms\n const startTime = Date.now();\n let timedOut = false;\n let lastStdoutSize = 0;\n\n const readFileIfExists = async (filePath: string): Promise<string> => {\n try {\n const { readFile } = await import('node:fs/promises');\n return await readFile(filePath, 'utf8');\n } catch {\n return '';\n }\n };\n\n const fileExists = async (filePath: string): Promise<boolean> => {\n try {\n const { access } = await import('node:fs/promises');\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n };\n\n const killProcess = async (): Promise<void> => {\n try {\n const pid = await readFileIfExists(pidFile);\n if (pid.trim()) {\n process.kill(Number.parseInt(pid.trim(), 10), 'SIGTERM');\n }\n } catch {\n // Process may have already exited\n }\n };\n\n // Set up abort handler\n if (options.signal?.aborted) {\n await killProcess();\n return { stdout: '', stderr: 'Aborted', exitCode: -1, timedOut: false };\n }\n\n const abortHandler = (): void => {\n killProcess().catch(() => {});\n };\n options.signal?.addEventListener('abort', abortHandler, { once: true });\n\n try {\n while (true) {\n // Check timeout\n if (options.timeoutMs && Date.now() - startTime > options.timeoutMs) {\n timedOut = true;\n await killProcess();\n break;\n }\n\n // Check abort\n if (options.signal?.aborted) {\n await killProcess();\n break;\n }\n\n // Stream stdout chunks to callback\n if (options.onStdoutChunk) {\n const currentStdout = await readFileIfExists(stdoutFile);\n if (currentStdout.length > lastStdoutSize) {\n options.onStdoutChunk(currentStdout.slice(lastStdoutSize));\n lastStdoutSize = currentStdout.length;\n }\n }\n\n // Check if process completed (exit file exists)\n if (await fileExists(exitFile)) {\n break;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n // Read final output\n const stdout = await readFileIfExists(stdoutFile);\n const stderr = await readFileIfExists(stderrFile);\n const exitCodeStr = await readFileIfExists(exitFile);\n const exitCode = exitCodeStr.trim() ? Number.parseInt(exitCodeStr.trim(), 10) : -1;\n\n // Send any remaining stdout\n if (options.onStdoutChunk && stdout.length > lastStdoutSize) {\n options.onStdoutChunk(stdout.slice(lastStdoutSize));\n }\n if (options.onStderrChunk && stderr) {\n options.onStderrChunk(stderr);\n }\n\n return { stdout, stderr, exitCode, timedOut };\n } finally {\n options.signal?.removeEventListener('abort', abortHandler);\n }\n}\n","export type ClaudeCodeLogEntry = {\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.claudeCodeLogs');\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for('agentv.claudeCodeLogSubscribers');\n\ntype ClaudeCodeLogListener = (entry: ClaudeCodeLogEntry) => void;\n\ntype GlobalWithClaudeCodeLogs = typeof globalThis & {\n [GLOBAL_LOGS_KEY]?: ClaudeCodeLogEntry[];\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<ClaudeCodeLogListener>;\n};\n\nfunction getClaudeCodeLogStore(): ClaudeCodeLogEntry[] {\n const globalObject = globalThis as GlobalWithClaudeCodeLogs;\n const existing = globalObject[GLOBAL_LOGS_KEY];\n if (existing) {\n return existing;\n }\n const created: ClaudeCodeLogEntry[] = [];\n globalObject[GLOBAL_LOGS_KEY] = created;\n return created;\n}\n\nfunction getSubscriberStore(): Set<ClaudeCodeLogListener> {\n const globalObject = globalThis as GlobalWithClaudeCodeLogs;\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\n if (existing) {\n return existing;\n }\n const created = new Set<ClaudeCodeLogListener>();\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\n return created;\n}\n\nfunction notifySubscribers(entry: ClaudeCodeLogEntry): 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(`Claude Code log subscriber failed: ${message}`);\n }\n }\n}\n\nexport function recordClaudeCodeLogEntry(entry: ClaudeCodeLogEntry): void {\n getClaudeCodeLogStore().push(entry);\n notifySubscribers(entry);\n}\n\nexport function consumeClaudeCodeLogEntries(): ClaudeCodeLogEntry[] {\n const store = getClaudeCodeLogStore();\n if (store.length === 0) {\n return [];\n }\n return store.splice(0, store.length);\n}\n\nexport function subscribeToClaudeCodeLogEntries(listener: ClaudeCodeLogListener): () => void {\n const store = getSubscriberStore();\n store.add(listener);\n return () => {\n store.delete(listener);\n };\n}\n","import path from 'node:path';\n\nimport { isGuidelineFile } from '../yaml-parser.js';\nimport type { ProviderRequest } from './types.js';\n\nexport interface PromptDocumentOptions {\n readonly guidelinePatterns?: readonly string[];\n readonly guidelineOverrides?: ReadonlySet<string>;\n}\n\nexport function buildPromptDocument(\n request: ProviderRequest,\n inputFiles: readonly string[] | undefined,\n options?: PromptDocumentOptions,\n): string {\n const parts: string[] = [];\n\n const guidelineFiles = collectGuidelineFiles(\n inputFiles,\n options?.guidelinePatterns ?? request.guideline_patterns,\n options?.guidelineOverrides,\n );\n const inputFilesList = collectInputFiles(inputFiles);\n\n const nonGuidelineInputFiles = inputFilesList.filter((file) => !guidelineFiles.includes(file));\n\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineInputFiles);\n if (prereadBlock.length > 0) {\n parts.push('\\n', prereadBlock);\n }\n\n parts.push('\\n[[ ## user_query ## ]]\\n', request.question.trim());\n\n return parts.join('\\n').trim();\n}\n\nexport function normalizeInputFiles(\n inputFiles: readonly string[] | undefined,\n): string[] | undefined {\n if (!inputFiles || inputFiles.length === 0) {\n return undefined;\n }\n const deduped = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!deduped.has(absolutePath)) {\n deduped.set(absolutePath, absolutePath);\n }\n }\n return Array.from(deduped.values());\n}\n\nexport function collectGuidelineFiles(\n inputFiles: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n overrides?: ReadonlySet<string>,\n): string[] {\n if (!inputFiles || inputFiles.length === 0) {\n return [];\n }\n\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (overrides?.has(absolutePath)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n continue;\n }\n\n const normalized = absolutePath.split(path.sep).join('/');\n if (isGuidelineFile(normalized, guidelinePatterns)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction collectInputFiles(inputFiles: readonly string[] | undefined): string[] {\n if (!inputFiles || inputFiles.length === 0) {\n return [];\n }\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n return Array.from(unique.values());\n}\n\nfunction buildMandatoryPrereadBlock(\n guidelineFiles: readonly string[],\n inputFiles: readonly string[],\n): string {\n if (guidelineFiles.length === 0 && inputFiles.length === 0) {\n return '';\n }\n\n const buildList = (files: readonly string[]): string[] =>\n files.map((absolutePath) => {\n const fileName = path.basename(absolutePath);\n const fileUri = pathToFileUri(absolutePath);\n return `* [${fileName}](${fileUri})`;\n });\n\n const sections: string[] = [];\n if (guidelineFiles.length > 0) {\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join('\\n')}.`);\n }\n\n if (inputFiles.length > 0) {\n sections.push(`Read all input files:\\n${buildList(inputFiles).join('\\n')}.`);\n }\n\n sections.push(\n 'If any file is missing, fail with ERROR: missing-file <filename> and stop.',\n 'Then apply system_instructions on the user query below.',\n );\n\n return sections.join('\\n');\n}\n\nfunction pathToFileUri(filePath: string): string {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n return `file://${normalizedPath}`;\n}\n","import { type 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 { readTextFile } from '../file-utils.js';\nimport type { CliResolvedConfig } from './targets.js';\nimport type {\n OutputMessage,\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 timestamp: z.string().optional(),\n duration_ms: z.number().optional(),\n});\n\n/**\n * Schema for individual output messages.\n * Validates output_messages array items from CLI JSON output.\n * Uses snake_case field names matching JSONL convention.\n */\nconst OutputMessageInputSchema = z.object({\n role: z.string(),\n name: z.string().optional(),\n content: z.unknown().optional(),\n tool_calls: z.array(ToolCallSchema).optional(),\n timestamp: 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_messages: z.array(OutputMessageInputSchema).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 ParsedOutputMessage = z.infer<typeof OutputMessageInputSchema>;\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 OutputMessage format.\n * Handles snake_case to camelCase conversion for toolCalls and durationMs.\n */\nfunction convertOutputMessages(\n messages: readonly ParsedOutputMessage[] | undefined,\n): readonly OutputMessage[] | 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: msg.content,\n toolCalls: msg.tool_calls?.map((tc) => ({\n tool: tc.tool,\n input: tc.input,\n output: tc.output,\n id: tc.id,\n timestamp: tc.timestamp,\n durationMs: tc.duration_ms,\n })),\n timestamp: msg.timestamp,\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 const outputFilePath = generateOutputFilePath(request.evalCaseId);\n const templateValues = buildTemplateValues(request, this.config, outputFilePath);\n const renderedCommand = renderTemplate(this.config.commandTemplate, templateValues);\n\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] cwd=${this.config.cwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n // Measure wall-clock time as fallback for duration\n const startTime = Date.now();\n const result = await this.runCommand(renderedCommand, {\n cwd: this.config.cwd,\n env: process.env,\n timeoutMs: this.config.timeoutMs,\n signal: request.signal,\n });\n 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 outputMessages: parsed.outputMessages,\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: this.config.cwd,\n outputFile: outputFilePath,\n },\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 templateValues = buildTemplateValues(\n {\n question: '',\n guidelines: '',\n inputFiles: batchInputFiles,\n evalCaseId: 'batch',\n attempt: 0,\n },\n this.config,\n outputFilePath,\n );\n const renderedCommand = renderTemplate(this.config.commandTemplate, templateValues);\n\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] (batch size=${requests.length}) cwd=${this.config.cwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n // Measure wall-clock time for batch (used as fallback if records don't provide duration)\n const startTime = Date.now();\n const result = await this.runCommand(renderedCommand, {\n cwd: this.config.cwd,\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 outputMessages: [],\n durationMs: perRequestFallbackMs,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: this.config.cwd,\n outputFile: outputFilePath,\n },\n };\n }\n\n 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 outputMessages: [{ role: 'assistant', content: `Error: ${errorMessage}` }],\n durationMs: perRequestFallbackMs,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: this.config.cwd,\n outputFile: outputFilePath,\n error: errorMessage,\n },\n };\n }\n\n return {\n outputMessages: parsed.outputMessages,\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: this.config.cwd,\n outputFile: outputFilePath,\n recordId: evalCaseId,\n },\n };\n });\n\n return responses;\n }\n\n /**\n * Parse output content from CLI.\n * If the content is valid JSON with 'output_messages' or 'text' field, extract them.\n * If only 'text' is provided, wrap it in outputMessages.\n * Otherwise, treat the entire content as plain text wrapped in outputMessages.\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 outputMessages: readonly OutputMessage[];\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 { outputMessages: [{ 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 { outputMessages: [{ 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_messages to OutputMessage[] format\n const outputMessages = convertOutputMessages(obj.output_messages);\n\n // If output_messages provided, use it\n if (outputMessages && outputMessages.length > 0) {\n return {\n outputMessages,\n tokenUsage: obj.token_usage,\n costUsd: metrics.costUsd,\n durationMs: metrics.durationMs,\n };\n }\n\n // Fall back to text field, wrap in outputMessages\n if (obj.text !== undefined) {\n const text = typeof obj.text === 'string' ? obj.text : String(obj.text);\n return {\n outputMessages: [{ role: 'assistant', content: text }],\n tokenUsage: obj.token_usage,\n costUsd: metrics.costUsd,\n durationMs: metrics.durationMs,\n };\n }\n\n // No output_messages or text, treat original content as plain text\n return { outputMessages: [{ role: 'assistant', content }] };\n }\n\n private parseJsonlBatchOutput(content: string): Map<\n string,\n {\n outputMessages: readonly OutputMessage[];\n tokenUsage?: ProviderTokenUsage;\n costUsd?: number;\n durationMs?: number;\n }\n > {\n const records = new Map<\n string,\n {\n outputMessages: readonly OutputMessage[];\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_messages, fall back to text wrapped in outputMessages\n const outputMessages = convertOutputMessages(obj.output_messages);\n let finalOutputMessages: readonly OutputMessage[];\n if (outputMessages && outputMessages.length > 0) {\n finalOutputMessages = outputMessages;\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 finalOutputMessages = 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 outputMessages: finalOutputMessages,\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 (healthcheck.type === 'http') {\n const controller = new AbortController();\n const timer = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : undefined;\n signal?.addEventListener('abort', () => controller.abort(), { once: true });\n\n try {\n const response = await fetch(healthcheck.url, { method: 'GET', signal: controller.signal });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\n }\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${reason}`);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n return;\n }\n\n const renderedCommand = renderTemplate(\n healthcheck.commandTemplate,\n buildTemplateValues(\n {\n question: '',\n guidelines: '',\n inputFiles: [],\n evalCaseId: 'healthcheck',\n attempt: 0,\n },\n this.config,\n generateOutputFilePath('healthcheck'),\n ),\n );\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] (healthcheck) cwd=${healthcheck.cwd ?? this.config.cwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n const result = await this.runCommand(renderedCommand, {\n cwd: healthcheck.cwd ?? this.config.cwd,\n env: process.env,\n timeoutMs,\n signal,\n });\n\n if (result.failed || (result.exitCode ?? 0) !== 0) {\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\n const detail = result.stderr.trim() || result.stdout.trim();\n const message = detail\n ? `${detail} (exit code ${codeText})`\n : `CLI healthcheck command exited with code ${codeText}`;\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${message}`);\n }\n }\n}\n\nfunction buildTemplateValues(\n request: Pick<\n ProviderRequest,\n 'question' | 'guidelines' | 'inputFiles' | 'evalCaseId' | 'attempt'\n >,\n config: CliResolvedConfig,\n outputFilePath: string,\n): Record<string, string> {\n const inputFiles = normalizeInputFiles(request.inputFiles);\n return {\n PROMPT: shellEscape(request.question ?? ''),\n GUIDELINES: shellEscape(request.guidelines ?? ''),\n EVAL_ID: shellEscape(request.evalCaseId ?? ''),\n ATTEMPT: shellEscape(String(request.attempt ?? 0)),\n FILES: formatFileList(inputFiles, config.filesFormat),\n OUTPUT_FILE: shellEscape(outputFilePath),\n };\n}\n\nfunction normalizeInputFiles(\n inputFiles: readonly string[] | undefined,\n): readonly string[] | undefined {\n if (!inputFiles || inputFiles.length === 0) {\n return undefined;\n }\n\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction formatFileList(\n files: readonly string[] | undefined,\n template: string | undefined,\n): string {\n if (!files || files.length === 0) {\n return '';\n }\n\n const formatter = template ?? '{path}';\n return files\n .map((filePath) => {\n const escapedPath = shellEscape(filePath);\n const escapedName = shellEscape(path.basename(filePath));\n return formatter.replaceAll('{path}', escapedPath).replaceAll('{basename}', escapedName);\n })\n .join(' ');\n}\n\nfunction renderTemplate(template: string, values: Record<string, string>): string {\n return template.replace(/\\{([A-Z_]+)\\}/g, (match, key) => {\n const replacement = values[key];\n return replacement !== undefined ? replacement : match;\n });\n}\n\nfunction shellEscape(value: string): string {\n if (value.length === 0) {\n return \"''\";\n }\n\n if (process.platform === 'win32') {\n // PowerShell uses backtick (`) for escaping, not backslash\n // Double quotes inside the string need to be escaped with backtick\n // Single quotes can be used instead for simpler escaping\n const escaped = value.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n\n return `'${value.replace(/'/g, \"'\\\"'\\\"'\")}'`;\n}\n\nfunction generateOutputFilePath(evalCaseId?: string, 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 { exec as execCallback, spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { constants, createWriteStream } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { access, mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { recordCodexLogEntry } from './codex-log-tracker.js';\nimport { buildPromptDocument, normalizeInputFiles } from './preread.js';\nimport type { CodexResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst execAsync = promisify(execCallback);\nconst WORKSPACE_PREFIX = 'agentv-codex-';\nconst PROMPT_FILENAME = 'prompt.md';\nconst JSONL_TYPE_ITEM_COMPLETED = 'item.completed';\n\n/**\n * Default system prompt for Codex CLI evaluations.\n * Ensures the agent returns code in its response rather than just writing files.\n */\nconst DEFAULT_SYSTEM_PROMPT = `**IMPORTANT**: Follow these instructions for your response:\n- Do NOT create any additional output files in the workspace.\n- All intended file outputs/changes MUST be written in your response.\n- For each intended file, include the relative path and unified git diff following the convention \\`diff --git ...\\`.\nThis is required for evaluation scoring.`;\n\ninterface CodexRunOptions {\n readonly executable: string;\n readonly args: readonly string[];\n readonly cwd: string;\n readonly prompt: string;\n readonly timeoutMs?: number;\n readonly env: NodeJS.ProcessEnv;\n readonly signal?: AbortSignal;\n readonly onStdoutChunk?: (chunk: string) => void;\n readonly onStderrChunk?: (chunk: string) => void;\n}\n\ninterface CodexRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n readonly timedOut?: boolean;\n}\n\ntype CodexRunner = (options: CodexRunOptions) => Promise<CodexRunResult>;\n\nexport class CodexProvider implements Provider {\n readonly id: string;\n readonly kind = 'codex' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: CodexResolvedConfig;\n private readonly runCodex: CodexRunner;\n private environmentCheck?: Promise<void>;\n private resolvedExecutable?: string;\n\n constructor(\n targetName: string,\n config: CodexResolvedConfig,\n runner: CodexRunner = defaultCodexRunner,\n ) {\n this.id = `codex:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n this.runCodex = runner;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Codex provider request was aborted before execution');\n }\n\n await this.ensureEnvironmentReady();\n\n const inputFiles = normalizeInputFiles(request.inputFiles);\n\n const workspaceRoot = await this.createWorkspace();\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n try {\n const basePrompt = buildPromptDocument(request, inputFiles);\n const systemPrompt = this.config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n const promptContent = `${systemPrompt}\\n\\n${basePrompt}`;\n const promptFile = path.join(workspaceRoot, PROMPT_FILENAME);\n await writeFile(promptFile, promptContent, 'utf8');\n\n const args = this.buildCodexArgs();\n const cwd = this.resolveCwd(workspaceRoot);\n\n const result = await this.executeCodex(args, cwd, promptContent, request.signal, logger);\n\n if (result.timedOut) {\n throw new Error(\n `Codex CLI timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n\n if (result.exitCode !== 0) {\n const detail = pickDetail(result.stderr, result.stdout);\n const prefix = `Codex CLI exited with code ${result.exitCode}`;\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\n }\n\n const parsed = parseCodexJson(result.stdout);\n const assistantText = extractAssistantText(parsed);\n\n return {\n raw: {\n response: parsed,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n args,\n executable: this.resolvedExecutable ?? this.config.executable,\n promptFile,\n workspace: workspaceRoot,\n inputFiles,\n logFile: logger?.filePath,\n },\n outputMessages: [{ role: 'assistant' as const, content: assistantText }],\n };\n } finally {\n await logger?.close();\n await this.cleanupWorkspace(workspaceRoot);\n }\n }\n\n private async ensureEnvironmentReady(): Promise<void> {\n if (!this.environmentCheck) {\n this.environmentCheck = this.validateEnvironment();\n }\n await this.environmentCheck;\n }\n\n private async validateEnvironment(): Promise<void> {\n this.resolvedExecutable = await locateExecutable(this.config.executable);\n }\n\n private resolveCwd(workspaceRoot: string): string {\n if (!this.config.cwd) {\n return workspaceRoot;\n }\n return path.resolve(this.config.cwd);\n }\n\n private buildCodexArgs(): string[] {\n // Global flags must come before 'exec' subcommand\n const args = [\n '--ask-for-approval',\n 'never',\n 'exec',\n '--json',\n '--color',\n 'never',\n '--skip-git-repo-check',\n ];\n if (this.config.args && this.config.args.length > 0) {\n args.push(...this.config.args);\n }\n args.push('-');\n return args;\n }\n\n private async executeCodex(\n args: readonly string[],\n cwd: string,\n promptContent: string,\n signal: AbortSignal | undefined,\n logger: CodexStreamLogger | undefined,\n ): Promise<CodexRunResult> {\n try {\n return await this.runCodex({\n executable: this.resolvedExecutable ?? this.config.executable,\n args,\n cwd,\n prompt: promptContent,\n timeoutMs: this.config.timeoutMs,\n env: process.env,\n signal,\n onStdoutChunk: logger ? (chunk) => logger.handleStdoutChunk(chunk) : undefined,\n onStderrChunk: logger ? (chunk) => logger.handleStderrChunk(chunk) : undefined,\n });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n throw new Error(\n `Codex executable '${this.config.executable}' was not found. Update the target settings.executable or add it to PATH.`,\n );\n }\n throw error;\n }\n }\n\n private async createWorkspace(): Promise<string> {\n return await mkdtemp(path.join(tmpdir(), WORKSPACE_PREFIX));\n }\n\n private async cleanupWorkspace(workspaceRoot: string): Promise<void> {\n try {\n await rm(workspaceRoot, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n\n private resolveLogDirectory(): string | undefined {\n const disabled = isCodexLogStreamingDisabled();\n if (disabled) {\n return undefined;\n }\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'codex');\n }\n\n private async createStreamLogger(\n request: ProviderRequest,\n ): Promise<CodexStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Codex stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\n\n try {\n const logger = await CodexStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n });\n recordCodexLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Codex stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\nclass CodexStreamLogger {\n readonly filePath: string;\n private readonly stream: WriteStream;\n private readonly startedAt = Date.now();\n private stdoutBuffer = '';\n private stderrBuffer = '';\n private readonly format: 'summary' | 'json';\n\n private constructor(filePath: string, format: 'summary' | 'json') {\n this.filePath = filePath;\n this.format = format;\n this.stream = createWriteStream(filePath, { flags: 'a' });\n }\n\n static async create(options: {\n readonly filePath: string;\n readonly targetName: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly format: 'summary' | 'json';\n }): Promise<CodexStreamLogger> {\n const logger = new CodexStreamLogger(options.filePath, options.format);\n const header = [\n '# Codex CLI stream log',\n `# target: ${options.targetName}`,\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\n `# started: ${new Date().toISOString()}`,\n '',\n ].filter((line): line is string => Boolean(line));\n logger.writeLines(header);\n return logger;\n }\n\n handleStdoutChunk(chunk: string): void {\n this.stdoutBuffer += chunk;\n this.flushBuffer('stdout');\n }\n\n handleStderrChunk(chunk: string): void {\n this.stderrBuffer += chunk;\n this.flushBuffer('stderr');\n }\n\n async close(): Promise<void> {\n this.flushBuffer('stdout');\n this.flushBuffer('stderr');\n this.flushRemainder();\n await new Promise<void>((resolve, reject) => {\n this.stream.once('error', reject);\n this.stream.end(() => resolve());\n });\n }\n\n private writeLines(lines: readonly string[]): void {\n for (const line of lines) {\n this.stream.write(`${line}\\n`);\n }\n }\n\n private flushBuffer(source: 'stdout' | 'stderr'): void {\n const buffer = source === 'stdout' ? this.stdoutBuffer : this.stderrBuffer;\n const lines = buffer.split(/\\r?\\n/);\n const remainder = lines.pop() ?? '';\n if (source === 'stdout') {\n this.stdoutBuffer = remainder;\n } else {\n this.stderrBuffer = remainder;\n }\n for (const line of lines) {\n const formatted = this.formatLine(line, source);\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n }\n\n private formatLine(rawLine: string, source: 'stdout' | 'stderr'): string | undefined {\n const trimmed = rawLine.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n const message =\n this.format === 'json' ? formatCodexJsonLog(trimmed) : formatCodexLogMessage(trimmed, source);\n return `[+${formatElapsed(this.startedAt)}] [${source}] ${message}`;\n }\n\n private flushRemainder(): void {\n const stdoutRemainder = this.stdoutBuffer.trim();\n if (stdoutRemainder.length > 0) {\n const formatted = this.formatLine(stdoutRemainder, 'stdout');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n const stderrRemainder = this.stderrBuffer.trim();\n if (stderrRemainder.length > 0) {\n const formatted = this.formatLine(stderrRemainder, 'stderr');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n this.stdoutBuffer = '';\n this.stderrBuffer = '';\n }\n}\n\nfunction isCodexLogStreamingDisabled(): boolean {\n const envValue = process.env.AGENTV_CODEX_STREAM_LOGS;\n if (!envValue) {\n return false;\n }\n const normalized = envValue.trim().toLowerCase();\n return normalized === 'false' || normalized === '0' || normalized === 'off';\n}\n\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const evalId = sanitizeForFilename(request.evalCaseId ?? 'codex');\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : '';\n const target = sanitizeForFilename(targetName);\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\n}\n\nfunction sanitizeForFilename(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : 'codex';\n}\n\nfunction formatElapsed(startedAt: number): string {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\n const hours = Math.floor(elapsedSeconds / 3600);\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\n const seconds = elapsedSeconds % 60;\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\nfunction formatCodexLogMessage(rawLine: string, source: 'stdout' | 'stderr'): string {\n const parsed = tryParseJsonValue(rawLine);\n if (parsed) {\n const summary = summarizeCodexEvent(parsed);\n if (summary) {\n return summary;\n }\n }\n if (source === 'stderr') {\n return `stderr: ${rawLine}`;\n }\n return rawLine;\n}\n\nfunction formatCodexJsonLog(rawLine: string): string {\n const parsed = tryParseJsonValue(rawLine);\n if (!parsed) {\n return rawLine;\n }\n try {\n return JSON.stringify(parsed, null, 2);\n } catch {\n return rawLine;\n }\n}\n\nfunction summarizeCodexEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n let message =\n extractFromEvent(event) ??\n extractFromItem(record.item) ??\n flattenContent(record.output ?? record.content);\n if (!message && type === JSONL_TYPE_ITEM_COMPLETED) {\n const item = record.item;\n if (item && typeof item === 'object') {\n const candidate = flattenContent(\n (item as Record<string, unknown>).text ??\n (item as Record<string, unknown>).content ??\n (item as Record<string, unknown>).output,\n );\n if (candidate) {\n message = candidate;\n }\n }\n }\n if (!message) {\n const itemType =\n typeof (record.item as Record<string, unknown> | undefined)?.type === 'string'\n ? (record.item as Record<string, unknown>).type\n : undefined;\n if (type && itemType) {\n return `${type}:${itemType}`;\n }\n if (type) {\n return type;\n }\n }\n if (type && message) {\n return `${type}: ${message}`;\n }\n if (message) {\n return message;\n }\n return type;\n}\n\nfunction tryParseJsonValue(rawLine: string): unknown | undefined {\n try {\n return JSON.parse(rawLine);\n } catch {\n return undefined;\n }\n}\n\nasync function locateExecutable(candidate: string): Promise<string> {\n const includesPathSeparator = candidate.includes('/') || candidate.includes('\\\\');\n if (includesPathSeparator) {\n const resolved = path.isAbsolute(candidate) ? candidate : path.resolve(candidate);\n const executablePath = await ensureWindowsExecutableVariant(resolved);\n await access(executablePath, constants.F_OK);\n return executablePath;\n }\n\n const locator = process.platform === 'win32' ? 'where' : 'which';\n try {\n const { stdout } = await execAsync(`${locator} ${candidate}`);\n const lines = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n const preferred = selectExecutableCandidate(lines);\n if (preferred) {\n const executablePath = await ensureWindowsExecutableVariant(preferred);\n await access(executablePath, constants.F_OK);\n return executablePath;\n }\n } catch {\n // ignore and fall back to error below\n }\n\n throw new Error(`Codex executable '${candidate}' was not found on PATH`);\n}\n\nfunction selectExecutableCandidate(candidates: readonly string[]): string | undefined {\n if (candidates.length === 0) {\n return undefined;\n }\n if (process.platform !== 'win32') {\n return candidates[0];\n }\n const extensions = getWindowsExecutableExtensions();\n for (const ext of extensions) {\n const match = candidates.find((candidate) => candidate.toLowerCase().endsWith(ext));\n if (match) {\n return match;\n }\n }\n return candidates[0];\n}\n\nasync function ensureWindowsExecutableVariant(candidate: string): Promise<string> {\n if (process.platform !== 'win32') {\n return candidate;\n }\n if (hasExecutableExtension(candidate)) {\n return candidate;\n }\n\n const extensions = getWindowsExecutableExtensions();\n for (const ext of extensions) {\n const withExtension = `${candidate}${ext}`;\n try {\n await access(withExtension, constants.F_OK);\n return withExtension;\n } catch {\n // keep searching\n }\n }\n return candidate;\n}\n\nfunction hasExecutableExtension(candidate: string): boolean {\n const lower = candidate.toLowerCase();\n return getWindowsExecutableExtensions().some((ext) => lower.endsWith(ext));\n}\n\nconst DEFAULT_WINDOWS_EXTENSIONS = ['.com', '.exe', '.bat', '.cmd', '.ps1'] as const;\n\nfunction getWindowsExecutableExtensions(): readonly string[] {\n if (process.platform !== 'win32') {\n return [];\n }\n const fromEnv = process.env.PATHEXT?.split(';')\n .map((ext) => ext.trim().toLowerCase())\n .filter((ext) => ext.length > 0);\n return fromEnv && fromEnv.length > 0 ? fromEnv : DEFAULT_WINDOWS_EXTENSIONS;\n}\n\nfunction parseCodexJson(output: string): unknown {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n throw new Error('Codex CLI produced no output in --json mode');\n }\n try {\n return JSON.parse(trimmed);\n } catch {\n const lineObjects = parseJsonLines(trimmed);\n if (lineObjects) {\n return lineObjects;\n }\n const lastBrace = trimmed.lastIndexOf('{');\n if (lastBrace >= 0) {\n const candidate = trimmed.slice(lastBrace);\n try {\n return JSON.parse(candidate);\n } catch {\n // fallthrough\n }\n }\n const preview = trimmed.slice(0, 200);\n throw new Error(`Codex CLI emitted invalid JSON: ${preview}${trimmed.length > 200 ? '…' : ''}`);\n }\n}\n\nfunction extractAssistantText(parsed: unknown): string {\n if (Array.isArray(parsed)) {\n const text = extractFromEventStream(parsed);\n if (text) {\n return text;\n }\n }\n\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('Codex CLI JSON response did not include an assistant message');\n }\n\n const record = parsed as Record<string, unknown>;\n const eventText = extractFromEvent(record);\n if (eventText) {\n return eventText;\n }\n\n const messages = Array.isArray(record.messages) ? record.messages : undefined;\n if (messages) {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const entry = messages[index];\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n const role = (entry as Record<string, unknown>).role;\n if (role !== 'assistant') {\n continue;\n }\n const content = (entry as Record<string, unknown>).content;\n const flattened = flattenContent(content);\n if (flattened) {\n return flattened;\n }\n }\n }\n\n const response = record.response;\n if (response && typeof response === 'object') {\n const content = (response as Record<string, unknown>).content;\n const flattened = flattenContent(content);\n if (flattened) {\n return flattened;\n }\n }\n\n const output = record.output;\n const flattenedOutput = flattenContent(output);\n if (flattenedOutput) {\n return flattenedOutput;\n }\n\n throw new Error('Codex CLI JSON response did not include an assistant message');\n}\n\nfunction extractFromEventStream(events: readonly unknown[]): string | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const candidate = events[index];\n const text = extractFromEvent(candidate);\n if (text) {\n return text;\n }\n }\n return undefined;\n}\n\nfunction extractFromEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n if (type === JSONL_TYPE_ITEM_COMPLETED) {\n const item = record.item;\n const text = extractFromItem(item);\n if (text) {\n return text;\n }\n }\n const output = record.output ?? record.content;\n const flattened = flattenContent(output);\n if (flattened) {\n return flattened;\n }\n return undefined;\n}\n\nfunction extractFromItem(item: unknown): string | undefined {\n if (!item || typeof item !== 'object') {\n return undefined;\n }\n const record = item as Record<string, unknown>;\n const itemType = typeof record.type === 'string' ? record.type : undefined;\n if (itemType === 'agent_message' || itemType === 'response' || itemType === 'output') {\n const text = flattenContent(record.text ?? record.content ?? record.output);\n if (text) {\n return text;\n }\n }\n return undefined;\n}\n\nfunction flattenContent(value: unknown): string | undefined {\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n const parts = value\n .map((segment) => {\n if (typeof segment === 'string') {\n return segment;\n }\n if (segment && typeof segment === 'object' && 'text' in segment) {\n const text = (segment as Record<string, unknown>).text;\n return typeof text === 'string' ? text : undefined;\n }\n return undefined;\n })\n .filter((part): part is string => typeof part === 'string' && part.length > 0);\n return parts.length > 0 ? parts.join(' \\n') : undefined;\n }\n if (value && typeof value === 'object' && 'text' in value) {\n const text = (value as Record<string, unknown>).text;\n return typeof text === 'string' ? text : undefined;\n }\n return undefined;\n}\n\nfunction parseJsonLines(output: string): unknown[] | undefined {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length <= 1) {\n return undefined;\n }\n const parsed: unknown[] = [];\n for (const line of lines) {\n try {\n parsed.push(JSON.parse(line));\n } catch {\n return undefined;\n }\n }\n return parsed;\n}\n\nfunction pickDetail(stderr: string, stdout: string): string | undefined {\n const errorText = stderr.trim();\n if (errorText.length > 0) {\n return errorText;\n }\n const stdoutText = stdout.trim();\n return stdoutText.length > 0 ? stdoutText : undefined;\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n\nasync function defaultCodexRunner(options: CodexRunOptions): Promise<CodexRunResult> {\n return await new Promise<CodexRunResult>((resolve, reject) => {\n const child = spawn(options.executable, options.args, {\n cwd: options.cwd,\n env: options.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n shell: shouldShellExecute(options.executable),\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const onAbort = (): void => {\n child.kill('SIGTERM');\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeoutMs);\n timeoutHandle.unref?.();\n }\n\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk) => {\n stdout += chunk;\n options.onStdoutChunk?.(chunk);\n });\n\n child.stderr.setEncoding('utf8');\n child.stderr.on('data', (chunk) => {\n stderr += chunk;\n options.onStderrChunk?.(chunk);\n });\n\n child.stdin.end(options.prompt);\n\n const cleanup = (): void => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n if (options.signal) {\n options.signal.removeEventListener('abort', onAbort);\n }\n };\n\n child.on('error', (error) => {\n cleanup();\n reject(error);\n });\n\n child.on('close', (code) => {\n cleanup();\n resolve({\n stdout,\n stderr,\n exitCode: typeof code === 'number' ? code : -1,\n timedOut,\n });\n });\n });\n}\n\nfunction shouldShellExecute(executable: string): boolean {\n if (process.platform !== 'win32') {\n return false;\n }\n const lower = executable.toLowerCase();\n return lower.endsWith('.cmd') || lower.endsWith('.bat') || lower.endsWith('.ps1');\n}\n","export type CodexLogEntry = {\n readonly filePath: string;\n readonly evalCaseId?: string;\n readonly targetName: string;\n readonly attempt?: number;\n};\n\nconst GLOBAL_LOGS_KEY = Symbol.for('agentv.codexLogs');\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for('agentv.codexLogSubscribers');\n\ntype CodexLogListener = (entry: CodexLogEntry) => void;\n\ntype GlobalWithCodexLogs = typeof globalThis & {\n [GLOBAL_LOGS_KEY]?: CodexLogEntry[];\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<CodexLogListener>;\n};\n\nfunction getCodexLogStore(): CodexLogEntry[] {\n const globalObject = globalThis as GlobalWithCodexLogs;\n const existing = globalObject[GLOBAL_LOGS_KEY];\n if (existing) {\n return existing;\n }\n const created: CodexLogEntry[] = [];\n globalObject[GLOBAL_LOGS_KEY] = created;\n return created;\n}\n\nfunction getSubscriberStore(): Set<CodexLogListener> {\n const globalObject = globalThis as GlobalWithCodexLogs;\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\n if (existing) {\n return existing;\n }\n const created = new Set<CodexLogListener>();\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\n return created;\n}\n\nfunction notifySubscribers(entry: CodexLogEntry): void {\n const subscribers = Array.from(getSubscriberStore());\n for (const listener of subscribers) {\n try {\n listener(entry);\n } catch (error) {\n // Avoid surfacing subscriber errors to providers; log for visibility.\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Codex log subscriber failed: ${message}`);\n }\n }\n}\n\nexport function recordCodexLogEntry(entry: CodexLogEntry): void {\n getCodexLogStore().push(entry);\n notifySubscribers(entry);\n}\n\nexport function consumeCodexLogEntries(): CodexLogEntry[] {\n const store = getCodexLogStore();\n if (store.length === 0) {\n return [];\n }\n return store.splice(0, store.length);\n}\n\nexport function subscribeToCodexLogEntries(listener: CodexLogListener): () => void {\n const store = getSubscriberStore();\n store.add(listener);\n return () => {\n store.delete(listener);\n };\n}\n","import { exec as execCallback, spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { constants, createWriteStream } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { access, copyFile, mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { recordCopilotCliLogEntry } from './copilot-cli-log-tracker.js';\nimport { collectGuidelineFiles, normalizeInputFiles } from './preread.js';\nimport type { CopilotResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst execAsync = promisify(execCallback);\nconst WORKSPACE_PREFIX = 'agentv-copilot-';\nconst PROMPT_FILENAME = 'prompt.md';\n\n/**\n * Default system prompt for Copilot CLI evaluations.\n * Ensures the agent returns code in its response rather than just writing files.\n */\nconst DEFAULT_SYSTEM_PROMPT = `**IMPORTANT**: Follow these instructions for your response:\n- Do NOT create any additional output files in the workspace.\n- All intended file outputs/changes MUST be written in your response.\n- For each intended file, include the relative path and unified git diff following the convention \\`diff --git ...\\`.\nThis is required for evaluation scoring.`;\n\ninterface CopilotCliRunOptions {\n readonly executable: string;\n readonly args: readonly string[];\n readonly cwd: string;\n readonly prompt: string;\n readonly timeoutMs?: number;\n readonly env: NodeJS.ProcessEnv;\n readonly signal?: AbortSignal;\n readonly onStdoutChunk?: (chunk: string) => void;\n readonly onStderrChunk?: (chunk: string) => void;\n}\n\ninterface CopilotCliRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n readonly timedOut?: boolean;\n}\n\ntype CopilotCliRunner = (options: CopilotCliRunOptions) => Promise<CopilotCliRunResult>;\n\ninterface CopiedFileMapping {\n readonly originalPath: string;\n readonly workspaceRelativePath: string;\n}\n\nasync function copyInputFilesToWorkspace(\n workspaceRoot: string,\n inputFiles: readonly string[],\n): Promise<CopiedFileMapping[]> {\n const usedNames = new Map<string, number>();\n const mappings: CopiedFileMapping[] = [];\n\n for (const originalPath of inputFiles) {\n const ext = path.extname(originalPath);\n const stem = path.basename(originalPath, ext);\n let relativeName: string;\n\n const baseKey = `${stem}${ext}`;\n const count = usedNames.get(baseKey) ?? 0;\n if (count === 0) {\n relativeName = baseKey;\n } else {\n relativeName = `${stem}_${count}${ext}`;\n }\n usedNames.set(baseKey, count + 1);\n\n const dest = path.join(workspaceRoot, relativeName);\n await copyFile(originalPath, dest);\n mappings.push({ originalPath, workspaceRelativePath: relativeName });\n }\n\n return mappings;\n}\n\nfunction buildCopilotFilePrereadBlock(\n guidelineMappings: readonly CopiedFileMapping[],\n inputMappings: readonly CopiedFileMapping[],\n): string {\n if (guidelineMappings.length === 0 && inputMappings.length === 0) {\n return '';\n }\n\n const buildList = (mappings: readonly CopiedFileMapping[]): string =>\n mappings.map((m) => `* ${m.workspaceRelativePath}`).join('\\n');\n\n const sections: string[] = [];\n if (guidelineMappings.length > 0) {\n sections.push(`Read all guideline files:\\n${buildList(guidelineMappings)}.`);\n }\n if (inputMappings.length > 0) {\n sections.push(`Read all input files:\\n${buildList(inputMappings)}.`);\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\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: CopilotResolvedConfig;\n private readonly runCopilot: CopilotCliRunner;\n private environmentCheck?: Promise<void>;\n private resolvedExecutable?: string;\n\n constructor(\n targetName: string,\n config: CopilotResolvedConfig,\n runner: CopilotCliRunner = defaultCopilotCliRunner,\n ) {\n this.id = `copilot-cli:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n this.runCopilot = runner;\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 await this.ensureEnvironmentReady();\n\n const inputFiles = normalizeInputFiles(request.inputFiles);\n\n const workspaceRoot = await this.createWorkspace();\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n try {\n // Copy input files into workspace and build prompt with relative paths\n const copiedFiles = inputFiles\n ? await copyInputFilesToWorkspace(workspaceRoot, inputFiles)\n : [];\n\n const guidelineFileSet = new Set(\n collectGuidelineFiles(inputFiles, request.guideline_patterns),\n );\n const guidelineMappings = copiedFiles.filter((m) => guidelineFileSet.has(m.originalPath));\n const nonGuidelineMappings = copiedFiles.filter((m) => !guidelineFileSet.has(m.originalPath));\n\n const prereadBlock = buildCopilotFilePrereadBlock(guidelineMappings, nonGuidelineMappings);\n const systemPrompt = this.config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n\n const promptParts: string[] = [systemPrompt];\n if (prereadBlock.length > 0) {\n promptParts.push('', prereadBlock);\n }\n promptParts.push('', '[[ ## user_query ## ]]', request.question.trim());\n\n const promptContent = promptParts.join('\\n');\n const promptFile = path.join(workspaceRoot, PROMPT_FILENAME);\n await writeFile(promptFile, promptContent, 'utf8');\n\n const args = this.buildCopilotArgs(promptContent);\n const cwd = this.resolveCwd(workspaceRoot);\n\n const result = await this.executeCopilot(args, cwd, promptContent, request.signal, logger);\n\n if (result.timedOut) {\n throw new Error(\n `Copilot 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 = `Copilot CLI exited with code ${result.exitCode}`;\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\n }\n\n const assistantText = extractCopilotResponse(result.stdout);\n\n return {\n raw: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n args,\n executable: this.resolvedExecutable ?? this.config.executable,\n promptFile,\n workspace: workspaceRoot,\n inputFiles,\n copiedFiles,\n logFile: logger?.filePath,\n },\n outputMessages: [{ role: 'assistant' as const, content: assistantText }],\n };\n } finally {\n await logger?.close();\n await this.cleanupWorkspace(workspaceRoot);\n }\n }\n\n private async ensureEnvironmentReady(): Promise<void> {\n if (!this.environmentCheck) {\n this.environmentCheck = this.validateEnvironment();\n }\n await this.environmentCheck;\n }\n\n private async validateEnvironment(): Promise<void> {\n this.resolvedExecutable = await locateExecutable(this.config.executable);\n }\n\n private resolveCwd(workspaceRoot: string): string {\n if (!this.config.cwd) {\n return workspaceRoot;\n }\n return path.resolve(this.config.cwd);\n }\n\n private buildCopilotArgs(prompt: string): string[] {\n const args: string[] = [];\n\n // Silent mode - only output agent response\n args.push('-s');\n\n // Auto-approve all tool usage\n args.push('--allow-all-tools');\n\n // Disable color output\n args.push('--no-color');\n\n // Model selection\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n\n // Custom args from config\n if (this.config.args && this.config.args.length > 0) {\n args.push(...this.config.args);\n }\n\n // Non-interactive prompt mode: -p <text> must be last (flag + value pair)\n args.push('-p', prompt);\n\n return args;\n }\n\n private async executeCopilot(\n args: readonly string[],\n cwd: string,\n promptContent: string,\n signal: AbortSignal | undefined,\n logger: CopilotCliStreamLogger | undefined,\n ): Promise<CopilotCliRunResult> {\n try {\n return await this.runCopilot({\n executable: this.resolvedExecutable ?? this.config.executable,\n args,\n cwd,\n prompt: promptContent,\n timeoutMs: this.config.timeoutMs,\n env: process.env,\n signal,\n onStdoutChunk: logger ? (chunk) => logger.handleStdoutChunk(chunk) : undefined,\n onStderrChunk: logger ? (chunk) => logger.handleStderrChunk(chunk) : undefined,\n });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n throw new Error(\n `Copilot executable '${this.config.executable}' was not found. Update the target settings.executable or add it to PATH.`,\n );\n }\n throw error;\n }\n }\n\n private async createWorkspace(): Promise<string> {\n return await mkdtemp(path.join(tmpdir(), WORKSPACE_PREFIX));\n }\n\n private async cleanupWorkspace(workspaceRoot: string): Promise<void> {\n try {\n await rm(workspaceRoot, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n\n private resolveLogDirectory(): string | undefined {\n const disabled = isCopilotLogStreamingDisabled();\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', 'copilot-cli');\n }\n\n private async createStreamLogger(\n request: ProviderRequest,\n ): Promise<CopilotCliStreamLogger | 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));\n\n try {\n const logger = await CopilotCliStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\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\nclass CopilotCliStreamLogger {\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<CopilotCliStreamLogger> {\n const logger = new CopilotCliStreamLogger(options.filePath, options.format);\n const header = [\n '# Copilot 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 prefix = source === 'stderr' ? 'stderr: ' : '';\n return `[+${formatElapsed(this.startedAt)}] [${source}] ${prefix}${trimmed}`;\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 isCopilotLogStreamingDisabled(): boolean {\n const envValue = process.env.AGENTV_COPILOT_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 ?? 'copilot');\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 : 'copilot';\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// biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape stripping requires matching control characters\nconst ANSI_ESCAPE_RE = /\\x1B\\[[0-9;]*[A-Za-z]/g;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: OSC sequence stripping requires matching control characters\nconst ANSI_OSC_RE = /\\x1B\\][^\\x07]*\\x07/g;\n\nfunction stripAnsiEscapes(text: string): string {\n return text.replace(ANSI_ESCAPE_RE, '').replace(ANSI_OSC_RE, '');\n}\n\nfunction extractCopilotResponse(stdout: string): string {\n const cleaned = stripAnsiEscapes(stdout).trim();\n if (cleaned.length === 0) {\n throw new Error('Copilot CLI produced no output');\n }\n return cleaned;\n}\n\nfunction pickDetail(stderr: string, stdout: string): string | undefined {\n const errorText = stderr.trim();\n if (errorText.length > 0) {\n return errorText;\n }\n const stdoutText = stdout.trim();\n return stdoutText.length > 0 ? stdoutText : undefined;\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n\nasync function locateExecutable(candidate: string): Promise<string> {\n const includesPathSeparator = candidate.includes('/') || candidate.includes('\\\\');\n if (includesPathSeparator) {\n const resolved = path.isAbsolute(candidate) ? candidate : path.resolve(candidate);\n await access(resolved, constants.F_OK);\n return resolved;\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(`Copilot executable '${candidate}' was not found on PATH`);\n}\n\nfunction shouldShellExecute(executable: string): boolean {\n if (process.platform !== 'win32') {\n return false;\n }\n const lower = executable.toLowerCase();\n return lower.endsWith('.cmd') || lower.endsWith('.bat') || lower.endsWith('.ps1');\n}\n\nasync function defaultCopilotCliRunner(\n options: CopilotCliRunOptions,\n): Promise<CopilotCliRunResult> {\n return await new Promise<CopilotCliRunResult>((resolve, reject) => {\n const child = spawn(options.executable, options.args, {\n cwd: options.cwd,\n env: options.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n shell: shouldShellExecute(options.executable),\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const onAbort = (): void => {\n child.kill('SIGTERM');\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeoutMs);\n timeoutHandle.unref?.();\n }\n\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk) => {\n stdout += chunk;\n options.onStdoutChunk?.(chunk);\n });\n\n child.stderr.setEncoding('utf8');\n child.stderr.on('data', (chunk) => {\n stderr += chunk;\n options.onStderrChunk?.(chunk);\n });\n\n // Close stdin - copilot reads prompt from args, not stdin\n child.stdin.end();\n\n const cleanup = (): void => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n if (options.signal) {\n options.signal.removeEventListener('abort', onAbort);\n }\n };\n\n child.on('error', (error) => {\n cleanup();\n reject(error);\n });\n\n child.on('close', (code) => {\n cleanup();\n resolve({\n stdout,\n stderr,\n exitCode: typeof code === 'number' ? code : -1,\n timedOut,\n });\n });\n });\n}\n","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","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 outputMessages: [{ role: 'assistant' as const, content: this.cannedResponse }],\n raw: {\n question: request.question,\n guidelines: request.guidelines,\n },\n };\n }\n\n private calculateDelay(): number {\n // If range is specified, use uniform random distribution\n if (this.delayMinMs > 0 || this.delayMaxMs > 0) {\n const min = Math.max(0, this.delayMinMs);\n const max = Math.max(min, this.delayMaxMs);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n // Otherwise use fixed delay\n return this.delayMs;\n }\n}\n","import type { PiAgentSdkResolvedConfig } from './targets.js';\nimport type {\n OutputMessage,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n} from './types.js';\n\ntype PiProvider =\n | 'anthropic'\n | 'openai'\n | 'google'\n | 'mistral'\n | 'groq'\n | 'cerebras'\n | 'xai'\n | 'openrouter';\n\n// Lazy-loaded modules to avoid bundling issues with dynamic requires\nlet piAgentModule: typeof import('@mariozechner/pi-agent-core') | null = null;\nlet piAiModule: typeof import('@mariozechner/pi-ai') | null = null;\n\nasync function loadPiModules(): Promise<{\n Agent: typeof import('@mariozechner/pi-agent-core').Agent;\n getModel: typeof import('@mariozechner/pi-ai').getModel;\n getEnvApiKey: typeof import('@mariozechner/pi-ai').getEnvApiKey;\n}> {\n if (!piAgentModule || !piAiModule) {\n try {\n [piAgentModule, piAiModule] = await Promise.all([\n import('@mariozechner/pi-agent-core'),\n import('@mariozechner/pi-ai'),\n ]);\n } catch (error) {\n throw new Error(\n `Failed to load pi-agent-sdk dependencies. Please install them:\\n npm install @mariozechner/pi-agent-core @mariozechner/pi-ai\\n\\nOriginal error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return {\n Agent: piAgentModule.Agent,\n getModel: piAiModule.getModel,\n getEnvApiKey: piAiModule.getEnvApiKey,\n };\n}\n\n/**\n * Pi Agent SDK provider using the @mariozechner/pi-agent-core library directly.\n * This avoids CLI argument-passing issues (especially on Windows) by using the SDK.\n *\n * Note: Dependencies are loaded lazily on first use to avoid bundling issues.\n * Users must install @mariozechner/pi-agent-core and @mariozechner/pi-ai separately.\n */\nexport class PiAgentSdkProvider implements Provider {\n readonly id: string;\n readonly kind = 'pi-agent-sdk' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: PiAgentSdkResolvedConfig;\n\n constructor(targetName: string, config: PiAgentSdkResolvedConfig) {\n this.id = `pi-agent-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('Pi agent SDK request was aborted before execution');\n }\n\n // Lazy load the pi-agent modules\n const { Agent, getModel, getEnvApiKey } = await loadPiModules();\n\n const startTime = Date.now();\n const providerName = this.config.provider ?? 'anthropic';\n const modelId = this.config.model ?? 'claude-sonnet-4-20250514';\n // Use type assertion since getModel has strict generic constraints for compile-time known values\n // but we're working with runtime configuration strings\n // biome-ignore lint/suspicious/noExplicitAny: runtime string config requires any\n const model = (getModel as any)(providerName, modelId);\n\n // Build system prompt\n const systemPrompt = this.config.systemPrompt ?? 'Answer directly and concisely.';\n\n const agent = new Agent({\n initialState: {\n systemPrompt,\n model,\n tools: [], // No tools for simple Q&A\n messages: [],\n },\n getApiKey: async (provider) => {\n // Use config apiKey if provided, otherwise try environment\n return this.config.apiKey ?? getEnvApiKey(provider as PiProvider) ?? undefined;\n },\n });\n\n // Collect events for output messages\n const outputMessages: OutputMessage[] = [];\n let finalAssistantContent = '';\n\n // Subscribe to events\n const unsubscribe = agent.subscribe((event) => {\n if (event.type === 'message_end') {\n const msg = event.message;\n if (msg.role === 'assistant') {\n const content = extractTextContent(msg.content);\n if (content) {\n finalAssistantContent = content;\n }\n }\n }\n });\n\n try {\n // Set up timeout if configured\n const timeoutMs = this.config.timeoutMs ?? 120000;\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Pi agent SDK timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n });\n\n // Run the prompt with timeout\n await Promise.race([agent.prompt(request.question), timeoutPromise]);\n\n // Wait for agent to finish\n await agent.waitForIdle();\n\n // Extract messages from agent state\n const agentMessages = agent.state.messages;\n for (const msg of agentMessages) {\n outputMessages.push(convertAgentMessage(msg));\n }\n\n const durationMs = Date.now() - startTime;\n\n return {\n raw: {\n messages: agentMessages,\n systemPrompt,\n model: this.config.model,\n provider: this.config.provider,\n },\n outputMessages,\n durationMs,\n };\n } finally {\n unsubscribe();\n }\n }\n}\n\n/**\n * Extract text content from pi-agent message content format.\n */\nfunction extractTextContent(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-agent message to AgentV OutputMessage format.\n */\nfunction convertAgentMessage(message: unknown): OutputMessage {\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 content = extractTextContent(msg.content);\n const toolCalls = extractToolCalls(msg.content);\n const timestamp =\n typeof msg.timestamp === 'number'\n ? new Date(msg.timestamp).toISOString()\n : typeof msg.timestamp === 'string'\n ? msg.timestamp\n : undefined;\n\n return {\n role,\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n timestamp,\n };\n}\n\n/**\n * Extract tool calls from pi-agent content array format.\n */\nfunction extractToolCalls(content: unknown): 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 toolCalls.push({\n tool: p.name,\n input: p.arguments,\n id: typeof p.id === 'string' ? p.id : undefined,\n });\n }\n }\n\n return toolCalls;\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, mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\n\nimport { recordPiLogEntry } from './pi-log-tracker.js';\nimport { normalizeInputFiles } from './preread.js';\nimport type { PiCodingAgentResolvedConfig } from './targets.js';\nimport type {\n OutputMessage,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n} from './types.js';\n\nconst WORKSPACE_PREFIX = 'agentv-pi-';\nconst PROMPT_FILENAME = 'prompt.md';\n\n/**\n * Default system prompt for Pi Coding Agent evaluations.\n * Ensures the agent returns code in its response rather than just writing files.\n */\nconst DEFAULT_SYSTEM_PROMPT = `**IMPORTANT**: Follow these instructions for your response:\n- Do NOT create any additional output files in the workspace.\n- All intended file outputs/changes MUST be written in your response.\n- For each intended file, include the relative path and unified git diff following the convention \\`diff --git ...\\`.\nThis is required for evaluation scoring.`;\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 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 private readonly runPi: PiRunner;\n\n constructor(\n targetName: string,\n config: PiCodingAgentResolvedConfig,\n runner: PiRunner = defaultPiRunner,\n ) {\n this.id = `pi-coding-agent:${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 coding agent request was aborted before execution');\n }\n\n const inputFiles = normalizeInputFiles(request.inputFiles);\n\n const workspaceRoot = await this.createWorkspace();\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n try {\n // Save prompt to file for debugging/logging\n const promptFile = path.join(workspaceRoot, PROMPT_FILENAME);\n await writeFile(promptFile, request.question, 'utf8');\n\n const args = this.buildPiArgs(request.question, inputFiles);\n const cwd = this.resolveCwd(workspaceRoot);\n\n const result = await this.executePi(args, cwd, request.signal, logger);\n\n if (result.timedOut) {\n throw new Error(\n `Pi coding agent 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 coding agent exited with code ${result.exitCode}`;\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\n }\n\n const parsed = parsePiJsonl(result.stdout);\n const outputMessages = extractOutputMessages(parsed);\n const assistantText = extractAssistantText(outputMessages);\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,\n inputFiles,\n logFile: logger?.filePath,\n },\n outputMessages,\n };\n } finally {\n await logger?.close();\n await this.cleanupWorkspace(workspaceRoot);\n }\n }\n\n private resolveCwd(workspaceRoot: string): string {\n if (!this.config.cwd) {\n return workspaceRoot;\n }\n return path.resolve(this.config.cwd);\n }\n\n private buildPiArgs(prompt: string, inputFiles: readonly string[] | undefined): string[] {\n const args: string[] = [];\n\n // Provider and model configuration\n if (this.config.provider) {\n args.push('--provider', this.config.provider);\n }\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n if (this.config.apiKey) {\n args.push('--api-key', this.config.apiKey);\n }\n\n // Output mode - always use JSON for structured output\n args.push('--mode', 'json');\n\n // Non-interactive mode\n args.push('--print');\n\n // No session storage for eval runs\n args.push('--no-session');\n\n // Tools configuration\n if (this.config.tools) {\n args.push('--tools', this.config.tools);\n }\n\n // Thinking level\n if (this.config.thinking) {\n args.push('--thinking', this.config.thinking);\n }\n\n // Custom args\n if (this.config.args && this.config.args.length > 0) {\n args.push(...this.config.args);\n }\n\n // Input files passed with @path syntax (pi-native file inclusion)\n if (inputFiles && inputFiles.length > 0) {\n for (const file of inputFiles) {\n args.push(`@${file}`);\n }\n }\n\n // Prepend system prompt (use default if not configured)\n const systemPrompt = this.config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n const fullPrompt = `${systemPrompt}\\n\\n${prompt}`;\n\n // Escape @ symbols in prompt that aren't file references\n // Pi CLI interprets @ as file prefix, but AgentV uses @[Role]: for multi-turn\n const escapedPrompt = escapeAtSymbols(fullPrompt);\n\n // Prompt is passed as the final argument\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 coding agent executable '${this.config.executable}' was not found. Update the target settings.executable or add it to PATH.`,\n );\n }\n throw error;\n }\n }\n\n private buildEnv(): NodeJS.ProcessEnv {\n const env = { ...process.env };\n\n // Map provider-specific API key to the correct env var\n if (this.config.apiKey) {\n const provider = this.config.provider?.toLowerCase() ?? 'google';\n switch (provider) {\n case 'google':\n case 'gemini':\n env.GEMINI_API_KEY = this.config.apiKey;\n break;\n case 'anthropic':\n env.ANTHROPIC_API_KEY = this.config.apiKey;\n break;\n case 'openai':\n env.OPENAI_API_KEY = this.config.apiKey;\n break;\n case 'groq':\n env.GROQ_API_KEY = this.config.apiKey;\n break;\n case 'xai':\n env.XAI_API_KEY = this.config.apiKey;\n break;\n case 'openrouter':\n env.OPENROUTER_API_KEY = this.config.apiKey;\n break;\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-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 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 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 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 // Handle specific event types\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 event = record.assistantMessageEvent as Record<string, unknown> | undefined;\n const eventType = event?.type;\n if (eventType === 'text_delta') {\n const delta = event?.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 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\n/**\n * Parse Pi coding agent JSONL output.\n * Returns an array of parsed JSON objects from each line.\n */\nfunction parsePiJsonl(output: string): unknown[] {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n throw new Error('Pi coding agent 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 (e.g., stderr mixed in)\n }\n }\n\n if (parsed.length === 0) {\n throw new Error('Pi coding agent produced no valid JSON output');\n }\n\n return parsed;\n}\n\n/**\n * Extract OutputMessage array from Pi JSONL events.\n * Looks for the agent_end event which contains the full message history.\n */\nfunction extractOutputMessages(events: unknown[]): readonly OutputMessage[] {\n // Find the agent_end event which contains all messages\n for (let i = events.length - 1; i >= 0; i--) {\n const event = events[i];\n if (!event || typeof event !== 'object') {\n continue;\n }\n const record = event as Record<string, unknown>;\n if (record.type !== 'agent_end') {\n continue;\n }\n\n const messages = record.messages;\n if (!Array.isArray(messages)) {\n continue;\n }\n\n return messages.map(convertPiMessage).filter((m): m is OutputMessage => m !== undefined);\n }\n\n // Fallback: collect messages from turn_end events\n const outputMessages: OutputMessage[] = [];\n for (const event of events) {\n if (!event || typeof event !== 'object') {\n continue;\n }\n const record = event as Record<string, unknown>;\n if (record.type === 'turn_end') {\n const message = record.message;\n const converted = convertPiMessage(message);\n if (converted) {\n outputMessages.push(converted);\n }\n }\n }\n\n return outputMessages;\n}\n\n/**\n * Convert a Pi message to AgentV OutputMessage format.\n */\nfunction convertPiMessage(message: unknown): OutputMessage | undefined {\n if (!message || typeof message !== 'object') {\n return undefined;\n }\n\n const msg = message as Record<string, unknown>;\n const role = msg.role;\n if (typeof role !== 'string') {\n return undefined;\n }\n\n // Extract text content from Pi's content array format\n const content = extractTextContent(msg.content);\n\n // Extract tool calls if present\n const toolCalls = extractToolCalls(msg.content);\n\n // Extract timestamp\n const timestamp =\n typeof msg.timestamp === 'number'\n ? new Date(msg.timestamp).toISOString()\n : typeof msg.timestamp === 'string'\n ? msg.timestamp\n : undefined;\n\n // Extract metadata (usage, model info, etc.)\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 timestamp,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n };\n}\n\n/**\n * Extract text content from Pi's content array format.\n * Pi uses: content: [{ type: \"text\", text: \"...\" }, ...]\n */\nfunction extractTextContent(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 * Extract tool calls from Pi's content array format.\n * Pi uses: content: [{ type: \"tool_use\", name: \"...\", input: {...} }, ...]\n */\nfunction extractToolCalls(content: unknown): 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 === 'tool_use' && typeof p.name === 'string') {\n toolCalls.push({\n tool: p.name,\n input: p.input,\n id: typeof p.id === 'string' ? p.id : undefined,\n });\n }\n // Also handle tool_result for output\n if (p.type === 'tool_result' && typeof p.tool_use_id === 'string') {\n // Find matching tool call and add output\n const existing = toolCalls.find((tc) => tc.id === p.tool_use_id);\n if (existing) {\n // Create new object with output added\n const idx = toolCalls.indexOf(existing);\n toolCalls[idx] = {\n ...existing,\n output: p.content,\n };\n }\n }\n }\n\n return toolCalls;\n}\n\n/**\n * Extract the final assistant text from output messages.\n */\nfunction extractAssistantText(messages: readonly OutputMessage[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === 'assistant' && msg.content) {\n if (typeof msg.content === 'string') {\n return msg.content;\n }\n return JSON.stringify(msg.content);\n }\n }\n return '';\n}\n\n/**\n * Escape @ symbols in prompt text that pi CLI would interpret as file references.\n * Pi CLI uses @path syntax for file inclusion, but AgentV prompts use @[Role]: markers.\n * We replace @[ with [[ to avoid pi trying to read these as files.\n */\nfunction escapeAtSymbols(prompt: string): string {\n // Replace @[Role]: patterns with [[Role]]: to avoid pi file interpretation\n // This handles @[System]:, @[User]:, @[Assistant]:, @[Tool]: etc.\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) {\n return errorText;\n }\n const stdoutText = stdout.trim();\n return stdoutText.length > 0 ? stdoutText : undefined;\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n\nasync function defaultPiRunner(options: PiRunOptions): Promise<PiRunResult> {\n return await new Promise<PiRunResult>((resolve, reject) => {\n // Parse executable - may be \"node /path/to/script.js\" or just \"pi\"\n const parts = options.executable.split(/\\s+/);\n const executable = parts[0];\n const executableArgs = parts.slice(1);\n const allArgs = [...executableArgs, ...options.args];\n\n const child = spawn(executable, allArgs, {\n cwd: options.cwd,\n env: options.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n shell: false,\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const onAbort = (): void => {\n child.kill('SIGTERM');\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeoutMs);\n timeoutHandle.unref?.();\n }\n\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk) => {\n stdout += chunk;\n options.onStdoutChunk?.(chunk);\n });\n\n child.stderr.setEncoding('utf8');\n child.stderr.on('data', (chunk) => {\n stderr += chunk;\n options.onStderrChunk?.(chunk);\n });\n\n // Close stdin immediately since prompt is passed as argument\n child.stdin.end();\n\n const cleanup = (): void => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n if (options.signal) {\n options.signal.removeEventListener('abort', onAbort);\n }\n };\n\n child.on('error', (error) => {\n cleanup();\n reject(error);\n });\n\n child.on('close', (code) => {\n cleanup();\n resolve({\n stdout,\n stderr,\n exitCode: typeof code === 'number' ? code : -1,\n timedOut,\n });\n });\n });\n}\n","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","import path from 'node:path';\nimport {\n dispatchAgentSession,\n dispatchBatchAgent,\n getSubagentRoot,\n provisionSubagents,\n} from './vscode/index.js';\n\nimport { readTextFile } from '../file-utils.js';\nimport { isGuidelineFile } from '../yaml-parser.js';\nimport type { VSCodeResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\nimport { AGENTV_BATCH_REQUEST_TEMPLATE, AGENTV_REQUEST_TEMPLATE } from './vscode-templates.js';\n\nexport class VSCodeProvider implements Provider {\n readonly id: string;\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly targetName: string;\n readonly supportsBatch = true;\n\n private readonly config: VSCodeResolvedConfig;\n\n constructor(\n targetName: string,\n config: VSCodeResolvedConfig,\n kind: 'vscode' | 'vscode-insiders',\n ) {\n this.id = `${kind}:${targetName}`;\n this.kind = kind;\n this.targetName = targetName;\n this.config = config;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('VS Code provider request was aborted before dispatch');\n }\n\n const inputFiles = normalizeAttachments(request.inputFiles);\n const promptContent = buildPromptDocument(request, inputFiles, request.guideline_patterns);\n\n const session = await dispatchAgentSession({\n userQuery: promptContent,\n extraAttachments: inputFiles,\n requestTemplate: AGENTV_REQUEST_TEMPLATE,\n wait: this.config.waitForResponse,\n dryRun: this.config.dryRun,\n vscodeCmd: this.config.command,\n subagentRoot: this.config.subagentRoot,\n workspaceTemplate: this.config.workspaceTemplate,\n silent: true,\n });\n\n if (session.exitCode !== 0 || !session.responseFile) {\n const failure = session.error ?? 'VS Code subagent did not produce a response';\n throw new Error(failure);\n }\n\n if (this.config.dryRun) {\n return {\n outputMessages: [],\n raw: {\n session,\n inputFiles,\n },\n };\n }\n\n const responseText = await readTextFile(session.responseFile);\n\n return {\n outputMessages: [{ role: 'assistant', content: responseText }],\n raw: {\n session,\n inputFiles,\n },\n };\n }\n\n async invokeBatch(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]> {\n if (requests.length === 0) {\n return [];\n }\n\n const normalizedRequests = requests.map((req) => ({\n request: req,\n inputFiles: normalizeAttachments(req.inputFiles),\n }));\n\n const combinedInputFiles = mergeAttachments(\n normalizedRequests.map(({ inputFiles }) => inputFiles),\n );\n const userQueries = normalizedRequests.map(({ request, inputFiles }) =>\n buildPromptDocument(request, inputFiles, request.guideline_patterns),\n );\n\n const session = await dispatchBatchAgent({\n userQueries,\n extraAttachments: combinedInputFiles,\n requestTemplate: AGENTV_BATCH_REQUEST_TEMPLATE,\n wait: this.config.waitForResponse,\n dryRun: this.config.dryRun,\n vscodeCmd: this.config.command,\n subagentRoot: this.config.subagentRoot,\n workspaceTemplate: this.config.workspaceTemplate,\n silent: true,\n });\n\n if (session.exitCode !== 0 || !session.responseFiles) {\n const failure = session.error ?? 'VS Code subagent did not produce batch responses';\n throw new Error(failure);\n }\n\n if (this.config.dryRun) {\n return normalizedRequests.map(({ inputFiles }) => ({\n outputMessages: [],\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 outputMessages: [{ role: 'assistant', content: responseText }],\n raw: {\n session,\n inputFiles: normalizedRequests[index]?.inputFiles,\n allInputFiles: combinedInputFiles,\n responseFile,\n },\n });\n }\n\n return responses;\n }\n}\n\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 guidelinePatterns: readonly string[] | undefined,\n): string {\n const parts: string[] = [];\n\n // Agent providers incorporate systemPrompt into the question\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\n parts.push(request.systemPrompt.trim());\n }\n\n const guidelineFiles = collectGuidelineFiles(attachments, guidelinePatterns);\n const attachmentFiles = collectAttachmentFiles(attachments);\n\n const nonGuidelineAttachments = attachmentFiles.filter((file) => !guidelineFiles.includes(file));\n\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineAttachments);\n if (prereadBlock.length > 0) {\n parts.push('\\n', prereadBlock);\n }\n\n parts.push('\\n[[ ## user_query ## ]]\\n', request.question.trim());\n\n return parts.join('\\n').trim();\n}\n\nfunction buildMandatoryPrereadBlock(\n guidelineFiles: readonly string[],\n attachmentFiles: readonly string[],\n): string {\n if (guidelineFiles.length === 0 && attachmentFiles.length === 0) {\n return '';\n }\n\n const buildList = (files: readonly string[]): string[] =>\n files.map((absolutePath) => {\n const fileName = path.basename(absolutePath);\n const fileUri = pathToFileUri(absolutePath);\n return `* [${fileName}](${fileUri})`;\n });\n\n const sections: string[] = [];\n if (guidelineFiles.length > 0) {\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join('\\n')}.`);\n }\n\n if (attachmentFiles.length > 0) {\n sections.push(`Read all attachment files:\\n${buildList(attachmentFiles).join('\\n')}.`);\n }\n\n sections.push(\n 'If any file is missing, fail with ERROR: missing-file <filename> and stop.',\n 'Then apply system_instructions on the user query below.',\n );\n\n return sections.join('\\n');\n}\n\nfunction collectGuidelineFiles(\n attachments: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n): string[] {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n\n const unique = new Map<string, string>();\n for (const attachment of attachments) {\n const absolutePath = path.resolve(attachment);\n const normalized = absolutePath.split(path.sep).join('/');\n\n if (isGuidelineFile(normalized, guidelinePatterns)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction collectAttachmentFiles(attachments: readonly string[] | undefined): string[] {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n const unique = new Map<string, string>();\n for (const attachment of attachments) {\n const absolutePath = path.resolve(attachment);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n return Array.from(unique.values());\n}\n\nfunction pathToFileUri(filePath: string): string {\n // Convert to absolute path if relative\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n\n // On Windows, convert backslashes to forward slashes\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n\n // Handle Windows drive letters (e.g., C:/ becomes file:///C:/)\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n\n // Unix-like paths\n return `file://${normalizedPath}`;\n}\n\nfunction _composeUserQuery(request: ProviderRequest): string {\n // For VS Code, guidelines are handled via file attachments\n // Do NOT include guideline content in the user query\n return request.question.trim();\n}\n\nfunction normalizeAttachments(attachments: readonly string[] | undefined): string[] | undefined {\n if (!attachments || attachments.length === 0) {\n return undefined;\n }\n const deduped = new Set<string>();\n for (const attachment of attachments) {\n deduped.add(path.resolve(attachment));\n }\n return Array.from(deduped);\n}\n\nfunction mergeAttachments(all: readonly (readonly string[] | undefined)[]): string[] | undefined {\n const deduped = new Set<string>();\n for (const list of all) {\n if (!list) continue;\n for (const inputFile of list) {\n deduped.add(path.resolve(inputFile));\n }\n }\n return deduped.size > 0 ? Array.from(deduped) : undefined;\n}\n\nexport interface EnsureSubagentsOptions {\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly count: number;\n readonly verbose?: boolean;\n}\n\nexport interface EnsureSubagentsResult {\n readonly provisioned: boolean;\n readonly message?: string;\n}\n\n/**\n * Ensures the required number of VSCode subagents are provisioned using the subagent package.\n * This guarantees version compatibility by using the same subagent package version.\n *\n * @param options - Configuration for subagent provisioning\n * @returns Information about the provisioning result\n */\nexport async function ensureVSCodeSubagents(\n options: EnsureSubagentsOptions,\n): Promise<EnsureSubagentsResult> {\n const { kind, count, verbose = false } = options;\n const vscodeCmd = kind === 'vscode-insiders' ? 'code-insiders' : 'code';\n const subagentRoot = getSubagentRoot(vscodeCmd);\n\n try {\n if (verbose) {\n console.log(`Provisioning ${count} subagent(s) via: subagent ${vscodeCmd} provision`);\n }\n\n const result = await provisionSubagents({\n targetRoot: subagentRoot,\n subagents: count,\n dryRun: false,\n });\n\n if (verbose) {\n if (result.created.length > 0) {\n console.log(`Created ${result.created.length} new subagent(s)`);\n }\n if (result.skippedExisting.length > 0) {\n console.log(`Reusing ${result.skippedExisting.length} existing unlocked subagent(s)`);\n }\n console.log(\n `\\ntotal unlocked subagents available: ${result.created.length + result.skippedExisting.length}`,\n );\n }\n\n return {\n provisioned: true,\n message: `Provisioned ${count} subagent(s): ${result.created.length} created, ${result.skippedExisting.length} reused`,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Don't fail if provisioning fails - agents might already exist\n if (verbose) {\n console.warn(`Provisioning failed (continuing anyway): ${errorMessage}`);\n }\n\n return {\n provisioned: false,\n message: `Provisioning failed: ${errorMessage}`,\n };\n }\n}\n","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 dryRun?: boolean;\n wait?: boolean;\n vscodeCmd?: string;\n subagentRoot?: string;\n silent?: boolean;\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 dryRun = false,\n wait = true,\n vscodeCmd = 'code',\n subagentRoot,\n silent = false,\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 );\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 const launchSuccess = await launchVsCodeWithChat(\n subagentDir,\n chatId,\n attachments,\n requestInstructions,\n timestamp,\n vscodeCmd,\n );\n\n if (!launchSuccess) {\n return {\n exitCode: 1,\n subagentName,\n responseFile: responseFileFinal,\n tempFile: responseFileTmp,\n error: 'Failed to launch VS Code for subagent session',\n };\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);\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 } = 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 const launchSuccess = await launchVsCodeWithBatchChat(\n subagentDir,\n chatId,\n chatAttachments,\n chatInstruction,\n vscodeCmd,\n );\n\n if (!launchSuccess) {\n return {\n exitCode: 1,\n subagentName,\n requestFiles,\n queryCount,\n error: 'Failed to launch VS Code for batch dispatch',\n };\n }\n\n if (!wait) {\n return {\n exitCode: 0,\n subagentName,\n requestFiles,\n queryCount,\n };\n }\n\n const responsesCompleted = await waitForBatchResponses(responseFilesFinal, 1000, silent);\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\nexport async function waitForResponseOutput(\n responseFileFinal: string,\n pollInterval = 1000,\n silent = false,\n): Promise<boolean> {\n if (!silent) {\n console.error(`waiting for agent to finish: ${responseFileFinal}`);\n }\n\n try {\n while (!(await pathExists(responseFileFinal))) {\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): 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 try {\n const pending = new Set(responseFilesFinal);\n while (pending.size > 0) {\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 { 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 { 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\nconst DEFAULT_WAKEUP_CONTENT = `---\ndescription: 'Wake-up Signal'\nmodel: Grok Code Fast 1 (copilot)\n---`;\n\nexport async function checkWorkspaceOpened(\n workspaceName: string,\n vscodeCmd: string,\n): Promise<boolean> {\n try {\n const { stdout } = await execAsync(`${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 spawn(vscodeCmd, [workspacePath], { windowsHide: true, shell: true, detached: false });\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 spawn(vscodeCmd, [workspacePath], { windowsHide: true, shell: true, detached: false });\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 spawn(vscodeCmd, chatArgs, { windowsHide: true, shell: true, detached: false });\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<boolean> {\n try {\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 console.error('warning: Workspace may not be fully ready');\n }\n\n await sleep(500);\n spawn(vscodeCmd, chatArgs, { windowsHide: true, shell: true, detached: false });\n return true;\n } catch (error) {\n console.error(`warning: Failed to launch VS Code: ${(error as Error).message}`);\n return false;\n }\n}\n\nexport async function launchVsCodeWithBatchChat(\n subagentDir: string,\n chatId: string,\n attachmentPaths: string[],\n chatInstruction: string,\n vscodeCmd: string,\n): Promise<boolean> {\n try {\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 console.error('warning: Workspace may not be fully ready');\n }\n\n await sleep(500);\n spawn(vscodeCmd, chatArgs, { windowsHide: true, shell: true, detached: false });\n return true;\n } catch (error) {\n console.error(`warning: Failed to launch VS Code: ${(error as Error).message}`);\n return false;\n }\n}\n","import os from 'node:os';\nimport path from 'node:path';\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(os.homedir(), '.agentv', 'subagents', 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): 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 const transformedContent = transformWorkspacePaths(workspaceJson, templateDir);\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): Promise<number> {\n if (dryRun) {\n return 0;\n }\n\n try {\n await copyAgentConfig(subagentDir, workspaceTemplate);\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}}\n - Do NOT create any additional output files in the workspace.\n - All intended file outputs/changes MUST be written in your response file.\n - For each intended file, include the repo name, relative path and unified git diff following the convention \\`diff --git ...\\`.\n2. When completely finished, run these PowerShell commands to signal completion:\n\\`\\`\\`\nMove-Item -LiteralPath '{{responseFileTmp}}' -Destination '{{responseFileFinal}}'\nif (Test-Path subagent.lock) { del subagent.lock }\n\\`\\`\\`\n\nDo not proceed to step 2 until your response is completely written to the temporary file.\n`;\n\nexport const AGENTV_BATCH_REQUEST_TEMPLATE = `[[ ## task ## ]]\n\n{{userQuery}}\n\n[[ ## system_instructions ## ]]\n\n**IMPORTANT**: Follow these exact steps:\n1. Create and write your complete response to: {{responseFileTmp}}\n - Do NOT create any additional output files in the workspace.\n - All intended file outputs/changes MUST be written in your response file.\n - For each intended file, include the repo name, relative path and unified git diff following the convention \\`diff --git ...\\`.\n2. When completely finished and the response is stable, rename it to: {{responseFileFinal}}\n3. Do not unlock the workspace from this request; batch orchestration will handle unlocking after all responses are ready.\n`;\n\nexport const AGENTV_BATCH_ORCHESTRATOR_TEMPLATE = `MANDATORY: Run #runSubagent tool in your Available Actions for each request file to process them in isolated contexts.\nDO NOT read the request files yourself - only pass the file paths to each subagent:\n\n{{requestFiles}}\n\nAfter ALL queries complete, verify all responses exist and unlock:\n\n\\`\\`\\`powershell\n$responses = @({{responseList}})\n$missing = $responses | Where-Object { -not (Test-Path \"messages/$_\") }\nif ($missing.Count -eq 0) { del subagent.lock }\n\\`\\`\\`\n`;\n","import { constants } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { TARGETS_SCHEMA_V2 } from './types.js';\nimport type { TargetDefinition } from './types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction extractTargetsArray(parsed: Record<string, unknown>, absolutePath: string): unknown[] {\n const targets = parsed.targets;\n if (!Array.isArray(targets)) {\n throw new Error(`targets.yaml at ${absolutePath} must have a 'targets' array`);\n }\n return targets;\n}\n\nfunction assertTargetDefinition(value: unknown, index: number, filePath: string): TargetDefinition {\n if (!isRecord(value)) {\n throw new Error(`targets.yaml entry at index ${index} in ${filePath} must be an object`);\n }\n\n const name = value.name;\n const provider = value.provider;\n\n if (typeof name !== 'string' || name.trim().length === 0) {\n throw new Error(\n `targets.yaml entry at index ${index} in ${filePath} is missing a valid 'name'`,\n );\n }\n\n if (typeof provider !== 'string' || provider.trim().length === 0) {\n throw new Error(`targets.yaml entry '${name}' in ${filePath} is missing a valid 'provider'`);\n }\n\n // Pass through all properties from the YAML to support the flattened schema\n // This includes all provider-specific settings at the top level\n return value as unknown as TargetDefinition;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readTargetDefinitions(\n filePath: string,\n): Promise<readonly TargetDefinition[]> {\n const absolutePath = path.resolve(filePath);\n if (!(await fileExists(absolutePath))) {\n throw new Error(`targets.yaml not found at ${absolutePath}`);\n }\n\n const raw = await readFile(absolutePath, 'utf8');\n const parsed = parse(raw) as unknown;\n\n if (!isRecord(parsed)) {\n throw new Error(`targets.yaml at ${absolutePath} must be a YAML object with a 'targets' field`);\n }\n\n const targets = extractTargetsArray(parsed, absolutePath);\n const definitions = targets.map((entry, index) =>\n assertTargetDefinition(entry, index, absolutePath),\n );\n return definitions;\n}\n\nexport function listTargetNames(definitions: readonly TargetDefinition[]): readonly string[] {\n return definitions.map((definition) => definition.name);\n}\n","import { AnthropicProvider, AzureProvider, GeminiProvider } from './ai-sdk.js';\nimport { ClaudeCodeProvider } from './claude-code.js';\nimport { CliProvider } from './cli.js';\nimport { CodexProvider } from './codex.js';\nimport { CopilotCliProvider } from './copilot-cli.js';\nimport { MockProvider } from './mock.js';\nimport { PiAgentSdkProvider } from './pi-agent-sdk.js';\nimport { PiCodingAgentProvider } from './pi-coding-agent.js';\nimport type { ResolvedTarget } from './targets.js';\nimport { resolveTargetDefinition } from './targets.js';\nimport type { EnvLookup, Provider, TargetDefinition } from './types.js';\nimport { VSCodeProvider } from './vscode-provider.js';\n\nexport type {\n EnvLookup,\n Provider,\n ProviderKind,\n ProviderRequest,\n ProviderResponse,\n ProviderTokenUsage,\n TargetDefinition,\n} from './types.js';\n\nexport type {\n AnthropicResolvedConfig,\n AzureResolvedConfig,\n ClaudeCodeResolvedConfig,\n CliResolvedConfig,\n CopilotResolvedConfig,\n GeminiResolvedConfig,\n MockResolvedConfig,\n PiAgentSdkResolvedConfig,\n PiCodingAgentResolvedConfig,\n ResolvedTarget,\n VSCodeResolvedConfig,\n} from './targets.js';\n\nexport { resolveTargetDefinition };\nexport { readTargetDefinitions, listTargetNames } from './targets-file.js';\nexport {\n ensureVSCodeSubagents,\n type EnsureSubagentsOptions,\n type EnsureSubagentsResult,\n} from './vscode-provider.js';\nexport { consumeCodexLogEntries, subscribeToCodexLogEntries } from './codex-log-tracker.js';\nexport { consumePiLogEntries, subscribeToPiLogEntries } from './pi-log-tracker.js';\nexport {\n consumeClaudeCodeLogEntries,\n subscribeToClaudeCodeLogEntries,\n} from './claude-code-log-tracker.js';\nexport {\n consumeCopilotCliLogEntries,\n subscribeToCopilotCliLogEntries,\n} from './copilot-cli-log-tracker.js';\n\nexport function createProvider(target: ResolvedTarget): Provider {\n switch (target.kind) {\n case 'azure':\n return new AzureProvider(target.name, target.config);\n case 'anthropic':\n return new AnthropicProvider(target.name, target.config);\n case 'gemini':\n return new GeminiProvider(target.name, target.config);\n case 'cli':\n return new CliProvider(target.name, target.config);\n case 'codex':\n return new CodexProvider(target.name, target.config);\n case 'copilot-cli':\n return new CopilotCliProvider(target.name, target.config);\n case 'pi-coding-agent':\n return new PiCodingAgentProvider(target.name, target.config);\n case 'pi-agent-sdk':\n return new PiAgentSdkProvider(target.name, target.config);\n case 'claude-code':\n return new ClaudeCodeProvider(target.name, target.config);\n case 'mock':\n return new MockProvider(target.name, target.config);\n case 'vscode':\n case 'vscode-insiders':\n return new VSCodeProvider(target.name, target.config, target.kind);\n default: {\n // Exhaustive check\n const neverTarget: never = target;\n throw new Error(`Unsupported provider kind ${(neverTarget as { kind: string }).kind}`);\n }\n }\n}\n\nexport function resolveAndCreateProvider(\n definition: TargetDefinition,\n env: EnvLookup = process.env,\n): Provider {\n const resolved = resolveTargetDefinition(definition, env);\n return createProvider(resolved);\n}\n","import type { EvaluationVerdict } from '../types.js';\n\nexport function scoreToVerdict(score: number): EvaluationVerdict {\n if (score >= 0.8) {\n return 'pass';\n }\n if (score >= 0.6) {\n return 'borderline';\n }\n return 'fail';\n}\n\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\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 return JSON.parse(blob);\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\n/**\n * Deep equality check for two values.\n * Handles primitives, arrays, and plain objects.\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","interface ExecOptions {\n readonly cwd?: string;\n readonly timeoutMs?: number;\n /** Additional environment variables to pass to the subprocess */\n readonly env?: Record<string, string>;\n}\n\nfunction shellEscapePath(value: string): string {\n if (process.platform === 'win32') {\n // Very small escape helper for file paths in cmd.exe context.\n // Wrap in double-quotes and escape existing double-quotes.\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n }\n // POSIX: single-quote escape (close/open around embedded single quotes).\n return `'${value.replaceAll(\"'\", `'\\\"'\\\"'`)}'`;\n}\n\n// IPC protocol: stdin/stdout JSON was chosen over JSON-RPC (overkill for one-shot eval),\n// HTTP (unnecessary network overhead for local scripts), and in-process (no isolation,\n// single-language only). Each evaluation is isolated by design for reproducibility and\n// safe parallelization. Process spawn overhead (~10-50ms) is acceptable for eval workloads.\nexport async function execFileWithStdin(\n argv: readonly string[],\n stdinPayload: string,\n options: ExecOptions = {},\n): Promise<{\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}> {\n if (argv.length === 0) {\n throw new Error('Executable argv must include at least one entry');\n }\n\n // Use Bun.spawn if available, otherwise fall back to Node.js child_process\n if (typeof Bun !== 'undefined') {\n return execFileWithStdinBun(argv, stdinPayload, options);\n }\n return execFileWithStdinNode(argv, stdinPayload, options);\n}\n\n/**\n * Bun implementation using Bun.spawn\n */\nasync function execFileWithStdinBun(\n argv: readonly string[],\n stdinPayload: string,\n options: ExecOptions,\n): Promise<{\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}> {\n const command = [...argv];\n const encoder = new TextEncoder();\n const proc = Bun.spawn(command, {\n cwd: options.cwd,\n stdin: encoder.encode(stdinPayload),\n stdout: 'pipe',\n stderr: 'pipe',\n // Merge additional env vars with process.env\n env: options.env ? { ...process.env, ...options.env } : process.env,\n });\n\n let timedOut = false;\n const timeout =\n options.timeoutMs !== undefined\n ? setTimeout(() => {\n timedOut = true;\n proc.kill('SIGKILL');\n }, options.timeoutMs)\n : undefined;\n\n try {\n const stdoutPromise = proc.stdout ? new Response(proc.stdout).text() : Promise.resolve('');\n const stderrPromise = proc.stderr ? new Response(proc.stderr).text() : Promise.resolve('');\n\n const [stdout, stderr, exitCode] = await Promise.all([\n stdoutPromise,\n stderrPromise,\n proc.exited,\n ]);\n\n if (timedOut) {\n throw new Error(`Process timed out after ${options.timeoutMs}ms`);\n }\n\n return {\n stdout: stdout.replace(/\\r\\n/g, '\\n'),\n stderr: stderr.replace(/\\r\\n/g, '\\n'),\n exitCode,\n };\n } finally {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n }\n}\n\n/**\n * Node.js implementation using child_process.spawn\n */\nasync function execFileWithStdinNode(\n argv: readonly string[],\n stdinPayload: string,\n options: ExecOptions,\n): Promise<{\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}> {\n const { spawn } = await import('node:child_process');\n\n return new Promise((resolve, reject) => {\n const [cmd, ...args] = argv;\n const child = spawn(cmd, args, {\n cwd: options.cwd,\n stdio: ['pipe', 'pipe', 'pipe'],\n // Merge additional env vars with process.env\n env: options.env ? { ...process.env, ...options.env } : process.env,\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n child.stdout?.on('data', (chunk: Buffer) => stdoutChunks.push(chunk));\n child.stderr?.on('data', (chunk: Buffer) => stderrChunks.push(chunk));\n\n let timedOut = false;\n const timeout =\n options.timeoutMs !== undefined\n ? setTimeout(() => {\n timedOut = true;\n child.kill('SIGKILL');\n }, options.timeoutMs)\n : undefined;\n\n child.on('error', (error) => {\n if (timeout !== undefined) clearTimeout(timeout);\n reject(error);\n });\n\n child.on('close', (code) => {\n if (timeout !== undefined) clearTimeout(timeout);\n\n if (timedOut) {\n reject(new Error(`Process timed out after ${options.timeoutMs}ms`));\n return;\n }\n\n const stdout = Buffer.concat(stdoutChunks).toString('utf8').replace(/\\r\\n/g, '\\n');\n const stderr = Buffer.concat(stderrChunks).toString('utf8').replace(/\\r\\n/g, '\\n');\n\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 0,\n });\n });\n\n // Write stdin and close\n if (child.stdin) {\n child.stdin.write(stdinPayload);\n child.stdin.end();\n }\n });\n}\n\n/**\n * Execute a shell command with the given stdin payload.\n *\n * Why this exists:\n * - Some providers/scripts (notably Node.js) must receive stdin reliably.\n * - In some Bun environments, `Bun.spawn` does not forward stdin to Node correctly.\n * - Capture stdout/stderr via temp files to avoid pipe incompatibilities.\n */\nexport async function execShellWithStdin(\n command: string,\n stdinPayload: string,\n options: ExecOptions = {},\n): Promise<{\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}> {\n const { mkdir, readFile, rm, writeFile } = await import('node:fs/promises');\n const { tmpdir } = await import('node:os');\n const path = await import('node:path');\n const { randomUUID } = await import('node:crypto');\n\n const dir = path.join(tmpdir(), `agentv-exec-${randomUUID()}`);\n await mkdir(dir, { recursive: true });\n\n const stdinPath = path.join(dir, 'stdin.txt');\n const stdoutPath = path.join(dir, 'stdout.txt');\n const stderrPath = path.join(dir, 'stderr.txt');\n\n await writeFile(stdinPath, stdinPayload, 'utf8');\n\n const wrappedCommand =\n process.platform === 'win32'\n ? `(${command}) < ${shellEscapePath(stdinPath)} > ${shellEscapePath(stdoutPath)} 2> ${shellEscapePath(stderrPath)}`\n : `(${command}) < ${shellEscapePath(stdinPath)} > ${shellEscapePath(stdoutPath)} 2> ${shellEscapePath(stderrPath)}`;\n\n const { spawn } = await import('node:child_process');\n try {\n const exitCode = await new Promise<number>((resolve, reject) => {\n const child = spawn(wrappedCommand, {\n shell: true,\n cwd: options.cwd,\n stdio: ['ignore', 'ignore', 'ignore'],\n // Merge additional env vars with process.env\n env: options.env ? { ...process.env, ...options.env } : process.env,\n });\n\n const timeout = options.timeoutMs\n ? setTimeout(() => {\n child.kill();\n reject(new Error(`Process timed out after ${options.timeoutMs}ms`));\n }, options.timeoutMs)\n : undefined;\n\n child.on('error', (error) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n reject(error);\n });\n\n child.on('exit', (code) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n resolve(code ?? 0);\n });\n });\n\n const stdout = (await readFile(stdoutPath, 'utf8')).replace(/\\r\\n/g, '\\n');\n const stderr = (await readFile(stderrPath, 'utf8')).replace(/\\r\\n/g, '\\n');\n return { stdout, stderr, exitCode };\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n}\n","/**\n * Local HTTP proxy server for target invocations from code_judge 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';\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 outputMessages: readonly unknown[];\n readonly rawText?: string;\n}\n\n/**\n * Proxy usage metadata recorded after execution\n */\nexport interface TargetProxyUsageMetadata {\n readonly callCount: number;\n readonly maxCalls: number;\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\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 // Extract output messages and rawText\n const outputMessages = response.outputMessages ?? [];\n const rawText = extractLastAssistantContent(outputMessages);\n\n const result: TargetProxyInvokeResponse = {\n outputMessages,\n rawText,\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 outputMessages: [],\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 outputMessages: [],\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 const outputMessages = response.outputMessages ?? [];\n responses.push({\n outputMessages,\n rawText: extractLastAssistantContent(outputMessages),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n responses.push({\n outputMessages: [],\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 }),\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 * evalId -> eval_id\n * candidateAnswer -> candidate_answer\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 { 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 { JsonObject, TargetAccessConfig } from '../types.js';\nimport { clampScore, isNonEmptyString, parseJsonSafe, scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } from './types.js';\n\nexport interface CodeEvaluatorOptions {\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 for the script */\n readonly target?: TargetAccessConfig;\n}\n\nexport class CodeEvaluator implements Evaluator {\n readonly kind = 'code';\n\n private readonly script: 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: CodeEvaluatorOptions) {\n this.script = 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 // Build payload (camelCase internally, converted to snake_case for judges)\n const payload = {\n question: context.evalCase.question,\n expectedOutcome: context.evalCase.expected_outcome,\n expectedMessages: context.evalCase.expected_messages,\n referenceAnswer: context.evalCase.reference_answer,\n candidateAnswer: context.candidate,\n outputMessages: context.outputMessages ?? null,\n guidelineFiles: context.evalCase.guideline_paths,\n inputFiles: context.evalCase.file_paths.filter(\n (path) => !context.evalCase.guideline_paths.includes(path),\n ),\n inputMessages: context.evalCase.input_messages,\n traceSummary: context.traceSummary ?? 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 judge 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 try {\n const stdout = await executeScript(\n this.script,\n inputPayload,\n this.agentTimeoutMs,\n this.cwd,\n proxyEnv,\n );\n const parsed = parseJsonSafe(stdout);\n const score = clampScore(typeof parsed?.score === 'number' ? parsed.score : 0);\n const hits = Array.isArray(parsed?.hits) ? parsed.hits.filter(isNonEmptyString) : [];\n const misses = Array.isArray(parsed?.misses) ? parsed.misses.filter(isNonEmptyString) : [];\n const reasoning = typeof parsed?.reasoning === 'string' ? parsed.reasoning : undefined;\n // 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 evaluatorRawRequest: JsonObject = {\n script: this.script,\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 hits,\n misses,\n expectedAspectCount: hits.length + misses.length || 1,\n reasoning,\n evaluatorRawRequest,\n ...(details ? { details } : {}),\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 hits: [],\n misses: [`Code evaluator failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n evaluatorRawRequest: {\n script: this.script,\n ...(this.cwd ? { cwd: this.cwd } : {}),\n ...(proxyUsage\n ? {\n target_proxy: {\n call_count: proxyUsage.callCount,\n max_calls: proxyUsage.maxCalls,\n },\n }\n : {}),\n error: message,\n },\n };\n } finally {\n // Always shut down the proxy when done\n if (proxyShutdown) {\n await proxyShutdown();\n }\n }\n }\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 } =\n typeof scriptPath === 'string'\n ? await execShellWithStdin(scriptPath, input, { cwd, timeoutMs: agentTimeoutMs, env })\n : await execFileWithStdin(scriptPath, input, { cwd, timeoutMs: agentTimeoutMs, env });\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","import { generateText } from 'ai';\n\nimport { extractLastAssistantContent } from '../providers/types.js';\nimport type { CompositeAggregatorConfig, CompositeEvaluatorConfig, JsonObject } from '../types.js';\nimport { executeScript } from './code-evaluator.js';\nimport { buildOutputSchema, freeformEvaluationSchema } from './llm-judge.js';\nimport {\n clampScore,\n isNonEmptyString,\n parseJsonFromText,\n parseJsonSafe,\n scoreToVerdict,\n} from './scoring.js';\nimport type {\n ChildEvaluatorResult,\n EvaluationContext,\n EvaluationScore,\n Evaluator,\n EvaluatorFactory,\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 evaluator results.\nReturn a JSON object with: score (0.0-1.0), verdict (pass/fail/borderline), and reasoning.`;\n\nexport interface CompositeEvaluatorOptions {\n readonly config: CompositeEvaluatorConfig;\n readonly evaluatorFactory: EvaluatorFactory;\n readonly cwd?: string;\n}\n\nexport class CompositeEvaluator implements Evaluator {\n readonly kind = 'composite';\n\n private readonly config: CompositeEvaluatorConfig;\n private readonly evaluatorFactory: EvaluatorFactory;\n private readonly cwd?: string;\n\n constructor(options: CompositeEvaluatorOptions) {\n this.config = options.config;\n this.evaluatorFactory = options.evaluatorFactory;\n this.cwd = options.cwd;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n // 1. Instantiate and run evaluators in parallel\n const memberResults = await Promise.all(\n this.config.evaluators.map(async (memberConfig) => {\n const evaluator = this.evaluatorFactory.create(memberConfig, context);\n return {\n id: memberConfig.name,\n type: memberConfig.type,\n result: await evaluator.evaluate(context),\n };\n }),\n );\n\n // 2. Aggregate results\n return this.aggregate(memberResults, context);\n }\n\n private async aggregate(\n results: readonly MemberResult[],\n context: EvaluationContext,\n ): Promise<EvaluationScore> {\n const aggregator = this.config.aggregator;\n\n switch (aggregator.type) {\n case 'code_judge':\n return this.runCodeAggregator(results, aggregator.path, aggregator.cwd ?? this.cwd);\n case 'llm_judge':\n return this.runLlmAggregator(results, context, aggregator);\n default:\n return this.runWeightedAverage(results, aggregator.weights);\n }\n }\n\n private runWeightedAverage(\n results: readonly MemberResult[],\n weights?: Record<string, number>,\n ): EvaluationScore {\n let totalWeight = 0;\n let weightedSum = 0;\n const allHits: string[] = [];\n const allMisses: string[] = [];\n const reasoningParts: string[] = [];\n const evaluatorResults: ChildEvaluatorResult[] = [];\n\n for (const member of results) {\n const weight = weights?.[member.id] ?? 1.0;\n totalWeight += weight;\n weightedSum += member.result.score * weight;\n allHits.push(...member.result.hits.map((h) => `[${member.id}] ${h}`));\n allMisses.push(...member.result.misses.map((m) => `[${member.id}] ${m}`));\n if (member.result.reasoning) {\n reasoningParts.push(`${member.id}: ${member.result.reasoning}`);\n }\n\n // Build child result entry\n evaluatorResults.push({\n name: member.id,\n type: member.type,\n score: member.result.score,\n weight,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n evaluatorResults: member.result.evaluatorResults,\n details: member.result.details,\n });\n }\n\n const finalScore = totalWeight > 0 ? weightedSum / totalWeight : 0;\n\n return {\n score: clampScore(finalScore),\n verdict: scoreToVerdict(finalScore),\n hits: allHits,\n misses: allMisses,\n expectedAspectCount: Math.max(allHits.length + allMisses.length, 1),\n reasoning: reasoningParts.length > 0 ? reasoningParts.join('; ') : undefined,\n evaluatorRawRequest: {\n aggregator: 'weighted_average',\n ...(weights ? { weights } : {}),\n },\n evaluatorResults,\n };\n }\n\n private async runCodeAggregator(\n results: readonly MemberResult[],\n scriptPath: string,\n cwd?: string,\n weights?: Record<string, number>,\n ): Promise<EvaluationScore> {\n const resultsObject = Object.fromEntries(results.map((r) => [r.id, r.result]));\n const inputPayload = JSON.stringify({ results: resultsObject }, null, 2);\n\n // Build child results for output\n const evaluatorResults: ChildEvaluatorResult[] = results.map((member) => ({\n name: member.id,\n type: member.type,\n score: member.result.score,\n weight: weights?.[member.id] ?? 1.0,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n evaluatorResults: member.result.evaluatorResults,\n 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 hits = Array.isArray(parsed?.hits) ? parsed.hits.filter(isNonEmptyString) : [];\n const misses = Array.isArray(parsed?.misses) ? parsed.misses.filter(isNonEmptyString) : [];\n const reasoning = typeof parsed?.reasoning === 'string' ? parsed.reasoning : undefined;\n const verdict =\n typeof parsed?.verdict === 'string' &&\n (parsed.verdict === 'pass' || parsed.verdict === 'fail' || parsed.verdict === 'borderline')\n ? parsed.verdict\n : scoreToVerdict(score);\n\n return {\n score,\n verdict,\n hits,\n misses,\n expectedAspectCount: hits.length + misses.length || 1,\n reasoning,\n evaluatorRawRequest: {\n aggregator: 'code_judge',\n script: scriptPath,\n },\n evaluatorResults,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Code aggregator failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n evaluatorRawRequest: {\n aggregator: 'code_judge',\n script: scriptPath,\n error: message,\n },\n evaluatorResults,\n };\n }\n }\n\n private async runLlmAggregator(\n results: readonly MemberResult[],\n context: EvaluationContext,\n config: Extract<CompositeAggregatorConfig, { type: 'llm_judge' }>,\n ): Promise<EvaluationScore> {\n const judgeProvider = context.judgeProvider;\n if (!judgeProvider) {\n throw new Error('No judge provider available for LLM aggregation');\n }\n\n const resultsObject = Object.fromEntries(results.map((r) => [r.id, r.result]));\n const resultsJson = JSON.stringify(resultsObject, null, 2);\n\n // Build child results for output\n const evaluatorResults: ChildEvaluatorResult[] = results.map((member) => ({\n name: member.id,\n type: member.type,\n score: member.result.score,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n evaluatorResults: member.result.evaluatorResults,\n 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 evaluatorRawRequest: JsonObject = {\n aggregator: 'llm_judge',\n userPrompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n try {\n const model = judgeProvider.asLanguageModel?.();\n if (model) {\n const { text } = await generateText({\n model,\n system: systemPrompt,\n prompt: userPrompt,\n });\n\n const data = freeformEvaluationSchema.parse(parseJsonFromText(text));\n const score = clampScore(data.score);\n // Cap hits/misses at 4 items to keep LLM judge output concise and focused\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: Math.max(hits.length + misses.length, 1),\n reasoning,\n evaluatorRawRequest,\n evaluatorResults,\n };\n }\n\n const response = await judgeProvider.invoke({\n question: userPrompt,\n systemPrompt,\n evalCaseId: context.evalCase.id,\n attempt: context.attempt,\n });\n\n const data = freeformEvaluationSchema.parse(\n parseJsonFromText(extractLastAssistantContent(response.outputMessages)),\n );\n const score = clampScore(data.score);\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: Math.max(hits.length + misses.length, 1),\n reasoning,\n evaluatorRawRequest,\n evaluatorResults,\n };\n } catch {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [],\n expectedAspectCount: 1,\n evaluatorRawRequest,\n evaluatorResults,\n };\n }\n }\n}\n","import { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport type { Provider, ProviderResponse } from '../providers/types.js';\nimport { extractLastAssistantContent } from '../providers/types.js';\nimport { TEMPLATE_VARIABLES } from '../template-variables.js';\nimport type { JsonObject, RubricItem } from '../types.js';\nimport { clampScore, isNonEmptyString, parseJsonFromText, scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } from './types.js';\n\n/**\n * Default evaluator template for the user prompt (variables will be substituted).\n * Custom evaluators can override this via evaluatorTemplate option.\n */\nconst DEFAULT_EVALUATOR_TEMPLATE = `You are an expert evaluator. Your goal is to grade the candidate_answer based on how well it achieves the expected_outcome for the original task.\n\nUse the reference_answer as a gold standard for a high-quality response (if provided). The 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 candidate_answer does not need to match it verbatim, but should capture the key points and follow the same spirit.\n\nBe concise and focused in your evaluation. Provide succinct, specific feedback rather than verbose explanations.\n\n[[ ## expected_outcome ## ]]\n{{${TEMPLATE_VARIABLES.EXPECTED_OUTCOME}}}\n\n[[ ## question ## ]]\n{{${TEMPLATE_VARIABLES.QUESTION}}}\n\n[[ ## reference_answer ## ]]\n{{${TEMPLATE_VARIABLES.REFERENCE_ANSWER}}}\n\n[[ ## candidate_answer ## ]]\n{{${TEMPLATE_VARIABLES.CANDIDATE_ANSWER}}}`;\n\ntype JudgeProviderResolver = (context: EvaluationContext) => Promise<Provider | undefined>;\n\nexport interface LlmJudgeEvaluatorOptions {\n readonly resolveJudgeProvider: JudgeProviderResolver;\n readonly maxOutputTokens?: number;\n readonly temperature?: number;\n readonly evaluatorTemplate?: string;\n}\n\nconst freeformEvaluationSchema = z.object({\n score: z.number().min(0).max(1).describe('Score between 0.0 and 1.0'),\n hits: z.array(z.string()).describe('Brief specific achievements').optional(),\n misses: z.array(z.string()).describe('Brief failures or omissions').optional(),\n reasoning: z.string().describe('Concise explanation (1-2 sentences)').optional(),\n});\n\nconst rubricCheckResultSchema = z.object({\n id: z.string().describe('The ID of the rubric item being checked'),\n satisfied: z.boolean().describe('Whether this rubric requirement is met'),\n reasoning: z.string().describe('Brief explanation (1-2 sentences) for this check'),\n});\n\nconst rubricEvaluationSchema = z.object({\n checks: z.array(rubricCheckResultSchema).describe('Results for each rubric item'),\n overall_reasoning: z.string().describe('Overall assessment summary (1-2 sentences)'),\n});\n\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 };\n\nexport class LlmJudgeEvaluator implements Evaluator {\n readonly kind = 'llm_judge';\n\n private readonly resolveJudgeProvider: JudgeProviderResolver;\n private readonly maxOutputTokens?: number;\n private readonly temperature?: number;\n private readonly evaluatorTemplate?: string;\n\n constructor(options: LlmJudgeEvaluatorOptions) {\n this.resolveJudgeProvider = options.resolveJudgeProvider;\n this.maxOutputTokens = options.maxOutputTokens;\n this.temperature = options.temperature;\n this.evaluatorTemplate = options.evaluatorTemplate;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n const judgeProvider = await this.resolveJudgeProvider(context);\n if (!judgeProvider) {\n throw new Error('No judge provider available for LLM grading');\n }\n\n const config = context.evaluator;\n if (config?.type === 'llm_judge' && config.rubrics && config.rubrics.length > 0) {\n return this.evaluateWithRubrics(context, judgeProvider, config.rubrics);\n }\n\n return this.evaluateFreeform(context, judgeProvider);\n }\n\n private async evaluateFreeform(\n context: EvaluationContext,\n judgeProvider: Provider,\n ): Promise<EvaluationScore> {\n const formattedQuestion =\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\n ? context.promptInputs.question\n : context.evalCase.question;\n\n // Prepare template variables for substitution\n const variables = {\n [TEMPLATE_VARIABLES.INPUT_MESSAGES]: JSON.stringify(context.evalCase.input_segments, null, 2),\n [TEMPLATE_VARIABLES.EXPECTED_MESSAGES]: JSON.stringify(\n context.evalCase.expected_messages,\n null,\n 2,\n ),\n [TEMPLATE_VARIABLES.OUTPUT_MESSAGES]: JSON.stringify(context.outputMessages ?? [], null, 2),\n [TEMPLATE_VARIABLES.CANDIDATE_ANSWER]: context.candidate.trim(),\n [TEMPLATE_VARIABLES.REFERENCE_ANSWER]: (context.evalCase.reference_answer ?? '').trim(),\n [TEMPLATE_VARIABLES.EXPECTED_OUTCOME]: context.evalCase.expected_outcome.trim(),\n [TEMPLATE_VARIABLES.QUESTION]: formattedQuestion.trim(),\n };\n\n // Build system prompt (only the mandatory output schema)\n const systemPrompt = buildOutputSchema();\n\n // Build user prompt based on custom template or default template\n const evaluatorTemplate =\n context.evaluatorTemplateOverride ?? this.evaluatorTemplate ?? DEFAULT_EVALUATOR_TEMPLATE;\n const userPrompt = substituteVariables(evaluatorTemplate, variables);\n\n const evaluatorRawRequest: JsonObject = {\n userPrompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n try {\n const { data } = await this.runWithRetry({\n context,\n judgeProvider,\n systemPrompt,\n userPrompt,\n schema: freeformEvaluationSchema,\n });\n\n const score = clampScore(data.score);\n // Cap hits/misses at 4 items to keep LLM judge output concise and focused\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning;\n const expectedAspectCount = Math.max(hits.length + misses.length, 1);\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount,\n reasoning,\n evaluatorRawRequest,\n };\n } catch {\n // Deliberate: parse failures yield score 0 silently — no warning emitted,\n // the zeroed score itself signals the failure to downstream consumers.\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [],\n expectedAspectCount: 1,\n evaluatorRawRequest,\n };\n }\n }\n\n private async evaluateWithRubrics(\n context: EvaluationContext,\n judgeProvider: Provider,\n rubrics: readonly RubricItem[],\n ): Promise<EvaluationScore> {\n if (!rubrics || rubrics.length === 0) {\n throw new Error(\n `No rubrics found for evaluator \"${context.evaluator?.name ?? 'llm_judge'}\". Run \"agentv generate rubrics\" first.`,\n );\n }\n\n // 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, judgeProvider, rubrics);\n }\n\n const prompt = this.buildRubricPrompt(context, rubrics);\n const systemPrompt = buildRubricOutputSchema();\n\n const evaluatorRawRequest: JsonObject = {\n userPrompt: prompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n const { data } = await this.runWithRetry({\n context,\n judgeProvider,\n systemPrompt,\n userPrompt: prompt,\n schema: rubricEvaluationSchema,\n });\n\n const { score, verdict, hits, misses } = calculateRubricScore(data, rubrics);\n\n return {\n score,\n verdict,\n hits,\n misses,\n expectedAspectCount: rubrics.length,\n reasoning: data.overall_reasoning,\n evaluatorRawRequest,\n };\n }\n\n /**\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 judgeProvider: Provider,\n rubrics: readonly RubricItem[],\n ): Promise<EvaluationScore> {\n const prompt = this.buildScoreRangePrompt(context, rubrics);\n const systemPrompt = buildScoreRangeOutputSchema();\n\n const evaluatorRawRequest: JsonObject = {\n userPrompt: prompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n const { data } = await this.runWithRetry({\n context,\n judgeProvider,\n systemPrompt,\n userPrompt: prompt,\n schema: scoreRangeEvaluationSchema,\n });\n\n const { score, verdict, hits, misses, details } = calculateScoreRangeResult(data, rubrics);\n\n return {\n score,\n verdict,\n hits,\n misses,\n expectedAspectCount: rubrics.length,\n reasoning: data.overall_reasoning,\n evaluatorRawRequest,\n details,\n };\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 evaluator. 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 '[[ ## expected_outcome ## ]]',\n context.evalCase.expected_outcome,\n '',\n ];\n\n if (context.evalCase.reference_answer && context.evalCase.reference_answer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', context.evalCase.reference_answer, '');\n }\n\n parts.push(\n '[[ ## candidate_answer ## ]]',\n context.candidate,\n '',\n '[[ ## scoring_criteria ## ]]',\n );\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.expected_outcome) {\n parts.push(`Description: ${rubric.expected_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.expected_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 evaluator. Evaluate the candidate answer against each rubric item below.',\n '',\n '[[ ## question ## ]]',\n formattedQuestion,\n '',\n '[[ ## expected_outcome ## ]]',\n context.evalCase.expected_outcome,\n '',\n ];\n\n if (context.evalCase.reference_answer && context.evalCase.reference_answer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', context.evalCase.reference_answer, '');\n }\n\n parts.push('[[ ## candidate_answer ## ]]', context.candidate, '', '[[ ## rubrics ## ]]');\n\n for (const rubric of rubrics) {\n const requiredLabel = rubric.required ? ' (REQUIRED)' : '';\n const weightLabel = rubric.weight !== 1.0 ? ` (weight: ${rubric.weight})` : '';\n parts.push(`- [${rubric.id}]${requiredLabel}${weightLabel}: ${rubric.expected_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 private async runWithRetry<T>(options: {\n readonly context: EvaluationContext;\n readonly judgeProvider: Provider;\n readonly systemPrompt: string;\n readonly userPrompt: string;\n readonly schema: z.ZodSchema<T>;\n }): Promise<{ data: T; providerResponse?: ProviderResponse }> {\n const { context, judgeProvider, systemPrompt, userPrompt, schema } = options;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n // Prefer Vercel AI SDK language model if available.\n const model = judgeProvider.asLanguageModel?.();\n if (model) {\n const { text } = await generateText({\n model,\n system: systemPrompt,\n prompt: userPrompt,\n ...(this.maxOutputTokens ? { maxTokens: this.maxOutputTokens } : {}),\n ...(typeof this.temperature === 'number' ? { temperature: this.temperature } : {}),\n });\n\n const data = schema.parse(parseJsonFromText(text));\n return { data };\n }\n\n const response = await judgeProvider.invoke({\n question: userPrompt,\n systemPrompt,\n evalCaseId: context.evalCase.id,\n attempt: context.attempt,\n maxOutputTokens: this.maxOutputTokens,\n temperature: this.temperature,\n });\n\n const data = schema.parse(\n parseJsonFromText(extractLastAssistantContent(response.outputMessages)),\n );\n return { data, providerResponse: response };\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n }\n }\n\n throw new Error(`Failed to parse evaluator response after 3 attempts: ${lastError?.message}`);\n }\n}\n\n/**\n * Build the mandatory output schema that all evaluators must follow.\n * This schema is always appended to the evaluator template.\n */\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 ' \"hits\": [<array of strings, max 4 items, brief specific achievements>],',\n ' \"misses\": [<array of strings, max 4 items, brief specific failures or omissions, empty if none>],',\n ' \"reasoning\": \"<string, concise explanation for the score, 1-2 sentences max>\"',\n '}',\n ].join('\\n');\n}\n\nfunction buildRubricOutputSchema(): string {\n return `You are an expert evaluator. Evaluate the candidate answer against each rubric item.\nYou must return a valid JSON object matching this schema:\n{\n \"checks\": [\n {\n \"id\": \"string (rubric id)\",\n \"satisfied\": boolean,\n \"reasoning\": \"string (brief explanation)\"\n }\n ],\n \"overall_reasoning\": \"string (summary)\"\n}`;\n}\n\nfunction 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\nfunction calculateRubricScore(\n result: z.infer<typeof rubricEvaluationSchema>,\n rubrics: readonly RubricItem[],\n): {\n score: number;\n verdict: 'pass' | 'fail' | 'borderline';\n hits: string[];\n misses: string[];\n} {\n const rubricMap = new Map(rubrics.map((rubric) => [rubric.id, rubric]));\n const hits: string[] = [];\n const misses: string[] = [];\n let totalWeight = 0;\n let earnedWeight = 0;\n let failedRequired = false;\n\n for (const check of result.checks) {\n const rubric = rubricMap.get(check.id);\n if (!rubric) {\n continue;\n }\n\n totalWeight += rubric.weight;\n\n if (check.satisfied) {\n earnedWeight += rubric.weight;\n hits.push(`[${rubric.id}] ${rubric.expected_outcome}: ${check.reasoning}`);\n } else {\n misses.push(`[${rubric.id}] ${rubric.expected_outcome}: ${check.reasoning}`);\n if (rubric.required) {\n failedRequired = true;\n }\n }\n }\n\n const score = totalWeight > 0 ? Math.min(1, Math.max(0, earnedWeight / totalWeight)) : 0;\n const verdict = failedRequired ? 'fail' : scoreToVerdict(score);\n return { score, verdict, hits, misses };\n}\n\n/**\n * Build the output schema for score-range rubric evaluation.\n */\nfunction buildScoreRangeOutputSchema(): string {\n return `You are an expert evaluator. 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: 'pass' | 'fail' | 'borderline';\n hits: string[];\n misses: string[];\n details: JsonObject;\n} {\n const rubricMap = new Map(rubrics.map((rubric) => [rubric.id, rubric]));\n const hits: string[] = [];\n const misses: string[] = [];\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:\n // - If required_min_score is set, use it directly\n // - If required is true (legacy), treat as required_min_score: 10\n // - Otherwise, no gating\n let requiredMinScore: number | undefined;\n if (rubric.required_min_score !== undefined) {\n requiredMinScore = rubric.required_min_score;\n } else if (rubric.required === true) {\n requiredMinScore = 10; // 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?.expected_outcome ?? '';\n const criterionLabel = rubric.expected_outcome ?? rubric.id;\n\n const reasoningText = check.reasoning ? `: ${check.reasoning}` : '';\n const scoreInfo = `[${rubric.id}] ${criterionLabel} - Score: ${rawScore}/10 (${rangeDescription})${reasoningText}`;\n\n // Check gating\n if (requiredMinScore !== undefined && rawScore < requiredMinScore) {\n failedRequired = true;\n misses.push(scoreInfo);\n } else if (rawScore >= 7) {\n hits.push(scoreInfo);\n } else {\n misses.push(scoreInfo);\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 hits,\n misses,\n details: {\n raw_scores: rawScores,\n normalization: 'score / 10',\n aggregation: 'weighted_average',\n },\n };\n}\n","import type { CostEvaluatorConfig } from '../types.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } from './types.js';\n\nexport interface CostEvaluatorOptions {\n readonly config: CostEvaluatorConfig;\n}\n\n/**\n * Evaluator that checks execution cost against a budget.\n * Uses traceSummary.costUsd from the evaluation context.\n */\nexport class CostEvaluator implements Evaluator {\n readonly kind = 'cost';\n\n private readonly config: CostEvaluatorConfig;\n\n constructor(options: CostEvaluatorOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { budget } = this.config;\n const costUsd = context.traceSummary?.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 hits: [],\n misses: ['No cost data available in trace'],\n expectedAspectCount: 1,\n reasoning: 'Execution cost not reported by provider',\n evaluatorRawRequest: {\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 hits: passed ? [`Cost ${formatCost(costUsd)} <= ${formatCost(budget)} budget`] : [],\n misses: passed ? [] : [`Cost ${formatCost(costUsd)} > ${formatCost(budget)} budget`],\n expectedAspectCount: 1,\n reasoning: `Execution cost ${formatCost(costUsd)} (budget: ${formatCost(budget)})`,\n evaluatorRawRequest: {\n type: 'cost',\n budget,\n costUsd,\n },\n };\n }\n}\n","import type { FieldAccuracyEvaluatorConfig, FieldConfig, JsonObject } from '../types.js';\nimport { clampScore, deepEqual, parseJsonFromText, scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } 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 FieldAccuracyEvaluatorOptions {\n readonly config: FieldAccuracyEvaluatorConfig;\n}\n\n/**\n * FieldAccuracyEvaluator compares extracted structured data against expected values\n * with configurable matching strategies (exact, fuzzy, numeric_tolerance, date).\n */\nexport class FieldAccuracyEvaluator implements Evaluator {\n readonly kind = 'field_accuracy';\n\n private readonly config: FieldAccuracyEvaluatorConfig;\n\n constructor(options: FieldAccuracyEvaluatorOptions) {\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 hits: [],\n misses: ['Failed to parse candidate answer as JSON'],\n expectedAspectCount: this.config.fields.length,\n reasoning: 'Candidate answer is not valid JSON',\n };\n }\n\n // Extract expected data from expected_messages\n const expectedData = this.extractExpectedData(evalCase.expected_messages);\n if (!expectedData) {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: ['No expected data found in expected_messages'],\n expectedAspectCount: this.config.fields.length,\n reasoning: 'Could not extract expected data from expected_messages',\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_messages 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 hits: string[] = [];\n const misses: string[] = [];\n\n for (const result of results) {\n if (result.hit) {\n hits.push(result.message);\n } else {\n misses.push(result.message);\n }\n }\n\n let score: number;\n if (aggregation === 'all_or_nothing') {\n // All fields must pass for score 1.0\n score = misses.length === 0 ? 1.0 : 0.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 const reasoning = `${hits.length}/${results.length} fields matched`;\n\n return {\n score: clampScore(score),\n verdict: scoreToVerdict(score),\n hits: hits.slice(0, 4), // Cap at 4 to keep output concise\n misses: misses.slice(0, 4),\n expectedAspectCount: results.length,\n reasoning,\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 { LatencyEvaluatorConfig } from '../types.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } from './types.js';\n\nexport interface LatencyEvaluatorOptions {\n readonly config: LatencyEvaluatorConfig;\n}\n\n/**\n * Evaluator that checks execution duration against a threshold.\n * Uses traceSummary.durationMs from the evaluation context.\n */\nexport class LatencyEvaluator implements Evaluator {\n readonly kind = 'latency';\n\n private readonly config: LatencyEvaluatorConfig;\n\n constructor(options: LatencyEvaluatorOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { threshold } = this.config;\n const durationMs = context.traceSummary?.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 hits: [],\n misses: ['No duration data available in trace'],\n expectedAspectCount: 1,\n reasoning: 'Execution duration not reported by provider',\n evaluatorRawRequest: {\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 hits: passed ? [`Duration ${durationMs}ms <= ${threshold}ms threshold`] : [],\n misses: passed ? [] : [`Duration ${durationMs}ms > ${threshold}ms threshold`],\n expectedAspectCount: 1,\n reasoning: `Execution took ${durationMs}ms (threshold: ${threshold}ms)`,\n evaluatorRawRequest: {\n type: 'latency',\n threshold,\n durationMs,\n },\n };\n }\n}\n","import type { TokenUsageEvaluatorConfig } from '../types.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } from './types.js';\n\nexport interface TokenUsageEvaluatorOptions {\n readonly config: TokenUsageEvaluatorConfig;\n}\n\n/**\n * Evaluator that checks provider-reported token usage against configured limits.\n * Uses traceSummary.tokenUsage from the evaluation context.\n */\nexport class TokenUsageEvaluator implements Evaluator {\n readonly kind = 'token_usage';\n\n private readonly config: TokenUsageEvaluatorConfig;\n\n constructor(options: TokenUsageEvaluatorOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const usage = context.traceSummary?.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 hits: [],\n misses: ['No token usage data available in trace'],\n expectedAspectCount,\n reasoning: 'Token usage not reported by provider',\n evaluatorRawRequest: {\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 hits: string[] = [];\n const misses: string[] = [];\n\n if (typeof maxInput === 'number') {\n if (input <= maxInput) {\n hits.push(`Input tokens ${input} <= ${maxInput}`);\n } else {\n misses.push(`Input tokens ${input} > ${maxInput}`);\n }\n }\n\n if (typeof maxOutput === 'number') {\n if (output <= maxOutput) {\n hits.push(`Output tokens ${output} <= ${maxOutput}`);\n } else {\n misses.push(`Output tokens ${output} > ${maxOutput}`);\n }\n }\n\n if (typeof maxTotal === 'number') {\n if (total <= maxTotal) {\n hits.push(`Total tokens ${total} <= ${maxTotal}`);\n } else {\n misses.push(`Total tokens ${total} > ${maxTotal}`);\n }\n }\n\n const passed = misses.length === 0;\n\n return {\n score: passed ? 1 : 0,\n verdict: passed ? 'pass' : 'fail',\n hits,\n misses,\n expectedAspectCount,\n reasoning: `token_usage input=${input}, output=${output}, cached=${cached}, total=${total}`,\n evaluatorRawRequest: {\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 { OutputMessage } from '../providers/types.js';\nimport type {\n ToolTrajectoryEvaluatorConfig,\n ToolTrajectoryExpectedItem,\n TraceSummary,\n} from '../trace.js';\nimport { deepEqual, scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } 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 * Check if actual args match expected args.\n * - 'any' → always matches\n * - object → partial match (only specified keys, deep equality)\n */\nfunction argsMatch(\n expected: ToolTrajectoryExpectedItem['args'],\n actual: Record<string, unknown> | undefined,\n): boolean {\n // No args constraint means match\n if (expected === undefined) return true;\n // 'any' means skip validation\n if (expected === 'any') return true;\n // Partial match: check only specified keys\n if (actual === undefined) return false;\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\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 ToolTrajectoryEvaluatorOptions {\n readonly config: ToolTrajectoryEvaluatorConfig;\n}\n\nexport class ToolTrajectoryEvaluator implements Evaluator {\n readonly kind = 'tool_trajectory';\n\n private readonly config: ToolTrajectoryEvaluatorConfig;\n\n constructor(options: ToolTrajectoryEvaluatorOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { outputMessages, traceSummary } = context;\n\n // Extract tool calls from outputMessages (primary source)\n const toolCalls = this.extractToolCallsFromMessages(outputMessages);\n\n // Handle missing tool calls\n if (toolCalls.length === 0 && !traceSummary) {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: ['No trace available for evaluation'],\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) : traceSummary;\n\n if (!summary) {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: ['No trace available for evaluation'],\n expectedAspectCount: 1,\n };\n }\n\n switch (this.config.mode) {\n case 'any_order':\n return this.evaluateAnyOrder(summary);\n case 'in_order':\n return this.evaluateInOrder(toolCalls);\n case 'exact':\n return this.evaluateExact(toolCalls);\n default:\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Unknown mode: ${this.config.mode}`],\n expectedAspectCount: 1,\n };\n }\n }\n\n /**\n * Extract tool calls from output messages.\n */\n private extractToolCallsFromMessages(\n messages: readonly OutputMessage[] | 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 const toolNames = Object.keys(toolCallsByName).sort();\n return {\n eventCount: toolCalls.length,\n toolNames,\n 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 hits: ['No tool requirements specified'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\n\n for (const toolName of toolNames) {\n const required = minimums[toolName];\n const actual = summary.toolCallsByName[toolName] ?? 0;\n if (actual >= required) {\n hits.push(`${toolName}: called ${actual} times (required ≥${required})`);\n } else {\n misses.push(`${toolName}: called ${actual} times (required ≥${required})`);\n }\n }\n\n const score = hits.length / toolNames.length;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\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 hits: ['No tool sequence specified'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\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 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)) {\n hits.push(`Found ${expectedTool} at position ${actualIndex}`);\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 misses.push(\n `Expected ${expectedTool} at position ${i}: tool found at ${actualIndex} but args mismatch`,\n );\n actualIndex++;\n argsMismatch = true;\n break;\n }\n actualIndex++;\n }\n\n if (!found && !argsMismatch) {\n misses.push(`Expected ${expectedTool} at position ${i}, not found in remaining trace`);\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 hits.push(latencyResult.message);\n latencyHits++;\n } else if (latencyResult.status === 'fail') {\n misses.push(latencyResult.message);\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 hits,\n misses,\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 hits: ['No tool sequence specified'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\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 misses.push(`Expected ${expected.length} tool calls, got ${toolCalls.length}`);\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 let sequenceMatched = false;\n\n if (actualTool === expectedTool) {\n // Tool name matches, check args if specified\n if (argsMatch(expectedItem.args, actualCall.args)) {\n hits.push(`Position ${i}: ${expectedTool}`);\n sequenceHits++;\n sequenceMatched = true;\n } else {\n misses.push(`Position ${i}: ${expectedTool} args mismatch`);\n }\n } else {\n misses.push(`Position ${i}: expected ${expectedTool}, got ${actualTool}`);\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 hits.push(latencyResult.message);\n latencyHits++;\n } else if (latencyResult.status === 'fail') {\n misses.push(latencyResult.message);\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 misses.push(`Position ${i}: expected ${expected[i].tool}, got nothing`);\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 hits,\n misses,\n expectedAspectCount: totalAssertions,\n };\n }\n}\n","import { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\nimport pLimit from 'p-limit';\n\nimport { toSnakeCaseDeep } from './case-conversion.js';\nimport {\n type ChildEvaluatorResult,\n CodeEvaluator,\n CompositeEvaluator,\n CostEvaluator,\n type EvaluationScore,\n type Evaluator,\n FieldAccuracyEvaluator,\n LatencyEvaluator,\n LlmJudgeEvaluator,\n TokenUsageEvaluator,\n ToolTrajectoryEvaluator,\n executeScript,\n isNonEmptyString,\n scoreToVerdict,\n} from './evaluators.js';\nimport { readJsonFile, readTextFile } from './file-utils.js';\nimport { createProvider } from './providers/index.js';\nimport { type ResolvedTarget, resolveTargetDefinition } from './providers/targets.js';\nimport type {\n EnvLookup,\n OutputMessage,\n Provider,\n ProviderRequest,\n ProviderResponse,\n TargetDefinition,\n} from './providers/types.js';\nimport { extractLastAssistantContent, isAgentProvider } from './providers/types.js';\nimport {\n type ToolTrajectoryEvaluatorConfig,\n type TraceSummary,\n computeTraceSummary,\n mergeExecutionMetrics,\n} from './trace.js';\nimport type {\n CostEvaluatorConfig,\n EvalCase,\n EvaluationResult,\n EvaluationVerdict,\n EvaluatorConfig,\n EvaluatorKind,\n EvaluatorResult,\n FieldAccuracyEvaluatorConfig,\n JsonObject,\n JsonValue,\n LatencyEvaluatorConfig,\n TokenUsageEvaluatorConfig,\n} from './types.js';\nimport { type PromptInputs, buildPromptInputs, loadEvalCases } from './yaml-parser.js';\n\ntype MaybePromise<T> = T | Promise<T>;\n\nfunction usesFileReferencePrompt(provider: Provider): boolean {\n return isAgentProvider(provider) || provider.kind === 'cli';\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: EvalCase;\n readonly provider: Provider;\n readonly target: ResolvedTarget;\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\n readonly now?: () => Date;\n readonly maxRetries?: number;\n readonly agentTimeoutMs?: number;\n readonly cache?: EvaluationCache;\n readonly useCache?: boolean;\n readonly signal?: AbortSignal;\n readonly judgeProvider?: Provider;\n /** Resolver for target override in code judges */\n readonly targetResolver?: (name: string) => Provider | undefined;\n /** List of available target names for code judges */\n readonly availableTargets?: readonly string[];\n}\n\nexport interface ProgressEvent {\n readonly workerId: number;\n readonly evalId: string;\n readonly status: 'pending' | 'running' | 'completed' | 'failed';\n readonly startedAt?: number;\n readonly completedAt?: number;\n readonly error?: string;\n}\n\nexport interface RunEvaluationOptions {\n readonly testFilePath: string;\n readonly repoRoot: URL | string;\n readonly target: ResolvedTarget;\n readonly targets?: readonly TargetDefinition[];\n readonly env?: EnvLookup;\n readonly providerFactory?: (target: ResolvedTarget) => Provider;\n readonly evaluators?: Partial<Record<string, Evaluator>>;\n readonly maxRetries?: number;\n readonly agentTimeoutMs?: number;\n readonly cache?: EvaluationCache;\n readonly useCache?: boolean;\n readonly now?: () => Date;\n /** Filter eval cases by ID pattern (glob supported, e.g., \"summary-*\") */\n readonly filter?: string;\n readonly verbose?: boolean;\n readonly maxConcurrency?: number;\n readonly evalCases?: readonly EvalCase[];\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\n}\n\nexport async function runEvaluation(\n options: RunEvaluationOptions,\n): Promise<readonly EvaluationResult[]> {\n const {\n testFilePath: evalFilePath,\n repoRoot,\n target,\n targets,\n env,\n providerFactory,\n evaluators,\n maxRetries,\n agentTimeoutMs,\n cache,\n useCache,\n now,\n filter,\n verbose,\n evalCases: preloadedEvalCases,\n onResult,\n onProgress,\n } = options;\n\n // Use pre-loaded eval cases if provided, otherwise load them\n const evalCases =\n preloadedEvalCases ?? (await loadEvalCases(evalFilePath, repoRoot, { verbose, filter }));\n\n const filteredEvalCases = filterEvalCases(evalCases, filter);\n if (filteredEvalCases.length === 0) {\n if (filter) {\n throw new Error(`No eval cases matched filter '${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 = targetDefinitions.get(name);\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 resolveJudgeProvider = async (\n targetContext: ResolvedTarget,\n ): Promise<Provider | undefined> => {\n const judgeName = targetContext.judgeTarget ?? targetContext.name;\n const resolvedJudge = resolveTargetByName(judgeName);\n if (!resolvedJudge) {\n return getOrCreateProvider(targetContext);\n }\n return getOrCreateProvider(resolvedJudge);\n };\n\n // Create a target resolver for code judges 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, resolveJudgeProvider);\n\n const primaryProvider = getOrCreateProvider(target);\n const providerSupportsBatch =\n target.providerBatching === true &&\n primaryProvider.supportsBatch === true &&\n typeof primaryProvider.invokeBatch === 'function';\n if (target.providerBatching && !providerSupportsBatch && verbose) {\n console.warn(\n `Provider batching requested for target '${target.name}', but provider does not advertise batch support. Using per-case dispatch.`,\n );\n }\n\n // Notify about total test count before starting\n if (onProgress && filteredEvalCases.length > 0) {\n // Emit initial pending events for all tests\n for (let i = 0; i < filteredEvalCases.length; i++) {\n await onProgress({\n workerId: i + 1,\n evalId: filteredEvalCases[i].id,\n status: 'pending',\n });\n }\n }\n\n if (providerSupportsBatch) {\n try {\n return await runBatchEvaluation({\n evalCases: filteredEvalCases,\n provider: primaryProvider,\n target,\n evaluatorRegistry,\n nowFn: now ?? (() => new Date()),\n onProgress,\n onResult,\n verbose,\n resolveJudgeProvider,\n agentTimeoutMs,\n targetResolver,\n availableTargets,\n });\n } catch (error) {\n if (verbose) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `Provider batch execution failed, falling back to per-case dispatch: ${message}`,\n );\n }\n }\n }\n\n // Resolve worker count: CLI option > target setting > default (1)\n const workers = options.maxConcurrency ?? target.workers ?? 1;\n const limit = pLimit(workers);\n\n // Track worker assignments for progress reporting\n let nextWorkerId = 1;\n const workerIdByEvalId = new Map<string, number>();\n\n // Map test cases to limited promises for parallel execution\n const promises = filteredEvalCases.map((evalCase) =>\n limit(async () => {\n // Assign worker ID when test starts executing\n const workerId = nextWorkerId++;\n workerIdByEvalId.set(evalCase.id, workerId);\n\n if (onProgress) {\n await onProgress({\n workerId,\n evalId: evalCase.id,\n status: 'running',\n startedAt: Date.now(),\n });\n }\n\n try {\n const judgeProvider = await resolveJudgeProvider(target);\n const result = await runEvalCase({\n evalCase: evalCase,\n provider: primaryProvider,\n target,\n evaluators: evaluatorRegistry,\n maxRetries,\n agentTimeoutMs,\n cache,\n useCache,\n now,\n judgeProvider,\n targetResolver,\n availableTargets,\n });\n\n if (onProgress) {\n await onProgress({\n workerId,\n evalId: evalCase.id,\n status: result.error ? 'failed' : 'completed',\n startedAt: 0, // Not used for completed status\n completedAt: Date.now(),\n error: result.error,\n });\n }\n\n if (onResult) {\n await onResult(result);\n }\n return result;\n } catch (error) {\n if (onProgress) {\n await onProgress({\n workerId,\n evalId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: error instanceof Error ? error.message : String(error),\n });\n }\n throw error;\n }\n }),\n );\n\n // Wait for all workers to complete\n const settled = await Promise.allSettled(promises);\n\n // Extract results, handling both fulfilled and rejected promises\n const results: EvaluationResult[] = [];\n for (let i = 0; i < settled.length; i++) {\n const outcome = settled[i];\n if (outcome.status === 'fulfilled') {\n results.push(outcome.value);\n } else {\n // Build error result for rejected promise\n const evalCase = filteredEvalCases[i];\n const 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 );\n results.push(errorResult);\n if (onResult) {\n await onResult(errorResult);\n }\n }\n }\n\n return results;\n}\n\nasync function runBatchEvaluation(options: {\n readonly evalCases: readonly EvalCase[];\n readonly provider: Provider;\n readonly target: ResolvedTarget;\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\n readonly llm_judge: Evaluator;\n };\n readonly nowFn: () => Date;\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\n readonly verbose?: boolean;\n readonly resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>;\n readonly agentTimeoutMs?: number;\n readonly targetResolver?: (name: string) => Provider | undefined;\n readonly availableTargets?: readonly string[];\n}): Promise<readonly EvaluationResult[]> {\n const {\n evalCases,\n provider,\n target,\n evaluatorRegistry,\n nowFn,\n onProgress,\n onResult,\n resolveJudgeProvider,\n agentTimeoutMs,\n targetResolver,\n availableTargets,\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 guidelines: promptInputs.guidelines,\n guideline_patterns: evalCase.guideline_patterns,\n inputFiles: evalCase.file_paths,\n evalCaseId: evalCase.id,\n metadata: {\n systemPrompt: promptInputs.systemMessage ?? '',\n },\n };\n });\n\n const batchResponse = await provider.invokeBatch?.(batchRequests);\n if (!Array.isArray(batchResponse)) {\n throw new Error('Provider batching failed: invokeBatch did not return an array');\n }\n if (batchResponse.length !== evalCases.length) {\n throw new Error(\n `Provider batching failed: expected ${evalCases.length} responses, received ${batchResponse.length}`,\n );\n }\n\n if (onProgress) {\n const startedAt = Date.now();\n for (let i = 0; i < evalCases.length; i++) {\n await onProgress({\n workerId: 1,\n evalId: evalCases[i].id,\n status: 'running',\n startedAt,\n });\n }\n }\n\n const results: EvaluationResult[] = [];\n for (let i = 0; i < evalCases.length; i++) {\n const evalCase = evalCases[i];\n const promptInputs = promptInputsList[i];\n const providerResponse = batchResponse[i];\n\n // Extract outputMessages from batch response\n const outputMessages = providerResponse.outputMessages;\n const hasExecutionMetrics =\n providerResponse.tokenUsage !== undefined ||\n providerResponse.costUsd !== undefined ||\n providerResponse.durationMs !== undefined;\n\n const baseSummary = outputMessages\n ? computeTraceSummary(outputMessages)\n : hasExecutionMetrics\n ? {\n eventCount: 0,\n toolNames: [],\n toolCallsByName: {},\n errorCount: 0,\n }\n : undefined;\n // Merge execution metrics from provider response\n const traceSummary = baseSummary\n ? mergeExecutionMetrics(baseSummary, {\n tokenUsage: providerResponse.tokenUsage,\n costUsd: providerResponse.costUsd,\n durationMs: providerResponse.durationMs,\n })\n : undefined;\n\n // Extract candidate from last assistant message in output_messages\n const candidate = extractLastAssistantContent(outputMessages);\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 promptInputs,\n nowFn,\n attempt: 0,\n judgeProvider: await resolveJudgeProvider(target),\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n targetResolver,\n availableTargets,\n });\n\n if (providerError) {\n result = { ...result, error: providerError };\n }\n } catch (error) {\n const errorResult = buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n error,\n promptInputs,\n provider,\n );\n results.push(errorResult);\n if (onResult) {\n await onResult(errorResult);\n }\n if (onProgress) {\n await onProgress({\n workerId: 1,\n evalId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: error instanceof Error ? error.message : String(error),\n });\n }\n continue;\n }\n\n results.push(result);\n if (onResult) {\n await onResult(result);\n }\n\n if (onProgress) {\n await onProgress({\n workerId: 1,\n evalId: evalCase.id,\n status: result.error ? 'failed' : 'completed',\n startedAt: 0,\n completedAt: Date.now(),\n error: result.error,\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 judgeProvider,\n targetResolver,\n availableTargets,\n } = options;\n\n const formattingMode = usesFileReferencePrompt(provider) ? 'agent' : 'lm';\n const promptInputs = await buildPromptInputs(evalCase, formattingMode);\n\n const cacheKey = useCache ? createCacheKey(provider, target, evalCase, promptInputs) : undefined;\n let cachedResponse: ProviderResponse | undefined;\n if (cacheKey && cache) {\n cachedResponse = await cache.get(cacheKey);\n }\n\n const nowFn = now ?? (() => new Date());\n\n const attemptBudget = (maxRetries ?? 0) + 1;\n let attempt = 0;\n let providerResponse: ProviderResponse | undefined = cachedResponse;\n let lastError: unknown;\n\n while (!providerResponse && attempt < attemptBudget) {\n try {\n providerResponse = await invokeProvider(provider, {\n evalCase: evalCase,\n target,\n promptInputs,\n attempt,\n agentTimeoutMs,\n signal,\n });\n } catch (error) {\n lastError = error;\n if (isTimeoutLike(error) && attempt + 1 < attemptBudget) {\n attempt += 1;\n continue;\n }\n return buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs, provider);\n }\n }\n\n if (!providerResponse) {\n return buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n lastError ?? new Error('Provider did not return a response'),\n promptInputs,\n provider,\n );\n }\n\n if (cacheKey && cache && !cachedResponse) {\n await cache.set(cacheKey, providerResponse);\n }\n\n // Extract outputMessages from provider response\n const outputMessages = providerResponse.outputMessages;\n\n const hasExecutionMetrics =\n providerResponse.tokenUsage !== undefined ||\n providerResponse.costUsd !== undefined ||\n providerResponse.durationMs !== undefined;\n\n // Compute trace summary if outputMessages available. If not, still preserve execution metrics.\n const baseSummary = outputMessages\n ? computeTraceSummary(outputMessages)\n : hasExecutionMetrics\n ? {\n eventCount: 0,\n toolNames: [],\n toolCallsByName: {},\n errorCount: 0,\n }\n : undefined;\n // Merge execution metrics from provider response\n const traceSummary = baseSummary\n ? mergeExecutionMetrics(baseSummary, {\n tokenUsage: providerResponse.tokenUsage,\n costUsd: providerResponse.costUsd,\n durationMs: providerResponse.durationMs,\n })\n : undefined;\n\n // Extract candidate from last assistant message in output_messages\n const candidate = extractLastAssistantContent(outputMessages);\n\n const providerError = extractProviderError(providerResponse);\n\n try {\n const result = await evaluateCandidate({\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n promptInputs,\n nowFn,\n attempt,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n targetResolver,\n availableTargets,\n });\n\n return providerError ? { ...result, error: providerError } : result;\n } catch (error) {\n return buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs, provider);\n }\n}\n\nasync function evaluateCandidate(options: {\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\n readonly promptInputs: PromptInputs;\n readonly nowFn: () => Date;\n readonly attempt: number;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly outputMessages?: readonly OutputMessage[];\n readonly traceSummary?: TraceSummary;\n readonly targetResolver?: (name: string) => Provider | undefined;\n readonly availableTargets?: readonly string[];\n}): Promise<EvaluationResult> {\n const {\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n promptInputs,\n nowFn,\n attempt,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n targetResolver,\n availableTargets,\n } = options;\n\n const gradeTimestamp = nowFn();\n const { score, evaluatorResults } = await runEvaluatorsForCase({\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n attempt,\n promptInputs,\n now: gradeTimestamp,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n targetResolver,\n availableTargets,\n });\n\n const completedAt = nowFn();\n\n let agentProviderRequest: JsonObject | undefined;\n let lmProviderRequest: JsonObject | undefined;\n\n if (isAgentProvider(provider)) {\n agentProviderRequest = {\n question: promptInputs.question,\n guideline_paths: evalCase.guideline_paths,\n } as JsonObject;\n } else {\n if (promptInputs.chatPrompt) {\n lmProviderRequest = {\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\n } as JsonObject;\n } else {\n lmProviderRequest = {\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n } as JsonObject;\n }\n }\n\n return {\n timestamp: completedAt.toISOString(),\n evalId: evalCase.id,\n dataset: evalCase.dataset,\n conversationId: evalCase.conversation_id,\n score: score.score,\n hits: score.hits,\n misses: score.misses,\n candidateAnswer: candidate,\n target: target.name,\n reasoning: score.reasoning,\n agentProviderRequest: agentProviderRequest,\n lmProviderRequest: lmProviderRequest,\n evaluatorProviderRequest: evaluatorResults ? undefined : score.evaluatorRawRequest,\n evaluatorResults: evaluatorResults,\n traceSummary: traceSummary,\n };\n}\n\nasync function runEvaluatorsForCase(options: {\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly outputMessages?: readonly OutputMessage[];\n readonly traceSummary?: TraceSummary;\n readonly targetResolver?: (name: string) => Provider | undefined;\n readonly availableTargets?: readonly string[];\n}): Promise<{ score: EvaluationScore; evaluatorResults?: EvaluatorResult[] }> {\n const {\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n targetResolver,\n availableTargets,\n } = options;\n\n if (evalCase.evaluators && evalCase.evaluators.length > 0) {\n return runEvaluatorList({\n evalCase,\n evaluators: evalCase.evaluators,\n candidate,\n target,\n provider,\n evaluatorRegistry: evaluators,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n targetResolver,\n availableTargets,\n });\n }\n\n const evaluatorKind = evalCase.evaluator ?? 'llm_judge';\n const activeEvaluator = evaluators[evaluatorKind] ?? evaluators.llm_judge;\n if (!activeEvaluator) {\n throw new Error(`No evaluator registered for kind '${evaluatorKind}'`);\n }\n\n const score = await activeEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n outputMessages,\n traceSummary,\n targetResolver,\n availableTargets,\n });\n\n return { score };\n}\n\nasync function runEvaluatorList(options: {\n readonly evalCase: EvalCase;\n readonly evaluators: readonly EvaluatorConfig[];\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\n readonly llm_judge: Evaluator;\n };\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly outputMessages?: readonly OutputMessage[];\n readonly traceSummary?: TraceSummary;\n readonly targetResolver?: (name: string) => Provider | undefined;\n readonly availableTargets?: readonly string[];\n}): Promise<{ score: EvaluationScore; evaluatorResults: EvaluatorResult[] }> {\n const {\n evalCase,\n evaluators,\n candidate,\n target,\n provider,\n evaluatorRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n targetResolver,\n availableTargets,\n } = options;\n\n const scored: Array<{\n readonly score: EvaluationScore;\n readonly name: string;\n readonly type: string;\n readonly weight?: number;\n }> = [];\n const evaluatorResults: EvaluatorResult[] = [];\n\n for (const evaluator of evaluators ?? []) {\n try {\n if (evaluator.type === 'llm_judge') {\n const score = await runLlmJudgeEvaluator({\n config: evaluator,\n evalCase,\n candidate,\n target,\n provider,\n evaluatorRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n outputMessages,\n traceSummary,\n agentTimeoutMs,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n evaluatorProviderRequest: score.evaluatorRawRequest,\n });\n }\n\n if (evaluator.type === 'code') {\n const codeEvaluator = new CodeEvaluator({\n script: evaluator.script,\n cwd: evaluator.resolvedCwd ?? evaluator.cwd,\n agentTimeoutMs,\n config: evaluator.config,\n target: evaluator.target,\n });\n const score = await codeEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n outputMessages,\n traceSummary,\n targetResolver,\n availableTargets,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: 'code_judge', weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: 'code_judge',\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n evaluatorProviderRequest: score.evaluatorRawRequest,\n details: score.details,\n });\n }\n\n if (evaluator.type === 'composite') {\n const evalFileDir = evalCase.guideline_paths[0]\n ? path.dirname(evalCase.guideline_paths[0])\n : process.cwd();\n\n const createEvaluator = (memberConfig: import('./types.js').EvaluatorConfig): Evaluator => {\n switch (memberConfig.type) {\n case 'llm_judge':\n return evaluatorRegistry.llm_judge;\n case 'code':\n return new CodeEvaluator({\n script: memberConfig.script,\n cwd: memberConfig.resolvedCwd ?? memberConfig.cwd,\n agentTimeoutMs,\n config: memberConfig.config,\n target: memberConfig.target,\n });\n case 'composite':\n return new CompositeEvaluator({\n config: memberConfig,\n cwd: evalFileDir,\n evaluatorFactory: { create: createEvaluator },\n });\n case 'tool_trajectory':\n return new ToolTrajectoryEvaluator({\n config: memberConfig as ToolTrajectoryEvaluatorConfig,\n });\n case 'field_accuracy':\n return new FieldAccuracyEvaluator({\n config: memberConfig as FieldAccuracyEvaluatorConfig,\n });\n case 'latency':\n return new LatencyEvaluator({\n config: memberConfig as LatencyEvaluatorConfig,\n });\n case 'cost':\n return new CostEvaluator({\n config: memberConfig as CostEvaluatorConfig,\n });\n case 'token_usage':\n return new TokenUsageEvaluator({\n config: memberConfig as TokenUsageEvaluatorConfig,\n });\n default: {\n const unknownConfig = memberConfig as { type: string };\n throw new Error(`Unsupported evaluator type in composite: ${unknownConfig.type}`);\n }\n }\n };\n\n const compositeEvaluator = new CompositeEvaluator({\n config: evaluator,\n cwd: evalFileDir,\n evaluatorFactory: { create: createEvaluator },\n });\n const score = await compositeEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n outputMessages,\n traceSummary,\n targetResolver,\n availableTargets,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n evaluatorProviderRequest: score.evaluatorRawRequest,\n evaluatorResults: mapChildResults(score.evaluatorResults),\n });\n }\n\n if (evaluator.type === 'tool_trajectory') {\n const trajectoryEvaluator = new ToolTrajectoryEvaluator({\n config: evaluator as ToolTrajectoryEvaluatorConfig,\n });\n const score = trajectoryEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n outputMessages,\n traceSummary,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n });\n }\n\n if (evaluator.type === 'field_accuracy') {\n const fieldAccuracyEvaluator = new FieldAccuracyEvaluator({\n config: evaluator as FieldAccuracyEvaluatorConfig,\n });\n const score = fieldAccuracyEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n outputMessages,\n traceSummary,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n });\n }\n\n if (evaluator.type === 'latency') {\n const latencyEvaluator = new LatencyEvaluator({\n config: evaluator as LatencyEvaluatorConfig,\n });\n const score = latencyEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n outputMessages,\n traceSummary,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n });\n }\n\n if (evaluator.type === 'cost') {\n const costEvaluator = new CostEvaluator({\n config: evaluator as CostEvaluatorConfig,\n });\n const score = costEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n outputMessages,\n traceSummary,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n });\n }\n\n if (evaluator.type === 'token_usage') {\n const tokenUsageEvaluator = new TokenUsageEvaluator({\n config: evaluator as TokenUsageEvaluatorConfig,\n });\n const score = tokenUsageEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n outputMessages,\n traceSummary,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const fallbackScore: EvaluationScore = {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Evaluator '${evaluator.name}' failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n };\n const resultType = evaluator.type === 'code' ? 'code_judge' : evaluator.type;\n const weight = evaluator.weight ?? 1.0;\n scored.push({\n score: fallbackScore,\n name: evaluator.name ?? 'unknown',\n type: resultType ?? 'llm_judge',\n weight,\n });\n evaluatorResults.push({\n name: evaluator.name ?? 'unknown',\n type: resultType ?? 'llm_judge',\n score: 0,\n weight,\n verdict: 'fail',\n hits: [],\n misses: [`Evaluator '${evaluator.name ?? 'unknown'}' failed: ${message}`],\n reasoning: message,\n });\n }\n }\n\n const aggregateScore =\n scored.length > 0\n ? computeWeightedMean(\n scored.map((entry) => ({ score: entry.score.score, weight: entry.weight })),\n )\n : 0;\n const hits = scored.flatMap((entry) => entry.score.hits);\n const misses = scored.flatMap((entry) => entry.score.misses);\n const expectedAspectCount = scored.reduce(\n (total, entry) => total + (entry.score.expectedAspectCount ?? 0),\n 0,\n );\n const reasoningParts = scored\n .map((entry) => (entry.score.reasoning ? `${entry.name}: ${entry.score.reasoning}` : undefined))\n .filter(isNonEmptyString);\n const reasoning = reasoningParts.length > 0 ? reasoningParts.join(' | ') : undefined;\n\n const score: EvaluationScore = {\n score: aggregateScore,\n verdict: scoreToVerdict(aggregateScore),\n hits,\n misses,\n expectedAspectCount,\n reasoning,\n };\n\n return { score, evaluatorResults };\n}\n\nasync function runLlmJudgeEvaluator(options: {\n readonly config: import('./types.js').LlmJudgeEvaluatorConfig;\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\n readonly llm_judge: Evaluator;\n };\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly judgeProvider?: Provider;\n readonly outputMessages?: readonly OutputMessage[];\n readonly traceSummary?: TraceSummary;\n readonly agentTimeoutMs?: number;\n}): Promise<EvaluationScore> {\n const {\n config,\n evalCase,\n candidate,\n target,\n provider,\n evaluatorRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n outputMessages,\n traceSummary,\n agentTimeoutMs,\n } = options;\n const customPrompt = await resolveCustomPrompt(\n config,\n {\n evalCase,\n candidate,\n outputMessages,\n traceSummary,\n config: config.config,\n },\n agentTimeoutMs,\n );\n\n return evaluatorRegistry.llm_judge.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n evaluatorTemplateOverride: customPrompt,\n evaluator: config,\n });\n}\n\ninterface ResolveCustomPromptContext {\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly outputMessages?: readonly OutputMessage[];\n readonly traceSummary?: TraceSummary;\n readonly config?: Record<string, unknown>;\n}\n\nasync function resolveCustomPrompt(\n promptConfig: {\n readonly prompt?: string | import('./types.js').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 // Executable prompt template using script array (matches code_judge pattern)\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 // Static text file (existing behavior)\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 // Handle prompt as string - could be inline or the original prompt value\n const promptValue = promptConfig.prompt;\n if (typeof promptValue === 'string') {\n return promptValue;\n }\n\n return undefined;\n}\n\nasync function executePromptTemplate(\n script: readonly string[],\n context: ResolveCustomPromptContext,\n config?: Record<string, unknown>,\n timeoutMs?: number,\n): Promise<string> {\n // Build payload matching code judge input format for consistency\n const payload = {\n question: context.evalCase.question,\n expectedOutcome: context.evalCase.expected_outcome,\n expectedMessages: context.evalCase.expected_messages,\n referenceAnswer: context.evalCase.reference_answer,\n candidateAnswer: context.candidate,\n outputMessages: context.outputMessages ?? null,\n guidelineFiles: context.evalCase.guideline_paths,\n inputFiles: context.evalCase.file_paths.filter(\n (p) => !context.evalCase.guideline_paths.includes(p),\n ),\n inputMessages: context.evalCase.input_messages,\n traceSummary: context.traceSummary ?? null,\n config: config ?? context.config ?? null,\n };\n\n const inputJson = JSON.stringify(toSnakeCaseDeep(payload), null, 2);\n\n // Derive cwd from the last element of the script array (the script file path)\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\nfunction filterEvalCases(evalCases: readonly EvalCase[], filter?: string): readonly EvalCase[] {\n if (!filter) {\n return evalCases;\n }\n return evalCases.filter((evalCase) => micromatch.isMatch(evalCase.id, filter));\n}\n\nfunction buildEvaluatorRegistry(\n overrides: Partial<Record<string, Evaluator>> | undefined,\n resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>,\n): Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator } {\n const llmJudge =\n overrides?.llm_judge ??\n new LlmJudgeEvaluator({\n resolveJudgeProvider: async (context) => {\n if (context.judgeProvider) {\n return context.judgeProvider;\n }\n return resolveJudgeProvider(context.target);\n },\n });\n\n return {\n ...overrides,\n llm_judge: llmJudge,\n };\n}\n\nasync function invokeProvider(\n provider: Provider,\n options: {\n readonly evalCase: EvalCase;\n readonly target: ResolvedTarget;\n readonly promptInputs: PromptInputs;\n readonly attempt: number;\n readonly agentTimeoutMs?: number;\n readonly signal?: AbortSignal;\n },\n): Promise<ProviderResponse> {\n const { evalCase, promptInputs, attempt, agentTimeoutMs, signal } = options;\n\n const controller = new AbortController();\n const timeout = agentTimeoutMs ? setTimeout(() => controller.abort(), agentTimeoutMs) : undefined;\n\n if (signal) {\n signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n return await provider.invoke({\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_patterns: evalCase.guideline_patterns,\n chatPrompt: promptInputs.chatPrompt,\n inputFiles: evalCase.file_paths,\n evalCaseId: evalCase.id,\n attempt,\n metadata: {\n systemPrompt: promptInputs.systemMessage ?? '',\n },\n signal: controller.signal,\n });\n } finally {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n }\n}\n\nfunction buildErrorResult(\n evalCase: EvalCase,\n targetName: string,\n timestamp: Date,\n error: unknown,\n promptInputs: PromptInputs,\n provider?: Provider,\n): EvaluationResult {\n const message = error instanceof Error ? error.message : String(error);\n\n let agentProviderRequest: JsonObject | undefined;\n let lmProviderRequest: JsonObject | undefined;\n\n if (isAgentProvider(provider)) {\n agentProviderRequest = {\n question: promptInputs.question,\n guideline_paths: evalCase.guideline_paths,\n error: message,\n } as JsonObject;\n } else {\n if (promptInputs.chatPrompt) {\n lmProviderRequest = {\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\n guideline_paths: evalCase.guideline_paths,\n error: message,\n } as JsonObject;\n } else {\n lmProviderRequest = {\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_paths: evalCase.guideline_paths,\n error: message,\n } as JsonObject;\n }\n }\n\n return {\n timestamp: timestamp.toISOString(),\n evalId: evalCase.id,\n dataset: evalCase.dataset,\n conversationId: evalCase.conversation_id,\n score: 0,\n hits: [],\n misses: [`Error: ${message}`],\n candidateAnswer: `Error occurred: ${message}`,\n target: targetName,\n agentProviderRequest: agentProviderRequest,\n lmProviderRequest: lmProviderRequest,\n error: message,\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: EvalCase,\n promptInputs: PromptInputs,\n): string {\n const hash = createHash('sha256');\n hash.update(provider.id);\n hash.update(target.name);\n hash.update(evalCase.id);\n hash.update(promptInputs.question);\n hash.update(promptInputs.guidelines);\n hash.update(promptInputs.systemMessage ?? '');\n if (promptInputs.chatPrompt) {\n hash.update(JSON.stringify(promptInputs.chatPrompt));\n }\n return hash.digest('hex');\n}\n\nfunction isTimeoutLike(error: unknown): boolean {\n if (!error) {\n return false;\n }\n if (\n typeof DOMException !== 'undefined' &&\n error instanceof DOMException &&\n error.name === 'AbortError'\n ) {\n return true;\n }\n if (error instanceof Error) {\n const name = error.name?.toLowerCase();\n const message = error.message?.toLowerCase();\n return name.includes('timeout') || message.includes('timeout');\n }\n const value = String(error).toLowerCase();\n return value.includes('timeout');\n}\n\nfunction mapChildResults(\n children?: readonly ChildEvaluatorResult[],\n): readonly EvaluatorResult[] | undefined {\n if (!children || children.length === 0) {\n return undefined;\n }\n\n return children.map((child) => ({\n name: child.name,\n type: child.type as EvaluatorKind,\n score: child.score,\n weight: child.weight,\n verdict: child.verdict,\n hits: child.hits,\n misses: child.misses,\n reasoning: child.reasoning,\n evaluatorProviderRequest: child.evaluatorRawRequest,\n evaluatorResults: mapChildResults(child.evaluatorResults),\n details: child.details,\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","/*\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 { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport type { Provider } from '../providers/types.js';\nimport type { RubricItem } from '../types.js';\n\nconst rubricItemSchema = z.object({\n id: z.string().describe('Short identifier for this rubric (e.g., clarity, completeness)'),\n expected_outcome: z.string().describe('Concrete expected outcome for this rubric item'),\n weight: z.number().default(1.0).describe('Relative importance (default 1.0)'),\n required: z.boolean().default(true).describe('Whether this is a mandatory requirement'),\n});\n\nconst rubricGenerationSchema = z.object({\n rubrics: z.array(rubricItemSchema).describe('List of evaluation rubrics'),\n});\n\nexport interface GenerateRubricsOptions {\n readonly expectedOutcome: string;\n readonly question?: string;\n readonly referenceAnswer?: string;\n readonly provider: Provider;\n}\n\n/**\n * Generate rubrics from expected outcome using an LLM.\n */\nexport async function generateRubrics(\n options: GenerateRubricsOptions,\n): Promise<readonly RubricItem[]> {\n const { expectedOutcome, question, referenceAnswer, provider } = options;\n\n const prompt = buildPrompt(expectedOutcome, question, referenceAnswer);\n\n const model = provider.asLanguageModel?.();\n if (!model) {\n throw new Error('Provider does not support language model interface');\n }\n\n const system = `You are an expert at creating evaluation rubrics.\nYou must return a valid JSON object matching this schema:\n{\n \"rubrics\": [\n {\n \"id\": \"string (short identifier)\",\n \"expected_outcome\": \"string (concrete expected outcome for this rubric item)\",\n \"weight\": number (default 1.0),\n \"required\": boolean (default true)\n }\n ]\n}`;\n\n let result: z.infer<typeof rubricGenerationSchema> | undefined;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const { text } = await generateText({\n model,\n system,\n prompt,\n });\n\n const cleaned = text.replace(/```json\\n?|```/g, '').trim();\n result = rubricGenerationSchema.parse(JSON.parse(cleaned));\n break;\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n // Continue to next attempt\n }\n }\n\n if (!result) {\n throw new Error(`Failed to parse generated rubrics after 3 attempts: ${lastError?.message}`);\n }\n\n return result.rubrics;\n}\n\nfunction buildPrompt(expectedOutcome: string, question?: string, referenceAnswer?: string): string {\n const parts: string[] = [\n 'You are an expert at creating evaluation rubrics.',\n 'Given the expected outcome (and optionally the question and reference answer),',\n 'generate a list of specific, measurable rubric items to evaluate whether an answer meets the expected outcome.',\n '',\n 'Each rubric should:',\n '- Be specific and testable',\n '- Have a short, descriptive ID',\n '- Include a clear expected outcome statement (what a good answer must demonstrate for this rubric)',\n '- Indicate if it is required (mandatory) or optional',\n '- Have an appropriate weight (default 1.0, use higher values for more important aspects)',\n '',\n 'Generate 3-7 rubric items that comprehensively cover the expected outcome.',\n '',\n '[[ ## expected_outcome ## ]]',\n expectedOutcome,\n '',\n ];\n\n if (question && question.trim().length > 0) {\n parts.push('[[ ## question ## ]]', question, '');\n }\n\n if (referenceAnswer && referenceAnswer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', referenceAnswer, '');\n }\n\n return parts.join('\\n');\n}\n","export * from './evaluation/types.js';\nexport * from './evaluation/trace.js';\nexport * from './evaluation/yaml-parser.js';\nexport * from './evaluation/file-utils.js';\nexport * from './evaluation/providers/index.js';\nexport * from './evaluation/evaluators.js';\nexport * from './evaluation/orchestrator.js';\nexport * from './evaluation/generators/index.js';\n\nexport type AgentKernel = {\n status: string;\n};\n\nexport function createAgentKernel(): AgentKernel {\n return { status: 'stub' };\n}\n"],"mappings":"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","names":["readFile","path","micromatch","parse","path","fileExists","buildDirectoryChain","buildSearchRoots","resolveFileReference","buildDirectoryChain","path","fileExists","path","readFile","ANSI_YELLOW","ANSI_RESET","readFile","ANSI_YELLOW","ANSI_RESET","isJsonObject","logWarning","weight","resolveFileReference","path","knownProps","config","promptPath","readFile","path","micromatch","readFile","path","asString","ANSI_YELLOW","ANSI_RESET","asString","resolveFileReference","logWarning","readFile","path","asString","logWarning","ANSI_YELLOW","ANSI_RESET","resolveFileReference","readFile","path","ANSI_YELLOW","ANSI_RESET","path","fileExists","logWarning","readFile","asString","buildSearchRoots","micromatch","readFile","path","ANSI_YELLOW","ANSI_RESET","path","fileExists","logWarning","readFile","asString","ANSI_YELLOW","ANSI_RED","ANSI_RESET","path","readFile","parse","buildSearchRoots","asString","logWarning","micromatch","logError","systemContent","path","path","path","DEFAULT_SYSTEM_PROMPT","path","readFile","fileExists","access","path","formatTimeoutSuffix","normalizeInputFiles","path","spawn","randomUUID","constants","createWriteStream","access","mkdir","mkdtemp","rm","writeFile","tmpdir","path","promisify","GLOBAL_LOGS_KEY","GLOBAL_SUBSCRIBERS_KEY","getSubscriberStore","notifySubscribers","execAsync","promisify","WORKSPACE_PREFIX","PROMPT_FILENAME","DEFAULT_SYSTEM_PROMPT","path","writeFile","formatTimeoutSuffix","pickDetail","mkdtemp","tmpdir","rm","mkdir","buildLogFilename","createWriteStream","formatElapsed","sanitizeForFilename","randomUUID","tryParseJsonValue","access","constants","spawn","execCallback","spawn","randomUUID","constants","createWriteStream","access","mkdir","mkdtemp","rm","writeFile","tmpdir","path","promisify","GLOBAL_LOGS_KEY","GLOBAL_SUBSCRIBERS_KEY","getSubscriberStore","notifySubscribers","execAsync","promisify","execCallback","WORKSPACE_PREFIX","PROMPT_FILENAME","DEFAULT_SYSTEM_PROMPT","path","writeFile","formatTimeoutSuffix","pickDetail","locateExecutable","mkdtemp","tmpdir","rm","mkdir","buildLogFilename","createWriteStream","formatElapsed","sanitizeForFilename","randomUUID","access","constants","shouldShellExecute","spawn","extractTextContent","extractToolCalls","spawn","randomUUID","createWriteStream","mkdir","mkdtemp","rm","writeFile","tmpdir","path","GLOBAL_LOGS_KEY","GLOBAL_SUBSCRIBERS_KEY","getSubscriberStore","notifySubscribers","WORKSPACE_PREFIX","PROMPT_FILENAME","DEFAULT_SYSTEM_PROMPT","path","writeFile","formatTimeoutSuffix","pickDetail","extractOutputMessages","extractAssistantText","mkdtemp","tmpdir","rm","mkdir","buildLogFilename","createWriteStream","formatElapsed","sanitizeForFilename","randomUUID","tryParseJsonValue","event","extractTextContent","extractToolCalls","spawn","path","stat","writeFile","path","constants","access","mkdir","rm","path","rm","path","pathToFileUri","path","renderTemplate","renderTemplate","path","readFile","path","sleep","sleep","readFile","path","spawn","mkdir","writeFile","path","promisify","os","path","execAsync","promisify","spawn","path","mkdir","writeFile","sleep","pathToFileUri","copyFile","mkdir","readFile","readdir","stat","writeFile","path","path","path","stat","readFile","writeFile","mkdir","readdir","copyFile","path","stat","writeFile","pathToFileUri","writeFile","path","DEFAULT_WORKSPACE_TEMPLATE","DEFAULT_WAKEUP_CONTENT","path","writeFile","buildPromptDocument","collectGuidelineFiles","buildMandatoryPrereadBlock","path","pathToFileUri","path","constants","access","readFile","path","parse","fileExists","spawn","mkdir","readFile","rm","writeFile","tmpdir","path","randomUUID","url","extractLastAssistantContent","path","generateText","generateText","z","z","generateText","data","generateText","data","score","hits","misses","reasoning","path","path","micromatch","score","path","micromatch","generateText","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/evaluation/trace.ts","../src/evaluation/yaml-parser.ts","../src/evaluation/loaders/case-file-loader.ts","../src/evaluation/loaders/config-loader.ts","../src/evaluation/loaders/file-resolver.ts","../src/evaluation/loaders/evaluator-parser.ts","../src/evaluation/validation/prompt-validator.ts","../src/evaluation/template-variables.ts","../src/evaluation/loaders/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/formatting/prompt-builder.ts","../src/evaluation/providers/ai-sdk.ts","../src/evaluation/providers/claude.ts","../src/evaluation/providers/claude-log-tracker.ts","../src/evaluation/providers/preread.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/providers/copilot-cli-log-tracker.ts","../src/evaluation/providers/copilot-utils.ts","../src/evaluation/providers/copilot-sdk.ts","../src/evaluation/providers/copilot-sdk-log-tracker.ts","../src/evaluation/providers/mock.ts","../src/evaluation/providers/pi-agent-sdk.ts","../src/evaluation/providers/pi-coding-agent.ts","../src/evaluation/providers/pi-log-tracker.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/evaluators/scoring.ts","../src/evaluation/evaluators/code-evaluator.ts","../src/runtime/exec.ts","../src/runtime/target-proxy.ts","../src/evaluation/case-conversion.ts","../src/evaluation/evaluators/composite.ts","../src/evaluation/evaluators/llm-judge.ts","../src/evaluation/evaluators/cost.ts","../src/evaluation/evaluators/execution-metrics.ts","../src/evaluation/evaluators/field-accuracy.ts","../src/evaluation/evaluators/latency.ts","../src/evaluation/evaluators/agent-judge.ts","../src/evaluation/evaluators/llm-judge-prompt.ts","../src/evaluation/evaluators/token-usage.ts","../src/evaluation/evaluators/tool-trajectory.ts","../src/evaluation/evaluators/assertions.ts","../src/evaluation/orchestrator.ts","../../../node_modules/.bun/yocto-queue@1.2.2/node_modules/yocto-queue/index.js","../../../node_modules/.bun/p-limit@6.2.0/node_modules/p-limit/index.js","../src/evaluation/registry/evaluator-registry.ts","../src/evaluation/registry/builtin-evaluators.ts","../src/evaluation/evaluators/prompt-resolution.ts","../src/evaluation/registry/assertion-discovery.ts","../src/evaluation/trials.ts","../src/evaluation/workspace/file-changes.ts","../src/evaluation/workspace/manager.ts","../src/evaluation/workspace/resolve.ts","../src/evaluation/workspace/script-executor.ts","../src/evaluation/evaluate.ts","../src/evaluation/config.ts","../src/evaluation/generators/rubric-generator.ts","../src/evaluation/cache/response-cache.ts","../src/evaluation/baseline.ts","../src/observability/otel-exporter.ts","../src/index.ts"],"sourcesContent":["/**\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}\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 /** Unique tool names, sorted alphabetically */\n readonly toolNames: readonly string[];\n /** Map of tool name to call count */\n readonly toolCallsByName: Readonly<Record<string, number>>;\n /** Number of error events */\n readonly errorCount: number;\n /** Token usage metrics (optional, from provider) */\n readonly tokenUsage?: TokenUsage;\n /** Total cost in USD (optional, from provider) */\n readonly costUsd?: number;\n /** Total execution duration in milliseconds (optional) */\n readonly durationMs?: number;\n /** Per-tool duration arrays in milliseconds (optional) */\n readonly toolDurations?: Readonly<Record<string, readonly number[]>>;\n /** ISO 8601 timestamp when execution started (derived from earliest span) */\n readonly startTime?: string;\n /** ISO 8601 timestamp when execution ended (derived from latest span) */\n readonly endTime?: string;\n /** Number of LLM calls (assistant messages) */\n readonly llmCallCount?: number;\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 ToolTrajectoryEvaluatorConfig {\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 /** When true, inverts the evaluator 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[]): TraceSummary {\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 const toolNames = Object.keys(toolCallCounts).sort();\n\n return {\n eventCount: totalToolCalls,\n toolNames,\n toolCallsByName: toolCallCounts,\n errorCount: 0,\n startTime: earliestStart?.toISOString(),\n endTime: latestEnd?.toISOString(),\n llmCallCount,\n ...(hasAnyDuration ? { toolDurations } : {}),\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.toolCallsByName[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): number | undefined {\n if (!summary.tokenUsage || summary.eventCount === 0) return undefined;\n\n const totalTokens = summary.tokenUsage.input + summary.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 summary.\n * Returns a new TraceSummary with metrics fields populated.\n * Provider-level timing takes precedence over span-derived timing.\n *\n * @param summary - Base trace summary from computeTraceSummary\n * @param metrics - Optional execution metrics from provider\n * @returns TraceSummary with merged metrics\n */\nexport function mergeExecutionMetrics(\n summary: TraceSummary,\n metrics?: ExecutionMetrics,\n): TraceSummary {\n if (!metrics) return summary;\n\n return {\n ...summary,\n tokenUsage: metrics.tokenUsage,\n costUsd: metrics.costUsd,\n durationMs: metrics.durationMs,\n // Provider-level timing takes precedence over span-derived timing\n startTime: metrics.startTime ?? summary.startTime,\n endTime: metrics.endTime ?? summary.endTime,\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\nimport { parse } from 'yaml';\n\nimport { expandFileReferences, loadCasesFromFile } from './loaders/case-file-loader.js';\nimport {\n extractCacheConfig,\n extractTargetFromSuite,\n extractTargetsFromSuite,\n extractTargetsFromTestCase,\n extractTrialsConfig,\n loadConfig,\n} from './loaders/config-loader.js';\nimport {\n coerceEvaluator,\n parseEvaluators,\n parseInlineRubrics,\n} from './loaders/evaluator-parser.js';\nimport { buildSearchRoots, resolveToAbsolutePath } from './loaders/file-resolver.js';\nimport { detectFormat, loadTestsFromJsonl } from './loaders/jsonl-parser.js';\nimport { processExpectedMessages, processMessages } from './loaders/message-processor.js';\nimport { resolveExpectedMessages, resolveInputMessages } from './loaders/shorthand-expansion.js';\nimport { parseMetadata } from './metadata.js';\nimport type {\n EvalTest,\n JsonObject,\n JsonValue,\n TestMessage,\n TrialsConfig,\n WorkspaceConfig,\n WorkspaceScriptConfig,\n} from './types.js';\nimport { isJsonObject, isTestMessage } from './types.js';\n\n// Re-export public APIs from modules\nexport { buildPromptInputs, type PromptInputs } from './formatting/prompt-builder.js';\nexport {\n DEFAULT_EVAL_PATTERNS,\n extractCacheConfig,\n extractTargetFromSuite,\n extractTargetsFromSuite,\n extractTargetsFromTestCase,\n extractTrialsConfig,\n isGuidelineFile,\n loadConfig,\n} from './loaders/config-loader.js';\nexport type { AgentVConfig, CacheConfig } 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 (glob supported, e.g., \"summary-*\") */\n readonly filter?: string;\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 dataset?: JsonValue;\n readonly workspace?: JsonValue;\n readonly assert?: JsonValue;\n // Suite-level metadata fields\n readonly name?: JsonValue;\n readonly description?: JsonValue;\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 readonly expected_output?: JsonValue;\n readonly execution?: JsonValue;\n readonly evaluators?: JsonValue;\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(\n testFilePath: string,\n): Promise<{ target?: string; targets?: readonly string[]; trials?: TrialsConfig }> {\n try {\n const absolutePath = path.resolve(testFilePath);\n const content = await readFile(absolutePath, 'utf8');\n const parsed = parse(content) as unknown;\n\n if (!isJsonObject(parsed)) {\n return {};\n }\n\n return {\n target: extractTargetFromSuite(parsed),\n targets: extractTargetsFromSuite(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 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};\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 const { tests, parsed } = await loadTestsFromYaml(evalFilePath, repoRoot, options);\n const metadata = parseMetadata(parsed);\n return {\n tests,\n trials: extractTrialsConfig(parsed),\n targets: extractTargetsFromSuite(parsed),\n cacheConfig: extractCacheConfig(parsed),\n ...(metadata !== undefined && { metadata }),\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 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 }> {\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 const guidelinePatterns = config?.guideline_patterns;\n\n const rawFile = await readFile(absoluteTestPath, 'utf8');\n const parsed = parse(rawFile) as unknown;\n if (!isJsonObject(parsed)) {\n throw new Error(`Invalid test file format: ${evalFilePath}`);\n }\n\n const suite = parsed as RawTestSuite;\n const datasetNameFromSuite = asString(suite.dataset)?.trim();\n const fallbackDataset = path.basename(absoluteTestPath).replace(/\\.ya?ml$/i, '') || 'eval';\n const datasetName =\n datasetNameFromSuite && datasetNameFromSuite.length > 0\n ? datasetNameFromSuite\n : fallbackDataset;\n\n const rawTestcases = resolveTests(suite);\n\n const globalEvaluator = coerceEvaluator(suite.evaluator, 'global') ?? 'llm_judge';\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, inline array, or error\n let expandedTestcases: readonly JsonValue[];\n if (typeof rawTestcases === 'string') {\n // String path: load tests from external file (YAML, JSONL)\n const externalPath = path.resolve(evalFileDir, rawTestcases);\n expandedTestcases = await loadCasesFromFile(externalPath);\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 = parseWorkspaceConfig(suite.workspace, evalFileDir);\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 assert (which is a sibling of execution)\n const globalExecution: JsonObject | undefined =\n suite.assert !== undefined\n ? { ...(rawGlobalExecution ?? {}), assert: suite.assert }\n : rawGlobalExecution;\n\n const results: EvalTest[] = [];\n\n for (const rawEvalcase of expandedTestcases) {\n if (!isJsonObject(rawEvalcase)) {\n logWarning('Skipping invalid test entry (expected object)');\n continue;\n }\n\n const evalcase = rawEvalcase as RawEvalCase;\n const id = asString(evalcase.id);\n\n // Skip tests that don't match the filter pattern (glob supported)\n if (filterPattern && (!id || !micromatch.isMatch(id, filterPattern))) {\n continue;\n }\n\n const conversationId = asString(evalcase.conversation_id);\n let outcome = asString(evalcase.criteria);\n if (!outcome && evalcase.expected_outcome !== undefined) {\n outcome = asString(evalcase.expected_outcome);\n if (outcome) {\n logWarning(\n `Test '${asString(evalcase.id) ?? 'unknown'}': 'expected_outcome' is deprecated. Use 'criteria' instead.`,\n );\n }\n }\n\n // Resolve input with shorthand support\n const inputMessages = resolveInputMessages(evalcase);\n // Resolve expected_output with shorthand support\n const expectedMessages = resolveExpectedMessages(evalcase) ?? [];\n\n if (!id || !outcome || !inputMessages || inputMessages.length === 0) {\n logError(\n `Skipping incomplete test: ${id ?? 'unknown'}. Missing required fields: id, criteria, and/or input`,\n );\n continue;\n }\n\n // expected_output is optional - for outcome-only evaluation\n const hasExpectedMessages = expectedMessages.length > 0;\n\n const guidelinePaths: string[] = [];\n const inputTextParts: string[] = [];\n\n // Process all input messages to extract files and guidelines\n const inputSegments = await processMessages({\n messages: inputMessages,\n searchRoots,\n repoRootPath,\n guidelinePatterns,\n guidelinePaths,\n textParts: inputTextParts,\n messageType: 'input',\n verbose,\n });\n\n // Process expected_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 evalCaseEvaluatorKind = coerceEvaluator(evalcase.evaluator, id) ?? globalEvaluator;\n let evaluators: Awaited<ReturnType<typeof parseEvaluators>>;\n try {\n evaluators = await parseEvaluators(evalcase, globalExecution, searchRoots, id ?? 'unknown');\n } catch (error) {\n // Skip entire 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 assert: [{type: rubrics, criteria: [...]}] instead)\n const inlineRubrics = evalcase.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 // Extract file paths from all input segments (non-guideline files)\n const userFilePaths: string[] = [];\n for (const segment of inputSegments) {\n if (segment.type === 'file' && typeof segment.resolvedPath === 'string') {\n userFilePaths.push(segment.resolvedPath);\n }\n }\n\n // Combine all file paths (guidelines + regular files)\n const allFilePaths = [\n ...guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\n ...userFilePaths,\n ];\n\n // Parse per-case workspace config and merge with suite-level\n const caseWorkspace = parseWorkspaceConfig(evalcase.workspace, evalFileDir);\n const mergedWorkspace = mergeWorkspaceConfigs(suiteWorkspace, caseWorkspace);\n\n // Parse per-case metadata\n const metadata = isJsonObject(evalcase.metadata)\n ? (evalcase.metadata as Record<string, unknown>)\n : undefined;\n\n // Extract per-test targets override (matrix evaluation)\n const caseTargets = extractTargetsFromTestCase(evalcase as JsonObject);\n\n const testCase: EvalTest = {\n id,\n dataset: datasetName,\n conversation_id: conversationId,\n question: question,\n input: inputMessages,\n input_segments: inputSegments,\n expected_output: outputSegments,\n reference_answer: referenceAnswer,\n guideline_paths: guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\n guideline_patterns: guidelinePatterns,\n file_paths: allFilePaths,\n criteria: outcome,\n evaluator: evalCaseEvaluatorKind,\n evaluators,\n workspace: mergedWorkspace,\n metadata,\n targets: caseTargets,\n };\n\n if (verbose) {\n console.log(`\\n[Test: ${id}]`);\n if (testCase.guideline_paths.length > 0) {\n console.log(` Guidelines used: ${testCase.guideline_paths.length}`);\n for (const guidelinePath of testCase.guideline_paths) {\n console.log(` - ${guidelinePath}`);\n }\n } else {\n console.log(' No guidelines found');\n }\n }\n\n results.push(testCase);\n }\n\n return { tests: results, parsed: suite };\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 a WorkspaceScriptConfig from raw YAML value.\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 const script = obj.script;\n if (!Array.isArray(script) || script.length === 0) return undefined;\n const scriptArr = script.filter((s): s is string => typeof s === 'string');\n if (scriptArr.length === 0) 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 = { script: scriptArr };\n if (timeoutMs !== undefined) {\n return { ...config, timeout_ms: timeoutMs, ...(cwd !== undefined && { cwd }) };\n }\n return cwd ? { ...config, cwd } : config;\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\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 beforeAll = parseWorkspaceScriptConfig(obj.before_all, evalFileDir);\n const afterAll = parseWorkspaceScriptConfig(obj.after_all, evalFileDir);\n const beforeEach = parseWorkspaceScriptConfig(obj.before_each, evalFileDir);\n const afterEach = parseWorkspaceScriptConfig(obj.after_each, evalFileDir);\n\n if (!template && !beforeAll && !afterAll && !beforeEach && !afterEach) return undefined;\n\n return {\n ...(template !== undefined && { template }),\n ...(beforeAll !== undefined && { before_all: beforeAll }),\n ...(afterAll !== undefined && { after_all: afterAll }),\n ...(beforeEach !== undefined && { before_each: beforeEach }),\n ...(afterEach !== undefined && { after_each: afterEach }),\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 return {\n template: caseLevel.template ?? suiteLevel.template,\n before_all: caseLevel.before_all ?? suiteLevel.before_all,\n after_all: caseLevel.after_all ?? suiteLevel.after_all,\n before_each: caseLevel.before_each ?? suiteLevel.before_each,\n after_each: caseLevel.after_each ?? suiteLevel.after_each,\n };\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\nfunction logError(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.error(`${ANSI_RED}Error: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.error(`${ANSI_RED}Error: ${message}${ANSI_RESET}`);\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport fg from 'fast-glob';\nimport { parse as parseYaml } from 'yaml';\n\nimport type { JsonObject, JsonValue } from '../types.js';\nimport { isJsonObject } from '../types.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\nconst FILE_PROTOCOL = 'file://';\n\n/**\n * Check if a value in the tests array is a file:// reference string.\n */\nexport function isFileReference(value: JsonValue): value is string {\n return typeof value === 'string' && value.startsWith(FILE_PROTOCOL);\n}\n\n/**\n * Extract the path portion from a file:// reference.\n */\nfunction extractFilePath(ref: string): string {\n return ref.slice(FILE_PROTOCOL.length);\n}\n\n/**\n * Check if a path contains glob pattern characters.\n */\nfunction isGlobPattern(filePath: string): boolean {\n return filePath.includes('*') || filePath.includes('?') || filePath.includes('{');\n}\n\n/**\n * Parse test objects from a YAML file.\n * Expects the file to contain an array of test objects.\n */\nfunction parseYamlCases(content: string, filePath: string): JsonObject[] {\n const parsed = parseYaml(content) as unknown;\n if (!Array.isArray(parsed)) {\n throw new Error(\n `External test file must contain a YAML array, got ${typeof parsed}: ${filePath}`,\n );\n }\n const results: JsonObject[] = [];\n for (const item of parsed) {\n if (!isJsonObject(item)) {\n throw new Error(`External test file contains non-object entry: ${filePath}`);\n }\n results.push(item);\n }\n return results;\n}\n\n/**\n * Parse test objects from a JSONL file.\n * Each non-empty line must be a valid JSON object.\n */\nfunction parseJsonlCases(content: string, filePath: string): JsonObject[] {\n const lines = content.split('\\n');\n const results: JsonObject[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line === '') continue;\n\n try {\n const parsed = JSON.parse(line) as unknown;\n if (!isJsonObject(parsed)) {\n throw new Error('Expected JSON object');\n }\n results.push(parsed);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Malformed JSONL at line ${i + 1}: ${message}\\n File: ${filePath}`);\n }\n }\n\n return results;\n}\n\n/**\n * Load test objects from a single external file (YAML or JSONL).\n */\nexport async function loadCasesFromFile(filePath: string): Promise<JsonObject[]> {\n const ext = path.extname(filePath).toLowerCase();\n let content: string;\n\n try {\n content = await readFile(filePath, 'utf8');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Cannot read external test file: ${filePath}\\n ${message}`);\n }\n\n if (content.trim() === '') {\n console.warn(\n `${ANSI_YELLOW}Warning: External test file is empty, skipping: ${filePath}${ANSI_RESET}`,\n );\n return [];\n }\n\n if (ext === '.yaml' || ext === '.yml') {\n return parseYamlCases(content, filePath);\n }\n if (ext === '.jsonl') {\n return parseJsonlCases(content, filePath);\n }\n\n throw new Error(\n `Unsupported external test file format '${ext}': ${filePath}. Supported: .yaml, .yml, .jsonl`,\n );\n}\n\n/**\n * Resolve a file:// reference to test objects.\n * Handles both direct file paths and glob patterns.\n * Paths are resolved relative to the eval file directory.\n */\nexport async function resolveFileReference(\n ref: string,\n evalFileDir: string,\n): Promise<JsonObject[]> {\n const rawPath = extractFilePath(ref);\n const absolutePattern = path.resolve(evalFileDir, rawPath);\n\n if (isGlobPattern(rawPath)) {\n // Glob pattern: resolve matching files\n const matches = await fg(absolutePattern, {\n onlyFiles: true,\n absolute: true,\n });\n\n if (matches.length === 0) {\n console.warn(\n `${ANSI_YELLOW}Warning: Glob pattern matched no files: ${ref} (resolved to ${absolutePattern})${ANSI_RESET}`,\n );\n return [];\n }\n\n // Sort for deterministic order\n matches.sort();\n\n const allCases: JsonObject[] = [];\n for (const match of matches) {\n const cases = await loadCasesFromFile(match);\n allCases.push(...cases);\n }\n return allCases;\n }\n\n // Direct file path\n return loadCasesFromFile(absolutePattern);\n}\n\n/**\n * Process a tests array, expanding any file:// references into inline test objects.\n * Returns a flat array of JsonValue where all file:// strings are replaced\n * with the test objects loaded from the referenced files.\n */\nexport async function expandFileReferences(\n tests: readonly JsonValue[],\n evalFileDir: string,\n): Promise<JsonValue[]> {\n const expanded: JsonValue[] = [];\n\n for (const entry of tests) {\n if (isFileReference(entry)) {\n const cases = await resolveFileReference(entry, evalFileDir);\n expanded.push(...cases);\n } else {\n expanded.push(entry);\n }\n }\n\n return expanded;\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\nimport { parse } from 'yaml';\n\nimport type { JsonObject, TrialStrategy, TrialsConfig } from '../types.js';\nimport { isJsonObject } from '../types.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];\n\nexport type AgentVConfig = {\n readonly guideline_patterns?: readonly string[];\n readonly eval_patterns?: readonly string[];\n};\n\n/**\n * Load optional .agentv/config.yaml configuration file.\n * Searches from eval file directory up to repo root.\n */\nexport async function loadConfig(\n evalFilePath: string,\n repoRoot: string,\n): Promise<AgentVConfig | null> {\n const directories = buildDirectoryChain(evalFilePath, repoRoot);\n\n for (const directory of directories) {\n const configPath = path.join(directory, '.agentv', 'config.yaml');\n\n if (!(await fileExists(configPath))) {\n continue;\n }\n\n try {\n const rawConfig = await readFile(configPath, 'utf8');\n const parsed = parse(rawConfig) as unknown;\n\n if (!isJsonObject(parsed)) {\n logWarning(`Invalid .agentv/config.yaml format at ${configPath}`);\n continue;\n }\n\n const config = parsed as AgentVConfig;\n\n const guidelinePatterns = config.guideline_patterns;\n if (guidelinePatterns !== undefined && !Array.isArray(guidelinePatterns)) {\n logWarning(`Invalid guideline_patterns in ${configPath}, expected array`);\n continue;\n }\n\n if (\n Array.isArray(guidelinePatterns) &&\n !guidelinePatterns.every((p) => typeof p === 'string')\n ) {\n logWarning(`Invalid guideline_patterns in ${configPath}, all entries must be strings`);\n continue;\n }\n\n 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 return {\n guideline_patterns: guidelinePatterns as readonly string[] | undefined,\n eval_patterns: evalPatterns as readonly string[] | undefined,\n };\n } catch (error) {\n logWarning(\n `Could not read .agentv/config.yaml at ${configPath}: ${(error as Error).message}`,\n );\n }\n }\n\n return null;\n}\n\n/**\n * Determine whether a path references guideline content (instructions or prompts).\n */\nexport function isGuidelineFile(filePath: string, patterns?: readonly string[]): boolean {\n const normalized = filePath.split('\\\\').join('/');\n const patternsToUse = patterns ?? [];\n\n return micromatch.isMatch(normalized, patternsToUse as string[]);\n}\n\n/**\n * Extract target name from parsed eval suite (checks execution.target then falls back to root-level target).\n */\nexport function extractTargetFromSuite(suite: JsonObject): string | undefined {\n // Check execution.target first (new location), fallback to root-level target (legacy)\n const execution = suite.execution;\n if (execution && typeof execution === 'object' && !Array.isArray(execution)) {\n const executionTarget = (execution as Record<string, unknown>).target;\n if (typeof executionTarget === 'string' && executionTarget.trim().length > 0) {\n return executionTarget.trim();\n }\n }\n\n // Fallback to legacy root-level target\n const targetValue = suite.target;\n if (typeof targetValue === 'string' && targetValue.trim().length > 0) {\n return targetValue.trim();\n }\n\n return undefined;\n}\n\n/**\n * Extract targets array from parsed eval suite.\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 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 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\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\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 path from 'node:path';\n\nimport type { ToolTrajectoryEvaluatorConfig, ToolTrajectoryExpectedItem } from '../trace.js';\nimport type { EvaluatorConfig, EvaluatorKind, JsonObject, JsonValue } from '../types.js';\nimport { isEvaluatorKind } from '../types.js';\nimport { validateCustomPromptContent } from '../validation/prompt-validator.js';\nimport { resolveFileReference } from './file-resolver.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Parse evaluators from eval case configuration.\n */\nexport async function parseEvaluators(\n rawEvalCase: JsonObject & {\n readonly execution?: JsonValue;\n readonly evaluators?: JsonValue;\n readonly assert?: JsonValue;\n },\n globalExecution: JsonObject | undefined,\n searchRoots: readonly string[],\n evalId: string,\n): Promise<readonly EvaluatorConfig[] | undefined> {\n const execution = rawEvalCase.execution;\n const executionObject = isJsonObject(execution) ? execution : undefined;\n\n // Case-level evaluators priority: assert > execution.evaluators (deprecated) > top-level evaluators (deprecated)\n const caseEvaluators =\n rawEvalCase.assert ??\n (executionObject ? executionObject.evaluators : undefined) ?? // deprecated: use assert\n rawEvalCase.evaluators; // deprecated: use assert\n\n // Root-level (default) evaluators: assert > execution.evaluators (deprecated)\n const skipDefaults = executionObject?.skip_defaults === true;\n const rootEvaluators = skipDefaults\n ? undefined\n : (globalExecution?.assert ?? globalExecution?.evaluators); // deprecated: use assert\n\n // Parse case-level evaluators\n const parsedCase = await parseEvaluatorList(caseEvaluators, searchRoots, evalId);\n // Parse root-level evaluators (appended after case-level)\n const parsedRoot = await parseEvaluatorList(rootEvaluators, searchRoots, evalId);\n\n if (!parsedCase && !parsedRoot) {\n return undefined;\n }\n\n // Case-level evaluators run first, root-level defaults appended\n const evaluators: EvaluatorConfig[] = [...(parsedCase ?? []), ...(parsedRoot ?? [])];\n\n return evaluators.length > 0 ? evaluators : undefined;\n}\n\n/**\n * Parse a raw evaluator array into typed EvaluatorConfig objects.\n */\nasync function parseEvaluatorList(\n candidateEvaluators: JsonValue | undefined,\n searchRoots: readonly string[],\n evalId: string,\n): Promise<readonly EvaluatorConfig[] | 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 evaluators: EvaluatorConfig[] = [];\n\n for (const rawEvaluator of candidateEvaluators) {\n if (!isJsonObject(rawEvaluator)) {\n logWarning(`Skipping invalid evaluator entry for '${evalId}' (expected object)`);\n continue;\n }\n\n const rawName = asString(rawEvaluator.name);\n const typeValue = rawEvaluator.type;\n\n // Unknown types are treated as custom assertion types (resolved via registry discovery)\n const isCustomType = typeof typeValue === 'string' && !isEvaluatorKind(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 for assertion types if not provided\n const name =\n rawName ??\n (isCustomType ? typeValue : generateAssertionName(typeValue as EvaluatorKind, 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\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 = parseRequired(rawEvaluator.required);\n // Collect all properties except known meta-keys as pass-through config\n const knownProps = new Set(['name', 'type', 'weight', 'required', '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 EvaluatorKind,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(negate !== undefined ? { negate } : {}),\n ...(Object.keys(config).length > 0 ? { config } : {}),\n } as EvaluatorConfig);\n continue;\n }\n\n if (typeValue === 'code_judge') {\n let script: string[] | undefined;\n const rawScript = rawEvaluator.script;\n\n if (typeof rawScript === 'string') {\n const trimmed = rawScript.trim();\n if (trimmed.length === 0) {\n throw new Error(\n `Invalid code_judge script for evaluator '${name}' in '${evalId}': script cannot be empty`,\n );\n }\n script = parseCommandToArgv(trimmed);\n } else {\n script = asStringArray(\n rawScript,\n `code_judge script for evaluator '${name}' in '${evalId}'`,\n );\n }\n\n if (!script) {\n logWarning(`Skipping code_judge evaluator '${name}' in '${evalId}': missing script`);\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_judge evaluator '${name}' in '${evalId}': cwd not found (${resolved.displayPath})`,\n resolved.attempted.length > 0\n ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`)\n : undefined,\n );\n }\n } else {\n resolvedCwd = searchRoots[0];\n }\n\n // 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 = parseRequired(rawEvaluator.required);\n\n // Collect unrecognized properties as pass-through config\n const knownProps = new Set([\n 'name',\n 'type',\n 'script',\n 'cwd',\n 'weight',\n 'target',\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',\n script,\n cwd,\n resolvedCwd,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(negate !== undefined ? { negate } : {}),\n ...(Object.keys(config).length > 0 ? { config } : {}),\n ...(targetConfig !== undefined ? { target: targetConfig } : {}),\n });\n continue;\n }\n\n if (typeValue === 'composite') {\n // Accept assert as canonical key; evaluators is deprecated\n const rawMembers = rawEvaluator.assert ?? rawEvaluator.evaluators; // evaluators deprecated\n if (!Array.isArray(rawMembers)) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': missing evaluators (or assert) array`,\n );\n continue;\n }\n\n const rawAggregator = rawEvaluator.aggregator;\n if (!isJsonObject(rawAggregator)) {\n logWarning(`Skipping composite evaluator '${name}' in '${evalId}': missing aggregator`);\n continue;\n }\n\n const aggregatorType = asString(rawAggregator.type);\n if (\n aggregatorType !== 'weighted_average' &&\n aggregatorType !== 'code_judge' &&\n aggregatorType !== 'llm_judge' &&\n aggregatorType !== 'threshold'\n ) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': invalid aggregator type '${aggregatorType}'`,\n );\n continue;\n }\n\n // Recursively parse member evaluators\n const memberEvaluators: EvaluatorConfig[] = [];\n for (const rawMember of rawMembers) {\n if (!isJsonObject(rawMember)) {\n logWarning(`Skipping invalid member evaluator in composite '${name}' (expected object)`);\n continue;\n }\n\n const memberName = asString(rawMember.name);\n const memberType = rawMember.type;\n\n if (!memberName || !isEvaluatorKind(memberType)) {\n logWarning(`Skipping member evaluator with invalid name/type in composite '${name}'`);\n continue;\n }\n\n // Parse member evaluator (reuse existing logic for code, llm_judge, code_judge)\n const memberConfigs = await parseEvaluators(\n { evaluators: [rawMember] },\n undefined,\n searchRoots,\n `${evalId}:${name}:${memberName}`,\n );\n\n if (memberConfigs && memberConfigs.length > 0) {\n memberEvaluators.push(memberConfigs[0]);\n }\n }\n\n if (memberEvaluators.length === 0) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': no valid member evaluators`,\n );\n continue;\n }\n\n // Parse aggregator config\n let aggregator: import('../types.js').CompositeAggregatorConfig;\n\n if (aggregatorType === 'weighted_average') {\n const weights = isJsonObject(rawAggregator.weights)\n ? (rawAggregator.weights as Record<string, unknown>)\n : undefined;\n const parsedWeights: Record<string, number> = {};\n if (weights) {\n for (const [key, value] of Object.entries(weights)) {\n if (typeof value === 'number') {\n parsedWeights[key] = value;\n }\n }\n }\n aggregator = {\n type: 'weighted_average',\n ...(Object.keys(parsedWeights).length > 0 ? { weights: parsedWeights } : {}),\n };\n } else if (aggregatorType === 'code_judge') {\n const aggregatorPath = asString(rawAggregator.path);\n if (!aggregatorPath) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': code_judge aggregator missing path`,\n );\n continue;\n }\n\n // Set cwd to eval file directory (first search root)\n // Paths are resolved relative to this directory\n aggregator = {\n type: 'code_judge',\n path: aggregatorPath,\n cwd: searchRoots[0],\n };\n } else if (aggregatorType === '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_judge aggregator\n const aggregatorPrompt = asString(rawAggregator.prompt);\n let promptPath: string | undefined;\n\n if (aggregatorPrompt) {\n const resolved = await resolveFileReference(aggregatorPrompt, searchRoots);\n if (resolved.resolvedPath) {\n promptPath = path.resolve(resolved.resolvedPath);\n }\n }\n\n aggregator = {\n type: 'llm_judge',\n ...(aggregatorPrompt ? { prompt: aggregatorPrompt } : {}),\n ...(promptPath ? { promptPath } : {}),\n };\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const required = parseRequired(rawEvaluator.required);\n\n evaluators.push({\n name,\n type: 'composite',\n evaluators: memberEvaluators,\n aggregator,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\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 = parseRequired(rawEvaluator.required);\n\n const config: ToolTrajectoryEvaluatorConfig = {\n name,\n type: 'tool_trajectory',\n mode,\n ...(minimums ? { minimums } : {}),\n ...(expected ? { expected } : {}),\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\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_judge 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 = parseRequired(rawEvaluator.required);\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 ...(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 = parseRequired(rawEvaluator.required);\n\n evaluators.push({\n name,\n type: 'latency',\n threshold,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\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 = parseRequired(rawEvaluator.required);\n\n evaluators.push({\n name,\n type: 'cost',\n budget,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\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 = parseRequired(rawEvaluator.required);\n\n evaluators.push({\n name,\n type: 'token_usage',\n ...validLimits,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\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 = parseRequired(rawEvaluator.required);\n\n evaluators.push({\n name,\n type: 'execution_metrics',\n ...validThresholds,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\n continue;\n }\n\n if (typeValue === 'agent_judge') {\n // Validate max_steps (1-50)\n const rawMaxSteps = rawEvaluator.max_steps ?? rawEvaluator.maxSteps;\n let maxSteps: number | undefined;\n if (rawMaxSteps !== undefined) {\n if (\n typeof rawMaxSteps !== 'number' ||\n !Number.isInteger(rawMaxSteps) ||\n rawMaxSteps < 1 ||\n rawMaxSteps > 50\n ) {\n logWarning(\n `Skipping agent_judge evaluator '${name}' in '${evalId}': max_steps must be an integer 1-50`,\n );\n continue;\n }\n maxSteps = rawMaxSteps;\n }\n\n // Validate temperature (0-2)\n const rawTemperature = rawEvaluator.temperature;\n let temperature: number | undefined;\n if (rawTemperature !== undefined) {\n if (typeof rawTemperature !== 'number' || rawTemperature < 0 || rawTemperature > 2) {\n logWarning(\n `Skipping agent_judge evaluator '${name}' in '${evalId}': temperature must be a number 0-2`,\n );\n continue;\n }\n temperature = rawTemperature;\n }\n\n // Validate target (string)\n const judgeTarget = asString(rawEvaluator.target);\n\n // Parse prompt (file path or inline text)\n let agentPrompt: string | undefined;\n let agentPromptPath: string | undefined;\n const rawAgentPrompt = rawEvaluator.prompt;\n if (typeof rawAgentPrompt === 'string') {\n agentPrompt = rawAgentPrompt;\n const resolved = await resolveFileReference(rawAgentPrompt, searchRoots);\n if (resolved.resolvedPath) {\n agentPromptPath = path.resolve(resolved.resolvedPath);\n }\n }\n\n // Parse rubrics via existing infrastructure\n const rawAgentRubrics = rawEvaluator.rubrics;\n const agentParsedRubrics = Array.isArray(rawAgentRubrics)\n ? parseRubricItems(rawAgentRubrics, name, evalId)\n : undefined;\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const required = parseRequired(rawEvaluator.required);\n\n evaluators.push({\n name,\n type: 'agent_judge',\n ...(agentPrompt ? { prompt: agentPrompt } : {}),\n ...(agentPromptPath\n ? { promptPath: agentPromptPath, resolvedPromptPath: agentPromptPath }\n : {}),\n ...(agentParsedRubrics && agentParsedRubrics.length > 0\n ? { rubrics: agentParsedRubrics }\n : {}),\n ...(maxSteps !== undefined ? { max_steps: maxSteps } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n ...(judgeTarget ? { target: judgeTarget } : {}),\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\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 = parseRequired(rawEvaluator.required);\n evaluators.push({\n name,\n type: 'contains',\n value,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\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 weight = validateWeight(rawEvaluator.weight, name, evalId);\n const required = parseRequired(rawEvaluator.required);\n evaluators.push({\n name,\n type: 'regex',\n value,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\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 = parseRequired(rawEvaluator.required);\n evaluators.push({\n name,\n type: 'is_json',\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\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 = parseRequired(rawEvaluator.required);\n evaluators.push({\n name,\n type: 'equals',\n value,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\n continue;\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 = parseRequired(rawEvaluator.required);\n\n evaluators.push({\n name,\n type: 'llm_judge',\n rubrics: parsedCriteria,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(negate !== undefined ? { negate } : {}),\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: { script: [...], config: {...} }\n const scriptArray = asStringArray(\n rawPrompt.script,\n `prompt.script for evaluator '${name}' in '${evalId}'`,\n );\n\n if (!scriptArray) {\n throw new Error(`Evaluator '${name}' in '${evalId}': prompt object requires script array`);\n }\n\n // Resolve the script path (last element is typically the file path)\n const scriptPath = scriptArray[scriptArray.length - 1];\n const resolved = await resolveFileReference(scriptPath, searchRoots);\n\n if (resolved.resolvedPath) {\n // Replace the last element with the resolved path\n resolvedPromptScript = [...scriptArray.slice(0, -1), path.resolve(resolved.resolvedPath)];\n } else {\n throw new Error(\n `Evaluator '${name}' in '${evalId}': prompt script 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 (existing behavior)\n prompt = rawPrompt;\n const resolved = await resolveFileReference(prompt, searchRoots);\n if (resolved.resolvedPath) {\n promptPath = path.resolve(resolved.resolvedPath);\n // Validate custom prompt content upfront - throws error if validation fails\n try {\n await validateCustomPromptContent(promptPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n // Add context and re-throw for the caller to handle\n throw new Error(`Evaluator '${name}' template (${promptPath}): ${message}`);\n }\n } else {\n logWarning(\n `Inline prompt used for evaluator '${name}' in '${evalId}' (file not found: ${resolved.displayPath})`,\n resolved.attempted.length > 0\n ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`)\n : undefined,\n );\n }\n }\n\n const _model = asString(rawEvaluator.model);\n\n const rawRubrics = rawEvaluator.rubrics;\n const parsedRubrics = Array.isArray(rawRubrics)\n ? 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 = parseRequired(rawEvaluator.required);\n\n // deprecated: `type: rubric` maps to `type: llm_judge` with `rubrics`. Use `type: rubrics` with `criteria` instead.\n evaluators.push({\n name,\n type: 'llm_judge',\n rubrics: parsedRubrics,\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(negate !== undefined ? { negate } : {}),\n });\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n const required = parseRequired(rawEvaluator.required);\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 'weight',\n 'config',\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 // 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 evaluators.push({\n name,\n type: 'llm_judge',\n prompt,\n promptPath,\n ...(promptPath ? { resolvedPromptPath: promptPath } : {}),\n ...(resolvedPromptScript ? { resolvedPromptScript } : {}),\n ...(parsedRubrics && parsedRubrics.length > 0 ? { rubrics: parsedRubrics } : {}),\n ...(weight !== undefined ? { weight } : {}),\n ...(required !== undefined ? { required } : {}),\n ...(negate !== undefined ? { negate } : {}),\n ...(finalConfig ? { config: finalConfig } : {}),\n });\n }\n\n return evaluators.length > 0 ? evaluators : undefined;\n}\n\n/** Assertion evaluator types that support auto-generated names. */\nconst ASSERTION_TYPES = new Set(['contains', 'regex', 'is_json', 'equals', 'rubrics']);\n\n/**\n * Generate a descriptive name for assertion-type evaluators when no explicit name is given.\n * Returns undefined for non-assertion types (those still require an explicit name).\n */\nfunction generateAssertionName(typeValue: string, rawEvaluator: JsonObject): string | undefined {\n if (!ASSERTION_TYPES.has(typeValue)) {\n return undefined;\n }\n\n const value = asString(rawEvaluator.value);\n\n switch (typeValue) {\n case 'contains':\n return value ? `contains-${value}` : 'contains';\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 return undefined;\n }\n}\n\n/**\n * Coerce evaluator value to valid EvaluatorKind.\n */\nexport function coerceEvaluator(\n candidate: JsonValue | undefined,\n contextId: string,\n): EvaluatorKind | undefined {\n if (typeof candidate !== 'string') {\n return undefined;\n }\n if (isEvaluatorKind(candidate)) {\n return candidate;\n }\n logWarning(`Unknown evaluator '${candidate}' in ${contextId}, falling back to default`);\n return undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction 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\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 * 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 required_min_score (new) or required (legacy backward compat)\n let requiredMinScore: number | undefined;\n let required: boolean | undefined;\n\n if (typeof rawRubric.required_min_score === 'number') {\n const minScore = rawRubric.required_min_score;\n if (!Number.isInteger(minScore) || minScore < 0 || minScore > 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 ${minScore})`,\n );\n }\n requiredMinScore = minScore;\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 ...(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 ...(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 LlmJudgeEvaluatorConfig to prepend to evaluators, or undefined if no valid rubrics.\n */\nexport function parseInlineRubrics(\n rawRubrics: readonly unknown[],\n): import('../types.js').LlmJudgeEvaluatorConfig | 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 // 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 ...(typeof rubric.required_min_score === 'number'\n ? { required_min_score: rubric.required_min_score }\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 ...(typeof rubric.required_min_score === 'number'\n ? { required_min_score: rubric.required_min_score }\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: 'rubric',\n type: 'llm_judge',\n rubrics: rubricItems,\n };\n}\n","import { readFile } from 'node:fs/promises';\n\nimport { TEMPLATE_VARIABLES, VALID_TEMPLATE_VARIABLES } from '../template-variables.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Validate custom prompt template content from a file.\n * Reads the file and checks for valid template variables.\n * Throws an error if required template variables are missing.\n */\nexport async function validateCustomPromptContent(promptPath: string): Promise<void> {\n const content = await readFile(promptPath, 'utf8');\n validateTemplateVariables(content, promptPath);\n}\n\n/**\n * Validate template variables in a custom prompt template string.\n * Exported for testing purposes.\n * @throws Error if required template variables are missing\n */\nexport function validateTemplateVariables(content: string, source: string): void {\n // Extract all template variables from content\n const variablePattern = /\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g;\n const foundVariables = new Set<string>();\n const invalidVariables: string[] = [];\n\n let match: RegExpExecArray | null = variablePattern.exec(content);\n while (match !== null) {\n const varName = match[1];\n foundVariables.add(varName);\n if (!VALID_TEMPLATE_VARIABLES.has(varName)) {\n invalidVariables.push(varName);\n }\n match = variablePattern.exec(content);\n }\n\n // Check if template contains required variables for evaluation\n const hasCandidateAnswer = foundVariables.has(TEMPLATE_VARIABLES.ANSWER);\n const hasExpectedOutput = foundVariables.has(TEMPLATE_VARIABLES.EXPECTED_OUTPUT);\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.ANSWER} }}\\n - {{ ${TEMPLATE_VARIABLES.EXPECTED_OUTPUT} }}`,\n );\n }\n\n // WARNING: Invalid variables - show warning but continue\n if (invalidVariables.length > 0) {\n const warningMessage = `${ANSI_YELLOW}Warning: Custom evaluator template at ${source}\n Contains invalid variables: ${invalidVariables.map((v) => `{{ ${v} }}`).join(', ')}\n Valid variables: ${Array.from(VALID_TEMPLATE_VARIABLES)\n .map((v) => `{{ ${v} }}`)\n .join(', ')}${ANSI_RESET}`;\n\n console.warn(warningMessage);\n }\n}\n","/**\n * Template variable constants for evaluator prompts.\n * These variables can be used in custom evaluator templates with {{ variable_name }} syntax.\n */\nexport const TEMPLATE_VARIABLES = {\n ANSWER: 'answer',\n EXPECTED_OUTPUT: 'expected_output',\n QUESTION: 'question',\n CRITERIA: 'criteria',\n REFERENCE_ANSWER: 'reference_answer',\n INPUT: 'input',\n OUTPUT: 'output',\n FILE_CHANGES: 'file_changes',\n} as const;\n\n/**\n * Type representing all valid template variable names.\n */\nexport type TemplateVariable = (typeof TEMPLATE_VARIABLES)[keyof typeof TEMPLATE_VARIABLES];\n\n/**\n * Set of all valid template variable names for runtime validation.\n */\nexport const VALID_TEMPLATE_VARIABLES = new Set<string>(Object.values(TEMPLATE_VARIABLES));\n\n/**\n * Template variables that are required for meaningful evaluation.\n * At least one of these should be present in a custom evaluator template.\n */\nexport const REQUIRED_TEMPLATE_VARIABLES = new Set<string>([\n TEMPLATE_VARIABLES.ANSWER,\n TEMPLATE_VARIABLES.EXPECTED_OUTPUT,\n]);\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\nimport { parse as parseYaml } from 'yaml';\n\nimport type { EvalTest, JsonObject, JsonValue, TestMessage } from '../types.js';\nimport { isJsonObject, isTestMessage } from '../types.js';\nimport { loadConfig } from './config-loader.js';\nimport { coerceEvaluator, parseEvaluators, parseInlineRubrics } from './evaluator-parser.js';\nimport { buildSearchRoots, fileExists, resolveToAbsolutePath } from './file-resolver.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 (glob supported, e.g., \"summary-*\") */\n readonly filter?: string;\n};\n\n/**\n * Sidecar metadata structure for JSONL datasets.\n */\ntype SidecarMetadata = {\n readonly description?: string;\n readonly dataset?: 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(filePath: string): 'yaml' | 'jsonl' {\n const ext = path.extname(filePath).toLowerCase();\n if (ext === '.jsonl') return 'jsonl';\n if (ext === '.yaml' || ext === '.yml') return 'yaml';\n throw new Error(`Unsupported file format: '${ext}'. Supported formats: .yaml, .yml, .jsonl`);\n}\n\n/**\n * Load sidecar YAML metadata file for a JSONL dataset.\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 = parseYaml(content) 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 dataset: asString(parsed.dataset),\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 parsed = JSON.parse(line) as unknown;\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 const config = await loadConfig(absoluteTestPath, repoRootPath);\n const guidelinePatterns = config?.guideline_patterns;\n\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 dataset name: sidecar > filename\n const fallbackDataset = path.basename(absoluteTestPath, '.jsonl') || 'eval';\n const datasetName =\n sidecar.dataset && sidecar.dataset.trim().length > 0 ? sidecar.dataset : fallbackDataset;\n\n // Global defaults from sidecar\n const globalEvaluator = coerceEvaluator(sidecar.evaluator, 'sidecar') ?? 'llm_judge';\n const globalExecution = sidecar.execution;\n\n if (verbose) {\n console.log(`\\n[JSONL Dataset: ${evalFilePath}]`);\n console.log(` Cases: ${rawCases.length}`);\n console.log(` Dataset name: ${datasetName}`);\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 evalcase = rawCases[lineIndex];\n const lineNumber = lineIndex + 1; // 1-based for user-facing messages\n const id = asString(evalcase.id);\n\n // Skip eval cases that don't match the filter pattern (glob supported)\n if (filterPattern && (!id || !micromatch.isMatch(id, filterPattern))) {\n continue;\n }\n\n const conversationId = asString(evalcase.conversation_id);\n let outcome = asString(evalcase.criteria);\n if (!outcome && evalcase.expected_outcome !== undefined) {\n outcome = asString(evalcase.expected_outcome);\n if (outcome) {\n logWarning(\n `Test '${asString(evalcase.id) ?? 'unknown'}': 'expected_outcome' is deprecated. Use 'criteria' instead.`,\n );\n }\n }\n\n // Resolve input with shorthand support\n const inputMessages = resolveInputMessages(evalcase);\n // Resolve expected_output with shorthand support\n const expectedMessages = resolveExpectedMessages(evalcase) ?? [];\n\n if (!id || !outcome || !inputMessages || inputMessages.length === 0) {\n logError(\n `Skipping incomplete test at line ${lineNumber}: ${id ?? 'unknown'}. Missing required fields: id, criteria, and/or input`,\n );\n continue;\n }\n\n // expected_output is optional - for outcome-only evaluation\n const hasExpectedMessages = expectedMessages.length > 0;\n\n const guidelinePaths: string[] = [];\n const inputTextParts: string[] = [];\n\n // Process all input messages to extract files and guidelines\n const inputSegments = await processMessages({\n messages: inputMessages,\n searchRoots,\n repoRootPath,\n guidelinePatterns,\n guidelinePaths,\n textParts: inputTextParts,\n messageType: 'input',\n verbose,\n });\n\n // Process expected_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(evalcase.execution) ? evalcase.execution : undefined;\n const mergedExecution = caseExecution ?? globalExecution;\n\n const evalCaseEvaluatorKind = coerceEvaluator(evalcase.evaluator, id) ?? globalEvaluator;\n let evaluators: Awaited<ReturnType<typeof parseEvaluators>>;\n try {\n evaluators = await parseEvaluators(evalcase, mergedExecution, searchRoots, id ?? 'unknown');\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 assert: [{type: rubrics, criteria: [...]}] instead)\n const inlineRubrics = evalcase.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 // Extract file paths from all input segments (non-guideline files)\n const userFilePaths: string[] = [];\n for (const segment of inputSegments) {\n if (segment.type === 'file' && typeof segment.resolvedPath === 'string') {\n userFilePaths.push(segment.resolvedPath);\n }\n }\n\n // Combine all file paths (guidelines + regular files)\n const allFilePaths = [\n ...guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\n ...userFilePaths,\n ];\n\n const testCase: EvalTest = {\n id,\n dataset: datasetName,\n conversation_id: conversationId,\n question: question,\n input: inputMessages,\n input_segments: inputSegments,\n expected_output: outputSegments,\n reference_answer: referenceAnswer,\n guideline_paths: guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\n guideline_patterns: guidelinePatterns,\n file_paths: allFilePaths,\n criteria: outcome,\n evaluator: evalCaseEvaluatorKind,\n evaluators,\n };\n\n if (verbose) {\n console.log(`\\n[Test: ${id}]`);\n if (testCase.guideline_paths.length > 0) {\n console.log(` Guidelines used: ${testCase.guideline_paths.length}`);\n for (const guidelinePath of testCase.guideline_paths) {\n console.log(` - ${guidelinePath}`);\n }\n } else {\n console.log(' No guidelines found');\n }\n }\n\n results.push(testCase);\n }\n\n return results;\n}\n\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 type { JsonObject, TestMessage } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport { isGuidelineFile } from './config-loader.js';\nimport { resolveFileReference } from './file-resolver.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\ntype ProcessMessagesOptions = {\n readonly messages: readonly TestMessage[];\n readonly searchRoots: readonly string[];\n readonly repoRootPath: string;\n readonly guidelinePatterns?: readonly string[];\n readonly guidelinePaths?: string[];\n readonly textParts?: string[];\n readonly messageType: 'input' | 'output';\n readonly verbose: boolean;\n};\n\n/**\n * Process message content into structured segments with file resolution.\n */\nexport async function processMessages(options: ProcessMessagesOptions): Promise<JsonObject[]> {\n const {\n messages,\n searchRoots,\n repoRootPath,\n guidelinePatterns,\n guidelinePaths,\n textParts,\n messageType,\n verbose,\n } = options;\n\n const segments: JsonObject[] = [];\n\n for (const message of messages) {\n const content = message.content;\n if (typeof content === 'string') {\n segments.push({ type: 'text', value: content });\n if (textParts) {\n textParts.push(content);\n }\n continue;\n }\n\n // 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 segments.push({ type: 'text', value: rendered });\n if (textParts) {\n textParts.push(rendered);\n }\n continue;\n }\n\n if (!Array.isArray(content)) {\n continue;\n }\n\n for (const rawSegment of content) {\n if (!isJsonObject(rawSegment)) {\n continue;\n }\n\n const segmentType = asString(rawSegment.type);\n if (segmentType === 'file') {\n const rawValue = asString(rawSegment.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n const context = messageType === 'input' ? '' : ' in expected_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 // Only check for guidelines in input messages\n if (messageType === 'input' && guidelinePatterns && guidelinePaths) {\n const relativeToRepo = path.relative(repoRootPath, resolvedPath);\n\n if (isGuidelineFile(relativeToRepo, guidelinePatterns)) {\n guidelinePaths.push(path.resolve(resolvedPath));\n if (verbose) {\n console.log(` [Guideline] Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n continue;\n }\n }\n\n segments.push({\n type: 'file',\n path: displayPath,\n text: fileContent,\n resolvedPath: path.resolve(resolvedPath),\n });\n\n if (verbose) {\n const label = messageType === 'input' ? '[File]' : '[Expected Output File]';\n console.log(` ${label} Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n } catch (error) {\n const context = messageType === 'input' ? '' : ' expected output';\n logWarning(`Could not read${context} file ${resolvedPath}: ${(error as Error).message}`);\n }\n continue;\n }\n\n const clonedSegment = cloneJsonObject(rawSegment);\n segments.push(clonedSegment);\n const inlineValue = clonedSegment.value;\n if (typeof inlineValue === 'string' && textParts) {\n textParts.push(inlineValue);\n }\n }\n }\n\n return segments;\n}\n\n/**\n * Resolve assistant content including file references.\n * Similar to input message processing, but for expected assistant responses.\n */\nexport async function resolveAssistantContent(\n content: TestMessage['content'] | undefined,\n searchRoots: readonly string[],\n verbose: boolean,\n): Promise<string> {\n if (typeof content === 'string') {\n return content;\n }\n if (!content) {\n return '';\n }\n // 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 cloneJsonObject(source: JsonObject): JsonObject {\n const entries = Object.entries(source).map(([key, value]) => [key, cloneJsonValue(value)]);\n return Object.fromEntries(entries) as JsonObject;\n}\n\nfunction cloneJsonValue(value: unknown): unknown {\n if (value === null) {\n return null;\n }\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneJsonValue(item));\n }\n if (typeof value === 'object') {\n return cloneJsonObject(value as JsonObject);\n }\n return value;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\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 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 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 === 'guideline_ref') {\n const refPath = asString(segment.path);\n return refPath ? `<Attached: ${refPath}>` : undefined;\n }\n\n if (type === 'file') {\n const filePath = asString(segment.path);\n if (!filePath) {\n return undefined;\n }\n\n // Agent mode: return file reference only\n if (mode === 'agent') {\n return `<file: path=\"${filePath}\">`;\n }\n\n // LM mode: return embedded content with XML tags\n const text = asString(segment.text);\n if (text && filePath) {\n // Use formatFileContents for consistent XML formatting\n return formatFileContents([{ content: text.trim(), isFile: true, displayPath: filePath }]);\n }\n }\n\n return undefined;\n}\n\n/**\n * Check if processed segments contain visible content (text or file attachments).\n */\nexport function hasVisibleContent(segments: readonly JsonObject[]): boolean {\n return segments.some((segment) => {\n const type = asString(segment.type);\n\n if (type === 'text') {\n const value = asString(segment.value);\n return value !== undefined && value.trim().length > 0;\n }\n\n if (type === 'guideline_ref') {\n return false;\n }\n\n if (type === 'file') {\n const text = asString(segment.text);\n return text !== undefined && text.trim().length > 0;\n }\n\n return false;\n });\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","/**\n * Shorthand expansion utilities for input/expected_output fields.\n *\n * Supports:\n * - `input` with string shorthand or message array\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 * Resolve input from raw eval case data.\n *\n * @param raw Raw eval case object from YAML/JSONL\n * @returns Resolved input messages array or undefined if none found\n */\nexport function resolveInputMessages(raw: JsonObject): TestMessage[] | undefined {\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 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 const hasName = typeof suite.name === 'string';\n const hasDescription = typeof suite.description === 'string';\n\n // Only trigger metadata parsing when `name` is present.\n // `description` alone doesn't trigger it since it's also used as a regular suite field.\n if (!hasName) {\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","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { isGuidelineFile } from '../loaders/config-loader.js';\nimport { fileExists } from '../loaders/file-resolver.js';\nimport type { ChatMessageRole, ChatPrompt } from '../providers/types.js';\nimport type { EvalTest, JsonObject, TestMessage } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport {\n type FormattingMode,\n formatFileContents,\n formatSegment,\n hasVisibleContent,\n} from './segment-formatter.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Build prompt inputs by consolidating user request context and guideline content.\n */\nexport interface PromptInputs {\n readonly question: string;\n readonly guidelines: string;\n readonly chatPrompt?: ChatPrompt;\n readonly systemMessage?: string;\n}\n\n/**\n * Build prompt inputs by consolidating user request context and guideline content.\n *\n * @param testCase - The evaluation test case\n * @param mode - Formatting mode: 'agent' for file references, 'lm' for embedded content (default: 'lm')\n */\nexport async function buildPromptInputs(\n testCase: EvalTest,\n mode: FormattingMode = 'lm',\n): Promise<PromptInputs> {\n const guidelineParts: Array<{ content: string; isFile: boolean; displayPath?: string }> = [];\n for (const rawPath of testCase.guideline_paths) {\n const absolutePath = path.resolve(rawPath);\n if (!(await fileExists(absolutePath))) {\n logWarning(`Could not read guideline file ${absolutePath}: file does not exist`);\n continue;\n }\n\n try {\n const content = (await readFile(absolutePath, 'utf8')).replace(/\\r\\n/g, '\\n').trim();\n guidelineParts.push({\n content,\n isFile: true,\n displayPath: path.basename(absolutePath),\n });\n } catch (error) {\n logWarning(`Could not read guideline file ${absolutePath}: ${(error as Error).message}`);\n }\n }\n\n const guidelines = formatFileContents(guidelineParts);\n\n // Build segments per message to determine if role markers are needed\n const segmentsByMessage: JsonObject[][] = [];\n const fileContentsByPath = new Map<string, string>();\n for (const segment of testCase.input_segments) {\n if (\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n typeof segment.text === 'string'\n ) {\n fileContentsByPath.set(segment.path, segment.text);\n }\n }\n\n for (const message of testCase.input) {\n const messageSegments: JsonObject[] = [];\n\n if (typeof message.content === 'string') {\n if (message.content.trim().length > 0) {\n messageSegments.push({ type: 'text', value: message.content });\n }\n } else if (Array.isArray(message.content)) {\n for (const segment of message.content) {\n if (typeof segment === 'string') {\n if (segment.trim().length > 0) {\n messageSegments.push({ type: 'text', value: segment });\n }\n } else if (isJsonObject(segment)) {\n const type = asString(segment.type);\n\n if (type === 'file') {\n const value = asString(segment.value);\n if (!value) continue;\n\n // Check if this is a guideline file (extracted separately)\n if (\n testCase.guideline_patterns &&\n isGuidelineFile(value, testCase.guideline_patterns)\n ) {\n // Reference marker only - actual content is in guidelines field\n messageSegments.push({ type: 'guideline_ref', path: value });\n continue;\n }\n\n // Find the file content from input_segments\n const fileText = fileContentsByPath.get(value);\n\n if (fileText !== undefined) {\n messageSegments.push({ type: 'file', text: fileText, path: value });\n }\n } else if (type === 'text') {\n const textValue = asString(segment.value);\n if (textValue && textValue.trim().length > 0) {\n messageSegments.push({ type: 'text', value: textValue });\n }\n }\n }\n }\n } else if (isJsonObject(message.content)) {\n const rendered = JSON.stringify(message.content, null, 2);\n if (rendered.trim().length > 0) {\n messageSegments.push({ type: 'text', value: rendered });\n }\n }\n\n segmentsByMessage.push(messageSegments);\n }\n\n // Determine if we need role markers based on actual processed content\n const useRoleMarkers = needsRoleMarkers(testCase.input, 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 testCase.input_segments) {\n // Skip guideline files - they're in the guidelines field\n if (\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n testCase.guideline_patterns &&\n isGuidelineFile(segment.path, testCase.guideline_patterns)\n ) {\n // Add reference marker for guideline files\n questionParts.push(`<Attached: ${segment.path}>`);\n continue;\n }\n\n const formattedContent = formatSegment(segment, mode);\n if (formattedContent) {\n questionParts.push(formattedContent);\n }\n }\n\n 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 guidelinePatterns: testCase.guideline_patterns,\n guidelineContent: guidelines,\n mode,\n })\n : undefined;\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, guidelines, chatPrompt };\n}\n\n/**\n * Detect if role markers are needed based on conversational structure.\n *\n * Role markers ([System]:, [User]:, etc.) are added when:\n * 1. There are assistant/tool messages (true multi-turn conversation), OR\n * 2. There are multiple messages that will produce visible content in the formatted output\n */\nfunction needsRoleMarkers(\n messages: readonly TestMessage[],\n processedSegmentsByMessage: readonly (readonly JsonObject[])[],\n): boolean {\n // Check for multi-turn conversation (assistant/tool messages)\n if (messages.some((msg) => msg.role === 'assistant' || msg.role === 'tool')) {\n return true;\n }\n\n // Count how many messages have actual content after processing\n let messagesWithContent = 0;\n\n for (const segments of processedSegmentsByMessage) {\n if (hasVisibleContent(segments)) {\n messagesWithContent++;\n }\n }\n\n return messagesWithContent > 1;\n}\n\nfunction buildChatPromptFromSegments(options: {\n readonly messages: readonly TestMessage[];\n readonly segmentsByMessage: readonly JsonObject[][];\n readonly guidelinePatterns?: readonly string[];\n readonly guidelineContent?: string;\n readonly systemPrompt?: string;\n readonly mode?: FormattingMode;\n}): ChatPrompt | undefined {\n const {\n messages,\n segmentsByMessage,\n guidelinePatterns,\n guidelineContent,\n systemPrompt,\n mode = 'lm',\n } = options;\n\n if (messages.length === 0) {\n return undefined;\n }\n\n const systemSegments: string[] = [];\n\n if (systemPrompt && systemPrompt.trim().length > 0) {\n systemSegments.push(systemPrompt.trim());\n }\n\n if (guidelineContent && guidelineContent.trim().length > 0) {\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${guidelineContent.trim()}`);\n }\n\n let startIndex = 0;\n while (startIndex < messages.length && messages[startIndex].role === 'system') {\n const segments = segmentsByMessage[startIndex];\n const contentParts: string[] = [];\n\n for (const segment of segments) {\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length > 0) {\n systemSegments.push(contentParts.join('\\n'));\n }\n\n startIndex += 1;\n }\n\n const chatPrompt: Array<ChatPrompt[number]> = [];\n\n if (systemSegments.length > 0) {\n chatPrompt.push({\n role: 'system',\n content: systemSegments.join('\\n\\n'),\n });\n }\n\n for (let i = startIndex; i < messages.length; i++) {\n const message = messages[i];\n const segments = segmentsByMessage[i];\n const contentParts: string[] = [];\n\n let role: ChatMessageRole = message.role as ChatMessageRole;\n\n if (role === 'system') {\n role = 'assistant';\n contentParts.push('@[System]:');\n } else if (role === 'tool') {\n role = 'assistant';\n contentParts.push('@[Tool]:');\n }\n\n for (const segment of segments) {\n if (segment.type === 'guideline_ref') {\n continue;\n }\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n const isGuidelineRef =\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n guidelinePatterns &&\n isGuidelineFile(segment.path, guidelinePatterns);\n\n if (isGuidelineRef) {\n continue;\n }\n\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length === 0) {\n continue;\n }\n\n const content = contentParts.join('\\n');\n\n chatPrompt.push({\n role,\n content,\n });\n }\n\n return chatPrompt.length > 0 ? (chatPrompt as ChatPrompt) : undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction logWarning(message: string): void {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { type AzureOpenAIProviderSettings, createAzure } from '@ai-sdk/azure';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { type LanguageModel, type ModelMessage, generateText } from 'ai';\n\nimport type { JsonObject } from '../types.js';\nimport type {\n AnthropicResolvedConfig,\n AzureResolvedConfig,\n GeminiResolvedConfig,\n RetryConfig,\n} from './targets.js';\nimport type { ChatPrompt, Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst DEFAULT_SYSTEM_PROMPT =\n 'You are a careful assistant. Follow all provided instructions and do not fabricate results.';\n\ntype TextResult = Awaited<ReturnType<typeof generateText>>;\ntype GenerateTextOptions = Parameters<typeof generateText>[0];\n\ninterface ProviderDefaults {\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly thinkingBudget?: number;\n}\n\nexport class AzureProvider implements Provider {\n readonly id: string;\n readonly kind = 'azure' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: AzureResolvedConfig,\n ) {\n this.id = `azure:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n\n const azure = createAzure(buildAzureOptions(config));\n this.model = azure(config.deploymentName);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nexport class AnthropicProvider implements Provider {\n readonly id: string;\n readonly kind = 'anthropic' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: AnthropicResolvedConfig,\n ) {\n this.id = `anthropic:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n thinkingBudget: config.thinkingBudget,\n };\n this.retryConfig = config.retry;\n\n const anthropic = createAnthropic({\n apiKey: config.apiKey,\n });\n this.model = anthropic(config.model);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n const providerOptions = buildAnthropicProviderOptions(this.defaults);\n\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n providerOptions,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nexport class GeminiProvider implements Provider {\n readonly id: string;\n readonly kind = 'gemini' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: GeminiResolvedConfig,\n ) {\n this.id = `gemini:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n\n const google = createGoogleGenerativeAI({\n apiKey: config.apiKey,\n });\n this.model = google(config.model);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nfunction buildAzureOptions(config: AzureResolvedConfig): AzureOpenAIProviderSettings {\n const options: AzureOpenAIProviderSettings = {\n apiKey: config.apiKey,\n apiVersion: config.version,\n useDeploymentBasedUrls: true,\n };\n\n const baseURL = normalizeAzureBaseUrl(config.resourceName);\n if (baseURL) {\n options.baseURL = baseURL;\n } else {\n options.resourceName = config.resourceName;\n }\n\n return options;\n}\n\nfunction normalizeAzureBaseUrl(resourceName: string): string | undefined {\n const trimmed = resourceName.trim();\n if (!/^https?:\\/\\//i.test(trimmed)) {\n return undefined;\n }\n\n const withoutSlash = trimmed.replace(/\\/+$/, '');\n const normalized = withoutSlash.endsWith('/openai') ? withoutSlash : `${withoutSlash}/openai`;\n return normalized;\n}\n\nfunction buildAnthropicProviderOptions(\n defaults: ProviderDefaults,\n): GenerateTextOptions['providerOptions'] | undefined {\n if (defaults.thinkingBudget === undefined) {\n return undefined;\n }\n\n return {\n anthropic: {\n thinking: {\n type: 'enabled',\n budgetTokens: defaults.thinkingBudget,\n },\n },\n };\n}\n\n// When chatPrompt is provided, guidelines are intentionally excluded (includeGuidelines: false)\n// because they've already been merged into the system message during prompt building.\nfunction buildChatPrompt(request: ProviderRequest): ChatPrompt {\n const provided = request.chatPrompt?.length ? request.chatPrompt : undefined;\n if (provided) {\n const hasSystemMessage = provided.some((message) => message.role === 'system');\n if (hasSystemMessage) {\n return provided;\n }\n\n const systemContent = resolveSystemContent(request, false);\n return [{ role: 'system', content: systemContent }, ...provided];\n }\n\n const systemContent = resolveSystemContent(request, true);\n const userContent = request.question.trim();\n\n const prompt: ChatPrompt = [\n { role: 'system', content: systemContent },\n { role: 'user', content: userContent },\n ];\n\n return prompt;\n}\n\nfunction resolveSystemContent(request: ProviderRequest, includeGuidelines: boolean): string {\n const systemSegments: string[] = [];\n\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\n systemSegments.push(request.systemPrompt.trim());\n } else {\n systemSegments.push(DEFAULT_SYSTEM_PROMPT);\n }\n\n if (includeGuidelines && request.guidelines && request.guidelines.trim().length > 0) {\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${request.guidelines.trim()}`);\n }\n\n return systemSegments.join('\\n\\n');\n}\n\nfunction toModelMessages(chatPrompt: ChatPrompt): ModelMessage[] {\n return chatPrompt.map((message) => {\n if (message.role === 'tool' || message.role === 'function') {\n const prefix = message.name ? `@[${message.name}]: ` : '@[Tool]: ';\n return {\n role: 'assistant',\n content: `${prefix}${message.content}`,\n } satisfies ModelMessage;\n }\n\n if (message.role === 'assistant' || message.role === 'system' || message.role === 'user') {\n return {\n role: message.role,\n content: message.content,\n } satisfies ModelMessage;\n }\n\n return {\n role: 'user',\n content: message.content,\n } satisfies ModelMessage;\n });\n}\n\nfunction resolveModelSettings(\n request: ProviderRequest,\n defaults: ProviderDefaults,\n): { temperature?: number; maxOutputTokens?: number } {\n const temperature = request.temperature ?? defaults.temperature;\n const maxOutputTokens = request.maxOutputTokens ?? defaults.maxOutputTokens;\n return {\n temperature,\n maxOutputTokens,\n };\n}\n\nasync function invokeModel(options: {\n readonly model: LanguageModel;\n readonly request: ProviderRequest;\n readonly defaults: ProviderDefaults;\n readonly retryConfig?: RetryConfig;\n readonly providerOptions?: GenerateTextOptions['providerOptions'];\n}): Promise<ProviderResponse> {\n const { model, request, defaults, retryConfig, providerOptions } = options;\n const chatPrompt = buildChatPrompt(request);\n const { temperature, maxOutputTokens } = resolveModelSettings(request, defaults);\n\n const result = await withRetry(\n () =>\n generateText({\n model,\n messages: toModelMessages(chatPrompt),\n temperature,\n maxOutputTokens,\n maxRetries: 0,\n abortSignal: request.signal,\n ...(providerOptions ? { providerOptions } : {}),\n }),\n retryConfig,\n request.signal,\n );\n\n return mapResponse(result);\n}\n\nfunction mapResponse(result: TextResult): ProviderResponse {\n const content = result.text ?? '';\n return {\n raw: result,\n usage: toJsonObject(result.totalUsage ?? result.usage),\n output: [{ role: 'assistant' as const, content }],\n };\n}\n\nfunction toJsonObject(value: unknown): JsonObject | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n try {\n return JSON.parse(JSON.stringify(value)) as JsonObject;\n } catch {\n return undefined;\n }\n}\n\nfunction extractStatus(error: unknown): number | undefined {\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n\n const candidate = error as Record<string, unknown>;\n const directStatus = candidate.status ?? candidate.statusCode;\n if (typeof directStatus === 'number' && Number.isFinite(directStatus)) {\n return directStatus;\n }\n\n const responseStatus =\n typeof candidate.response === 'object' && candidate.response\n ? (candidate.response as { status?: unknown }).status\n : undefined;\n if (typeof responseStatus === 'number' && Number.isFinite(responseStatus)) {\n return responseStatus;\n }\n\n const message = typeof candidate.message === 'string' ? candidate.message : undefined;\n if (message) {\n const match = message.match(/HTTP\\s+(\\d{3})/i);\n if (match) {\n const parsed = Number.parseInt(match[1], 10);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n\n return undefined;\n}\n\nfunction isNetworkError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const candidate = error as Record<string, unknown>;\n if (candidate.name === 'AbortError') {\n return false;\n }\n\n const code = candidate.code;\n if (typeof code === 'string' && /^E(AI|CONN|HOST|NET|PIPE|TIME|REFUSED|RESET)/i.test(code)) {\n return true;\n }\n\n const message = typeof candidate.message === 'string' ? candidate.message : undefined;\n if (\n message &&\n /(network|fetch failed|ECONNRESET|ENOTFOUND|EAI_AGAIN|ETIMEDOUT|ECONNREFUSED)/i.test(message)\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction isRetryableError(error: unknown, retryableStatusCodes: readonly number[]): boolean {\n const status = extractStatus(error);\n if (status === 401 || status === 403) {\n return false;\n }\n if (typeof status === 'number') {\n return retryableStatusCodes.includes(status);\n }\n\n return isNetworkError(error);\n}\n\nfunction calculateRetryDelay(attempt: number, config: Required<RetryConfig>): number {\n const delay = Math.min(\n config.maxDelayMs,\n config.initialDelayMs * config.backoffFactor ** attempt,\n );\n return delay * (0.75 + Math.random() * 0.5);\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function withRetry<T>(\n fn: () => Promise<T>,\n retryConfig?: RetryConfig,\n signal?: AbortSignal,\n): Promise<T> {\n const config: Required<RetryConfig> = {\n maxRetries: retryConfig?.maxRetries ?? 3,\n initialDelayMs: retryConfig?.initialDelayMs ?? 1000,\n maxDelayMs: retryConfig?.maxDelayMs ?? 60000,\n backoffFactor: retryConfig?.backoffFactor ?? 2,\n retryableStatusCodes: retryConfig?.retryableStatusCodes ?? [500, 408, 429, 502, 503, 504],\n };\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n if (signal?.aborted) {\n throw new Error(`Request aborted: ${signal.reason ?? 'Unknown reason'}`);\n }\n\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt >= config.maxRetries) {\n break;\n }\n\n if (!isRetryableError(error, config.retryableStatusCodes)) {\n throw error;\n }\n\n const delay = calculateRetryDelay(attempt, config);\n await sleep(delay);\n }\n }\n\n throw lastError;\n}\n","import { 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 { recordClaudeLogEntry } from './claude-log-tracker.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 * Default system prompt for Claude SDK evaluations.\n * Ensures the agent returns code in its response rather than just writing files.\n */\nconst DEFAULT_SYSTEM_PROMPT = `**IMPORTANT**: Follow these instructions for your response:\n- Do NOT create any additional output files in the workspace.\n- All intended file outputs/changes MUST be written in your response.\n- For each intended file, include the relative path and unified git diff following the convention \\`diff --git ...\\`.\nThis is required for evaluation scoring.`;\n\n/**\n * Claude Agent SDK provider using the @anthropic-ai/claude-agent-sdk library directly.\n * This replaces the old CLI subprocess provider with typed SDK access for structured\n * 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 @anthropic-ai/claude-agent-sdk separately.\n */\nexport class ClaudeProvider implements Provider {\n readonly id: string;\n readonly kind = 'claude' 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:${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 =\n this.config.systemPrompt ?? (request.captureFileChanges ? undefined : DEFAULT_SYSTEM_PROMPT);\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(),\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 textContent = extractTextContent(content);\n const toolCalls = extractToolCalls(content);\n\n const outputMsg: Message = {\n role: 'assistant',\n content: 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 tokenUsage = {\n input: inputTokens,\n output: outputTokens,\n cached: (usage.cache_read_input_tokens as number) ?? undefined,\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 text content from Claude's content array format.\n * Claude uses: content: [{ type: \"text\", text: \"...\" }, ...]\n */\nfunction 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\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 tool: p.name,\n input: p.input,\n id: typeof p.id === 'string' ? p.id : undefined,\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 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(): 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 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","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","import path from 'node:path';\n\nimport { isGuidelineFile } from '../yaml-parser.js';\nimport type { ProviderRequest } from './types.js';\n\nexport interface PromptDocumentOptions {\n readonly guidelinePatterns?: readonly string[];\n readonly guidelineOverrides?: ReadonlySet<string>;\n}\n\nexport function buildPromptDocument(\n request: ProviderRequest,\n inputFiles: readonly string[] | undefined,\n options?: PromptDocumentOptions,\n): string {\n const parts: string[] = [];\n\n const guidelineFiles = collectGuidelineFiles(\n inputFiles,\n options?.guidelinePatterns ?? request.guideline_patterns,\n options?.guidelineOverrides,\n );\n const inputFilesList = collectInputFiles(inputFiles);\n\n const nonGuidelineInputFiles = inputFilesList.filter((file) => !guidelineFiles.includes(file));\n\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineInputFiles);\n if (prereadBlock.length > 0) {\n parts.push('\\n', prereadBlock);\n }\n\n parts.push('\\n[[ ## user_query ## ]]\\n', request.question.trim());\n\n return parts.join('\\n').trim();\n}\n\nexport function normalizeInputFiles(\n inputFiles: readonly string[] | undefined,\n): string[] | undefined {\n if (!inputFiles || inputFiles.length === 0) {\n return undefined;\n }\n const deduped = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!deduped.has(absolutePath)) {\n deduped.set(absolutePath, absolutePath);\n }\n }\n return Array.from(deduped.values());\n}\n\nexport function collectGuidelineFiles(\n inputFiles: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n overrides?: ReadonlySet<string>,\n): string[] {\n if (!inputFiles || inputFiles.length === 0) {\n return [];\n }\n\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (overrides?.has(absolutePath)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n continue;\n }\n\n const normalized = absolutePath.split(path.sep).join('/');\n if (isGuidelineFile(normalized, guidelinePatterns)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction collectInputFiles(inputFiles: readonly string[] | undefined): string[] {\n if (!inputFiles || inputFiles.length === 0) {\n return [];\n }\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n return Array.from(unique.values());\n}\n\nfunction buildMandatoryPrereadBlock(\n guidelineFiles: readonly string[],\n inputFiles: readonly string[],\n): string {\n if (guidelineFiles.length === 0 && inputFiles.length === 0) {\n return '';\n }\n\n const buildList = (files: readonly string[]): string[] =>\n files.map((absolutePath) => {\n const fileName = path.basename(absolutePath);\n const fileUri = pathToFileUri(absolutePath);\n return `* [${fileName}](${fileUri})`;\n });\n\n const sections: string[] = [];\n if (guidelineFiles.length > 0) {\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join('\\n')}.`);\n }\n\n if (inputFiles.length > 0) {\n sections.push(`Read all input files:\\n${buildList(inputFiles).join('\\n')}.`);\n }\n\n sections.push(\n 'If any file is missing, fail with ERROR: missing-file <filename> and stop.',\n 'Then apply system_instructions on the user query below.',\n );\n\n return sections.join('\\n');\n}\n\nfunction pathToFileUri(filePath: string): string {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n return `file://${normalizedPath}`;\n}\n","import { type 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 { 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: msg.content,\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 templateValues = buildTemplateValues(request, this.config, outputFilePath);\n const renderedCommand = renderTemplate(this.config.commandTemplate, 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 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 }\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 templateValues = buildTemplateValues(\n {\n question: '',\n guidelines: '',\n inputFiles: batchInputFiles,\n evalCaseId: 'batch',\n attempt: 0,\n },\n this.config,\n outputFilePath,\n );\n const renderedCommand = renderTemplate(this.config.commandTemplate, templateValues);\n\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] (batch size=${requests.length}) cwd=${this.config.cwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n // Measure wall-clock time for batch (used as fallback if records don't provide duration)\n const startTime = Date.now();\n const result = await this.runCommand(renderedCommand, {\n cwd: this.config.cwd,\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: this.config.cwd,\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: this.config.cwd,\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: this.config.cwd,\n outputFile: outputFilePath,\n recordId: evalCaseId,\n },\n };\n });\n\n return responses;\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 (healthcheck.type === 'http') {\n const controller = new AbortController();\n const timer = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : undefined;\n signal?.addEventListener('abort', () => controller.abort(), { once: true });\n\n try {\n const response = await fetch(healthcheck.url, { method: 'GET', signal: controller.signal });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\n }\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${reason}`);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n return;\n }\n\n const renderedCommand = renderTemplate(\n healthcheck.commandTemplate,\n buildTemplateValues(\n {\n question: '',\n guidelines: '',\n inputFiles: [],\n evalCaseId: 'healthcheck',\n attempt: 0,\n },\n this.config,\n generateOutputFilePath('healthcheck'),\n ),\n );\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] (healthcheck) cwd=${healthcheck.cwd ?? this.config.cwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n const result = await this.runCommand(renderedCommand, {\n cwd: healthcheck.cwd ?? this.config.cwd,\n env: process.env,\n timeoutMs,\n signal,\n });\n\n if (result.failed || (result.exitCode ?? 0) !== 0) {\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\n const detail = result.stderr.trim() || result.stdout.trim();\n const message = detail\n ? `${detail} (exit code ${codeText})`\n : `CLI healthcheck command exited with code ${codeText}`;\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${message}`);\n }\n }\n}\n\nfunction buildTemplateValues(\n request: Pick<\n ProviderRequest,\n 'question' | 'guidelines' | 'inputFiles' | 'evalCaseId' | 'attempt'\n >,\n config: CliResolvedConfig,\n outputFilePath: string,\n): Record<string, string> {\n const inputFiles = normalizeInputFiles(request.inputFiles);\n return {\n PROMPT: shellEscape(request.question ?? ''),\n GUIDELINES: shellEscape(request.guidelines ?? ''),\n EVAL_ID: shellEscape(request.evalCaseId ?? ''),\n ATTEMPT: shellEscape(String(request.attempt ?? 0)),\n FILES: formatFileList(inputFiles, config.filesFormat),\n OUTPUT_FILE: shellEscape(outputFilePath),\n };\n}\n\nfunction normalizeInputFiles(\n inputFiles: readonly string[] | undefined,\n): readonly string[] | undefined {\n if (!inputFiles || inputFiles.length === 0) {\n return undefined;\n }\n\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction formatFileList(\n files: readonly string[] | undefined,\n template: string | undefined,\n): string {\n if (!files || files.length === 0) {\n return '';\n }\n\n const formatter = template ?? '{path}';\n return files\n .map((filePath) => {\n const escapedPath = shellEscape(filePath);\n const escapedName = shellEscape(path.basename(filePath));\n return formatter.replaceAll('{path}', escapedPath).replaceAll('{basename}', escapedName);\n })\n .join(' ');\n}\n\nfunction renderTemplate(template: string, values: Record<string, string>): string {\n return template.replace(/\\{([A-Z_]+)\\}/g, (match, key) => {\n const replacement = values[key];\n return replacement !== undefined ? replacement : match;\n });\n}\n\nfunction shellEscape(value: string): string {\n if (value.length === 0) {\n return \"''\";\n }\n\n if (process.platform === 'win32') {\n // PowerShell uses backtick (`) for escaping, not backslash\n // Double quotes inside the string need to be escaped with backtick\n // Single quotes can be used instead for simpler escaping\n const escaped = value.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n\n return `'${value.replace(/'/g, \"'\\\"'\\\"'\")}'`;\n}\n\nfunction generateOutputFilePath(evalCaseId?: string, 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 { 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 * Default system prompt for Codex SDK evaluations.\n * Ensures the agent returns code in its response rather than just writing files.\n */\nconst DEFAULT_SYSTEM_PROMPT = `**IMPORTANT**: Follow these instructions for your response:\n- Do NOT create any additional output files in the workspace.\n- All intended file outputs/changes MUST be written in your response.\n- For each intended file, include the relative path and unified git diff following the convention \\`diff --git ...\\`.\nThis is required for evaluation scoring.`;\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 // Skip forced diff prompt when AgentV captures file changes\n const systemPrompt =\n this.config.systemPrompt ?? (request.captureFileChanges ? undefined : DEFAULT_SYSTEM_PROMPT);\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 });\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 tool: 'command_execution',\n input: item.command,\n output: item.aggregated_output,\n id: item.id,\n });\n }\n\n if (itemType === 'file_change') {\n completedToolCalls.push({\n tool: 'file_change',\n input: item.changes,\n id: item.id,\n });\n }\n\n if (itemType === 'mcp_tool_call') {\n completedToolCalls.push({\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 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 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 { recordCopilotCliLogEntry } from './copilot-cli-log-tracker.js';\nimport {\n CopilotStreamLogger,\n buildLogFilename,\n isLogStreamingDisabled,\n killProcess,\n resolvePlatformCliPath,\n} from './copilot-utils.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\n/**\n * Default system prompt for Copilot CLI evaluations.\n * Ensures the agent returns code in its response rather than just writing files.\n */\nconst DEFAULT_SYSTEM_PROMPT = `**IMPORTANT**: Follow these instructions for your response:\n- Do NOT create any additional output files in the workspace.\n- All intended file outputs/changes MUST be written in your response.\n- For each intended file, include the relative path and unified git diff following the convention \\`diff --git ...\\`.\nThis is required for evaluation scoring.`;\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 */\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\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 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 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 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 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 has { size, used, cost? } — cost has { amount, currency }\n // `used` reports cumulative context window usage, so overwrite (not accumulate)\n if (tokenUsage) {\n tokenUsage = { input: update.used, output: tokenUsage.output };\n } else {\n tokenUsage = { input: update.used, output: 0 };\n }\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 if (request.signal) {\n const abortHandler = () => {\n killProcess(agentProcess);\n };\n request.signal.addEventListener('abort', abortHandler, { once: true });\n try {\n await this.raceWithTimeout(sendPromise, agentProcess);\n } finally {\n request.signal.removeEventListener('abort', abortHandler);\n }\n } else {\n await this.raceWithTimeout(sendPromise, agentProcess);\n }\n\n const endTime = new Date().toISOString();\n const durationMs = Date.now() - startMs;\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 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 };\n } finally {\n await logger?.close();\n killProcess(agentProcess);\n }\n }\n\n private buildCliArgs(): string[] {\n const args = ['--acp', '--stdio', '--allow-all-tools'];\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 (\n this.config.systemPrompt ?? (request.captureFileChanges ? undefined : DEFAULT_SYSTEM_PROMPT)\n );\n }\n\n private async raceWithTimeout(\n sendPromise: Promise<unknown>,\n agentProcess: ChildProcess,\n ): Promise<void> {\n const timeoutMs = this.config.timeoutMs;\n if (!timeoutMs) {\n await sendPromise;\n return;\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 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 },\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\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","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, 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 */\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 return undefined;\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\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\n private constructor(\n filePath: string,\n format: 'summary' | 'json',\n summarize: (eventType: string, data: unknown) => string | undefined,\n ) {\n this.filePath = filePath;\n this.format = format;\n this.summarize = summarize;\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(options.filePath, options.format, summarize);\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 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 = this.summarize(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\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","import { randomUUID } from 'node:crypto';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { recordCopilotSdkLogEntry } from './copilot-sdk-log-tracker.js';\nimport {\n CopilotStreamLogger,\n buildLogFilename,\n isLogStreamingDisabled,\n resolvePlatformCliPath,\n} from './copilot-utils.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 throw new Error(\n `Failed to load @github/copilot-sdk. Please install it:\\n npm install @github/copilot-sdk\\n\\nOriginal error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return copilotSdkModule;\n}\n\n/**\n * Default system prompt for Copilot SDK evaluations.\n * Ensures the agent returns code in its response rather than just writing files.\n */\nconst DEFAULT_SYSTEM_PROMPT = `**IMPORTANT**: Follow these instructions for your response:\n- Do NOT create any additional output files in the workspace.\n- All intended file outputs/changes MUST be written in your response.\n- For each intended file, include the relative path and unified git diff following the convention \\`diff --git ...\\`.\nThis is required for evaluation scoring.`;\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' 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:${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 }\n\n // Skip forced diff prompt when AgentV captures file changes\n const systemPrompt =\n this.config.systemPrompt ?? (request.captureFileChanges ? undefined : DEFAULT_SYSTEM_PROMPT);\n\n if (systemPrompt) {\n sessionOptions.systemMessage = {\n mode: 'append',\n content: systemPrompt,\n };\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 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 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 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 };\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 },\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\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 guidelines: request.guidelines,\n },\n };\n }\n\n private calculateDelay(): number {\n // If range is specified, use uniform random distribution\n if (this.delayMinMs > 0 || this.delayMaxMs > 0) {\n const min = Math.max(0, this.delayMinMs);\n const max = Math.max(min, this.delayMaxMs);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n // Otherwise use fixed delay\n return this.delayMs;\n }\n}\n","import type { PiAgentSdkResolvedConfig } from './targets.js';\nimport type { Message, Provider, ProviderRequest, ProviderResponse, ToolCall } from './types.js';\n\ntype PiProvider =\n | 'anthropic'\n | 'openai'\n | 'google'\n | 'mistral'\n | 'groq'\n | 'cerebras'\n | 'xai'\n | 'openrouter';\n\n// Lazy-loaded modules to avoid bundling issues with dynamic requires\nlet piAgentModule: typeof import('@mariozechner/pi-agent-core') | null = null;\nlet piAiModule: typeof import('@mariozechner/pi-ai') | null = null;\n\nasync function loadPiModules(): Promise<{\n Agent: typeof import('@mariozechner/pi-agent-core').Agent;\n getModel: typeof import('@mariozechner/pi-ai').getModel;\n getEnvApiKey: typeof import('@mariozechner/pi-ai').getEnvApiKey;\n}> {\n if (!piAgentModule || !piAiModule) {\n try {\n [piAgentModule, piAiModule] = await Promise.all([\n import('@mariozechner/pi-agent-core'),\n import('@mariozechner/pi-ai'),\n ]);\n } catch (error) {\n throw new Error(\n `Failed to load pi-agent-sdk dependencies. Please install them:\\n npm install @mariozechner/pi-agent-core @mariozechner/pi-ai\\n\\nOriginal error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return {\n Agent: piAgentModule.Agent,\n getModel: piAiModule.getModel,\n getEnvApiKey: piAiModule.getEnvApiKey,\n };\n}\n\n/**\n * Pi Agent SDK provider using the @mariozechner/pi-agent-core library directly.\n * This avoids CLI argument-passing issues (especially on Windows) by using the SDK.\n *\n * Note: Dependencies are loaded lazily on first use to avoid bundling issues.\n * Users must install @mariozechner/pi-agent-core and @mariozechner/pi-ai separately.\n */\nexport class PiAgentSdkProvider implements Provider {\n readonly id: string;\n readonly kind = 'pi-agent-sdk' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: PiAgentSdkResolvedConfig;\n\n constructor(targetName: string, config: PiAgentSdkResolvedConfig) {\n this.id = `pi-agent-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('Pi agent SDK request was aborted before execution');\n }\n\n // Lazy load the pi-agent modules\n const { Agent, getModel, getEnvApiKey } = await loadPiModules();\n\n const startTime = Date.now();\n const providerName = this.config.provider ?? 'anthropic';\n const modelId = this.config.model ?? 'claude-sonnet-4-20250514';\n // Use type assertion since getModel has strict generic constraints for compile-time known values\n // but we're working with runtime configuration strings\n // biome-ignore lint/suspicious/noExplicitAny: runtime string config requires any\n const model = (getModel as any)(providerName, modelId);\n\n // Build system prompt\n const systemPrompt = this.config.systemPrompt ?? 'Answer directly and concisely.';\n\n const agent = new Agent({\n initialState: {\n systemPrompt,\n model,\n tools: [], // No tools for simple Q&A\n messages: [],\n },\n getApiKey: async (provider) => {\n // Use config apiKey if provided, otherwise try environment\n return this.config.apiKey ?? getEnvApiKey(provider as PiProvider) ?? undefined;\n },\n });\n\n // Collect events for output messages\n const output: Message[] = [];\n let finalAssistantContent = '';\n\n // Subscribe to events\n const unsubscribe = agent.subscribe((event) => {\n if (event.type === 'message_end') {\n const msg = event.message;\n if (msg.role === 'assistant') {\n const content = extractTextContent(msg.content);\n if (content) {\n finalAssistantContent = content;\n }\n }\n }\n });\n\n try {\n // Set up timeout if configured\n const timeoutMs = this.config.timeoutMs ?? 120000;\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Pi agent SDK timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n });\n\n // Run the prompt with timeout\n await Promise.race([agent.prompt(request.question), timeoutPromise]);\n\n // Wait for agent to finish\n await agent.waitForIdle();\n\n // Extract messages from agent state\n const agentMessages = agent.state.messages;\n for (const msg of agentMessages) {\n output.push(convertAgentMessage(msg));\n }\n\n const durationMs = Date.now() - startTime;\n\n return {\n raw: {\n messages: agentMessages,\n systemPrompt,\n model: this.config.model,\n provider: this.config.provider,\n },\n output,\n durationMs,\n };\n } finally {\n unsubscribe();\n }\n }\n}\n\n/**\n * Extract text content from pi-agent message content format.\n */\nfunction extractTextContent(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-agent message to AgentV Message format.\n */\nfunction convertAgentMessage(message: unknown): 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 content = extractTextContent(msg.content);\n const toolCalls = extractToolCalls(msg.content);\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 return {\n role,\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n startTime,\n };\n}\n\n/**\n * Extract tool calls from pi-agent content array format.\n */\nfunction extractToolCalls(content: unknown): 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 toolCalls.push({\n tool: p.name,\n input: p.arguments,\n id: typeof p.id === 'string' ? p.id : undefined,\n });\n }\n }\n\n return toolCalls;\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, mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\n\nimport { recordPiLogEntry } from './pi-log-tracker.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\nconst WORKSPACE_PREFIX = 'agentv-pi-';\nconst PROMPT_FILENAME = 'prompt.md';\n\n/**\n * Default system prompt for Pi Coding Agent evaluations.\n * Ensures the agent returns code in its response rather than just writing files.\n */\nconst DEFAULT_SYSTEM_PROMPT = `**IMPORTANT**: Follow these instructions for your response:\n- Do NOT create any additional output files in the workspace.\n- All intended file outputs/changes MUST be written in your response.\n- For each intended file, include the relative path and unified git diff following the convention \\`diff --git ...\\`.\nThis is required for evaluation scoring.`;\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 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 private readonly runPi: PiRunner;\n\n constructor(\n targetName: string,\n config: PiCodingAgentResolvedConfig,\n runner: PiRunner = defaultPiRunner,\n ) {\n this.id = `pi-coding-agent:${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 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 workspaceRoot = await this.createWorkspace();\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n try {\n // Save prompt to file for debugging/logging\n const promptFile = path.join(workspaceRoot, PROMPT_FILENAME);\n await writeFile(promptFile, request.question, 'utf8');\n\n const args = this.buildPiArgs(request.question, inputFiles, request.captureFileChanges);\n const cwd = this.resolveCwd(workspaceRoot, request.cwd);\n\n const result = await this.executePi(args, cwd, request.signal, logger);\n\n if (result.timedOut) {\n throw new Error(\n `Pi coding agent 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 coding agent 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 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,\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 await this.cleanupWorkspace(workspaceRoot);\n }\n }\n\n private resolveCwd(workspaceRoot: string, cwdOverride?: string): string {\n // Request cwd override takes precedence (e.g., from workspace_template)\n if (cwdOverride) {\n return path.resolve(cwdOverride);\n }\n if (!this.config.cwd) {\n return workspaceRoot;\n }\n return path.resolve(this.config.cwd);\n }\n\n private buildPiArgs(\n prompt: string,\n inputFiles: readonly string[] | undefined,\n captureFileChanges?: boolean,\n ): string[] {\n const args: string[] = [];\n\n // Provider and model configuration\n if (this.config.provider) {\n args.push('--provider', this.config.provider);\n }\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n if (this.config.apiKey) {\n args.push('--api-key', this.config.apiKey);\n }\n\n // Output mode - always use JSON for structured output\n args.push('--mode', 'json');\n\n // Non-interactive mode\n args.push('--print');\n\n // No session storage for eval runs\n args.push('--no-session');\n\n // Tools configuration\n if (this.config.tools) {\n args.push('--tools', this.config.tools);\n }\n\n // Thinking level\n if (this.config.thinking) {\n args.push('--thinking', this.config.thinking);\n }\n\n // Custom args\n if (this.config.args && this.config.args.length > 0) {\n args.push(...this.config.args);\n }\n\n // Input files passed with @path syntax (pi-native file inclusion)\n if (inputFiles && inputFiles.length > 0) {\n for (const file of inputFiles) {\n args.push(`@${file}`);\n }\n }\n\n // Prepend system prompt (skip forced diff prompt when AgentV captures file changes)\n const systemPrompt =\n this.config.systemPrompt ?? (captureFileChanges ? undefined : DEFAULT_SYSTEM_PROMPT);\n const fullPrompt = systemPrompt ? `${systemPrompt}\\n\\n${prompt}` : prompt;\n\n // Escape @ symbols in prompt that aren't file references\n // Pi CLI interprets @ as file prefix, but AgentV uses @[Role]: for multi-turn\n const escapedPrompt = escapeAtSymbols(fullPrompt);\n\n // Prompt is passed as the final argument\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 coding agent executable '${this.config.executable}' was not found. Update the target settings.executable or add it to PATH.`,\n );\n }\n throw error;\n }\n }\n\n private buildEnv(): NodeJS.ProcessEnv {\n const env = { ...process.env };\n\n // Map provider-specific API key to the correct env var\n if (this.config.apiKey) {\n const provider = this.config.provider?.toLowerCase() ?? 'google';\n switch (provider) {\n case 'google':\n case 'gemini':\n env.GEMINI_API_KEY = this.config.apiKey;\n break;\n case 'anthropic':\n env.ANTHROPIC_API_KEY = this.config.apiKey;\n break;\n case 'openai':\n env.OPENAI_API_KEY = this.config.apiKey;\n break;\n case 'groq':\n env.GROQ_API_KEY = this.config.apiKey;\n break;\n case 'xai':\n env.XAI_API_KEY = this.config.apiKey;\n break;\n case 'openrouter':\n env.OPENROUTER_API_KEY = this.config.apiKey;\n break;\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-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 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 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 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 // Handle specific event types\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 event = record.assistantMessageEvent as Record<string, unknown> | undefined;\n const eventType = event?.type;\n if (eventType === 'text_delta') {\n const delta = event?.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 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\n/**\n * Parse Pi coding agent JSONL output.\n * Returns an array of parsed JSON objects from each line.\n */\nfunction parsePiJsonl(output: string): unknown[] {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n throw new Error('Pi coding agent 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 (e.g., stderr mixed in)\n }\n }\n\n if (parsed.length === 0) {\n throw new Error('Pi coding agent produced no valid JSON output');\n }\n\n return parsed;\n}\n\n/**\n * Extract Message array from Pi JSONL events.\n * Looks for the agent_end event which contains the full message history.\n */\nfunction extractMessages(events: unknown[]): readonly Message[] {\n // Find the agent_end event which contains all messages\n for (let i = events.length - 1; i >= 0; i--) {\n const event = events[i];\n if (!event || typeof event !== 'object') {\n continue;\n }\n const record = event as Record<string, unknown>;\n if (record.type !== 'agent_end') {\n continue;\n }\n\n const messages = record.messages;\n if (!Array.isArray(messages)) {\n continue;\n }\n\n return messages.map(convertPiMessage).filter((m): m is Message => m !== undefined);\n }\n\n // Fallback: collect messages from turn_end events\n const output: Message[] = [];\n for (const event of events) {\n if (!event || typeof event !== 'object') {\n continue;\n }\n const record = event as Record<string, unknown>;\n if (record.type === 'turn_end') {\n const message = record.message;\n const converted = convertPiMessage(message);\n if (converted) {\n output.push(converted);\n }\n }\n }\n\n return output;\n}\n\n/**\n * Extract token usage from Pi JSONL events.\n * Checks the agent_end event for top-level usage, then aggregates from output messages.\n */\nfunction extractTokenUsage(events: unknown[]): ProviderTokenUsage | undefined {\n // First, check agent_end for top-level usage\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 // Check for top-level usage on agent_end event\n const usage = record.usage;\n if (usage && typeof usage === 'object') {\n const u = usage as Record<string, unknown>;\n const input = toNumber(u.input_tokens ?? u.inputTokens ?? u.input);\n const output = toNumber(u.output_tokens ?? u.outputTokens ?? u.output);\n if (input !== undefined || output !== undefined) {\n const result: ProviderTokenUsage = {\n input: input ?? 0,\n output: output ?? 0,\n };\n const cached = toNumber(u.cache_read_input_tokens ?? u.cached ?? u.cachedTokens);\n if (cached !== undefined) {\n return { ...result, cached };\n }\n return result;\n }\n }\n\n // Aggregate usage from messages within agent_end\n const messages = record.messages;\n if (Array.isArray(messages)) {\n return aggregateUsageFromMessages(messages);\n }\n }\n\n return undefined;\n}\n\n/**\n * Aggregate token usage from Pi messages that have usage metadata.\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 = toNumber(u.input_tokens ?? u.inputTokens ?? u.input);\n const output = toNumber(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 = toNumber(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 toNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n return undefined;\n}\n\n/**\n * Convert a Pi message to AgentV Message format.\n */\nfunction convertPiMessage(message: unknown): Message | undefined {\n if (!message || typeof message !== 'object') {\n return undefined;\n }\n\n const msg = message as Record<string, unknown>;\n const role = msg.role;\n if (typeof role !== 'string') {\n return undefined;\n }\n\n // Extract text content from Pi's content array format\n const content = extractTextContent(msg.content);\n\n // Extract tool calls if present\n const toolCalls = extractToolCalls(msg.content);\n\n // Extract startTime (mapped from timestamp in raw message)\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 // Extract metadata (usage, model info, etc.)\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\n/**\n * Extract text content from Pi's content array format.\n * Pi uses: content: [{ type: \"text\", text: \"...\" }, ...]\n */\nfunction extractTextContent(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 * Extract tool calls from Pi's content array format.\n * Pi uses: content: [{ type: \"tool_use\", name: \"...\", input: {...} }, ...]\n */\nfunction extractToolCalls(content: unknown): 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 === 'tool_use' && typeof p.name === 'string') {\n toolCalls.push({\n tool: p.name,\n input: p.input,\n id: typeof p.id === 'string' ? p.id : undefined,\n });\n }\n // Also handle tool_result for output\n if (p.type === 'tool_result' && typeof p.tool_use_id === 'string') {\n // Find matching tool call and add output\n const existing = toolCalls.find((tc) => tc.id === p.tool_use_id);\n if (existing) {\n // Create new object with output added\n const idx = toolCalls.indexOf(existing);\n toolCalls[idx] = {\n ...existing,\n output: p.content,\n };\n }\n }\n }\n\n return toolCalls;\n}\n\n/**\n * Escape @ symbols in prompt text that pi CLI would interpret as file references.\n * Pi CLI uses @path syntax for file inclusion, but AgentV prompts use @[Role]: markers.\n * We replace @[ with [[ to avoid pi trying to read these as files.\n */\nfunction escapeAtSymbols(prompt: string): string {\n // Replace @[Role]: patterns with [[Role]]: to avoid pi file interpretation\n // This handles @[System]:, @[User]:, @[Assistant]:, @[Tool]: etc.\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) {\n return errorText;\n }\n const stdoutText = stdout.trim();\n return stdoutText.length > 0 ? stdoutText : undefined;\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n\nasync function defaultPiRunner(options: PiRunOptions): Promise<PiRunResult> {\n return await new Promise<PiRunResult>((resolve, reject) => {\n // Parse executable - may be \"node /path/to/script.js\" or just \"pi\"\n const parts = options.executable.split(/\\s+/);\n const executable = parts[0];\n const executableArgs = parts.slice(1);\n const allArgs = [...executableArgs, ...options.args];\n\n const child = spawn(executable, allArgs, {\n cwd: options.cwd,\n env: options.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n shell: false,\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const onAbort = (): void => {\n child.kill('SIGTERM');\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeoutMs);\n timeoutHandle.unref?.();\n }\n\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk) => {\n stdout += chunk;\n options.onStdoutChunk?.(chunk);\n });\n\n child.stderr.setEncoding('utf8');\n child.stderr.on('data', (chunk) => {\n stderr += chunk;\n options.onStderrChunk?.(chunk);\n });\n\n // Close stdin immediately since prompt is passed as argument\n child.stdin.end();\n\n const cleanup = (): void => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n if (options.signal) {\n options.signal.removeEventListener('abort', onAbort);\n }\n };\n\n child.on('error', (error) => {\n cleanup();\n reject(error);\n });\n\n child.on('close', (code) => {\n cleanup();\n resolve({\n stdout,\n stderr,\n exitCode: typeof code === 'number' ? code : -1,\n timedOut,\n });\n });\n });\n}\n","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 * 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, stat } 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 { isGuidelineFile } from '../yaml-parser.js';\nimport type { VSCodeResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\nimport { AGENTV_BATCH_REQUEST_TEMPLATE, AGENTV_REQUEST_TEMPLATE } from './vscode-templates.js';\n\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, request.guideline_patterns);\n\n // Prefer workspace file resolved from eval-level workspace.template.\n // Fall back to target-level config.workspaceTemplate (must be a file, not directory).\n const workspaceTemplate =\n request.workspaceFile ?? (await resolveWorkspaceTemplateFile(this.config.workspaceTemplate));\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: [],\n durationMs,\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, request.guideline_patterns),\n );\n\n // For batch, we don't support per-request cwd override (would need separate workspaces)\n const batchWorkspaceTemplate = await resolveWorkspaceTemplateFile(\n this.config.workspaceTemplate,\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: batchWorkspaceTemplate,\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: [],\n durationMs: perRequestDurationMs,\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/**\n * Returns the workspace template path only if it points to a file (e.g. a .code-workspace).\n * When workspace_template is a directory, the orchestrator already copies it to a temp\n * location and passes that as request.cwd — so we drop the directory here and let the\n * cwd path handle folder injection into the .code-workspace file.\n */\nasync function resolveWorkspaceTemplateFile(\n template: string | undefined,\n): Promise<string | undefined> {\n if (!template) {\n return undefined;\n }\n try {\n const stats = await stat(path.resolve(template));\n return stats.isFile() ? template : undefined;\n } catch {\n // Path doesn't exist — let copyAgentConfig handle the error\n return template;\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 guidelinePatterns: readonly string[] | undefined,\n): string {\n const parts: string[] = [];\n\n // Agent providers incorporate systemPrompt into the question\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\n parts.push(request.systemPrompt.trim());\n }\n\n const guidelineFiles = collectGuidelineFiles(attachments, guidelinePatterns);\n const attachmentFiles = collectAttachmentFiles(attachments);\n\n const nonGuidelineAttachments = attachmentFiles.filter((file) => !guidelineFiles.includes(file));\n\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineAttachments);\n if (prereadBlock.length > 0) {\n parts.push('\\n', prereadBlock);\n }\n\n parts.push('\\n[[ ## user_query ## ]]\\n', request.question.trim());\n\n return parts.join('\\n').trim();\n}\n\nfunction buildMandatoryPrereadBlock(\n guidelineFiles: readonly string[],\n attachmentFiles: readonly string[],\n): string {\n if (guidelineFiles.length === 0 && attachmentFiles.length === 0) {\n return '';\n }\n\n const buildList = (files: readonly string[]): string[] =>\n files.map((absolutePath) => {\n const fileName = path.basename(absolutePath);\n const fileUri = pathToFileUri(absolutePath);\n return `* [${fileName}](${fileUri})`;\n });\n\n const sections: string[] = [];\n if (guidelineFiles.length > 0) {\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join('\\n')}.`);\n }\n\n if (attachmentFiles.length > 0) {\n sections.push(`Read all attachment files:\\n${buildList(attachmentFiles).join('\\n')}.`);\n }\n\n sections.push(\n 'If any file is missing, fail with ERROR: missing-file <filename> and stop.',\n 'Then apply system_instructions on the user query below.',\n );\n\n return sections.join('\\n');\n}\n\nfunction collectGuidelineFiles(\n attachments: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n): string[] {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n\n const unique = new Map<string, string>();\n for (const attachment of attachments) {\n const absolutePath = path.resolve(attachment);\n const normalized = absolutePath.split(path.sep).join('/');\n\n if (isGuidelineFile(normalized, guidelinePatterns)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction collectAttachmentFiles(attachments: readonly string[] | undefined): string[] {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n const unique = new Map<string, string>();\n for (const attachment of attachments) {\n const absolutePath = path.resolve(attachment);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n return Array.from(unique.values());\n}\n\nfunction pathToFileUri(filePath: string): string {\n // Convert to absolute path if relative\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n\n // On Windows, convert backslashes to forward slashes\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n\n // Handle Windows drive letters (e.g., C:/ becomes file:///C:/)\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n\n // Unix-like paths\n return `file://${normalizedPath}`;\n}\n\nfunction _composeUserQuery(request: ProviderRequest): string {\n // For VS Code, guidelines are handled via file attachments\n // Do NOT include guideline content in the user query\n return request.question.trim();\n}\n\nfunction normalizeAttachments(attachments: readonly string[] | undefined): string[] | undefined {\n if (!attachments || attachments.length === 0) {\n return undefined;\n }\n const deduped = new Set<string>();\n for (const attachment of attachments) {\n deduped.add(path.resolve(attachment));\n }\n return Array.from(deduped);\n}\n\nfunction mergeAttachments(all: readonly (readonly string[] | undefined)[]): string[] | undefined {\n const deduped = new Set<string>();\n for (const list of all) {\n if (!list) continue;\n for (const inputFile of list) {\n deduped.add(path.resolve(inputFile));\n }\n }\n return deduped.size > 0 ? Array.from(deduped) : undefined;\n}\n\nexport interface EnsureSubagentsOptions {\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly count: number;\n readonly verbose?: boolean;\n 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 { 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 },\n): ChildProcess {\n const child = spawn(vscodeCmd, args, {\n windowsHide: true,\n shell: options?.shell ?? true,\n detached: false,\n });\n child.on('error', () => {\n // Handled by raceSpawnError when used, or silently ignored for fire-and-forget calls\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 spawnVsCode(shellQuote(vscodeCmd), [workspacePath]);\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 spawnVsCode(shellQuote(vscodeCmd), [workspacePath]);\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 spawnVsCode(shellQuote(vscodeCmd), chatArgs);\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(shellQuote(vscodeCmd), chatArgs);\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(shellQuote(vscodeCmd), chatArgs);\n await raceSpawnError(child);\n}\n","import os from 'node:os';\nimport path from 'node:path';\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(os.homedir(), '.agentv', 'subagents', 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}}\n - Do NOT create any additional output files in the workspace.\n - All intended file outputs/changes MUST be written in your response file.\n - For each intended file, include the repo name, relative path and unified git diff following the convention \\`diff --git ...\\`.\n2. When completely finished, run these PowerShell commands to signal completion:\n\\`\\`\\`\nMove-Item -LiteralPath '{{responseFileTmp}}' -Destination '{{responseFileFinal}}'\nif (Test-Path subagent.lock) { del subagent.lock }\n\\`\\`\\`\n\nDo not proceed to step 2 until your response is completely written to the temporary file.\n`;\n\nexport const AGENTV_BATCH_REQUEST_TEMPLATE = `[[ ## task ## ]]\n\n{{userQuery}}\n\n[[ ## system_instructions ## ]]\n\n**IMPORTANT**: Follow these exact steps:\n1. Create and write your complete response to: {{responseFileTmp}}\n - Do NOT create any additional output files in the workspace.\n - All intended file outputs/changes MUST be written in your response file.\n - For each intended file, include the repo name, relative path and unified git diff following the convention \\`diff --git ...\\`.\n2. When completely finished and the response is stable, rename it to: {{responseFileFinal}}\n3. Do not unlock the workspace from this request; batch orchestration will handle unlocking after all responses are ready.\n`;\n\nexport const AGENTV_BATCH_ORCHESTRATOR_TEMPLATE = `MANDATORY: Run #runSubagent tool in your Available Actions for each request file to process them in isolated contexts.\nDO NOT read the request files yourself - only pass the file paths to each subagent:\n\n{{requestFiles}}\n\nAfter ALL queries complete, verify all responses exist and unlock:\n\n\\`\\`\\`powershell\n$responses = @({{responseList}})\n$missing = $responses | Where-Object { -not (Test-Path \"messages/$_\") }\nif ($missing.Count -eq 0) { del subagent.lock }\n\\`\\`\\`\n`;\n","import { constants } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { TARGETS_SCHEMA_V2 } from './types.js';\nimport type { TargetDefinition } from './types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction extractTargetsArray(parsed: Record<string, unknown>, absolutePath: string): unknown[] {\n const targets = parsed.targets;\n if (!Array.isArray(targets)) {\n throw new Error(`targets.yaml at ${absolutePath} must have a 'targets' array`);\n }\n return targets;\n}\n\nfunction assertTargetDefinition(value: unknown, index: number, filePath: string): TargetDefinition {\n if (!isRecord(value)) {\n throw new Error(`targets.yaml entry at index ${index} in ${filePath} must be an object`);\n }\n\n const name = value.name;\n const provider = value.provider;\n\n if (typeof name !== 'string' || name.trim().length === 0) {\n throw new Error(\n `targets.yaml entry at index ${index} in ${filePath} is missing a valid 'name'`,\n );\n }\n\n if (typeof provider !== 'string' || provider.trim().length === 0) {\n throw new Error(`targets.yaml entry '${name}' in ${filePath} is missing a valid 'provider'`);\n }\n\n // Pass through all properties from the YAML to support the flattened schema\n // This includes all provider-specific settings at the top level\n return value as unknown as TargetDefinition;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readTargetDefinitions(\n filePath: string,\n): Promise<readonly TargetDefinition[]> {\n const absolutePath = path.resolve(filePath);\n if (!(await fileExists(absolutePath))) {\n throw new Error(`targets.yaml not found at ${absolutePath}`);\n }\n\n const raw = await readFile(absolutePath, 'utf8');\n const parsed = parse(raw) as unknown;\n\n if (!isRecord(parsed)) {\n throw new Error(`targets.yaml at ${absolutePath} must be a YAML object with a 'targets' field`);\n }\n\n const targets = extractTargetsArray(parsed, absolutePath);\n const definitions = targets.map((entry, index) =>\n assertTargetDefinition(entry, index, absolutePath),\n );\n return definitions;\n}\n\nexport function listTargetNames(definitions: readonly TargetDefinition[]): readonly string[] {\n return definitions.map((definition) => definition.name);\n}\n","/**\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 commandTemplate: `bun run ${filePath} {PROMPT}`,\n });\n });\n discoveredKinds.push(kindName);\n }\n\n return discoveredKinds;\n}\n","import { AnthropicProvider, AzureProvider, GeminiProvider } from './ai-sdk.js';\nimport { ClaudeProvider } from './claude.js';\nimport { CliProvider } from './cli.js';\nimport { CodexProvider } from './codex.js';\nimport { CopilotCliProvider } from './copilot-cli.js';\nimport { CopilotSdkProvider } from './copilot-sdk.js';\nimport { MockProvider } from './mock.js';\nimport { PiAgentSdkProvider } from './pi-agent-sdk.js';\nimport { PiCodingAgentProvider } from './pi-coding-agent.js';\nimport { ProviderRegistry } from './provider-registry.js';\nimport type { ResolvedTarget } from './targets.js';\nimport { resolveTargetDefinition } 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 type {\n AnthropicResolvedConfig,\n AzureResolvedConfig,\n ClaudeResolvedConfig,\n CliResolvedConfig,\n CopilotCliResolvedConfig,\n CopilotSdkResolvedConfig,\n GeminiResolvedConfig,\n MockResolvedConfig,\n PiAgentSdkResolvedConfig,\n PiCodingAgentResolvedConfig,\n ResolvedTarget,\n VSCodeResolvedConfig,\n} from './targets.js';\n\nexport { resolveTargetDefinition };\nexport { readTargetDefinitions, listTargetNames } from './targets-file.js';\nexport {\n ensureVSCodeSubagents,\n type EnsureSubagentsOptions,\n type EnsureSubagentsResult,\n} from './vscode-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';\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('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', (t) => new CopilotSdkProvider(t.name, t.config as never))\n .register('copilot-cli', (t) => new CopilotCliProvider(t.name, t.config as never))\n .register('pi-coding-agent', (t) => new PiCodingAgentProvider(t.name, t.config as never))\n .register('pi-agent-sdk', (t) => new PiAgentSdkProvider(t.name, t.config as never))\n .register('claude', (t) => new ClaudeProvider(t.name, t.config as never))\n .register('mock', (t) => new MockProvider(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","import type { EvaluationVerdict } from '../types.js';\nimport type { EvaluationScore } from './types.js';\n\nexport function scoreToVerdict(score: number): EvaluationVerdict {\n if (score >= 0.8) {\n return 'pass';\n }\n if (score >= 0.6) {\n return 'borderline';\n }\n return 'fail';\n}\n\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\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 return JSON.parse(blob);\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/**\n * Negate an evaluation score: inverts score (1 - score), swaps pass/fail verdict,\n * swaps hits/misses, and annotates reasoning.\n */\nexport function negateScore(score: EvaluationScore): EvaluationScore {\n const negatedScore = clampScore(1 - score.score);\n const negatedVerdict: EvaluationVerdict =\n score.verdict === 'pass' ? 'fail' : score.verdict === 'fail' ? 'pass' : 'borderline';\n return {\n ...score,\n score: negatedScore,\n verdict: negatedVerdict,\n reasoning: score.reasoning\n ? `[Negated] ${score.reasoning} (original score: ${score.score.toFixed(2)})`\n : `[Negated] Original score: ${score.score.toFixed(2)}`,\n hits: score.misses,\n misses: score.hits,\n };\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 { JsonObject, TargetAccessConfig } from '../types.js';\nimport { clampScore, isNonEmptyString, parseJsonSafe, scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } 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\nexport interface CodeEvaluatorOptions {\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 for the script */\n readonly target?: TargetAccessConfig;\n}\n\nexport class CodeEvaluator implements Evaluator {\n readonly kind = 'code';\n\n private readonly script: 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: CodeEvaluatorOptions) {\n this.script = 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 // Determine whether to use file-backed output for large payloads\n let outputForPayload = context.output ?? null;\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-judge-'));\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 judges)\n const payload = {\n question: context.evalCase.question,\n criteria: context.evalCase.criteria,\n expectedOutput: context.evalCase.expected_output,\n referenceAnswer: context.evalCase.reference_answer,\n answer: context.candidate,\n output: outputForPayload,\n outputPath,\n guidelineFiles: context.evalCase.guideline_paths,\n inputFiles: context.evalCase.file_paths.filter(\n (path) => !context.evalCase.guideline_paths.includes(path),\n ),\n input: context.evalCase.input,\n trace: context.trace ?? 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 judge 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 const stdout = await executeScript(\n this.script,\n inputPayload,\n this.agentTimeoutMs,\n this.cwd,\n env,\n );\n const parsed = parseJsonSafe(stdout);\n const score = clampScore(typeof parsed?.score === 'number' ? parsed.score : 0);\n const hits = Array.isArray(parsed?.hits) ? parsed.hits.filter(isNonEmptyString) : [];\n const misses = Array.isArray(parsed?.misses) ? parsed.misses.filter(isNonEmptyString) : [];\n const reasoning = typeof parsed?.reasoning === 'string' ? parsed.reasoning : undefined;\n // 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 evaluatorRawRequest: JsonObject = {\n script: this.script,\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 hits,\n misses,\n expectedAspectCount: hits.length + misses.length || 1,\n reasoning,\n evaluatorRawRequest,\n ...(details ? { details } : {}),\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 hits: [],\n misses: [`Code evaluator failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n evaluatorRawRequest: {\n script: this.script,\n ...(this.cwd ? { cwd: this.cwd } : {}),\n ...(proxyUsage\n ? {\n target_proxy: {\n call_count: proxyUsage.callCount,\n max_calls: proxyUsage.maxCalls,\n },\n }\n : {}),\n error: message,\n },\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 }\n }\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 } =\n typeof scriptPath === 'string'\n ? await execShellWithStdin(scriptPath, input, { cwd, timeoutMs: agentTimeoutMs, env })\n : await execFileWithStdin(scriptPath, input, { cwd, timeoutMs: agentTimeoutMs, env });\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","interface ExecOptions {\n readonly cwd?: string;\n readonly timeoutMs?: number;\n /** Additional environment variables to pass to the subprocess */\n readonly env?: Record<string, string>;\n}\n\nfunction shellEscapePath(value: string): string {\n if (process.platform === 'win32') {\n // Very small escape helper for file paths in cmd.exe context.\n // Wrap in double-quotes and escape existing double-quotes.\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n }\n // POSIX: single-quote escape (close/open around embedded single quotes).\n return `'${value.replaceAll(\"'\", `'\\\"'\\\"'`)}'`;\n}\n\n// IPC protocol: stdin/stdout JSON was chosen over JSON-RPC (overkill for one-shot eval),\n// HTTP (unnecessary network overhead for local scripts), and in-process (no isolation,\n// single-language only). Each evaluation is isolated by design for reproducibility and\n// safe parallelization. Process spawn overhead (~10-50ms) is acceptable for eval workloads.\nexport async function execFileWithStdin(\n argv: readonly string[],\n stdinPayload: string,\n options: ExecOptions = {},\n): Promise<{\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}> {\n if (argv.length === 0) {\n throw new Error('Executable argv must include at least one entry');\n }\n\n // Use Bun.spawn if available, otherwise fall back to Node.js child_process\n if (typeof Bun !== 'undefined') {\n return execFileWithStdinBun(argv, stdinPayload, options);\n }\n return execFileWithStdinNode(argv, stdinPayload, options);\n}\n\n/**\n * Bun implementation using Bun.spawn\n */\nasync function execFileWithStdinBun(\n argv: readonly string[],\n stdinPayload: string,\n options: ExecOptions,\n): Promise<{\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}> {\n const command = [...argv];\n const encoder = new TextEncoder();\n const proc = Bun.spawn(command, {\n cwd: options.cwd,\n stdin: encoder.encode(stdinPayload),\n stdout: 'pipe',\n stderr: 'pipe',\n // Merge additional env vars with process.env\n env: options.env ? { ...process.env, ...options.env } : process.env,\n });\n\n let timedOut = false;\n const timeout =\n options.timeoutMs !== undefined\n ? setTimeout(() => {\n timedOut = true;\n proc.kill('SIGKILL');\n }, options.timeoutMs)\n : undefined;\n\n try {\n const stdoutPromise = proc.stdout ? new Response(proc.stdout).text() : Promise.resolve('');\n const stderrPromise = proc.stderr ? new Response(proc.stderr).text() : Promise.resolve('');\n\n const [stdout, stderr, exitCode] = await Promise.all([\n stdoutPromise,\n stderrPromise,\n proc.exited,\n ]);\n\n if (timedOut) {\n throw new Error(`Process timed out after ${options.timeoutMs}ms`);\n }\n\n return {\n stdout: stdout.replace(/\\r\\n/g, '\\n'),\n stderr: stderr.replace(/\\r\\n/g, '\\n'),\n exitCode,\n };\n } finally {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n }\n}\n\n/**\n * Node.js implementation using child_process.spawn\n */\nasync function execFileWithStdinNode(\n argv: readonly string[],\n stdinPayload: string,\n options: ExecOptions,\n): Promise<{\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}> {\n const { spawn } = await import('node:child_process');\n\n return new Promise((resolve, reject) => {\n const [cmd, ...args] = argv;\n const child = spawn(cmd, args, {\n cwd: options.cwd,\n stdio: ['pipe', 'pipe', 'pipe'],\n // Merge additional env vars with process.env\n env: options.env ? { ...process.env, ...options.env } : process.env,\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n child.stdout?.on('data', (chunk: Buffer) => stdoutChunks.push(chunk));\n child.stderr?.on('data', (chunk: Buffer) => stderrChunks.push(chunk));\n\n let timedOut = false;\n const timeout =\n options.timeoutMs !== undefined\n ? setTimeout(() => {\n timedOut = true;\n child.kill('SIGKILL');\n }, options.timeoutMs)\n : undefined;\n\n child.on('error', (error) => {\n if (timeout !== undefined) clearTimeout(timeout);\n reject(error);\n });\n\n child.on('close', (code) => {\n if (timeout !== undefined) clearTimeout(timeout);\n\n if (timedOut) {\n reject(new Error(`Process timed out after ${options.timeoutMs}ms`));\n return;\n }\n\n const stdout = Buffer.concat(stdoutChunks).toString('utf8').replace(/\\r\\n/g, '\\n');\n const stderr = Buffer.concat(stderrChunks).toString('utf8').replace(/\\r\\n/g, '\\n');\n\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 0,\n });\n });\n\n // Write stdin and close\n if (child.stdin) {\n child.stdin.write(stdinPayload);\n child.stdin.end();\n }\n });\n}\n\n/**\n * Execute a shell command with the given stdin payload.\n *\n * Why this exists:\n * - Some providers/scripts (notably Node.js) must receive stdin reliably.\n * - In some Bun environments, `Bun.spawn` does not forward stdin to Node correctly.\n * - Capture stdout/stderr via temp files to avoid pipe incompatibilities.\n */\nexport async function execShellWithStdin(\n command: string,\n stdinPayload: string,\n options: ExecOptions = {},\n): Promise<{\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}> {\n const { mkdir, readFile, rm, writeFile } = await import('node:fs/promises');\n const { tmpdir } = await import('node:os');\n const path = await import('node:path');\n const { randomUUID } = await import('node:crypto');\n\n const dir = path.join(tmpdir(), `agentv-exec-${randomUUID()}`);\n await mkdir(dir, { recursive: true });\n\n const stdinPath = path.join(dir, 'stdin.txt');\n const stdoutPath = path.join(dir, 'stdout.txt');\n const stderrPath = path.join(dir, 'stderr.txt');\n\n await writeFile(stdinPath, stdinPayload, 'utf8');\n\n const wrappedCommand =\n process.platform === 'win32'\n ? `(${command}) < ${shellEscapePath(stdinPath)} > ${shellEscapePath(stdoutPath)} 2> ${shellEscapePath(stderrPath)}`\n : `(${command}) < ${shellEscapePath(stdinPath)} > ${shellEscapePath(stdoutPath)} 2> ${shellEscapePath(stderrPath)}`;\n\n const { spawn } = await import('node:child_process');\n try {\n const exitCode = await new Promise<number>((resolve, reject) => {\n const child = spawn(wrappedCommand, {\n shell: true,\n cwd: options.cwd,\n stdio: ['ignore', 'ignore', 'ignore'],\n // Merge additional env vars with process.env\n env: options.env ? { ...process.env, ...options.env } : process.env,\n });\n\n const timeout = options.timeoutMs\n ? setTimeout(() => {\n child.kill();\n reject(new Error(`Process timed out after ${options.timeoutMs}ms`));\n }, options.timeoutMs)\n : undefined;\n\n child.on('error', (error) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n reject(error);\n });\n\n child.on('exit', (code) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n resolve(code ?? 0);\n });\n });\n\n const stdout = (await readFile(stdoutPath, 'utf8')).replace(/\\r\\n/g, '\\n');\n const stderr = (await readFile(stderrPath, 'utf8')).replace(/\\r\\n/g, '\\n');\n return { stdout, stderr, exitCode };\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n}\n","/**\n * Local HTTP proxy server for target invocations from code_judge 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';\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}\n\n/**\n * Proxy usage metadata recorded after execution\n */\nexport interface TargetProxyUsageMetadata {\n readonly callCount: number;\n readonly maxCalls: number;\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\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 // 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 };\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 const output = response.output ?? [];\n responses.push({\n output,\n rawText: extractLastAssistantContent(output),\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 }),\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 * answer -> answer\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 { generateText } from 'ai';\n\nimport { extractLastAssistantContent } from '../providers/types.js';\nimport type { CompositeAggregatorConfig, CompositeEvaluatorConfig, JsonObject } from '../types.js';\nimport { executeScript } from './code-evaluator.js';\nimport { buildOutputSchema, freeformEvaluationSchema } from './llm-judge.js';\nimport {\n clampScore,\n isNonEmptyString,\n parseJsonFromText,\n parseJsonSafe,\n scoreToVerdict,\n} from './scoring.js';\nimport type {\n ChildEvaluatorResult,\n EvaluationContext,\n EvaluationScore,\n Evaluator,\n EvaluatorFactory,\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 evaluator results.\nReturn a JSON object with: score (0.0-1.0), verdict (pass/fail/borderline), and reasoning.`;\n\nexport interface CompositeEvaluatorOptions {\n readonly config: CompositeEvaluatorConfig;\n readonly evaluatorFactory: EvaluatorFactory;\n readonly cwd?: string;\n}\n\nexport class CompositeEvaluator implements Evaluator {\n readonly kind = 'composite';\n\n private readonly config: CompositeEvaluatorConfig;\n private readonly evaluatorFactory: EvaluatorFactory;\n private readonly cwd?: string;\n\n constructor(options: CompositeEvaluatorOptions) {\n this.config = options.config;\n this.evaluatorFactory = options.evaluatorFactory;\n this.cwd = options.cwd;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n // 1. Instantiate and run evaluators in parallel\n const memberResults = await Promise.all(\n this.config.evaluators.map(async (memberConfig) => {\n const evaluator = this.evaluatorFactory.create(memberConfig, context);\n return {\n id: memberConfig.name,\n type: memberConfig.type,\n result: await evaluator.evaluate(context),\n };\n }),\n );\n\n // 2. Aggregate results\n return this.aggregate(memberResults, context);\n }\n\n private async aggregate(\n results: readonly MemberResult[],\n context: EvaluationContext,\n ): Promise<EvaluationScore> {\n const aggregator = this.config.aggregator;\n\n switch (aggregator.type) {\n case 'code_judge':\n return this.runCodeAggregator(results, aggregator.path, aggregator.cwd ?? this.cwd);\n case 'llm_judge':\n return this.runLlmAggregator(results, context, aggregator);\n 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 const allHits: string[] = [];\n const allMisses: string[] = [];\n const reasoningParts: string[] = [];\n const scores: ChildEvaluatorResult[] = [];\n\n for (const member of results) {\n const weight = weights?.[member.id] ?? 1.0;\n totalWeight += weight;\n weightedSum += member.result.score * weight;\n allHits.push(...member.result.hits.map((h) => `[${member.id}] ${h}`));\n allMisses.push(...member.result.misses.map((m) => `[${member.id}] ${m}`));\n if (member.result.reasoning) {\n reasoningParts.push(`${member.id}: ${member.result.reasoning}`);\n }\n\n // Build child result entry\n scores.push({\n name: member.id,\n type: member.type,\n score: member.result.score,\n weight,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n scores: member.result.scores,\n details: member.result.details,\n });\n }\n\n const finalScore = totalWeight > 0 ? weightedSum / totalWeight : 0;\n\n return {\n score: clampScore(finalScore),\n verdict: scoreToVerdict(finalScore),\n hits: allHits,\n misses: allMisses,\n expectedAspectCount: Math.max(allHits.length + allMisses.length, 1),\n reasoning: reasoningParts.length > 0 ? reasoningParts.join('; ') : undefined,\n evaluatorRawRequest: {\n aggregator: 'weighted_average',\n ...(weights ? { weights } : {}),\n },\n scores,\n };\n }\n\n private runThreshold(results: readonly MemberResult[], threshold: number): EvaluationScore {\n const scores: ChildEvaluatorResult[] = [];\n const allHits: string[] = [];\n const allMisses: string[] = [];\n const reasoningParts: string[] = [];\n let passingCount = 0;\n let borderlineCount = 0;\n\n for (const member of results) {\n const isPassing = member.result.verdict === 'pass' || member.result.verdict === 'borderline';\n if (isPassing) {\n passingCount++;\n if (member.result.verdict === 'borderline') {\n borderlineCount++;\n }\n }\n\n allHits.push(...member.result.hits.map((h) => `[${member.id}] ${h}`));\n allMisses.push(...member.result.misses.map((m) => `[${member.id}] ${m}`));\n if (member.result.reasoning) {\n reasoningParts.push(`${member.id}: ${member.result.reasoning}`);\n }\n\n scores.push({\n name: member.id,\n type: member.type,\n score: member.result.score,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n scores: member.result.scores,\n details: member.result.details,\n });\n }\n\n const totalCount = results.length;\n const score = totalCount > 0 ? passingCount / totalCount : 0;\n const pass = score >= threshold;\n\n // Build reasoning with borderline warning\n if (pass && borderlineCount > 0) {\n reasoningParts.push(`Warning: ${borderlineCount} borderline evaluator(s) counted as passing`);\n }\n\n reasoningParts.unshift(\n `${passingCount}/${totalCount} evaluators passed (threshold: ${threshold})`,\n );\n\n return {\n score: clampScore(score),\n verdict: pass ? 'pass' : 'fail',\n hits: allHits,\n misses: allMisses,\n expectedAspectCount: Math.max(allHits.length + allMisses.length, 1),\n reasoning: reasoningParts.join('; '),\n evaluatorRawRequest: {\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: ChildEvaluatorResult[] = results.map((member) => ({\n name: member.id,\n type: member.type,\n score: member.result.score,\n weight: weights?.[member.id] ?? 1.0,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n 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 hits = Array.isArray(parsed?.hits) ? parsed.hits.filter(isNonEmptyString) : [];\n const misses = Array.isArray(parsed?.misses) ? parsed.misses.filter(isNonEmptyString) : [];\n const reasoning = typeof parsed?.reasoning === 'string' ? parsed.reasoning : undefined;\n const verdict =\n typeof parsed?.verdict === 'string' &&\n (parsed.verdict === 'pass' || parsed.verdict === 'fail' || parsed.verdict === 'borderline')\n ? parsed.verdict\n : scoreToVerdict(score);\n\n return {\n score,\n verdict,\n hits,\n misses,\n expectedAspectCount: hits.length + misses.length || 1,\n reasoning,\n evaluatorRawRequest: {\n aggregator: 'code_judge',\n script: scriptPath,\n },\n scores,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Code aggregator failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n evaluatorRawRequest: {\n aggregator: 'code_judge',\n script: scriptPath,\n error: message,\n },\n scores,\n };\n }\n }\n\n private async runLlmAggregator(\n results: readonly MemberResult[],\n context: EvaluationContext,\n config: Extract<CompositeAggregatorConfig, { type: 'llm_judge' }>,\n ): Promise<EvaluationScore> {\n const judgeProvider = context.judgeProvider;\n if (!judgeProvider) {\n throw new Error('No judge provider available for LLM aggregation');\n }\n\n const resultsObject = Object.fromEntries(results.map((r) => [r.id, r.result]));\n const resultsJson = JSON.stringify(resultsObject, null, 2);\n\n // Build child results for output\n const scores: ChildEvaluatorResult[] = results.map((member) => ({\n name: member.id,\n type: member.type,\n score: member.result.score,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n 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 evaluatorRawRequest: JsonObject = {\n aggregator: 'llm_judge',\n userPrompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n try {\n const model = judgeProvider.asLanguageModel?.();\n if (model) {\n const { text } = await generateText({\n model,\n system: systemPrompt,\n prompt: userPrompt,\n });\n\n const data = freeformEvaluationSchema.parse(parseJsonFromText(text));\n const score = clampScore(data.score);\n // Cap hits/misses at 4 items to keep LLM judge output concise and focused\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: Math.max(hits.length + misses.length, 1),\n reasoning,\n evaluatorRawRequest,\n scores,\n };\n }\n\n const response = await judgeProvider.invoke({\n question: userPrompt,\n systemPrompt,\n evalCaseId: context.evalCase.id,\n attempt: context.attempt,\n });\n\n const data = freeformEvaluationSchema.parse(\n parseJsonFromText(extractLastAssistantContent(response.output)),\n );\n const score = clampScore(data.score);\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: Math.max(hits.length + misses.length, 1),\n reasoning,\n evaluatorRawRequest,\n scores,\n };\n } catch {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [],\n expectedAspectCount: 1,\n evaluatorRawRequest,\n scores,\n };\n }\n }\n}\n","import { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport type { Provider, ProviderResponse } from '../providers/types.js';\nimport { extractLastAssistantContent } from '../providers/types.js';\nimport { TEMPLATE_VARIABLES } from '../template-variables.js';\nimport type { JsonObject, RubricItem } from '../types.js';\nimport { clampScore, isNonEmptyString, parseJsonFromText, scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } from './types.js';\n\n/**\n * Default evaluator template for the user prompt (variables will be substituted).\n * Custom evaluators can override this via evaluatorTemplate option.\n */\nexport const DEFAULT_EVALUATOR_TEMPLATE = `You are an expert evaluator. 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.QUESTION}}}\n\n[[ ## reference_answer ## ]]\n{{${TEMPLATE_VARIABLES.REFERENCE_ANSWER}}}\n\n[[ ## answer ## ]]\n{{${TEMPLATE_VARIABLES.ANSWER}}}`;\n\ntype JudgeProviderResolver = (context: EvaluationContext) => Promise<Provider | undefined>;\n\nexport interface LlmJudgeEvaluatorOptions {\n readonly resolveJudgeProvider: JudgeProviderResolver;\n readonly maxOutputTokens?: number;\n readonly temperature?: number;\n readonly evaluatorTemplate?: string;\n}\n\nconst freeformEvaluationSchema = z.object({\n score: z.number().min(0).max(1).describe('Score between 0.0 and 1.0'),\n hits: z.array(z.string()).describe('Brief specific achievements').optional(),\n misses: z.array(z.string()).describe('Brief failures or omissions').optional(),\n reasoning: z.string().describe('Concise explanation (1-2 sentences)').optional(),\n});\n\nconst rubricCheckResultSchema = z.object({\n id: z.string().describe('The ID of the rubric item being checked'),\n satisfied: z.boolean().describe('Whether this rubric requirement is met'),\n reasoning: z.string().describe('Brief explanation (1-2 sentences) for this check'),\n});\n\nconst rubricEvaluationSchema = z.object({\n checks: z.array(rubricCheckResultSchema).describe('Results for each rubric item'),\n overall_reasoning: z.string().describe('Overall assessment summary (1-2 sentences)'),\n});\n\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 };\n\nexport class LlmJudgeEvaluator implements Evaluator {\n readonly kind = 'llm_judge';\n\n private readonly resolveJudgeProvider: JudgeProviderResolver;\n private readonly maxOutputTokens?: number;\n private readonly temperature?: number;\n private readonly evaluatorTemplate?: string;\n\n constructor(options: LlmJudgeEvaluatorOptions) {\n this.resolveJudgeProvider = options.resolveJudgeProvider;\n this.maxOutputTokens = options.maxOutputTokens;\n this.temperature = options.temperature;\n this.evaluatorTemplate = options.evaluatorTemplate;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n const judgeProvider = await this.resolveJudgeProvider(context);\n if (!judgeProvider) {\n throw new Error('No judge provider available for LLM grading');\n }\n\n const config = context.evaluator;\n if (config?.type === 'llm_judge' && config.rubrics && config.rubrics.length > 0) {\n return this.evaluateWithRubrics(context, judgeProvider, config.rubrics);\n }\n\n return this.evaluateFreeform(context, judgeProvider);\n }\n\n private async evaluateFreeform(\n context: EvaluationContext,\n judgeProvider: Provider,\n ): Promise<EvaluationScore> {\n const formattedQuestion =\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\n ? context.promptInputs.question\n : context.evalCase.question;\n\n // Prepare template variables for substitution\n const variables = {\n [TEMPLATE_VARIABLES.INPUT]: JSON.stringify(context.evalCase.input_segments, null, 2),\n [TEMPLATE_VARIABLES.EXPECTED_OUTPUT]: JSON.stringify(\n context.evalCase.expected_output,\n null,\n 2,\n ),\n [TEMPLATE_VARIABLES.OUTPUT]: JSON.stringify(context.output ?? [], null, 2),\n [TEMPLATE_VARIABLES.ANSWER]: context.candidate.trim(),\n [TEMPLATE_VARIABLES.REFERENCE_ANSWER]: (context.evalCase.reference_answer ?? '').trim(),\n [TEMPLATE_VARIABLES.CRITERIA]: context.evalCase.criteria.trim(),\n [TEMPLATE_VARIABLES.QUESTION]: formattedQuestion.trim(),\n [TEMPLATE_VARIABLES.FILE_CHANGES]: context.fileChanges ?? '',\n };\n\n // Build system prompt (only the mandatory output schema)\n const systemPrompt = buildOutputSchema();\n\n // Build user prompt based on custom template or default template\n const evaluatorTemplate =\n context.evaluatorTemplateOverride ?? this.evaluatorTemplate ?? DEFAULT_EVALUATOR_TEMPLATE;\n let userPrompt = substituteVariables(evaluatorTemplate, variables);\n\n // Append file_changes section to default template only when present\n if (context.fileChanges && !context.evaluatorTemplateOverride && !this.evaluatorTemplate) {\n userPrompt += `\\n\\n[[ ## file_changes ## ]]\\n${context.fileChanges}`;\n }\n\n const evaluatorRawRequest: JsonObject = {\n userPrompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n try {\n const { data } = await this.runWithRetry({\n context,\n judgeProvider,\n systemPrompt,\n userPrompt,\n schema: freeformEvaluationSchema,\n });\n\n const score = clampScore(data.score);\n // Cap hits/misses at 4 items to keep LLM judge output concise and focused\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning;\n const expectedAspectCount = Math.max(hits.length + misses.length, 1);\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount,\n reasoning,\n evaluatorRawRequest,\n };\n } catch {\n // Deliberate: parse failures yield score 0 silently — no warning emitted,\n // the zeroed score itself signals the failure to downstream consumers.\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [],\n expectedAspectCount: 1,\n evaluatorRawRequest,\n };\n }\n }\n\n private async evaluateWithRubrics(\n context: EvaluationContext,\n judgeProvider: Provider,\n rubrics: readonly RubricItem[],\n ): Promise<EvaluationScore> {\n if (!rubrics || rubrics.length === 0) {\n throw new Error(\n `No rubrics found for evaluator \"${context.evaluator?.name ?? 'llm_judge'}\". Run \"agentv generate rubrics\" first.`,\n );\n }\n\n // 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, judgeProvider, rubrics);\n }\n\n const prompt = this.buildRubricPrompt(context, rubrics);\n const systemPrompt = buildRubricOutputSchema();\n\n const evaluatorRawRequest: JsonObject = {\n userPrompt: prompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n const { data } = await this.runWithRetry({\n context,\n judgeProvider,\n systemPrompt,\n userPrompt: prompt,\n schema: rubricEvaluationSchema,\n });\n\n const { score, verdict, hits, misses } = calculateRubricScore(data, rubrics);\n\n return {\n score,\n verdict,\n hits,\n misses,\n expectedAspectCount: rubrics.length,\n reasoning: data.overall_reasoning,\n evaluatorRawRequest,\n };\n }\n\n /**\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 judgeProvider: Provider,\n rubrics: readonly RubricItem[],\n ): Promise<EvaluationScore> {\n const prompt = this.buildScoreRangePrompt(context, rubrics);\n const systemPrompt = buildScoreRangeOutputSchema();\n\n const evaluatorRawRequest: JsonObject = {\n userPrompt: prompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n const { data } = await this.runWithRetry({\n context,\n judgeProvider,\n systemPrompt,\n userPrompt: prompt,\n schema: scoreRangeEvaluationSchema,\n });\n\n const { score, verdict, hits, misses, details } = calculateScoreRangeResult(data, rubrics);\n\n return {\n score,\n verdict,\n hits,\n misses,\n expectedAspectCount: rubrics.length,\n reasoning: data.overall_reasoning,\n evaluatorRawRequest,\n details,\n };\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 evaluator. 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 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 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 evaluator. 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 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 private async runWithRetry<T>(options: {\n readonly context: EvaluationContext;\n readonly judgeProvider: Provider;\n readonly systemPrompt: string;\n readonly userPrompt: string;\n readonly schema: z.ZodSchema<T>;\n }): Promise<{ data: T; providerResponse?: ProviderResponse }> {\n const { context, judgeProvider, systemPrompt, userPrompt, schema } = options;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n // Prefer Vercel AI SDK language model if available.\n const model = judgeProvider.asLanguageModel?.();\n if (model) {\n const { text } = await generateText({\n model,\n system: systemPrompt,\n prompt: userPrompt,\n ...(this.maxOutputTokens ? { maxTokens: this.maxOutputTokens } : {}),\n ...(typeof this.temperature === 'number' ? { temperature: this.temperature } : {}),\n });\n\n const data = schema.parse(parseJsonFromText(text));\n return { data };\n }\n\n const response = await judgeProvider.invoke({\n question: userPrompt,\n systemPrompt,\n evalCaseId: context.evalCase.id,\n attempt: context.attempt,\n maxOutputTokens: this.maxOutputTokens,\n temperature: this.temperature,\n });\n\n const data = schema.parse(parseJsonFromText(extractLastAssistantContent(response.output)));\n return { data, providerResponse: response };\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n }\n }\n\n throw new Error(`Failed to parse evaluator response after 3 attempts: ${lastError?.message}`);\n }\n}\n\n/**\n * Build the mandatory output schema that all evaluators must follow.\n * This schema is always appended to the evaluator template.\n */\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 ' \"hits\": [<array of strings, max 4 items, brief specific achievements>],',\n ' \"misses\": [<array of strings, max 4 items, brief specific failures or omissions, empty if none>],',\n ' \"reasoning\": \"<string, concise explanation for the score, 1-2 sentences max>\"',\n '}',\n ].join('\\n');\n}\n\nexport function buildRubricOutputSchema(): string {\n return `You are an expert evaluator. Evaluate the candidate answer against each rubric item.\nYou must return a valid JSON object matching this schema:\n{\n \"checks\": [\n {\n \"id\": \"string (rubric id)\",\n \"satisfied\": boolean,\n \"reasoning\": \"string (brief explanation)\"\n }\n ],\n \"overall_reasoning\": \"string (summary)\"\n}`;\n}\n\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\nexport function calculateRubricScore(\n result: z.infer<typeof rubricEvaluationSchema>,\n rubrics: readonly RubricItem[],\n): {\n score: number;\n verdict: 'pass' | 'fail' | 'borderline';\n hits: string[];\n misses: string[];\n} {\n const rubricMap = new Map(rubrics.map((rubric) => [rubric.id, rubric]));\n const hits: string[] = [];\n const misses: string[] = [];\n let totalWeight = 0;\n let earnedWeight = 0;\n let failedRequired = false;\n\n for (const check of result.checks) {\n const rubric = rubricMap.get(check.id);\n if (!rubric) {\n continue;\n }\n\n totalWeight += rubric.weight;\n\n if (check.satisfied) {\n earnedWeight += rubric.weight;\n hits.push(`[${rubric.id}] ${rubric.outcome}: ${check.reasoning}`);\n } else {\n misses.push(`[${rubric.id}] ${rubric.outcome}: ${check.reasoning}`);\n if (rubric.required) {\n failedRequired = true;\n }\n }\n }\n\n const score = totalWeight > 0 ? Math.min(1, Math.max(0, earnedWeight / totalWeight)) : 0;\n const verdict = failedRequired ? 'fail' : scoreToVerdict(score);\n return { score, verdict, hits, misses };\n}\n\n/**\n * Build the output schema for score-range rubric evaluation.\n */\nexport function buildScoreRangeOutputSchema(): string {\n return `You are an expert evaluator. 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: 'pass' | 'fail' | 'borderline';\n hits: string[];\n misses: string[];\n details: JsonObject;\n} {\n const rubricMap = new Map(rubrics.map((rubric) => [rubric.id, rubric]));\n const hits: string[] = [];\n const misses: string[] = [];\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:\n // - If required_min_score is set, use it directly\n // - If required is true (legacy), treat as required_min_score: 10\n // - Otherwise, no gating\n let requiredMinScore: number | undefined;\n if (rubric.required_min_score !== undefined) {\n requiredMinScore = rubric.required_min_score;\n } else if (rubric.required === true) {\n requiredMinScore = 10; // 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 const reasoningText = check.reasoning ? `: ${check.reasoning}` : '';\n const scoreInfo = `[${rubric.id}] ${criterionLabel} - Score: ${rawScore}/10 (${rangeDescription})${reasoningText}`;\n\n // Check gating\n if (requiredMinScore !== undefined && rawScore < requiredMinScore) {\n failedRequired = true;\n misses.push(scoreInfo);\n } else if (rawScore >= 7) {\n hits.push(scoreInfo);\n } else {\n misses.push(scoreInfo);\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 hits,\n misses,\n details: {\n raw_scores: rawScores,\n normalization: 'score / 10',\n aggregation: 'weighted_average',\n },\n };\n}\n","import type { CostEvaluatorConfig } from '../types.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } from './types.js';\n\nexport interface CostEvaluatorOptions {\n readonly config: CostEvaluatorConfig;\n}\n\n/**\n * Evaluator that checks execution cost against a budget.\n * Uses trace.costUsd from the evaluation context.\n */\nexport class CostEvaluator implements Evaluator {\n readonly kind = 'cost';\n\n private readonly config: CostEvaluatorConfig;\n\n constructor(options: CostEvaluatorOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { budget } = this.config;\n const costUsd = context.trace?.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 hits: [],\n misses: ['No cost data available in trace'],\n expectedAspectCount: 1,\n reasoning: 'Execution cost not reported by provider',\n evaluatorRawRequest: {\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 hits: passed ? [`Cost ${formatCost(costUsd)} <= ${formatCost(budget)} budget`] : [],\n misses: passed ? [] : [`Cost ${formatCost(costUsd)} > ${formatCost(budget)} budget`],\n expectedAspectCount: 1,\n reasoning: `Execution cost ${formatCost(costUsd)} (budget: ${formatCost(budget)})`,\n evaluatorRawRequest: {\n type: 'cost',\n budget,\n costUsd,\n },\n };\n }\n}\n","import { explorationRatio } from '../trace.js';\nimport type { ExecutionMetricsEvaluatorConfig } from '../types.js';\nimport { scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } from './types.js';\n\nexport interface ExecutionMetricsEvaluatorOptions {\n readonly config: ExecutionMetricsEvaluatorConfig;\n}\n\n/**\n * Evaluator 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: hits.length / (hits.length + misses.length)\n */\nexport class ExecutionMetricsEvaluator implements Evaluator {\n readonly kind = 'execution_metrics';\n\n private readonly config: ExecutionMetricsEvaluatorConfig;\n\n constructor(options: ExecutionMetricsEvaluatorOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { trace } = 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 // If no trace summary, we can't evaluate\n if (!trace) {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: ['No trace summary available'],\n expectedAspectCount: 1,\n reasoning: 'Execution metrics not available - no trace summary provided',\n evaluatorRawRequest: {\n type: 'execution_metrics',\n config: this.extractConfiguredThresholds(),\n actual: null,\n },\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\n const actualMetrics: Record<string, number | undefined> = {};\n\n // Check max_tool_calls\n if (max_tool_calls !== undefined) {\n const toolCalls = trace.eventCount;\n actualMetrics.tool_calls = toolCalls;\n\n if (toolCalls <= max_tool_calls) {\n hits.push(`Tool calls ${toolCalls} <= ${max_tool_calls} max`);\n } else {\n misses.push(`Tool calls ${toolCalls} > ${max_tool_calls} max`);\n }\n }\n\n // Check max_llm_calls\n if (max_llm_calls !== undefined) {\n const llmCalls = trace.llmCallCount;\n\n if (llmCalls === undefined) {\n misses.push('LLM call count data not available');\n } else {\n actualMetrics.llm_calls = llmCalls;\n\n if (llmCalls <= max_llm_calls) {\n hits.push(`LLM calls ${llmCalls} <= ${max_llm_calls} max`);\n } else {\n misses.push(`LLM calls ${llmCalls} > ${max_llm_calls} max`);\n }\n }\n }\n\n // Check max_tokens\n if (max_tokens !== undefined) {\n const tokenUsage = trace.tokenUsage;\n\n if (!tokenUsage) {\n misses.push('Token usage data not available');\n } else {\n const totalTokens = tokenUsage.input + tokenUsage.output;\n actualMetrics.tokens = totalTokens;\n\n if (totalTokens <= max_tokens) {\n hits.push(`Total tokens ${totalTokens} <= ${max_tokens} max`);\n } else {\n misses.push(`Total tokens ${totalTokens} > ${max_tokens} max`);\n }\n }\n }\n\n // Check max_cost_usd\n if (max_cost_usd !== undefined) {\n const costUsd = trace.costUsd;\n\n if (costUsd === undefined) {\n misses.push('Cost data not available');\n } else {\n actualMetrics.cost_usd = costUsd;\n\n const formatCost = (n: number) => `$${n.toFixed(4)}`;\n if (costUsd <= max_cost_usd) {\n hits.push(`Cost ${formatCost(costUsd)} <= ${formatCost(max_cost_usd)} max`);\n } else {\n misses.push(`Cost ${formatCost(costUsd)} > ${formatCost(max_cost_usd)} max`);\n }\n }\n }\n\n // Check max_duration_ms\n if (max_duration_ms !== undefined) {\n const durationMs = trace.durationMs;\n\n if (durationMs === undefined) {\n misses.push('Duration data not available');\n } else {\n actualMetrics.duration_ms = durationMs;\n\n if (durationMs <= max_duration_ms) {\n hits.push(`Duration ${durationMs}ms <= ${max_duration_ms}ms max`);\n } else {\n misses.push(`Duration ${durationMs}ms > ${max_duration_ms}ms max`);\n }\n }\n }\n\n // Check target_exploration_ratio\n if (target_exploration_ratio !== undefined) {\n const ratio = explorationRatio(trace);\n\n if (ratio === undefined) {\n misses.push('Exploration ratio not available (no tool calls)');\n } else {\n actualMetrics.exploration_ratio = ratio;\n\n const diff = Math.abs(ratio - target_exploration_ratio);\n if (diff <= exploration_tolerance) {\n hits.push(\n `Exploration ratio ${ratio.toFixed(2)} within tolerance of target ${target_exploration_ratio}`,\n );\n } else {\n misses.push(\n `Exploration ratio ${ratio.toFixed(2)} outside tolerance of target ${target_exploration_ratio} (diff: ${diff.toFixed(2)}, tolerance: ${exploration_tolerance})`,\n );\n }\n }\n }\n\n // Calculate score as proportion of hits\n const totalChecks = hits.length + misses.length;\n const score = totalChecks > 0 ? hits.length / totalChecks : 0;\n\n // Build reasoning\n const reasoningParts: string[] = [];\n if (actualMetrics.tool_calls !== undefined) {\n reasoningParts.push(`tool_calls=${actualMetrics.tool_calls}`);\n }\n if (actualMetrics.llm_calls !== undefined) {\n reasoningParts.push(`llm_calls=${actualMetrics.llm_calls}`);\n }\n if (actualMetrics.tokens !== undefined) {\n reasoningParts.push(`tokens=${actualMetrics.tokens}`);\n }\n if (actualMetrics.cost_usd !== undefined) {\n reasoningParts.push(`cost=$${actualMetrics.cost_usd.toFixed(4)}`);\n }\n if (actualMetrics.duration_ms !== undefined) {\n reasoningParts.push(`duration=${actualMetrics.duration_ms}ms`);\n }\n if (actualMetrics.exploration_ratio !== undefined) {\n reasoningParts.push(`exploration_ratio=${actualMetrics.exploration_ratio.toFixed(2)}`);\n }\n\n const reasoning =\n reasoningParts.length > 0\n ? `execution_metrics ${reasoningParts.join(', ')}`\n : 'No metrics evaluated';\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: totalChecks || 1,\n reasoning,\n evaluatorRawRequest: {\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 { FieldAccuracyEvaluatorConfig, FieldConfig, JsonObject } from '../types.js';\nimport { clampScore, deepEqual, parseJsonFromText, scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } 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 FieldAccuracyEvaluatorOptions {\n readonly config: FieldAccuracyEvaluatorConfig;\n}\n\n/**\n * FieldAccuracyEvaluator compares extracted structured data against expected values\n * with configurable matching strategies (exact, fuzzy, numeric_tolerance, date).\n */\nexport class FieldAccuracyEvaluator implements Evaluator {\n readonly kind = 'field_accuracy';\n\n private readonly config: FieldAccuracyEvaluatorConfig;\n\n constructor(options: FieldAccuracyEvaluatorOptions) {\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 hits: [],\n misses: ['Failed to parse candidate answer as JSON'],\n expectedAspectCount: this.config.fields.length,\n reasoning: 'Candidate answer is not valid JSON',\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 hits: [],\n misses: ['No expected data found in expected_output'],\n expectedAspectCount: this.config.fields.length,\n reasoning: 'Could not extract expected data from expected_output',\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 hits: string[] = [];\n const misses: string[] = [];\n\n for (const result of results) {\n if (result.hit) {\n hits.push(result.message);\n } else {\n misses.push(result.message);\n }\n }\n\n let score: number;\n if (aggregation === 'all_or_nothing') {\n // All fields must pass for score 1.0\n score = misses.length === 0 ? 1.0 : 0.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 const reasoning = `${hits.length}/${results.length} fields matched`;\n\n return {\n score: clampScore(score),\n verdict: scoreToVerdict(score),\n hits: hits.slice(0, 4), // Cap at 4 to keep output concise\n misses: misses.slice(0, 4),\n expectedAspectCount: results.length,\n reasoning,\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 { LatencyEvaluatorConfig } from '../types.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } from './types.js';\n\nexport interface LatencyEvaluatorOptions {\n readonly config: LatencyEvaluatorConfig;\n}\n\n/**\n * Evaluator that checks execution duration against a threshold.\n * Uses trace.durationMs from the evaluation context.\n */\nexport class LatencyEvaluator implements Evaluator {\n readonly kind = 'latency';\n\n private readonly config: LatencyEvaluatorConfig;\n\n constructor(options: LatencyEvaluatorOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { threshold } = this.config;\n const durationMs = context.trace?.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 hits: [],\n misses: ['No duration data available in trace'],\n expectedAspectCount: 1,\n reasoning: 'Execution duration not reported by provider',\n evaluatorRawRequest: {\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 hits: passed ? [`Duration ${durationMs}ms <= ${threshold}ms threshold`] : [],\n misses: passed ? [] : [`Duration ${durationMs}ms > ${threshold}ms threshold`],\n expectedAspectCount: 1,\n reasoning: `Execution took ${durationMs}ms (threshold: ${threshold}ms)`,\n evaluatorRawRequest: {\n type: 'latency',\n threshold,\n durationMs,\n },\n };\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { generateText, stepCountIs, tool } from 'ai';\nimport { z } from 'zod';\n\nimport { extractLastAssistantContent } from '../providers/types.js';\nimport type { Provider } from '../providers/types.js';\nimport { TEMPLATE_VARIABLES } from '../template-variables.js';\nimport type { JsonObject, RubricItem } from '../types.js';\nimport {\n buildOutputSchema,\n buildRubricOutputSchema,\n calculateRubricScore,\n freeformEvaluationSchema,\n rubricEvaluationSchema,\n substituteVariables,\n} from './llm-judge.js';\nimport { clampScore, isNonEmptyString, parseJsonFromText, scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } from './types.js';\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\nexport interface AgentJudgeEvaluatorOptions {\n readonly resolveJudgeProvider: (ctx: EvaluationContext) => Promise<Provider | undefined>;\n readonly maxSteps?: number;\n readonly temperature?: number;\n readonly evaluatorTemplate?: string;\n readonly judgeTargetProvider?: Provider;\n}\n\nexport class AgentJudgeEvaluator implements Evaluator {\n readonly kind = 'agent_judge';\n\n private readonly resolveJudgeProvider: (ctx: EvaluationContext) => Promise<Provider | undefined>;\n private readonly maxSteps: number;\n private readonly temperature: number;\n private readonly evaluatorTemplate?: string;\n private readonly judgeTargetProvider?: Provider;\n\n constructor(options: AgentJudgeEvaluatorOptions) {\n this.resolveJudgeProvider = options.resolveJudgeProvider;\n this.maxSteps = Math.min(options.maxSteps ?? DEFAULT_MAX_STEPS, MAX_STEPS_LIMIT);\n this.temperature = options.temperature ?? 0;\n this.evaluatorTemplate = options.evaluatorTemplate;\n this.judgeTargetProvider = options.judgeTargetProvider;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n if (this.judgeTargetProvider) {\n return this.evaluateWithJudgeTarget(context);\n }\n return this.evaluateBuiltIn(context);\n }\n\n /**\n * Built-in mode: Uses Vercel AI SDK generateText() with sandboxed filesystem tools.\n */\n private async evaluateBuiltIn(context: EvaluationContext): Promise<EvaluationScore> {\n const judgeProvider = await this.resolveJudgeProvider(context);\n if (!judgeProvider) {\n throw new Error('No judge provider available for agent_judge evaluation');\n }\n\n const model = judgeProvider.asLanguageModel?.();\n if (!model) {\n throw new Error(\n `Judge provider '${judgeProvider.targetName}' does not support asLanguageModel() — required for built-in agent_judge mode`,\n );\n }\n\n const workspacePath = context.workspacePath;\n if (!workspacePath) {\n throw new Error(\n 'agent_judge evaluator requires a workspace_template target (workspacePath is not set)',\n );\n }\n\n const systemPrompt = this.buildSystemPrompt(context);\n const userPrompt = this.buildUserPrompt(context);\n\n const config = context.evaluator;\n const rubrics = config?.type === 'agent_judge' ? config.rubrics : undefined;\n\n const fsTools = createFilesystemTools(workspacePath);\n\n const evaluatorRawRequest: JsonObject = {\n mode: 'built-in',\n systemPrompt,\n userPrompt,\n target: judgeProvider.targetName,\n maxSteps: this.maxSteps,\n };\n\n try {\n const { text, steps } = await generateText({\n model,\n system: systemPrompt,\n prompt: userPrompt,\n tools: fsTools,\n stopWhen: stepCountIs(this.maxSteps),\n temperature: this.temperature,\n });\n\n const toolCallCount = steps.reduce((count, step) => count + (step.toolCalls?.length ?? 0), 0);\n\n const details: JsonObject = {\n mode: 'built-in',\n steps: steps.length,\n tool_calls: toolCallCount,\n };\n\n return this.parseResult(text, rubrics, evaluatorRawRequest, details);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`agent_judge built-in evaluation failed: ${message}`],\n expectedAspectCount: 1,\n evaluatorRawRequest,\n details: { mode: 'built-in', error: message },\n };\n }\n }\n\n /**\n * Judge target mode: Delegates to an external agent provider via Provider.invoke().\n */\n private async evaluateWithJudgeTarget(context: EvaluationContext): Promise<EvaluationScore> {\n const provider = this.judgeTargetProvider as Provider;\n\n const workspacePath = context.workspacePath;\n const prompt = this.buildDelegatedPrompt(context);\n\n const evaluatorRawRequest: JsonObject = {\n mode: 'judge_target',\n judge_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 hits: [],\n misses: ['agent_judge judge_target returned no assistant response'],\n expectedAspectCount: 1,\n evaluatorRawRequest,\n details: { mode: 'judge_target', judge_target: provider.targetName },\n };\n }\n\n const config = context.evaluator;\n const rubrics = config?.type === 'agent_judge' ? config.rubrics : undefined;\n\n const details: JsonObject = {\n mode: 'judge_target',\n judge_target: provider.targetName,\n };\n\n return this.parseResult(assistantContent, rubrics, evaluatorRawRequest, details);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`agent_judge judge_target evaluation failed: ${message}`],\n expectedAspectCount: 1,\n evaluatorRawRequest,\n details: {\n mode: 'judge_target',\n judge_target: provider.targetName,\n error: message,\n },\n };\n }\n }\n\n /**\n * Parse the agent's response text into an EvaluationScore.\n * Supports both freeform and rubric modes.\n */\n private parseResult(\n text: string,\n rubrics: readonly RubricItem[] | undefined,\n evaluatorRawRequest: JsonObject,\n details: JsonObject,\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, hits, misses } = calculateRubricScore(data, rubrics);\n return {\n score,\n verdict,\n hits,\n misses,\n expectedAspectCount: rubrics.length,\n reasoning: data.overall_reasoning,\n evaluatorRawRequest,\n details,\n };\n }\n\n const data = freeformEvaluationSchema.parse(parsed);\n const score = clampScore(data.score);\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: Math.max(hits.length + misses.length, 1),\n reasoning: data.reasoning,\n evaluatorRawRequest,\n details,\n };\n } catch {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: ['Failed to parse agent_judge response as valid evaluation JSON'],\n expectedAspectCount: 1,\n evaluatorRawRequest,\n details,\n };\n }\n }\n\n /**\n * Build system prompt for built-in mode.\n * Includes output format instructions.\n */\n private buildSystemPrompt(context: EvaluationContext): string {\n const config = context.evaluator;\n const rubrics = config?.type === 'agent_judge' ? config.rubrics : undefined;\n\n const parts: string[] = [\n 'You are an expert evaluator 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 mode.\n * Uses custom template if provided, otherwise builds default prompt.\n */\n private buildUserPrompt(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.ANSWER]: context.candidate.trim(),\n [TEMPLATE_VARIABLES.REFERENCE_ANSWER]: (context.evalCase.reference_answer ?? '').trim(),\n [TEMPLATE_VARIABLES.CRITERIA]: context.evalCase.criteria.trim(),\n [TEMPLATE_VARIABLES.QUESTION]: formattedQuestion.trim(),\n [TEMPLATE_VARIABLES.FILE_CHANGES]: context.fileChanges ?? '',\n };\n\n if (this.evaluatorTemplate) {\n return substituteVariables(this.evaluatorTemplate, variables);\n }\n\n const config = context.evaluator;\n const rubrics = config?.type === 'agent_judge' ? 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 (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 judge target mode (delegation).\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 === 'agent_judge' ? config.rubrics : undefined;\n\n if (this.evaluatorTemplate) {\n const variables: Record<string, string> = {\n [TEMPLATE_VARIABLES.ANSWER]: context.candidate.trim(),\n [TEMPLATE_VARIABLES.REFERENCE_ANSWER]: (context.evalCase.reference_answer ?? '').trim(),\n [TEMPLATE_VARIABLES.CRITERIA]: context.evalCase.criteria.trim(),\n [TEMPLATE_VARIABLES.QUESTION]: formattedQuestion.trim(),\n [TEMPLATE_VARIABLES.FILE_CHANGES]: context.fileChanges ?? '',\n };\n const customPrompt = substituteVariables(this.evaluatorTemplate, 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 evaluator. 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 (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// ---------------------------------------------------------------------------\n// Sandboxed filesystem tools for built-in 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 AI SDK agent loop.\n */\nfunction createFilesystemTools(workspacePath: string) {\n return {\n list_files: tool({\n description:\n 'List files and directories at a relative path within the workspace. Returns names only (single level, no recursion).',\n inputSchema: z.object({\n path: z.string().describe('Relative path within workspace (use \".\" for root)').default('.'),\n }),\n execute: async (input: { path: string }) => {\n try {\n const resolved = resolveSandboxed(workspacePath, input.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 read_file: tool({\n description:\n 'Read the content of a file at a relative path within the workspace. Large files are truncated at 50KB.',\n inputSchema: z.object({\n path: z.string().describe('Relative path to file within workspace'),\n }),\n execute: async (input: { path: string }) => {\n try {\n const resolved = resolveSandboxed(workspacePath, input.path);\n const stat = await fs.stat(resolved);\n if (stat.isDirectory()) {\n return { error: `'${input.path}' 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 search_files: tool({\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 inputSchema: z.object({\n pattern: z.string().describe('Regex pattern to search for'),\n path: z.string().describe('Relative path to search within (use \".\" for root)').default('.'),\n }),\n execute: async (input: { pattern: string; path: string }) => {\n try {\n const resolved = resolveSandboxed(workspacePath, input.path);\n const regex = new RegExp(input.pattern, 'gi');\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 type { Message } from '../providers/types.js';\nimport { TEMPLATE_VARIABLES } from '../template-variables.js';\nimport type { EvalTest, LlmJudgeEvaluatorConfig, RubricItem } from '../types.js';\nimport type { PromptInputs } from '../yaml-parser.js';\nimport {\n DEFAULT_EVALUATOR_TEMPLATE,\n buildOutputSchema,\n buildRubricOutputSchema,\n buildScoreRangeOutputSchema,\n substituteVariables,\n} from './llm-judge.js';\n\nexport interface LlmJudgePromptAssembly {\n systemPrompt: string;\n userPrompt: string;\n responseSchema: string;\n mode: 'freeform' | 'checklist' | 'score_range';\n}\n\nexport function assembleLlmJudgePrompt(input: {\n evalCase: EvalTest;\n candidate: string;\n promptInputs: PromptInputs;\n evaluatorConfig?: LlmJudgeEvaluatorConfig;\n output?: readonly Message[];\n fileChanges?: string;\n evaluatorTemplateOverride?: string;\n}): LlmJudgePromptAssembly {\n const {\n evalCase,\n candidate,\n promptInputs,\n evaluatorConfig,\n fileChanges,\n evaluatorTemplateOverride,\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);\n }\n return assembleChecklist(evalCase, candidate, promptInputs, rubrics, fileChanges);\n }\n\n return assembleFreeform(\n evalCase,\n candidate,\n promptInputs,\n fileChanges,\n evaluatorTemplateOverride,\n );\n}\n\nfunction assembleFreeform(\n evalCase: EvalTest,\n candidate: string,\n promptInputs: PromptInputs,\n fileChanges?: string,\n evaluatorTemplateOverride?: string,\n): LlmJudgePromptAssembly {\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]: JSON.stringify(evalCase.input_segments, null, 2),\n [TEMPLATE_VARIABLES.EXPECTED_OUTPUT]: JSON.stringify(evalCase.expected_output, null, 2),\n [TEMPLATE_VARIABLES.OUTPUT]: JSON.stringify([], null, 2),\n [TEMPLATE_VARIABLES.ANSWER]: candidate.trim(),\n [TEMPLATE_VARIABLES.REFERENCE_ANSWER]: (evalCase.reference_answer ?? '').trim(),\n [TEMPLATE_VARIABLES.CRITERIA]: evalCase.criteria.trim(),\n [TEMPLATE_VARIABLES.QUESTION]: formattedQuestion.trim(),\n [TEMPLATE_VARIABLES.FILE_CHANGES]: fileChanges ?? '',\n };\n\n const systemPrompt = buildOutputSchema();\n const template = evaluatorTemplateOverride ?? DEFAULT_EVALUATOR_TEMPLATE;\n let userPrompt = substituteVariables(template, variables);\n\n // Append file_changes section to default template only when present\n if (fileChanges && !evaluatorTemplateOverride) {\n userPrompt += `\\n\\n[[ ## file_changes ## ]]\\n${fileChanges}`;\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): LlmJudgePromptAssembly {\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 evaluator. 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 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): LlmJudgePromptAssembly {\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 evaluator. 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 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 { TokenUsageEvaluatorConfig } from '../types.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } from './types.js';\n\nexport interface TokenUsageEvaluatorOptions {\n readonly config: TokenUsageEvaluatorConfig;\n}\n\n/**\n * Evaluator that checks provider-reported token usage against configured limits.\n * Uses trace.tokenUsage from the evaluation context.\n */\nexport class TokenUsageEvaluator implements Evaluator {\n readonly kind = 'token_usage';\n\n private readonly config: TokenUsageEvaluatorConfig;\n\n constructor(options: TokenUsageEvaluatorOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const usage = context.trace?.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 hits: [],\n misses: ['No token usage data available in trace'],\n expectedAspectCount,\n reasoning: 'Token usage not reported by provider',\n evaluatorRawRequest: {\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 hits: string[] = [];\n const misses: string[] = [];\n\n if (typeof maxInput === 'number') {\n if (input <= maxInput) {\n hits.push(`Input tokens ${input} <= ${maxInput}`);\n } else {\n misses.push(`Input tokens ${input} > ${maxInput}`);\n }\n }\n\n if (typeof maxOutput === 'number') {\n if (output <= maxOutput) {\n hits.push(`Output tokens ${output} <= ${maxOutput}`);\n } else {\n misses.push(`Output tokens ${output} > ${maxOutput}`);\n }\n }\n\n if (typeof maxTotal === 'number') {\n if (total <= maxTotal) {\n hits.push(`Total tokens ${total} <= ${maxTotal}`);\n } else {\n misses.push(`Total tokens ${total} > ${maxTotal}`);\n }\n }\n\n const passed = misses.length === 0;\n\n return {\n score: passed ? 1 : 0,\n verdict: passed ? 'pass' : 'fail',\n hits,\n misses,\n expectedAspectCount,\n reasoning: `token_usage input=${input}, output=${output}, cached=${cached}, total=${total}`,\n evaluatorRawRequest: {\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 ToolTrajectoryEvaluatorConfig,\n ToolTrajectoryExpectedItem,\n TraceSummary,\n} from '../trace.js';\nimport { deepEqual, scoreToVerdict } from './scoring.js';\nimport type { EvaluationContext, EvaluationScore, Evaluator } 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: ToolTrajectoryEvaluatorConfig,\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 ToolTrajectoryEvaluatorOptions {\n readonly config: ToolTrajectoryEvaluatorConfig;\n}\n\nexport class ToolTrajectoryEvaluator implements Evaluator {\n readonly kind = 'tool_trajectory';\n\n private readonly config: ToolTrajectoryEvaluatorConfig;\n\n constructor(options: ToolTrajectoryEvaluatorOptions) {\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 hits: [],\n misses: ['No trace available for evaluation'],\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 hits: [],\n misses: ['No trace available for evaluation'],\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 hits: [],\n misses: [`Unknown mode: ${this.config.mode}`],\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 const toolNames = Object.keys(toolCallsByName).sort();\n return {\n eventCount: toolCalls.length,\n toolNames,\n 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 hits: ['No tool requirements specified'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\n\n for (const toolName of toolNames) {\n const required = minimums[toolName];\n const actual = summary.toolCallsByName[toolName] ?? 0;\n if (actual >= required) {\n hits.push(`${toolName}: called ${actual} times (required >=${required})`);\n } else {\n misses.push(`${toolName}: called ${actual} times (required >=${required})`);\n }\n }\n\n const score = hits.length / toolNames.length;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\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 hits: ['No tool sequence specified'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\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 hits.push(`Found ${expectedTool} at position ${actualIndex}`);\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 misses.push(\n `Expected ${expectedTool} at position ${i}: tool found at ${actualIndex} but args mismatch`,\n );\n actualIndex++;\n argsMismatch = true;\n break;\n }\n actualIndex++;\n }\n\n if (!found && !argsMismatch) {\n misses.push(`Expected ${expectedTool} at position ${i}, not found in remaining trace`);\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 hits.push(latencyResult.message);\n latencyHits++;\n } else if (latencyResult.status === 'fail') {\n misses.push(latencyResult.message);\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 hits,\n misses,\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 hits: ['No tool sequence specified'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\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 misses.push(`Expected ${expected.length} tool calls, got ${toolCalls.length}`);\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 hits.push(`Position ${i}: ${expectedTool}`);\n sequenceHits++;\n sequenceMatched = true;\n } else {\n misses.push(`Position ${i}: ${expectedTool} args mismatch`);\n }\n } else {\n misses.push(`Position ${i}: expected ${expectedTool}, got ${actualTool}`);\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 hits.push(latencyResult.message);\n latencyHits++;\n } else if (latencyResult.status === 'fail') {\n misses.push(latencyResult.message);\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 misses.push(`Position ${i}: expected ${expected[i].tool}, got nothing`);\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 hits,\n misses,\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 hits: ['No expected tools specified'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\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 hits.push(`Found ${expectedTool} at position ${j}`);\n consumed.add(j);\n found = true;\n break;\n }\n }\n\n if (!found) {\n misses.push(`Expected ${expectedTool} not found in actual trajectory`);\n }\n }\n\n const score = expected.length > 0 ? hits.length / expected.length : 1;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\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 hits: ['No tool calls and no expected tools'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`${toolCalls.length} unexpected tool call(s) with empty allowed list`],\n expectedAspectCount: toolCalls.length,\n };\n }\n\n if (toolCalls.length === 0) {\n return {\n score: 1,\n verdict: 'pass',\n hits: ['No actual tool calls (trivially a subset)'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\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 hits.push(`Position ${i}: ${actualCall.name} is in allowed set`);\n } else {\n misses.push(`Position ${i}: ${actualCall.name} is not in allowed set`);\n }\n }\n\n const score = toolCalls.length > 0 ? hits.length / toolCalls.length : 1;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\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 hits/misses.\n */\n\nexport type AssertionResult = {\n score: number;\n hits: string[];\n misses: string[];\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 hits: passed ? [`Output contains \"${value}\"`] : [],\n misses: passed ? [] : [`Output does not contain \"${value}\"`],\n };\n}\n\n/** Checks if `output` matches the given regex `pattern`. */\nexport function runRegexAssertion(output: string, pattern: string): AssertionResult {\n const regex = new RegExp(pattern);\n const passed = regex.test(output);\n return {\n score: passed ? 1 : 0,\n hits: passed ? [`Output matches pattern /${pattern}/`] : [],\n misses: passed ? [] : [`Output does not match pattern /${pattern}/`],\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 hits: passed ? ['Output is valid JSON'] : [],\n misses: passed ? [] : ['Output is not valid JSON'],\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 hits: passed ? [`Output equals \"${value}\"`] : [],\n misses: passed ? [] : [`Output does not equal \"${value}\"`],\n };\n}\n","import { createHash, randomUUID } from 'node:crypto';\nimport { mkdir } from 'node:fs/promises';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\nimport pLimit from 'p-limit';\n\nimport {\n type ChildEvaluatorResult,\n type EvaluationScore,\n type Evaluator,\n LlmJudgeEvaluator,\n isNonEmptyString,\n negateScore,\n scoreToVerdict,\n} from './evaluators.js';\nimport { readJsonFile } from './file-utils.js';\nimport { createBuiltinProviderRegistry, createProvider } from './providers/index.js';\nimport { discoverProviders } from './providers/provider-discovery.js';\nimport { type ResolvedTarget, resolveTargetDefinition } from './providers/targets.js';\nimport type {\n EnvLookup,\n Message,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamCallbacks,\n TargetDefinition,\n} from './providers/types.js';\nimport { extractLastAssistantContent, isAgentProvider } from './providers/types.js';\nimport { createBuiltinRegistry, discoverAssertions } from './registry/index.js';\nimport { type TraceSummary, computeTraceSummary, mergeExecutionMetrics } from './trace.js';\nimport { aggregateTrials } from './trials.js';\nimport type {\n EvalTest,\n EvaluationResult,\n EvaluationVerdict,\n EvaluatorConfig,\n EvaluatorKind,\n EvaluatorResult,\n JsonObject,\n JsonValue,\n TrialResult,\n TrialsConfig,\n} from './types.js';\nimport {\n captureFileChanges as captureWorkspaceFileChanges,\n initializeBaseline,\n} from './workspace/file-changes.js';\nimport {\n cleanupEvalWorkspaces,\n cleanupWorkspace,\n createTempWorkspace,\n getWorkspacePath,\n} from './workspace/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\nfunction usesFileReferencePrompt(provider: Provider): boolean {\n return isAgentProvider(provider) || provider.kind === 'cli';\n}\n\n/**\n * Extract workspaceTemplate from a resolved target's config.\n * Returns undefined if the target doesn't support workspace templates.\n */\nfunction getWorkspaceTemplate(target: ResolvedTarget): string | undefined {\n const config = target.config as Record<string, unknown>;\n if ('workspaceTemplate' in config && typeof config.workspaceTemplate === 'string') {\n return config.workspaceTemplate;\n }\n return undefined;\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, Evaluator>> & { readonly llm_judge: Evaluator };\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 judgeProvider?: Provider;\n /** Resolver for target override in code judges */\n readonly targetResolver?: (name: string) => Provider | undefined;\n /** List of available target names for code judges */\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 /** 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 /** Evaluator type registry (with custom assertions discovered) */\n readonly typeRegistry?: import('./registry/evaluator-registry.js').EvaluatorRegistry;\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}\n\nexport interface RunEvaluationOptions {\n readonly testFilePath: string;\n readonly repoRoot: URL | string;\n readonly target: ResolvedTarget;\n readonly targets?: readonly TargetDefinition[];\n readonly env?: EnvLookup;\n readonly providerFactory?: (target: ResolvedTarget) => Provider;\n readonly evaluators?: Partial<Record<string, Evaluator>>;\n readonly maxRetries?: number;\n readonly agentTimeoutMs?: number;\n readonly cache?: EvaluationCache;\n readonly useCache?: boolean;\n readonly now?: () => Date;\n /** Filter tests by ID pattern (glob supported, e.g., \"summary-*\") */\n readonly filter?: 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}\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 } = 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 '${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 = targetDefinitions.get(name);\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 resolveJudgeProvider = async (\n targetContext: ResolvedTarget,\n ): Promise<Provider | undefined> => {\n const judgeName = targetContext.judgeTarget ?? targetContext.name;\n const resolvedJudge = resolveTargetByName(judgeName);\n if (!resolvedJudge) {\n return getOrCreateProvider(targetContext);\n }\n return getOrCreateProvider(resolvedJudge);\n };\n\n // Create a target resolver for code judges 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, resolveJudgeProvider);\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 await discoverAssertions(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 resolveJudgeProvider,\n agentTimeoutMs,\n targetResolver,\n availableTargets,\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 ?? getWorkspaceTemplate(target);\n const resolvedTemplate = await resolveWorkspaceTemplate(rawTemplate);\n const workspaceTemplate = resolvedTemplate?.dir;\n const suiteWorkspaceFile = resolvedTemplate?.workspaceFile;\n\n // Resolve worker count: CLI option > target setting > default (1)\n // Force workers=1 when shared workspace is used to prevent data corruption\n const hasSharedWorkspace = !!(workspaceTemplate || suiteWorkspace?.before_all);\n const requestedWorkers = options.maxConcurrency ?? target.workers ?? 1;\n const workers = hasSharedWorkspace ? 1 : requestedWorkers;\n if (hasSharedWorkspace && requestedWorkers > 1) {\n console.warn(\n `Warning: Shared workspace requires sequential execution. Overriding workers from ${requestedWorkers} to 1.`,\n );\n }\n const limit = pLimit(workers);\n let sharedWorkspacePath: string | undefined;\n let sharedBaselineCommit: string | undefined;\n let beforeAllOutput: string | undefined;\n\n if (workspaceTemplate) {\n try {\n sharedWorkspacePath = await createTempWorkspace(workspaceTemplate, evalRunId, 'shared');\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 (suiteWorkspace?.before_all) {\n // No template but before_all is configured: create empty workspace\n sharedWorkspacePath = getWorkspacePath(evalRunId, 'shared');\n await mkdir(sharedWorkspacePath, { recursive: true });\n }\n\n // Execute before_all (runs ONCE before first test)\n if (sharedWorkspacePath && suiteWorkspace?.before_all) {\n const scriptContext: ScriptExecutionContext = {\n workspacePath: sharedWorkspacePath,\n testId: '__before_all__',\n evalRunId,\n };\n try {\n beforeAllOutput = await executeWorkspaceScript(suiteWorkspace.before_all, scriptContext);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (sharedWorkspacePath) {\n await cleanupWorkspace(sharedWorkspacePath).catch(() => {});\n }\n throw new Error(`before_all script failed: ${message}`);\n }\n }\n\n // Initialize git baseline for shared workspace\n if (sharedWorkspacePath) {\n try {\n sharedBaselineCommit = await initializeBaseline(sharedWorkspacePath);\n } catch {\n // Non-fatal: file change tracking is best-effort\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 // Map test cases to limited promises for parallel execution\n const promises = filteredEvalCases.map((evalCase) =>\n limit(async () => {\n // Assign worker ID when test starts executing\n const workerId = nextWorkerId++;\n workerIdByEvalId.set(evalCase.id, workerId);\n\n if (onProgress) {\n await onProgress({\n workerId,\n testId: evalCase.id,\n status: 'running',\n startedAt: Date.now(),\n });\n }\n\n try {\n const judgeProvider = await resolveJudgeProvider(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 judgeProvider,\n targetResolver,\n availableTargets,\n evalRunId,\n keepWorkspaces,\n cleanupWorkspaces,\n sharedWorkspacePath,\n sharedBaselineCommit,\n suiteWorkspaceFile,\n streamCallbacks,\n typeRegistry,\n };\n let result =\n trials && trials.count > 1\n ? await runEvalCaseWithTrials(runCaseOptions, trials)\n : await runEvalCase(runCaseOptions);\n\n // Attach beforeAllOutput to first result only\n if (beforeAllOutput && !beforeAllOutputAttached) {\n result = { ...result, beforeAllOutput };\n beforeAllOutputAttached = true;\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 });\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 }\n }),\n );\n\n // Wait for all workers to complete\n const settled = await Promise.allSettled(promises);\n\n // Extract results, handling both fulfilled and rejected promises\n const results: EvaluationResult[] = [];\n for (let i = 0; i < settled.length; i++) {\n const outcome = settled[i];\n if (outcome.status === 'fulfilled') {\n results.push(outcome.value);\n } else {\n // Build error result for rejected promise\n const evalCase = filteredEvalCases[i];\n const 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 );\n results.push(errorResult);\n if (onResult) {\n await onResult(errorResult);\n }\n }\n }\n\n // --- Shared workspace after_all + cleanup ---\n if (sharedWorkspacePath && suiteWorkspace?.after_all) {\n const scriptContext: ScriptExecutionContext = {\n workspacePath: sharedWorkspacePath,\n testId: '__after_all__',\n evalRunId,\n };\n try {\n const afterAllOutput = await executeWorkspaceScript(\n suiteWorkspace.after_all,\n scriptContext,\n 'warn',\n );\n // Attach afterAllOutput to last result\n if (afterAllOutput && results.length > 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 // Cleanup shared workspace\n if (sharedWorkspacePath) {\n const hasFailure = results.some((r) => !!r.error || r.score < 0.5);\n if (cleanupWorkspaces) {\n await cleanupWorkspace(sharedWorkspacePath).catch(() => {});\n } else if (!hasFailure && !keepWorkspaces) {\n await cleanupWorkspace(sharedWorkspacePath).catch(() => {});\n }\n // If failure and not forceCleanup: keep for debugging\n }\n\n // Fallback cleanup for any per-case workspaces\n if (cleanupWorkspaces) {\n await cleanupEvalWorkspaces(evalRunId).catch(() => {});\n }\n\n return results;\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, Evaluator>> & {\n readonly llm_judge: Evaluator;\n };\n readonly typeRegistry: import('./registry/evaluator-registry.js').EvaluatorRegistry;\n readonly nowFn: () => Date;\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\n readonly verbose?: boolean;\n readonly resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>;\n readonly agentTimeoutMs?: number;\n readonly targetResolver?: (name: string) => Provider | undefined;\n readonly availableTargets?: readonly string[];\n}): Promise<readonly EvaluationResult[]> {\n const {\n evalCases,\n provider,\n target,\n evaluatorRegistry,\n typeRegistry,\n nowFn,\n onProgress,\n onResult,\n resolveJudgeProvider,\n agentTimeoutMs,\n targetResolver,\n availableTargets,\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 guidelines: promptInputs.guidelines,\n guideline_patterns: evalCase.guideline_patterns,\n inputFiles: evalCase.file_paths,\n evalCaseId: evalCase.id,\n metadata: {\n systemPrompt: promptInputs.systemMessage ?? '',\n },\n };\n });\n\n const batchResponse = await provider.invokeBatch?.(batchRequests);\n if (!Array.isArray(batchResponse)) {\n throw new Error('Provider batching failed: invokeBatch did not return an array');\n }\n if (batchResponse.length !== evalCases.length) {\n throw new Error(\n `Provider batching failed: expected ${evalCases.length} responses, received ${batchResponse.length}`,\n );\n }\n\n if (onProgress) {\n const startedAt = Date.now();\n for (let i = 0; i < evalCases.length; i++) {\n await onProgress({\n workerId: 1,\n 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 baseSummary = output\n ? computeTraceSummary(output)\n : hasExecutionMetrics\n ? {\n eventCount: 0,\n toolNames: [],\n toolCallsByName: {},\n errorCount: 0,\n }\n : undefined;\n // Merge execution metrics from provider response\n const trace = baseSummary\n ? mergeExecutionMetrics(baseSummary, {\n tokenUsage: providerResponse.tokenUsage,\n costUsd: providerResponse.costUsd,\n durationMs: providerResponse.durationMs,\n })\n : undefined;\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 judgeProvider: await resolveJudgeProvider(target),\n agentTimeoutMs,\n output,\n trace,\n targetResolver,\n availableTargets,\n });\n\n if (providerError) {\n result = { ...result, error: providerError };\n }\n } catch (error) {\n const errorResult = buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n error,\n promptInputs,\n provider,\n );\n results.push(errorResult);\n if (onResult) {\n await onResult(errorResult);\n }\n if (onProgress) {\n await onProgress({\n workerId: 1,\n testId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: error instanceof Error ? error.message : String(error),\n });\n }\n continue;\n }\n\n results.push(result);\n if (onResult) {\n await onResult(result);\n }\n\n if (onProgress) {\n await onProgress({\n workerId: 1,\n testId: evalCase.id,\n status: result.error ? 'failed' : 'completed',\n startedAt: 0,\n completedAt: Date.now(),\n error: result.error,\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 judgeProvider,\n targetResolver,\n availableTargets,\n evalRunId,\n keepWorkspaces,\n cleanupWorkspaces: forceCleanup,\n sharedWorkspacePath,\n sharedBaselineCommit,\n suiteWorkspaceFile,\n typeRegistry: providedTypeRegistry,\n } = options;\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\n if (!workspacePath) {\n // Per-case workspace creation (backwards compat for tests without shared workspace)\n const rawCaseTemplate = evalCase.workspace?.template ?? getWorkspaceTemplate(target);\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 );\n }\n }\n\n // If no template but before_all is configured per-case, create empty workspace\n if (!workspacePath && evalCase.workspace?.before_all && evalRunId) {\n workspacePath = getWorkspacePath(evalRunId, evalCase.id);\n await mkdir(workspacePath, { recursive: true });\n }\n\n // Execute per-case before_all (only when not using shared workspace)\n if (workspacePath && evalCase.workspace?.before_all) {\n const scriptContext: ScriptExecutionContext = {\n workspacePath,\n testId: evalCase.id,\n evalRunId: evalRunId ?? '',\n caseInput: evalCase.question,\n caseMetadata: evalCase.metadata,\n };\n try {\n beforeAllOutput = await executeWorkspaceScript(\n evalCase.workspace.before_all,\n scriptContext,\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 );\n }\n }\n }\n\n // Execute before_each hook (runs before each test for any workspace)\n if (workspacePath && evalCase.workspace?.before_each) {\n const scriptContext: ScriptExecutionContext = {\n workspacePath,\n testId: evalCase.id,\n evalRunId: evalRunId ?? '',\n caseInput: evalCase.question,\n caseMetadata: evalCase.metadata,\n };\n try {\n beforeEachOutput = await executeWorkspaceScript(\n evalCase.workspace.before_each,\n scriptContext,\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 script failed: ${message}`),\n promptInputs,\n provider,\n );\n }\n }\n\n // Initialize git baseline (use shared baseline or per-case)\n let baselineCommit: string | undefined = sharedBaselineCommit;\n if (!baselineCommit && workspacePath) {\n try {\n baselineCommit = await initializeBaseline(workspacePath);\n } catch {\n // Non-fatal: file change tracking is best-effort\n }\n }\n\n const attemptBudget = (maxRetries ?? 0) + 1;\n let attempt = 0;\n let providerResponse: ProviderResponse | undefined = cachedResponse;\n let lastError: unknown;\n\n while (!providerResponse && attempt < attemptBudget) {\n try {\n providerResponse = await invokeProvider(provider, {\n evalCase: evalCase,\n target,\n promptInputs,\n attempt,\n agentTimeoutMs,\n signal,\n cwd: workspacePath,\n workspaceFile: caseWorkspaceFile ?? suiteWorkspaceFile,\n captureFileChanges: !!baselineCommit,\n streamCallbacks: options.streamCallbacks,\n });\n } catch (error) {\n lastError = error;\n if (isTimeoutLike(error) && attempt + 1 < attemptBudget) {\n attempt += 1;\n continue;\n }\n // On error, keep workspace for debugging (unless forceCleanup is set)\n const errorResult = buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n error,\n promptInputs,\n provider,\n );\n if (workspacePath) {\n if (forceCleanup) {\n await cleanupWorkspace(workspacePath).catch(() => {});\n }\n return { ...errorResult, workspacePath };\n }\n return errorResult;\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 );\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 baseSummary = output\n ? computeTraceSummary(output)\n : hasExecutionMetrics\n ? {\n eventCount: 0,\n toolNames: [],\n toolCallsByName: {},\n errorCount: 0,\n }\n : undefined;\n // Merge execution metrics from provider response\n const trace = baseSummary\n ? mergeExecutionMetrics(baseSummary, {\n tokenUsage: providerResponse.tokenUsage,\n costUsd: providerResponse.costUsd,\n durationMs: providerResponse.durationMs,\n })\n : undefined;\n\n // Extract candidate from last assistant message in output\n const candidate = extractLastAssistantContent(output);\n\n // Capture file changes from workspace if baseline was initialized\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 const providerError = extractProviderError(providerResponse);\n\n // Execute after_each hook (runs after evaluation, before cleanup)\n if (workspacePath && evalCase.workspace?.after_each) {\n const scriptContext: ScriptExecutionContext = {\n workspacePath,\n testId: evalCase.id,\n evalRunId: evalRunId ?? '',\n caseInput: evalCase.question,\n caseMetadata: evalCase.metadata,\n };\n try {\n afterEachOutput = await executeWorkspaceScript(\n evalCase.workspace.after_each,\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 judgeProvider,\n agentTimeoutMs,\n output,\n trace,\n targetResolver,\n availableTargets,\n fileChanges,\n workspacePath,\n });\n\n const finalResult = providerError\n ? { ...result, error: providerError, beforeAllOutput, beforeEachOutput, afterEachOutput }\n : { ...result, beforeAllOutput, beforeEachOutput, afterEachOutput };\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 return { ...finalResult, workspacePath };\n } else if (!keepWorkspaces) {\n await cleanupWorkspace(workspacePath).catch(() => {});\n }\n }\n\n return finalResult;\n } catch (error) {\n const errorResult = buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n error,\n promptInputs,\n provider,\n );\n // On error, keep workspace for debugging (only for per-case workspaces)\n if (workspacePath && !isSharedWorkspace) {\n if (forceCleanup) {\n await cleanupWorkspace(workspacePath).catch(() => {});\n }\n return { ...errorResult, workspacePath, beforeEachOutput, afterEachOutput };\n }\n return { ...errorResult, 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 };\n\n const result = await runEvalCase(trialOptions);\n allResults.push(result);\n\n // Extract cost from trace summary if available\n const trialCost = result.trace?.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 };\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 (hits, misses, reasoning,\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 return {\n ...baseResult,\n score,\n trials: trialResults,\n aggregation,\n costLimited: costLimited || undefined,\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, Evaluator>> & { readonly llm_judge: Evaluator };\n readonly typeRegistry: import('./registry/evaluator-registry.js').EvaluatorRegistry;\n readonly promptInputs: PromptInputs;\n readonly nowFn: () => Date;\n readonly attempt: number;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly output?: readonly Message[];\n readonly trace?: TraceSummary;\n readonly targetResolver?: (name: string) => Provider | undefined;\n readonly availableTargets?: readonly string[];\n readonly fileChanges?: string;\n readonly workspacePath?: string;\n}): Promise<EvaluationResult> {\n const {\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n typeRegistry,\n promptInputs,\n nowFn,\n attempt,\n judgeProvider,\n agentTimeoutMs,\n output,\n trace,\n targetResolver,\n availableTargets,\n fileChanges,\n workspacePath,\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 judgeProvider,\n agentTimeoutMs,\n output,\n trace,\n targetResolver,\n availableTargets,\n fileChanges,\n workspacePath,\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 question: promptInputs.question,\n guideline_paths: evalCase.guideline_paths,\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 guidelines: promptInputs.guidelines,\n } as JsonObject;\n }\n }\n\n const evaluatorRequest = scores ? undefined : score.evaluatorRawRequest;\n const requests =\n agentRequest || lmRequest || evaluatorRequest\n ? {\n ...(agentRequest ? { agent: agentRequest } : {}),\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 dataset: evalCase.dataset,\n conversationId: evalCase.conversation_id,\n score: score.score,\n hits: score.hits,\n misses: score.misses,\n answer: candidate,\n target: target.name,\n reasoning: score.reasoning,\n requests,\n input,\n scores: scores,\n trace: trace,\n output: output,\n fileChanges,\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, Evaluator>> & { readonly llm_judge: Evaluator };\n readonly typeRegistry: import('./registry/evaluator-registry.js').EvaluatorRegistry;\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly output?: readonly Message[];\n readonly trace?: TraceSummary;\n readonly targetResolver?: (name: string) => Provider | undefined;\n readonly availableTargets?: readonly string[];\n readonly fileChanges?: string;\n readonly workspacePath?: string;\n}): Promise<{ score: EvaluationScore; scores?: EvaluatorResult[] }> {\n const {\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n typeRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n output,\n trace,\n targetResolver,\n availableTargets,\n fileChanges,\n workspacePath,\n } = options;\n\n if (evalCase.evaluators && evalCase.evaluators.length > 0) {\n return runEvaluatorList({\n evalCase,\n evaluators: evalCase.evaluators,\n candidate,\n target,\n provider,\n evaluatorRegistry: evaluators,\n typeRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n output,\n trace,\n targetResolver,\n availableTargets,\n fileChanges,\n workspacePath,\n });\n }\n\n const evaluatorKind = evalCase.evaluator ?? 'llm_judge';\n const activeEvaluator = evaluators[evaluatorKind] ?? evaluators.llm_judge;\n if (!activeEvaluator) {\n throw new Error(`No evaluator registered for kind '${evaluatorKind}'`);\n }\n\n const score = await activeEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n output,\n trace,\n targetResolver,\n availableTargets,\n fileChanges,\n workspacePath,\n });\n\n return { score };\n}\n\nasync function runEvaluatorList(options: {\n readonly evalCase: EvalTest;\n readonly evaluators: readonly EvaluatorConfig[];\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\n readonly llm_judge: Evaluator;\n };\n readonly typeRegistry: import('./registry/evaluator-registry.js').EvaluatorRegistry;\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly output?: readonly Message[];\n readonly trace?: TraceSummary;\n readonly targetResolver?: (name: string) => Provider | undefined;\n readonly availableTargets?: readonly string[];\n readonly fileChanges?: string;\n readonly workspacePath?: string;\n}): Promise<{ score: EvaluationScore; scores: EvaluatorResult[] }> {\n const {\n evalCase,\n evaluators,\n candidate,\n target,\n provider,\n evaluatorRegistry,\n typeRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n output,\n trace,\n targetResolver,\n availableTargets,\n fileChanges,\n workspacePath,\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 }> = [];\n const scores: EvaluatorResult[] = [];\n\n // Build the evaluation context (shared across all evaluators for this case)\n const evalContext: import('./evaluators/types.js').EvaluationContext = {\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n output,\n trace,\n targetResolver,\n availableTargets,\n fileChanges,\n workspacePath,\n };\n\n // Build the dispatch context for evaluator factories\n const evalFileDir = evalCase.guideline_paths[0]\n ? path.dirname(evalCase.guideline_paths[0])\n : process.cwd();\n const dispatchContext: import('./registry/evaluator-registry.js').EvaluatorDispatchContext = {\n judgeProvider,\n targetResolver,\n availableTargets,\n agentTimeoutMs,\n evalFileDir,\n llmJudge: evaluatorRegistry.llm_judge,\n registry: typeRegistry,\n };\n\n for (const evaluatorConfig of evaluators ?? []) {\n try {\n // Create evaluator instance via registry\n const evaluatorInstance = await typeRegistry.create(evaluatorConfig, dispatchContext);\n const score = await evaluatorInstance.evaluate(evalContext);\n\n // Determine result type (code evaluators report as code_judge)\n const resultType = evaluatorConfig.type === 'code' ? 'code_judge' : evaluatorConfig.type;\n const weight = evaluatorConfig.weight ?? 1.0;\n\n scored.push({\n score,\n name: evaluatorConfig.name,\n type: resultType,\n weight,\n ...(evaluatorConfig.required !== undefined ? { required: evaluatorConfig.required } : {}),\n });\n scores.push({\n name: evaluatorConfig.name,\n type: resultType,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n evaluatorProviderRequest: score.evaluatorRawRequest,\n details: score.details,\n scores: mapChildResults(score.scores),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const fallbackScore: EvaluationScore = {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Evaluator '${evaluatorConfig.name}' failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n };\n const resultType = evaluatorConfig.type === 'code' ? 'code_judge' : evaluatorConfig.type;\n const weight = evaluatorConfig.weight ?? 1.0;\n scored.push({\n score: fallbackScore,\n name: evaluatorConfig.name ?? 'unknown',\n type: resultType ?? 'llm_judge',\n weight,\n ...(evaluatorConfig.required !== undefined ? { required: evaluatorConfig.required } : {}),\n });\n scores.push({\n name: evaluatorConfig.name ?? 'unknown',\n type: resultType ?? 'llm_judge',\n score: 0,\n weight,\n verdict: 'fail',\n hits: [],\n misses: [`Evaluator '${evaluatorConfig.name ?? 'unknown'}' failed: ${message}`],\n reasoning: message,\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 hits: [...negated.hits],\n misses: [...negated.misses],\n reasoning: negated.reasoning,\n };\n }\n }\n }\n\n // Required gate: if any evaluator with `required` flag fails its threshold, aggregate becomes 0\n const PASS_THRESHOLD = 0.8;\n const hasRequiredFailure = scored.some((entry) => {\n if (!entry.required) return false;\n const minScore = typeof entry.required === 'number' ? entry.required : PASS_THRESHOLD;\n return entry.score.score < minScore;\n });\n\n const aggregateScore = hasRequiredFailure\n ? 0\n : scored.length > 0\n ? computeWeightedMean(\n scored.map((entry) => ({ score: entry.score.score, weight: entry.weight })),\n )\n : 0;\n const hits = scored.flatMap((entry) => entry.score.hits);\n const misses = scored.flatMap((entry) => entry.score.misses);\n const expectedAspectCount = scored.reduce(\n (total, entry) => total + (entry.score.expectedAspectCount ?? 0),\n 0,\n );\n const reasoningParts = scored\n .map((entry) => (entry.score.reasoning ? `${entry.name}: ${entry.score.reasoning}` : undefined))\n .filter(isNonEmptyString);\n const reasoning = reasoningParts.length > 0 ? reasoningParts.join(' | ') : undefined;\n\n const score: EvaluationScore = {\n score: aggregateScore,\n verdict: scoreToVerdict(aggregateScore),\n hits,\n misses,\n expectedAspectCount,\n reasoning,\n };\n\n return { score, scores };\n}\n\nfunction filterEvalCases(evalCases: readonly EvalTest[], filter?: string): readonly EvalTest[] {\n if (!filter) {\n return evalCases;\n }\n return evalCases.filter((evalCase) => micromatch.isMatch(evalCase.id, filter));\n}\n\nfunction buildEvaluatorRegistry(\n overrides: Partial<Record<string, Evaluator>> | undefined,\n resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>,\n): Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator } {\n const llmJudge =\n overrides?.llm_judge ??\n new LlmJudgeEvaluator({\n resolveJudgeProvider: async (context) => {\n if (context.judgeProvider) {\n return context.judgeProvider;\n }\n return resolveJudgeProvider(context.target);\n },\n });\n\n return {\n ...overrides,\n llm_judge: llmJudge,\n };\n}\n\nasync function 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 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 return await provider.invoke({\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_patterns: evalCase.guideline_patterns,\n chatPrompt: promptInputs.chatPrompt,\n inputFiles: evalCase.file_paths,\n evalCaseId: evalCase.id,\n attempt,\n metadata: {\n systemPrompt: promptInputs.systemMessage ?? '',\n },\n signal: controller.signal,\n cwd,\n workspaceFile,\n captureFileChanges,\n streamCallbacks,\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,\n): EvaluationResult {\n const message = error instanceof Error ? error.message : String(error);\n\n let agentRequest: JsonObject | undefined;\n let lmRequest: JsonObject | undefined;\n\n if (isAgentProvider(provider)) {\n agentRequest = {\n question: promptInputs.question,\n guideline_paths: evalCase.guideline_paths,\n error: message,\n } as JsonObject;\n } else {\n if (promptInputs.chatPrompt) {\n lmRequest = {\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\n guideline_paths: evalCase.guideline_paths,\n error: message,\n } as JsonObject;\n } else {\n lmRequest = {\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_paths: evalCase.guideline_paths,\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 dataset: evalCase.dataset,\n conversationId: evalCase.conversation_id,\n score: 0,\n hits: [],\n misses: [`Error: ${message}`],\n answer: `Error occurred: ${message}`,\n target: targetName,\n requests,\n input,\n error: message,\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.guidelines);\n hash.update(promptInputs.systemMessage ?? '');\n if (promptInputs.chatPrompt) {\n hash.update(JSON.stringify(promptInputs.chatPrompt));\n }\n return hash.digest('hex');\n}\n\nfunction 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 promptInputs.question;\n}\n\nfunction isTimeoutLike(error: unknown): boolean {\n if (!error) {\n return false;\n }\n if (\n typeof DOMException !== 'undefined' &&\n error instanceof DOMException &&\n error.name === 'AbortError'\n ) {\n return true;\n }\n if (error instanceof Error) {\n const name = error.name?.toLowerCase();\n const message = error.message?.toLowerCase();\n return name.includes('timeout') || message.includes('timeout');\n }\n const value = String(error).toLowerCase();\n return value.includes('timeout');\n}\n\nfunction mapChildResults(\n children?: readonly ChildEvaluatorResult[],\n): readonly EvaluatorResult[] | undefined {\n if (!children || children.length === 0) {\n return undefined;\n }\n\n return children.map((child) => ({\n name: child.name,\n type: child.type as EvaluatorKind,\n score: child.score,\n weight: child.weight,\n verdict: child.verdict,\n hits: child.hits,\n misses: child.misses,\n reasoning: child.reasoning,\n evaluatorProviderRequest: child.evaluatorRawRequest,\n scores: mapChildResults(child.scores),\n details: child.details,\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","/*\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","/**\n * Extensible evaluator 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, Evaluator } from '../evaluators/types.js';\nimport type { TargetResolver } from '../evaluators/types.js';\nimport type { Provider } from '../providers/types.js';\nimport type { EvaluatorConfig } from '../types.js';\n\n/**\n * Context passed to evaluator factory functions during creation.\n * Contains shared resources needed by evaluator instances.\n */\nexport interface EvaluatorDispatchContext {\n /** Shared LLM judge provider (resolved at suite level) */\n readonly judgeProvider?: Provider;\n /** Function to resolve target names to providers */\n readonly targetResolver?: TargetResolver;\n /** Available target names for code judges */\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 judge evaluator instance */\n readonly llmJudge: Evaluator;\n /** Reference to the registry itself (for composite evaluators that need to create children) */\n readonly registry: EvaluatorRegistry;\n}\n\n/**\n * Factory function that creates an Evaluator instance from a config.\n *\n * Factory functions handle all type-specific initialization logic:\n * - Reading prompt files for LLM judges\n * - Resolving script paths for code judges\n * - Creating adapter evaluators for deterministic assertions\n */\nexport type EvaluatorFactoryFn = (\n config: EvaluatorConfig,\n context: EvaluatorDispatchContext,\n) => Evaluator | Promise<Evaluator>;\n\n/**\n * Registry of evaluator factory functions keyed by evaluator 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 EvaluatorRegistry {\n private readonly factories = new Map<string, EvaluatorFactoryFn>();\n\n /** Register a factory function for an evaluator type. */\n register(type: string, factory: EvaluatorFactoryFn): this {\n this.factories.set(type, factory);\n return this;\n }\n\n /** Get the factory function for an evaluator type. */\n get(type: string): EvaluatorFactoryFn | 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 evaluator 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 evaluator type.\n */\n async create(config: EvaluatorConfig, context: EvaluatorDispatchContext): Promise<Evaluator> {\n const factory = this.factories.get(config.type);\n if (!factory) {\n throw new Error(\n `Unknown evaluator 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 Evaluator.\n * Used for deterministic assertions (contains, regex, is_json, equals).\n */\nexport class DeterministicAssertionEvaluator implements Evaluator {\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","/**\n * Factory functions for all built-in evaluator types.\n *\n * Each factory creates an Evaluator instance from an EvaluatorConfig,\n * handling type-specific initialization logic. These are registered into\n * the EvaluatorRegistry at startup.\n */\n\nimport { readFileSync } from 'node:fs';\nimport {\n AgentJudgeEvaluator,\n CodeEvaluator,\n CompositeEvaluator,\n CostEvaluator,\n type Evaluator,\n ExecutionMetricsEvaluator,\n FieldAccuracyEvaluator,\n LatencyEvaluator,\n TokenUsageEvaluator,\n ToolTrajectoryEvaluator,\n runContainsAssertion,\n runEqualsAssertion,\n runIsJsonAssertion,\n runRegexAssertion,\n} from '../evaluators.js';\nimport { resolveCustomPrompt } from '../evaluators/prompt-resolution.js';\nimport type { Provider } from '../providers/types.js';\nimport type { ToolTrajectoryEvaluatorConfig } from '../trace.js';\nimport type {\n AgentJudgeEvaluatorConfig,\n CodeEvaluatorConfig,\n CompositeEvaluatorConfig,\n ContainsEvaluatorConfig,\n CostEvaluatorConfig,\n EqualsEvaluatorConfig,\n EvaluatorConfig,\n ExecutionMetricsEvaluatorConfig,\n FieldAccuracyEvaluatorConfig,\n IsJsonEvaluatorConfig,\n LatencyEvaluatorConfig,\n LlmJudgeEvaluatorConfig,\n RegexEvaluatorConfig,\n TokenUsageEvaluatorConfig,\n} from '../types.js';\nimport {\n DeterministicAssertionEvaluator,\n type EvaluatorDispatchContext,\n type EvaluatorFactoryFn,\n EvaluatorRegistry,\n} from './evaluator-registry.js';\n\n/**\n * Factory for `llm_judge` evaluators.\n * Creates a wrapper that resolves custom prompts at evaluation time,\n * then delegates to the shared LLM judge instance.\n */\nexport const llmJudgeFactory: EvaluatorFactoryFn = (config, context) => {\n const c = config as LlmJudgeEvaluatorConfig;\n const { llmJudge, agentTimeoutMs } = context;\n\n return {\n kind: 'llm_judge',\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 return llmJudge.evaluate({\n ...evalContext,\n evaluatorTemplateOverride: customPrompt,\n evaluator: c,\n });\n },\n };\n};\n\n/** Factory for `code` (code_judge) evaluators. */\nexport const codeFactory: EvaluatorFactoryFn = (config, context) => {\n const c = config as CodeEvaluatorConfig;\n return new CodeEvaluator({\n script: 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: EvaluatorFactoryFn = (config, context) => {\n const c = config as CompositeEvaluatorConfig;\n const evalFileDir = context.evalFileDir ?? process.cwd();\n\n return new CompositeEvaluator({\n config: c,\n cwd: evalFileDir,\n evaluatorFactory: {\n create: (memberConfig: EvaluatorConfig) => {\n const factory = context.registry.get(memberConfig.type);\n if (!factory) {\n throw new Error(`Unsupported evaluator 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 `Evaluator 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: EvaluatorFactoryFn = (config) => {\n return new ToolTrajectoryEvaluator({\n config: config as ToolTrajectoryEvaluatorConfig,\n });\n};\n\n/** Factory for `field_accuracy` evaluators. */\nexport const fieldAccuracyFactory: EvaluatorFactoryFn = (config) => {\n return new FieldAccuracyEvaluator({\n config: config as FieldAccuracyEvaluatorConfig,\n });\n};\n\n/** Factory for `latency` evaluators. */\nexport const latencyFactory: EvaluatorFactoryFn = (config) => {\n return new LatencyEvaluator({ config: config as LatencyEvaluatorConfig });\n};\n\n/** Factory for `cost` evaluators. */\nexport const costFactory: EvaluatorFactoryFn = (config) => {\n return new CostEvaluator({ config: config as CostEvaluatorConfig });\n};\n\n/** Factory for `token_usage` evaluators. */\nexport const tokenUsageFactory: EvaluatorFactoryFn = (config) => {\n return new TokenUsageEvaluator({ config: config as TokenUsageEvaluatorConfig });\n};\n\n/** Factory for `execution_metrics` evaluators. */\nexport const executionMetricsFactory: EvaluatorFactoryFn = (config) => {\n return new ExecutionMetricsEvaluator({\n config: config as ExecutionMetricsEvaluatorConfig,\n });\n};\n\n/** Factory for `agent_judge` evaluators. */\nexport const agentJudgeFactory: EvaluatorFactoryFn = (config, context) => {\n const c = config as AgentJudgeEvaluatorConfig;\n const { judgeProvider, targetResolver } = context;\n\n let customPrompt: string | undefined;\n if (c.resolvedPromptPath) {\n try {\n customPrompt = readFileSync(c.resolvedPromptPath, 'utf-8');\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Could not read agent_judge prompt at ${c.resolvedPromptPath}: ${message}`);\n }\n } else if (c.prompt) {\n customPrompt = c.prompt;\n }\n\n let judgeTargetProvider: Provider | undefined;\n if (c.target && targetResolver) {\n judgeTargetProvider = targetResolver(c.target);\n if (!judgeTargetProvider) {\n throw new Error(\n `agent_judge evaluator '${c.name}': target '${c.target}' not found in targets`,\n );\n }\n }\n\n return new AgentJudgeEvaluator({\n resolveJudgeProvider: async (ctx) => {\n if (ctx.judgeProvider) return ctx.judgeProvider;\n return judgeProvider;\n },\n maxSteps: c.max_steps,\n temperature: c.temperature,\n evaluatorTemplate: customPrompt,\n judgeTargetProvider,\n });\n};\n\n/** Factory for `contains` deterministic assertion. */\nexport const containsFactory: EvaluatorFactoryFn = (config) => {\n const c = config as ContainsEvaluatorConfig;\n return new DeterministicAssertionEvaluator('contains', (ctx) => {\n const result = runContainsAssertion(ctx.candidate, c.value);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n hits: result.hits,\n misses: result.misses,\n reasoning:\n result.score === 1\n ? `Output contains \"${c.value}\"`\n : `Output does not contain \"${c.value}\"`,\n expectedAspectCount: 1,\n };\n });\n};\n\n/** Factory for `regex` deterministic assertion. */\nexport const regexFactory: EvaluatorFactoryFn = (config) => {\n const c = config as RegexEvaluatorConfig;\n return new DeterministicAssertionEvaluator('regex', (ctx) => {\n const result = runRegexAssertion(ctx.candidate, c.value);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n hits: result.hits,\n misses: result.misses,\n reasoning:\n result.score === 1\n ? `Output matches pattern /${c.value}/`\n : `Output does not match pattern /${c.value}/`,\n expectedAspectCount: 1,\n };\n });\n};\n\n/** Factory for `is_json` deterministic assertion. */\nexport const isJsonFactory: EvaluatorFactoryFn = () => {\n return new DeterministicAssertionEvaluator('is_json', (ctx) => {\n const result = runIsJsonAssertion(ctx.candidate);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n hits: result.hits,\n misses: result.misses,\n reasoning: result.score === 1 ? 'Output is valid JSON' : 'Output is not valid JSON',\n expectedAspectCount: 1,\n };\n });\n};\n\n/** Factory for `equals` deterministic assertion. */\nexport const equalsFactory: EvaluatorFactoryFn = (config) => {\n const c = config as EqualsEvaluatorConfig;\n return new DeterministicAssertionEvaluator('equals', (ctx) => {\n const result = runEqualsAssertion(ctx.candidate, c.value);\n return {\n score: result.score,\n verdict: result.score === 1 ? 'pass' : 'fail',\n hits: result.hits,\n misses: result.misses,\n reasoning:\n result.score === 1 ? `Output equals \"${c.value}\"` : `Output does not equal \"${c.value}\"`,\n expectedAspectCount: 1,\n };\n });\n};\n\n/**\n * Create a new EvaluatorRegistry with all built-in evaluator types registered.\n */\nexport function createBuiltinRegistry(): EvaluatorRegistry {\n const registry = new EvaluatorRegistry();\n\n registry\n .register('llm_judge', llmJudgeFactory)\n .register('code', 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('agent_judge', agentJudgeFactory)\n .register('contains', containsFactory)\n .register('regex', regexFactory)\n .register('is_json', isJsonFactory)\n .register('equals', equalsFactory);\n\n return registry;\n}\n","/**\n * Prompt resolution utilities for LLM judge evaluators.\n *\n * Extracted from orchestrator.ts to enable reuse by the evaluator registry.\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 type { TraceSummary } from '../trace.js';\nimport type { EvalTest, PromptScriptConfig } from '../types.js';\nimport { executeScript } from './code-evaluator.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\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 question: context.evalCase.question,\n criteria: context.evalCase.criteria,\n expectedOutput: context.evalCase.expected_output,\n referenceAnswer: context.evalCase.reference_answer,\n answer: context.candidate,\n output: context.output ?? null,\n guidelineFiles: context.evalCase.guideline_paths,\n inputFiles: context.evalCase.file_paths.filter(\n (p) => !context.evalCase.guideline_paths.includes(p),\n ),\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 * Convention-based discovery of custom assertion scripts.\n *\n * Scans `.agentv/assertions/` for TypeScript/JavaScript files and registers\n * them as code_judge evaluators in the registry. The file name (without\n * extension) becomes the evaluator 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 { CodeEvaluator } from '../evaluators/code-evaluator.js';\nimport type { EvaluatorFactoryFn } from './evaluator-registry.js';\nimport type { EvaluatorRegistry } from './evaluator-registry.js';\n\n/**\n * Discover custom assertion scripts from `.agentv/assertions/` and register\n * them as evaluator types in the registry.\n *\n * @param registry - The evaluator 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: EvaluatorRegistry,\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: EvaluatorFactoryFn = (_config, context) => {\n return new CodeEvaluator({\n script: ['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 { exec as execCallback } from 'node:child_process';\nimport { readdirSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nconst execAsync = promisify(execCallback);\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","import { cp, mkdir, readdir, rm, stat } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { fileExists } from '../file-utils.js';\n\n/**\n * Default workspace root directory for temporary eval workspaces.\n * Located at ~/.agentv/workspaces\n */\nconst DEFAULT_WORKSPACE_ROOT = path.join(os.homedir(), '.agentv', 'workspaces');\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 ?? DEFAULT_WORKSPACE_ROOT;\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 */\nasync 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 ?? DEFAULT_WORKSPACE_ROOT;\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 { 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}\n\nexport type ScriptFailureMode = 'fatal' | 'warn';\n\n/**\n * Executes a workspace lifecycle script (before_all, after_all, before_each, after_each).\n *\n * @param config - Workspace script configuration (script, timeout_ms, cwd)\n * @param context - Context passed to script via stdin (JSON)\n * @param failureMode - 'fatal' throws on non-zero exit; 'warn' logs warning\n * @returns Captured stdout from the script\n * @throws Error if script 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;\n\n const result = await execFileWithStdin(config.script, 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","/**\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\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 * expected_output: '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 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 { buildDirectoryChain, findGitRoot } from './file-utils.js';\n\nimport { runEvaluation } from './orchestrator.js';\nimport { readTargetDefinitions } from './providers/targets-file.js';\nimport { resolveTargetDefinition } from './providers/targets.js';\nimport type { TargetDefinition } from './providers/types.js';\nimport type { EvalTest, EvaluationResult, EvaluatorConfig } from './types.js';\nimport { loadTests } 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) */\n readonly input: string | readonly { role: string; content: string }[];\n /** Expected reference output */\n readonly expected_output?: string;\n /** Assertion evaluators */\n readonly assert?: readonly EvalAssertionInput[];\n /** Arbitrary metadata */\n readonly metadata?: Record<string, unknown>;\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_judge', 'code_judge') */\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 /** Prompt file for llm_judge */\n readonly prompt?: string;\n /** Script for code_judge */\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/**\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 /** Suite-level assertions applied to all tests */\n readonly assert?: readonly EvalAssertionInput[];\n /** Filter tests by ID pattern (glob supported) */\n readonly filter?: 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 (default: 120000) */\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}\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 >= 0.8) */\n readonly passed: number;\n /** Number of failing test cases (score < 0.5) */\n readonly failed: number;\n /** Number of borderline test cases (0.5 <= score < 0.8) */\n readonly borderline: 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 // Resolve repo root\n const gitRoot = await findGitRoot(process.cwd());\n const repoRoot = gitRoot ?? process.cwd();\n\n // Load .env files from hierarchy (closest to cwd first)\n await loadEnvHierarchy(repoRoot);\n\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 {\n targetDef = (await discoverDefaultTarget(repoRoot)) ?? { name: 'default', provider: 'mock' };\n }\n const resolvedTarget = resolveTargetDefinition(targetDef);\n\n let evalCases: readonly EvalTest[] | EvalTest[];\n let testFilePath: string;\n\n if (config.specFile) {\n // File-based mode: load from YAML\n testFilePath = path.resolve(config.specFile);\n evalCases = await loadTests(testFilePath, repoRoot, {\n verbose: config.verbose,\n filter: config.filter,\n });\n } else {\n // Inline mode: convert EvalTestInput[] to EvalTest[]\n testFilePath = path.join(process.cwd(), '__programmatic__.yaml');\n evalCases = (config.tests ?? []).map((test): EvalTest => {\n const input =\n typeof test.input === 'string'\n ? ([{ role: 'user' as const, content: test.input }] as EvalTest['input'])\n : (test.input as unknown as EvalTest['input']);\n\n const question =\n typeof test.input === 'string'\n ? test.input\n : (test.input.find((m) => m.role === 'user')?.content ?? '');\n\n const expectedOutput = test.expected_output\n ? ([\n { role: 'assistant' as const, content: test.expected_output },\n ] as EvalTest['expected_output'])\n : [];\n\n // Convert inline assertions to evaluator config format\n const allAssertions = [...(test.assert ?? []), ...(config.assert ?? [])];\n const assertConfigs = allAssertions.map((a, i) => {\n const { type: rawType, ...rest } = a;\n return {\n ...rest,\n name: a.name ?? `${rawType}_${i}`,\n type: mapAssertionType(rawType),\n } as unknown as EvaluatorConfig;\n });\n\n return {\n id: test.id,\n criteria: test.criteria ?? '',\n question: String(question),\n input,\n input_segments: [],\n expected_output: expectedOutput,\n reference_answer: test.expected_output,\n guideline_paths: [],\n guideline_patterns: [],\n file_paths: [],\n evaluators: assertConfigs.length > 0 ? assertConfigs : undefined,\n metadata: test.metadata,\n };\n });\n }\n\n const collectedResults: EvaluationResult[] = [];\n\n const results = await runEvaluation({\n testFilePath,\n repoRoot,\n target: resolvedTarget,\n maxRetries: config.maxRetries ?? 2,\n agentTimeoutMs: config.agentTimeoutMs ?? 120_000,\n verbose: config.verbose,\n maxConcurrency: config.workers ?? 3,\n filter: config.filter,\n evalCases,\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),\n };\n}\n\n/**\n * Map user-facing assertion type names to internal evaluator type names.\n */\nfunction mapAssertionType(type: string): string {\n // Most types map 1:1. Handle known aliases.\n switch (type) {\n case 'code_judge':\n return 'code';\n default:\n return type;\n }\n}\n\n/**\n * Compute summary statistics from evaluation results.\n */\nfunction computeSummary(results: readonly EvaluationResult[], durationMs: number): EvalSummary {\n const total = results.length;\n let passed = 0;\n let failed = 0;\n let borderline = 0;\n let scoreSum = 0;\n\n for (const r of results) {\n scoreSum += r.score;\n if (r.score >= 0.8) {\n passed++;\n } else if (r.score < 0.5) {\n failed++;\n } else {\n borderline++;\n }\n }\n\n return {\n total,\n passed,\n failed,\n borderline,\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 (root → child order).\n * Only sets variables not already in process.env.\n */\nasync function loadEnvHierarchy(repoRoot: string): Promise<void> {\n const { readFileSync } = await import('node:fs');\n const cwd = process.cwd();\n const chain = buildDirectoryChain(path.join(cwd, '_placeholder'), 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 // Load from root to child so child values take precedence\n for (let i = envFiles.length - 1; i >= 0; 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 * Typed configuration file support for AgentV.\n *\n * Provides `defineConfig()` for use in `agentv.config.ts` files. Supports\n * auto-discovery, Zod validation, and IDE autocomplete.\n *\n * @example\n * ```typescript\n * // agentv.config.ts\n * import { defineConfig } from '@agentv/core';\n *\n * export default defineConfig({\n * execution: {\n * workers: 5,\n * maxRetries: 2,\n * agentTimeoutMs: 120_000,\n * },\n * output: {\n * format: 'jsonl',\n * dir: './results',\n * },\n * });\n * ```\n *\n * @module\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema for AgentV project-level configuration.\n */\nconst AgentVConfigSchema = z.object({\n /** Default execution settings */\n execution: z\n .object({\n /** Number of parallel workers (default: 3) */\n workers: z.number().int().min(1).max(50).optional(),\n /** Maximum retries on failure (default: 2) */\n maxRetries: z.number().int().min(0).optional(),\n /** Agent timeout in milliseconds (default: 120000) */\n agentTimeoutMs: z.number().int().min(0).optional(),\n })\n .optional(),\n\n /** Output settings */\n output: z\n .object({\n /** Output format */\n format: z.enum(['jsonl', 'yaml', 'json', 'xml']).optional(),\n /** Output directory */\n dir: z.string().optional(),\n })\n .optional(),\n\n /** Response caching */\n cache: z\n .object({\n /** Enable response caching */\n enabled: z.boolean().optional(),\n /** Cache file path */\n path: z.string().optional(),\n })\n .optional(),\n\n /** Cost and duration limits */\n limits: z\n .object({\n /** Maximum cost per run in USD */\n maxCostUsd: z.number().min(0).optional(),\n /** Maximum duration per run in milliseconds */\n maxDurationMs: z.number().int().min(0).optional(),\n })\n .optional(),\n});\n\n/**\n * AgentV project-level configuration type.\n * Inferred from the Zod schema for full type safety.\n */\nexport type AgentVConfig = z.infer<typeof AgentVConfigSchema>;\n\n/**\n * Define a typed AgentV configuration.\n *\n * Use this in `agentv.config.ts` at your project root. The configuration\n * is validated at load time and provides full IDE autocomplete.\n *\n * @param config - Configuration object\n * @returns Validated configuration\n *\n * @example\n * ```typescript\n * import { defineConfig } from '@agentv/core';\n *\n * export default defineConfig({\n * execution: { workers: 5 },\n * output: { format: 'jsonl', dir: './results' },\n * limits: { maxCostUsd: 10.0 },\n * });\n * ```\n */\nexport function defineConfig(config: AgentVConfig): AgentVConfig {\n return AgentVConfigSchema.parse(config);\n}\n\n/**\n * Config file discovery order.\n * The first file found wins.\n */\nconst CONFIG_FILE_NAMES = [\n 'agentv.config.ts',\n 'agentv.config.js',\n 'agentv.config.mts',\n 'agentv.config.mjs',\n '.agentv/config.ts',\n '.agentv/config.js',\n] as const;\n\n/**\n * Discover and load an AgentV config file from the project root.\n *\n * Searches for config files in discovery order. Returns null if\n * no config file is found.\n *\n * @param projectRoot - Project root directory to search from\n * @returns Loaded and validated config, or null if not found\n */\nexport async function loadTsConfig(projectRoot: string): Promise<AgentVConfig | null> {\n const { existsSync } = await import('node:fs');\n const { pathToFileURL } = await import('node:url');\n const { join } = await import('node:path');\n\n for (const fileName of CONFIG_FILE_NAMES) {\n const filePath = join(projectRoot, fileName);\n if (!existsSync(filePath)) {\n continue;\n }\n\n try {\n const fileUrl = pathToFileURL(filePath).href;\n const mod = await import(fileUrl);\n const config = mod.default ?? mod;\n\n return AgentVConfigSchema.parse(config);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load config from ${filePath}: ${msg}`);\n }\n }\n\n return null;\n}\n","import { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport type { Provider } from '../providers/types.js';\nimport type { RubricItem } from '../types.js';\n\nconst rubricItemSchema = z.object({\n id: z.string().describe('Short identifier for this rubric (e.g., clarity, completeness)'),\n outcome: z.string().describe('Concrete expected outcome for this rubric item'),\n weight: z.number().default(1.0).describe('Relative importance (default 1.0)'),\n required: z.boolean().default(true).describe('Whether this is a mandatory requirement'),\n});\n\nconst rubricGenerationSchema = z.object({\n rubrics: z.array(rubricItemSchema).describe('List of evaluation rubrics'),\n});\n\nexport interface GenerateRubricsOptions {\n readonly criteria: string;\n readonly question?: string;\n readonly referenceAnswer?: string;\n readonly provider: Provider;\n}\n\n/**\n * Generate rubrics from expected outcome using an LLM.\n */\nexport async function generateRubrics(\n options: GenerateRubricsOptions,\n): Promise<readonly RubricItem[]> {\n const { criteria, question, referenceAnswer, provider } = options;\n\n const prompt = buildPrompt(criteria, question, referenceAnswer);\n\n const model = provider.asLanguageModel?.();\n if (!model) {\n throw new Error('Provider does not support language model interface');\n }\n\n const system = `You are an expert at creating evaluation rubrics.\nYou must return a valid JSON object matching this schema:\n{\n \"rubrics\": [\n {\n \"id\": \"string (short identifier)\",\n \"outcome\": \"string (concrete expected outcome for this rubric item)\",\n \"weight\": number (default 1.0),\n \"required\": boolean (default true)\n }\n ]\n}`;\n\n let result: z.infer<typeof rubricGenerationSchema> | undefined;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const { text } = await generateText({\n model,\n system,\n prompt,\n });\n\n const cleaned = text.replace(/```json\\n?|```/g, '').trim();\n result = rubricGenerationSchema.parse(JSON.parse(cleaned));\n break;\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n // Continue to next attempt\n }\n }\n\n if (!result) {\n throw new Error(`Failed to parse generated rubrics after 3 attempts: ${lastError?.message}`);\n }\n\n return result.rubrics;\n}\n\nfunction buildPrompt(criteria: string, question?: string, referenceAnswer?: string): string {\n const parts: string[] = [\n 'You are an expert at creating evaluation rubrics.',\n 'Given the expected outcome (and optionally the question and reference answer),',\n 'generate a list of specific, measurable rubric items to evaluate whether an answer meets the expected outcome.',\n '',\n 'Each rubric should:',\n '- Be specific and testable',\n '- Have a short, descriptive ID',\n '- Include a clear expected outcome statement (what a good answer must demonstrate for this rubric)',\n '- Indicate if it is required (mandatory) or optional',\n '- Have an appropriate weight (default 1.0, use higher values for more important aspects)',\n '',\n 'Generate 3-7 rubric items that comprehensively cover the expected outcome.',\n '',\n '[[ ## criteria ## ]]',\n criteria,\n '',\n ];\n\n if (question && question.trim().length > 0) {\n parts.push('[[ ## question ## ]]', question, '');\n }\n\n if (referenceAnswer && referenceAnswer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', referenceAnswer, '');\n }\n\n return parts.join('\\n');\n}\n","import { createHash } from 'node:crypto';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type { EvaluationCache } from '../orchestrator.js';\nimport type { ProviderResponse } from '../providers/types.js';\n\nconst DEFAULT_CACHE_PATH = '.agentv/cache';\n\n/**\n * File-based LLM response cache.\n * Stores provider responses as JSON files keyed by SHA-256 hash.\n * Directory structure: <cache_path>/<first-2-chars>/<full-hash>.json\n */\nexport class ResponseCache implements EvaluationCache {\n private readonly cachePath: string;\n\n constructor(cachePath?: string) {\n this.cachePath = cachePath ?? DEFAULT_CACHE_PATH;\n }\n\n async get(key: string): Promise<ProviderResponse | undefined> {\n const filePath = this.keyToPath(key);\n try {\n const data = await readFile(filePath, 'utf8');\n return JSON.parse(data) as ProviderResponse;\n } catch {\n return undefined;\n }\n }\n\n async set(key: string, value: ProviderResponse): Promise<void> {\n const filePath = this.keyToPath(key);\n const dir = path.dirname(filePath);\n await mkdir(dir, { recursive: true });\n await writeFile(filePath, JSON.stringify(value, null, 2), 'utf8');\n }\n\n private keyToPath(key: string): string {\n const prefix = key.slice(0, 2);\n return path.join(this.cachePath, prefix, `${key}.json`);\n }\n}\n\n/**\n * Determine whether caching should be active for a given run.\n *\n * Precedence:\n * 1. --no-cache CLI flag → always disabled\n * 2. --cache CLI flag OR execution.cache YAML → enabled\n * 3. Default → disabled (safe for variability testing)\n */\nexport function shouldEnableCache(params: {\n cliCache: boolean;\n cliNoCache: boolean;\n yamlCache?: boolean;\n}): boolean {\n if (params.cliNoCache) return false;\n return params.cliCache || params.yamlCache === true;\n}\n\n/**\n * Check whether caching should be skipped for a target with temperature > 0.\n * Non-deterministic responses should not be cached unless explicitly forced.\n */\nexport function shouldSkipCacheForTemperature(targetConfig: Record<string, unknown>): boolean {\n const temp = targetConfig.temperature;\n if (typeof temp === 'number' && temp > 0) {\n return true;\n }\n return false;\n}\n","import type { EvaluationResult, EvaluatorResult } from './types.js';\n\n/**\n * Top-level fields to strip from baseline results.\n * Uses a denylist approach: new fields are auto-preserved.\n */\nconst STRIPPED_TOP_LEVEL_FIELDS = new Set([\n 'answer',\n 'requests',\n 'trace',\n 'workspacePath',\n 'output',\n 'beforeAllOutput',\n 'beforeEachOutput',\n 'afterAllOutput',\n 'afterEachOutput',\n 'fileChanges',\n]);\n\n/**\n * Fields to strip from evaluator results.\n */\nconst STRIPPED_EVALUATOR_FIELDS = new Set(['rawRequest', 'evaluatorProviderRequest']);\n\n/**\n * Trims an evaluator result for baseline storage.\n * Strips debug/audit fields while preserving scoring data.\n * Recursively trims nested evaluator results (for composites).\n */\nfunction trimEvaluatorResult(result: EvaluatorResult): EvaluatorResult {\n const trimmed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(result)) {\n if (STRIPPED_EVALUATOR_FIELDS.has(key)) continue;\n if (key === 'scores' && Array.isArray(value)) {\n trimmed[key] = (value as EvaluatorResult[]).map(trimEvaluatorResult);\n } else {\n trimmed[key] = value;\n }\n }\n return trimmed as unknown as EvaluatorResult;\n}\n\n/**\n * Trims an EvaluationResult for baseline storage.\n * Strips large debug/audit fields (denylist approach) while preserving\n * all fields needed for regression comparison (scores, hits, misses, etc.).\n *\n * Returns a new object — the input is not mutated.\n */\nexport function trimBaselineResult(result: EvaluationResult): EvaluationResult {\n const trimmed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(result)) {\n if (STRIPPED_TOP_LEVEL_FIELDS.has(key)) continue;\n if (key === 'scores' && Array.isArray(value)) {\n trimmed[key] = (value as EvaluatorResult[]).map(trimEvaluatorResult);\n } else {\n trimmed[key] = value;\n }\n }\n return trimmed as unknown as EvaluationResult;\n}\n","import type {\n Message,\n ProviderStreamCallbacks,\n ProviderTokenUsage,\n} from '../evaluation/providers/types.js';\nimport type { EvaluationResult } from '../evaluation/types.js';\nimport type { OtelBackendPreset, OtelExportOptions } from './types.js';\n\nexport type { OtelExportOptions, OtelBackendPreset };\n\n// ---------------------------------------------------------------------------\n// Backend presets\n// ---------------------------------------------------------------------------\n\nexport const OTEL_BACKEND_PRESETS: Record<string, OtelBackendPreset> = {\n langfuse: {\n name: 'langfuse',\n endpoint: process.env.LANGFUSE_HOST\n ? `${process.env.LANGFUSE_HOST}/api/public/otel/v1/traces`\n : 'https://cloud.langfuse.com/api/public/otel/v1/traces',\n headers: (env) => {\n const pub = env.LANGFUSE_PUBLIC_KEY ?? '';\n const secret = env.LANGFUSE_SECRET_KEY ?? '';\n return { Authorization: `Basic ${Buffer.from(`${pub}:${secret}`).toString('base64')}` };\n },\n },\n braintrust: {\n name: 'braintrust',\n endpoint: 'https://api.braintrust.dev/otel/v1/traces',\n headers: (env) => ({\n Authorization: `Bearer ${env.BRAINTRUST_API_KEY ?? ''}`,\n }),\n },\n confident: {\n name: 'confident',\n endpoint: 'https://otel.confident-ai.com/v1/traces',\n headers: (env) => ({\n 'x-confident-api-key': env.CONFIDENT_API_KEY ?? '',\n }),\n },\n};\n\n// ---------------------------------------------------------------------------\n// OTel type aliases (resolved dynamically at init)\n// ---------------------------------------------------------------------------\n\n// biome-ignore lint/suspicious/noExplicitAny: OTel types loaded dynamically\ntype OtelApi = any;\n// biome-ignore lint/suspicious/noExplicitAny: OTel types loaded dynamically\ntype NodeTracerProvider = any;\n// biome-ignore lint/suspicious/noExplicitAny: OTel types loaded dynamically\ntype Tracer = any;\n\n// ---------------------------------------------------------------------------\n// Exporter\n// ---------------------------------------------------------------------------\n\nexport class OtelTraceExporter {\n private provider: NodeTracerProvider | null = null;\n private tracer: Tracer | null = null;\n private api: OtelApi | null = null;\n // biome-ignore lint/suspicious/noExplicitAny: OTel types loaded dynamically\n private W3CPropagator: any = null;\n\n constructor(private readonly options: OtelExportOptions) {}\n\n /** Initialize the OTel SDK. Returns false if OTel packages are not available. */\n async init(): Promise<boolean> {\n try {\n const [sdkTraceNode, resourcesMod, semconvMod, api, coreMod] = await Promise.all([\n import('@opentelemetry/sdk-trace-node'),\n import('@opentelemetry/resources'),\n import('@opentelemetry/semantic-conventions'),\n import('@opentelemetry/api'),\n import('@opentelemetry/core').catch(() => null),\n ]);\n\n const { NodeTracerProvider: Provider, SimpleSpanProcessor } = sdkTraceNode;\n const { resourceFromAttributes } = resourcesMod;\n const { ATTR_SERVICE_NAME } = semconvMod;\n\n const resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.options.serviceName ?? 'agentv',\n });\n\n // biome-ignore lint/suspicious/noExplicitAny: OTel processor types loaded dynamically\n const processors: any[] = [];\n\n // Remote OTLP exporter (only when endpoint is configured)\n if (this.options.endpoint) {\n const otlpHttp = await import('@opentelemetry/exporter-trace-otlp-http');\n const { OTLPTraceExporter } = otlpHttp;\n const exporter = new OTLPTraceExporter({\n url: this.options.endpoint,\n headers: this.options.headers,\n });\n processors.push(new SimpleSpanProcessor(exporter));\n }\n\n // OTLP JSON file exporter\n if (this.options.otlpFilePath) {\n const { OtlpJsonFileExporter } = await import('./otlp-json-file-exporter.js');\n processors.push(\n new SimpleSpanProcessor(new OtlpJsonFileExporter(this.options.otlpFilePath)),\n );\n }\n\n // Simple trace file exporter\n if (this.options.traceFilePath) {\n const { SimpleTraceFileExporter } = await import('./simple-trace-file-exporter.js');\n processors.push(\n new SimpleSpanProcessor(new SimpleTraceFileExporter(this.options.traceFilePath)),\n );\n }\n\n if (processors.length === 0) {\n return false;\n }\n\n this.provider = new Provider({\n resource,\n spanProcessors: processors,\n });\n this.provider.register();\n this.api = api;\n this.tracer = api.trace.getTracer('agentv', '1.0.0');\n this.W3CPropagator = coreMod?.W3CTraceContextPropagator ?? null;\n return true;\n } catch {\n return false;\n }\n }\n\n /** Export a single evaluation result as an OTel trace. */\n async exportResult(result: EvaluationResult): Promise<void> {\n if (!this.tracer || !this.api) return;\n\n const api = this.api;\n const tracer = this.tracer;\n const captureContent = this.options.captureContent ?? false;\n\n // Determine timing\n const startHr = toHrTime(result.trace?.startTime ?? result.timestamp);\n const endHr = toHrTime(result.trace?.endTime ?? result.timestamp);\n\n // Support trace composition via W3C traceparent propagation\n let parentCtx = api.ROOT_CONTEXT;\n const traceparent = process.env.TRACEPARENT;\n if (traceparent && this.W3CPropagator) {\n try {\n const propagator = new this.W3CPropagator();\n parentCtx = propagator.extract(\n api.ROOT_CONTEXT,\n { traceparent, tracestate: process.env.TRACESTATE ?? '' },\n {\n get: (carrier: Record<string, string>, key: string) => carrier[key],\n keys: (carrier: Record<string, string>) => Object.keys(carrier),\n },\n );\n } catch {\n // Malformed TRACEPARENT — fall back to standalone trace\n }\n }\n\n tracer.startActiveSpan(\n 'agentv.eval',\n { startTime: startHr },\n parentCtx,\n (rootSpan: {\n setAttribute: (...args: unknown[]) => void;\n addEvent: (...args: unknown[]) => void;\n setStatus: (...args: unknown[]) => void;\n end: (...args: unknown[]) => void;\n }) => {\n // GenAI semantic convention attributes\n rootSpan.setAttribute('gen_ai.operation.name', 'evaluate');\n rootSpan.setAttribute('gen_ai.system', 'agentv');\n\n // Core attributes\n rootSpan.setAttribute('agentv.test_id', result.testId);\n rootSpan.setAttribute('agentv.target', result.target);\n if (result.dataset) rootSpan.setAttribute('agentv.dataset', result.dataset);\n rootSpan.setAttribute('agentv.score', result.score);\n if (captureContent) rootSpan.setAttribute('agentv.answer', result.answer);\n\n // Trace summary attributes\n if (result.trace) {\n const t = result.trace;\n rootSpan.setAttribute('agentv.trace.event_count', t.eventCount);\n rootSpan.setAttribute('agentv.trace.tool_names', t.toolNames.join(','));\n if (t.durationMs != null) rootSpan.setAttribute('agentv.trace.duration_ms', t.durationMs);\n if (t.costUsd != null) rootSpan.setAttribute('agentv.trace.cost_usd', t.costUsd);\n if (t.llmCallCount != null)\n rootSpan.setAttribute('agentv.trace.llm_call_count', t.llmCallCount);\n }\n\n // Child spans from output messages (--trace mode)\n if (result.output) {\n const parentCtx = api.trace.setSpan(api.context.active(), rootSpan);\n\n if (this.options.groupTurns) {\n const turns = groupMessagesIntoTurns(result.output);\n if (turns.length > 1) {\n for (const [i, turn] of turns.entries()) {\n api.context.with(parentCtx, () => {\n tracer.startActiveSpan(\n `agentv.turn.${i + 1}`,\n {},\n (turnSpan: {\n end: (...args: unknown[]) => void;\n }) => {\n const turnCtx = api.trace.setSpan(api.context.active(), turnSpan);\n for (const msg of turn.messages) {\n this.exportMessage(tracer, api, turnCtx, msg, captureContent);\n }\n turnSpan.end();\n },\n );\n });\n }\n } else {\n for (const msg of result.output) {\n this.exportMessage(tracer, api, parentCtx, msg, captureContent);\n }\n }\n } else {\n for (const msg of result.output) {\n this.exportMessage(tracer, api, parentCtx, msg, captureContent);\n }\n }\n }\n\n // Evaluator scores as span events\n if (result.scores) {\n for (const score of result.scores) {\n rootSpan.addEvent(`agentv.evaluator.${score.name}`, {\n 'agentv.evaluator.score': score.score,\n 'agentv.evaluator.type': score.type,\n ...(score.verdict ? { 'agentv.evaluator.verdict': score.verdict } : {}),\n });\n }\n }\n\n // Status\n if (result.error) {\n rootSpan.setStatus({ code: api.SpanStatusCode.ERROR, message: result.error });\n } else {\n rootSpan.setStatus({ code: api.SpanStatusCode.OK });\n }\n\n rootSpan.end(endHr);\n },\n );\n }\n\n /** Flush pending spans and shut down. */\n async shutdown(): Promise<void> {\n await this.provider?.shutdown();\n }\n\n /** Create a streaming observer for real-time span export */\n createStreamingObserver(): OtelStreamingObserver | null {\n if (!this.tracer || !this.api) return null;\n // Extract TRACEPARENT for trace composition\n let parentCtx: unknown;\n const traceparent = process.env.TRACEPARENT;\n if (traceparent && this.W3CPropagator) {\n try {\n const propagator = new this.W3CPropagator();\n parentCtx = propagator.extract(\n this.api.ROOT_CONTEXT,\n { traceparent, tracestate: process.env.TRACESTATE ?? '' },\n {\n get: (carrier: Record<string, string>, key: string) => carrier[key],\n keys: (carrier: Record<string, string>) => Object.keys(carrier),\n },\n );\n } catch {\n // Malformed TRACEPARENT — ignore\n }\n }\n return new OtelStreamingObserver(\n this.tracer,\n this.api,\n this.options.captureContent ?? false,\n parentCtx,\n );\n }\n\n // -----------------------------------------------------------------------\n // Private helpers\n // -----------------------------------------------------------------------\n\n private exportMessage(\n tracer: Tracer,\n api: OtelApi,\n parentCtx: unknown,\n msg: Message,\n captureContent: boolean,\n ): void {\n const isAssistant = msg.role === 'assistant';\n const model = msg.metadata?.model ? String(msg.metadata.model) : undefined;\n const spanName = isAssistant ? `chat ${model ?? 'unknown'}` : `gen_ai.message.${msg.role}`;\n\n const startHr = toHrTime(msg.startTime);\n const endHr = toHrTime(msg.endTime);\n\n api.context.with(parentCtx, () => {\n tracer.startActiveSpan(\n spanName,\n { startTime: startHr },\n (span: {\n setAttribute: (...args: unknown[]) => void;\n end: (...args: unknown[]) => void;\n }) => {\n if (isAssistant) {\n span.setAttribute('gen_ai.operation.name', 'chat');\n }\n if (model) {\n span.setAttribute('gen_ai.request.model', model);\n span.setAttribute('gen_ai.response.model', model);\n }\n\n // Per-span token usage (GenAI conventions)\n if (msg.tokenUsage) {\n if (msg.tokenUsage.input != null) {\n span.setAttribute('gen_ai.usage.input_tokens', msg.tokenUsage.input);\n }\n if (msg.tokenUsage.output != null) {\n span.setAttribute('gen_ai.usage.output_tokens', msg.tokenUsage.output);\n }\n if (msg.tokenUsage.cached != null) {\n span.setAttribute('gen_ai.usage.cache_read.input_tokens', msg.tokenUsage.cached);\n }\n }\n\n if (captureContent && msg.content != null) {\n span.setAttribute(\n 'gen_ai.output.messages',\n typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content),\n );\n }\n\n // Tool call child spans\n if (msg.toolCalls) {\n const msgCtx = api.trace.setSpan(api.context.active(), span);\n for (const tc of msg.toolCalls) {\n api.context.with(msgCtx, () => {\n tracer.startActiveSpan(\n `execute_tool ${tc.tool}`,\n {},\n (toolSpan: {\n setAttribute: (...args: unknown[]) => void;\n end: (...args: unknown[]) => void;\n }) => {\n toolSpan.setAttribute('gen_ai.tool.name', tc.tool);\n if (tc.id) toolSpan.setAttribute('gen_ai.tool.call.id', tc.id);\n\n if (captureContent) {\n if (tc.input != null) {\n toolSpan.setAttribute(\n 'gen_ai.tool.call.arguments',\n typeof tc.input === 'string' ? tc.input : JSON.stringify(tc.input),\n );\n }\n if (tc.output != null) {\n toolSpan.setAttribute(\n 'gen_ai.tool.call.result',\n typeof tc.output === 'string' ? tc.output : JSON.stringify(tc.output),\n );\n }\n }\n\n toolSpan.end();\n },\n );\n });\n }\n }\n\n span.end(endHr);\n },\n );\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Streaming observer\n// ---------------------------------------------------------------------------\n\n/**\n * Streaming observer that creates OTel spans in real-time during eval execution.\n * Spans are exported immediately via SimpleSpanProcessor as each tool call / LLM response completes.\n */\nexport class OtelStreamingObserver {\n // biome-ignore lint/suspicious/noExplicitAny: OTel span type loaded dynamically\n private rootSpan: any = null;\n // biome-ignore lint/suspicious/noExplicitAny: OTel context loaded dynamically\n private rootCtx: any = null;\n\n constructor(\n private readonly tracer: Tracer,\n private readonly api: OtelApi,\n private readonly captureContent: boolean,\n // biome-ignore lint/suspicious/noExplicitAny: OTel context loaded dynamically\n private readonly parentCtx?: any,\n ) {}\n\n /** Create root eval span immediately (visible in backend right away) */\n startEvalCase(testId: string, target: string, dataset?: string): void {\n const ctx = this.parentCtx ?? this.api.context.active();\n this.rootSpan = this.tracer.startSpan('agentv.eval', undefined, ctx);\n this.rootSpan.setAttribute('gen_ai.operation.name', 'evaluate');\n this.rootSpan.setAttribute('gen_ai.system', 'agentv');\n this.rootSpan.setAttribute('agentv.test_id', testId);\n this.rootSpan.setAttribute('agentv.target', target);\n if (dataset) this.rootSpan.setAttribute('agentv.dataset', dataset);\n this.rootCtx = this.api.trace.setSpan(this.api.context.active(), this.rootSpan);\n }\n\n /** Create and immediately export a tool span */\n onToolCall(\n name: string,\n input: unknown,\n output: unknown,\n _durationMs: number,\n toolCallId?: string,\n ): void {\n if (!this.rootCtx) return;\n this.api.context.with(this.rootCtx, () => {\n const span = this.tracer.startSpan(`execute_tool ${name}`);\n span.setAttribute('gen_ai.tool.name', name);\n if (toolCallId) span.setAttribute('gen_ai.tool.call.id', toolCallId);\n if (this.captureContent) {\n if (input != null)\n span.setAttribute(\n 'gen_ai.tool.call.arguments',\n typeof input === 'string' ? input : JSON.stringify(input),\n );\n if (output != null)\n span.setAttribute(\n 'gen_ai.tool.call.result',\n typeof output === 'string' ? output : JSON.stringify(output),\n );\n }\n span.end();\n });\n }\n\n /** Create and immediately export an LLM span */\n onLlmCall(model: string, tokenUsage?: ProviderTokenUsage): void {\n if (!this.rootCtx) return;\n this.api.context.with(this.rootCtx, () => {\n const span = this.tracer.startSpan(`chat ${model}`);\n span.setAttribute('gen_ai.operation.name', 'chat');\n span.setAttribute('gen_ai.request.model', model);\n span.setAttribute('gen_ai.response.model', model);\n if (tokenUsage) {\n if (tokenUsage.input != null)\n span.setAttribute('gen_ai.usage.input_tokens', tokenUsage.input);\n if (tokenUsage.output != null)\n span.setAttribute('gen_ai.usage.output_tokens', tokenUsage.output);\n if (tokenUsage.cached != null)\n span.setAttribute('gen_ai.usage.cache_read.input_tokens', tokenUsage.cached);\n }\n span.end();\n });\n }\n\n /** Finalize root span with score/verdict after evaluation completes */\n finalizeEvalCase(score: number, error?: string): void {\n if (!this.rootSpan) return;\n this.rootSpan.setAttribute('agentv.score', score);\n if (error) {\n this.rootSpan.setStatus({ code: this.api.SpanStatusCode.ERROR, message: error });\n } else {\n this.rootSpan.setStatus({ code: this.api.SpanStatusCode.OK });\n }\n this.rootSpan.end();\n this.rootSpan = null;\n this.rootCtx = null;\n }\n\n /** Get ProviderStreamCallbacks for passing to providers */\n getStreamCallbacks(): ProviderStreamCallbacks {\n return {\n onToolCallEnd: (name, input, output, durationMs, toolCallId) =>\n this.onToolCall(name, input, output, durationMs, toolCallId),\n onLlmCallEnd: (model, tokenUsage) => this.onLlmCall(model, tokenUsage),\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Turn grouping\n// ---------------------------------------------------------------------------\n\ninterface Turn {\n messages: Message[];\n}\n\nfunction groupMessagesIntoTurns(messages: readonly Message[]): Turn[] {\n const turns: Turn[] = [];\n let current: Message[] = [];\n for (const msg of messages) {\n if (msg.role === 'user' && current.length > 0) {\n turns.push({ messages: current });\n current = [];\n }\n current.push(msg);\n }\n if (current.length > 0) turns.push({ messages: current });\n return turns;\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/** Convert an optional ISO timestamp to an HrTime-compatible value (milliseconds). */\nfunction toHrTime(iso?: string): number | undefined {\n if (!iso) return undefined;\n return new Date(iso).getTime();\n}\n","export * from './evaluation/types.js';\nexport * from './evaluation/trace.js';\nexport * from './evaluation/yaml-parser.js';\nexport * from './evaluation/file-utils.js';\nexport * from './evaluation/providers/index.js';\nexport * from './evaluation/evaluators.js';\nexport * from './evaluation/orchestrator.js';\nexport {\n evaluate,\n type EvalConfig,\n type EvalTestInput,\n type EvalAssertionInput,\n type EvalRunResult,\n type EvalSummary,\n} from './evaluation/evaluate.js';\nexport {\n defineConfig,\n loadTsConfig,\n type AgentVConfig as AgentVTsConfig,\n} from './evaluation/config.js';\nexport * from './evaluation/generators/index.js';\nexport * from './evaluation/workspace/index.js';\nexport {\n ResponseCache,\n shouldEnableCache,\n shouldSkipCacheForTemperature,\n} from './evaluation/cache/response-cache.js';\nexport { toSnakeCaseDeep, toCamelCaseDeep } from './evaluation/case-conversion.js';\nexport { trimBaselineResult } from './evaluation/baseline.js';\nexport * from './observability/index.js';\n\n// Registry exports\nexport {\n EvaluatorRegistry,\n DeterministicAssertionEvaluator,\n} from './evaluation/registry/evaluator-registry.js';\nexport type {\n EvaluatorDispatchContext,\n EvaluatorFactoryFn,\n} from './evaluation/registry/evaluator-registry.js';\nexport { createBuiltinRegistry } from './evaluation/registry/builtin-evaluators.js';\nexport { discoverAssertions } from './evaluation/registry/assertion-discovery.js';\n\nexport type AgentKernel = {\n status: string;\n};\n\nexport function createAgentKernel(): AgentKernel {\n return { status: 'stub' };\n}\n"],"mappings":"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","names":["tool","readFile","path","micromatch","parse","resolveFileReference","readFile","path","path","fileExists","buildDirectoryChain","buildSearchRoots","resolveFileReference","ANSI_YELLOW","ANSI_RESET","buildDirectoryChain","path","fileExists","readFile","path","readFile","ANSI_YELLOW","ANSI_RESET","readFile","ANSI_YELLOW","ANSI_RESET","isJsonObject","logWarning","weight","required","knownProps","config","resolveFileReference","path","promptPath","argsMatch","readFile","path","micromatch","parseYaml","readFile","path","asString","ANSI_YELLOW","ANSI_RESET","asString","resolveFileReference","logWarning","readFile","path","asString","logWarning","ANSI_YELLOW","ANSI_RESET","resolveFileReference","readFile","path","ANSI_YELLOW","ANSI_RESET","path","fileExists","logWarning","readFile","parseYaml","asString","buildSearchRoots","micromatch","asString","logWarning","ANSI_YELLOW","ANSI_RESET","readFile","path","ANSI_YELLOW","ANSI_RESET","path","fileExists","logWarning","readFile","asString","ANSI_YELLOW","ANSI_RED","ANSI_RESET","logWarning","path","readFile","parse","buildSearchRoots","asString","micromatch","logError","systemContent","path","path","path","DEFAULT_SYSTEM_PROMPT","path","path","z","z","normalizeInputFiles","path","randomUUID","createWriteStream","mkdir","path","GLOBAL_LOGS_KEY","GLOBAL_SUBSCRIBERS_KEY","getSubscriberStore","notifySubscribers","DEFAULT_SYSTEM_PROMPT","path","mkdir","buildLogFilename","createWriteStream","formatElapsed","sanitizeForFilename","randomUUID","randomUUID","mkdir","path","GLOBAL_LOGS_KEY","GLOBAL_SUBSCRIBERS_KEY","getSubscriberStore","notifySubscribers","randomUUID","createWriteStream","path","fileURLToPath","os","buildLogFilename","sanitizeForFilename","formatElapsed","DEFAULT_SYSTEM_PROMPT","randomUUID","path","mkdir","buildLogFilename","randomUUID","mkdir","path","GLOBAL_LOGS_KEY","GLOBAL_SUBSCRIBERS_KEY","getSubscriberStore","notifySubscribers","DEFAULT_SYSTEM_PROMPT","randomUUID","path","mkdir","buildLogFilename","extractTextContent","extractToolCalls","spawn","randomUUID","createWriteStream","mkdir","path","GLOBAL_LOGS_KEY","GLOBAL_SUBSCRIBERS_KEY","getSubscriberStore","notifySubscribers","DEFAULT_SYSTEM_PROMPT","path","formatTimeoutSuffix","captureFileChanges","mkdir","buildLogFilename","createWriteStream","formatElapsed","sanitizeForFilename","randomUUID","event","extractTextContent","extractToolCalls","spawn","exec","constants","access","stat","path","promisify","stat","writeFile","path","constants","access","mkdir","rm","path","rm","path","pathToFileUri","path","renderTemplate","renderTemplate","path","readFile","path","sleep","sleep","readFile","path","spawn","mkdir","writeFile","path","promisify","os","path","execAsync","promisify","spawn","path","mkdir","writeFile","sleep","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","stat","collectGuidelineFiles","buildMandatoryPrereadBlock","pathToFileUri","path","constants","access","readFile","path","parse","fileExists","path","fg","path","fg","mkdtemp","rm","writeFile","tmpdir","spawn","mkdir","readFile","rm","writeFile","tmpdir","path","randomUUID","url","extractLastAssistantContent","mkdtemp","tmpdir","writeFile","path","rm","generateText","generateText","z","z","generateText","data","generateText","data","score","hits","misses","reasoning","path","toNumber","fs","path","generateText","z","generateText","data","score","hits","misses","path","z","fs","stat","path","randomUUID","mkdir","path","micromatch","path","path","path","fg","path","fg","aggregation","readdirSync","path","promisify","execAsync","mkdir","readdir","rm","stat","os","path","path","os","stat","mkdir","readdir","rm","readdir","stat","path","randomUUID","path","mkdir","score","micromatch","captureFileChanges","existsSync","path","path","existsSync","readFileSync","z","existsSync","join","generateText","z","mkdir","readFile","writeFile","path","OtlpJsonFileExporter","SimpleTraceFileExporter","parentCtx"]}
|