@agentv/core 0.2.6 → 0.2.8

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/evaluation/types.ts","../src/evaluation/yaml-parser.ts","../src/evaluation/providers/ax.ts","../src/evaluation/providers/mock.ts","../src/evaluation/providers/targets.ts","../src/evaluation/providers/vscode.ts","../src/evaluation/providers/targets-file.ts","../src/evaluation/providers/index.ts","../src/evaluation/scoring.ts","../src/evaluation/grading.ts","../src/evaluation/orchestrator.ts","../../../node_modules/.pnpm/yocto-queue@1.2.1/node_modules/yocto-queue/index.js","../../../node_modules/.pnpm/p-limit@6.2.0/node_modules/p-limit/index.js","../src/index.ts"],"sourcesContent":["/**\r\n * JSON primitive values appearing in AgentV payloads.\r\n */\r\nexport type JsonPrimitive = string | number | boolean | null;\r\n\r\n/**\r\n * Immutable JSON object representation for test fixtures.\r\n */\r\nexport interface JsonObject {\r\n readonly [key: string]: JsonValue;\r\n}\r\n\r\n/**\r\n * Recursive JSON value supporting nested structures.\r\n */\r\nexport type JsonValue = JsonPrimitive | JsonObject | readonly JsonValue[];\r\n\r\nconst TEST_MESSAGE_ROLE_VALUES = [\"system\", \"user\", \"assistant\", \"tool\"] as const;\r\n\r\n/**\r\n * Immutable list of supported message roles.\r\n */\r\nexport const TEST_MESSAGE_ROLES = TEST_MESSAGE_ROLE_VALUES;\r\n\r\n/**\r\n * Role literals used by test messages.\r\n */\r\nexport type TestMessageRole = (typeof TEST_MESSAGE_ROLE_VALUES)[number];\r\n\r\nconst TEST_MESSAGE_ROLE_SET: ReadonlySet<string> = new Set(TEST_MESSAGE_ROLE_VALUES);\r\n\r\n/**\r\n * Text or structured payload attached to a message.\r\n */\r\nexport type TestMessageContent = string | readonly JsonObject[];\r\n\r\n/**\r\n * System-authored instruction message.\r\n */\r\nexport type SystemTestMessage = {\r\n readonly role: \"system\";\r\n readonly content: TestMessageContent;\r\n};\r\n\r\n/**\r\n * User-authored prompt message.\r\n */\r\nexport type UserTestMessage = {\r\n readonly role: \"user\";\r\n readonly content: TestMessageContent;\r\n};\r\n\r\n/**\r\n * Assistant response message.\r\n */\r\nexport type AssistantTestMessage = {\r\n readonly role: \"assistant\";\r\n readonly content: TestMessageContent;\r\n};\r\n\r\n/**\r\n * Tool invocation message.\r\n */\r\nexport type ToolTestMessage = {\r\n readonly role: \"tool\";\r\n readonly content: TestMessageContent;\r\n};\r\n\r\n/**\r\n * Conversation message union with role discrimination.\r\n */\r\nexport type TestMessage =\r\n | SystemTestMessage\r\n | UserTestMessage\r\n | AssistantTestMessage\r\n | ToolTestMessage;\r\n\r\n/**\r\n * Guard validating supported message roles.\r\n */\r\nexport function isTestMessageRole(value: unknown): value is TestMessageRole {\r\n return typeof value === \"string\" && TEST_MESSAGE_ROLE_SET.has(value);\r\n}\r\n\r\n/**\r\n * Guard matching AgentV JSON objects.\r\n */\r\nexport function isJsonObject(value: unknown): value is JsonObject {\r\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\r\n return false;\r\n }\r\n return Object.values(value as Record<string, unknown>).every(isJsonValue);\r\n}\r\n\r\n/**\r\n * Guard matching AgentV JSON values.\r\n */\r\nexport function isJsonValue(value: unknown): value is JsonValue {\r\n if (\r\n value === null ||\r\n typeof value === \"string\" ||\r\n typeof value === \"number\" ||\r\n typeof value === \"boolean\"\r\n ) {\r\n return true;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.every(isJsonValue);\r\n }\r\n if (typeof value === \"object\") {\r\n return isJsonObject(value);\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Guard validating raw test messages.\r\n */\r\nexport function isTestMessage(value: unknown): value is TestMessage {\r\n if (typeof value !== \"object\" || value === null) {\r\n return false;\r\n }\r\n const candidate = value as { role?: unknown; content?: unknown };\r\n if (!isTestMessageRole(candidate.role)) {\r\n return false;\r\n }\r\n if (typeof candidate.content === \"string\") {\r\n return true;\r\n }\r\n if (!Array.isArray(candidate.content)) {\r\n return false;\r\n }\r\n return candidate.content.every(isJsonObject);\r\n}\r\n\r\nconst GRADER_KIND_VALUES = [\"heuristic\", \"llm_judge\"] as const;\r\n\r\n/**\r\n * Supported grader implementations.\r\n */\r\nexport const GRADER_KINDS = GRADER_KIND_VALUES;\r\n\r\n/**\r\n * Grader identifiers available to the pipeline.\r\n */\r\nexport type GraderKind = (typeof GRADER_KIND_VALUES)[number];\r\n\r\nconst GRADER_KIND_SET: ReadonlySet<string> = new Set(GRADER_KIND_VALUES);\r\n\r\n/**\r\n * Guard validating grader identifiers.\r\n */\r\nexport function isGraderKind(value: unknown): value is GraderKind {\r\n return typeof value === \"string\" && GRADER_KIND_SET.has(value);\r\n}\r\n\r\n/**\r\n * Test case definition sourced from AgentV specs.\r\n */\r\nexport interface TestCase {\r\n readonly id: string;\r\n readonly conversation_id?: string;\r\n readonly task: string;\r\n readonly user_segments: readonly JsonObject[];\r\n readonly expected_assistant_raw: string;\r\n readonly guideline_paths: readonly string[];\r\n readonly code_snippets: readonly string[];\r\n readonly outcome: string;\r\n readonly grader: GraderKind;\r\n}\r\n\r\n/**\r\n * Evaluator scorecard for a single test case run.\r\n */\r\nexport interface EvaluationResult {\r\n readonly eval_id: string;\r\n readonly conversation_id?: string;\r\n readonly score: number;\r\n readonly hits: readonly string[];\r\n readonly misses: readonly string[];\r\n readonly model_answer: string;\r\n readonly expected_aspect_count: number;\r\n readonly target: string;\r\n readonly timestamp: string;\r\n readonly reasoning?: string;\r\n readonly raw_aspects?: readonly string[];\r\n readonly raw_request?: JsonObject;\r\n readonly grader_raw_request?: JsonObject;\r\n}\r\n\r\n/**\r\n * Convenience accessor matching the Python hit_count property.\r\n */\r\nexport function getHitCount(result: Pick<EvaluationResult, \"hits\">): number {\r\n return result.hits.length;\r\n}\r\n","import { constants } from \"node:fs\";\r\nimport { access, readFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { parse } from \"yaml\";\r\n\r\nimport { buildSearchRoots, resolveFileReference } from \"./file-utils.js\";\r\nimport type { GraderKind, JsonObject, JsonValue, TestCase, TestMessage } from \"./types.js\";\r\nimport { isGraderKind, isJsonObject, isTestMessage } from \"./types.js\";\r\n\r\nconst CODE_BLOCK_PATTERN = /```[\\s\\S]*?```/g;\r\nconst ANSI_YELLOW = \"\\u001b[33m\";\r\nconst ANSI_RESET = \"\\u001b[0m\";\r\nconst SCHEMA_EVAL_V2 = \"agentv-eval-v2\";\r\n\r\n/**\r\n * Determine whether a path references guideline content (instructions or prompts).\r\n */\r\nexport function isGuidelineFile(filePath: string): boolean {\r\n const normalized = filePath.split(\"\\\\\").join(\"/\");\r\n return (\r\n normalized.endsWith(\".instructions.md\") ||\r\n normalized.includes(\"/instructions/\") ||\r\n normalized.endsWith(\".prompt.md\") ||\r\n normalized.includes(\"/prompts/\")\r\n );\r\n}\r\n\r\n/**\r\n * Extract fenced code blocks from AgentV user segments.\r\n */\r\nexport function extractCodeBlocks(segments: readonly JsonObject[]): readonly string[] {\r\n const codeBlocks: string[] = [];\r\n for (const segment of segments) {\r\n const typeValue = segment[\"type\"];\r\n if (typeof typeValue !== \"string\" || typeValue !== \"text\") {\r\n continue;\r\n }\r\n const textValue = segment[\"value\"];\r\n if (typeof textValue !== \"string\") {\r\n continue;\r\n }\r\n const matches = textValue.match(CODE_BLOCK_PATTERN);\r\n if (matches) {\r\n codeBlocks.push(...matches);\r\n }\r\n }\r\n return codeBlocks;\r\n}\r\n\r\ntype LoadOptions = {\r\n readonly verbose?: boolean;\r\n};\r\n\r\ntype RawTestSuite = JsonObject & {\r\n readonly $schema?: JsonValue;\r\n readonly grader?: JsonValue;\r\n readonly evalcases?: JsonValue;\r\n readonly target?: JsonValue;\r\n};\r\n\r\ntype RawTestCase = JsonObject & {\r\n readonly id?: JsonValue;\r\n readonly conversation_id?: JsonValue;\r\n readonly outcome?: JsonValue;\r\n readonly input_messages?: JsonValue;\r\n readonly expected_messages?: JsonValue;\r\n readonly grader?: JsonValue;\r\n readonly execution?: JsonValue;\r\n};\r\n\r\n/**\r\n * Load eval cases from a AgentV YAML specification file.\r\n */\r\nexport async function loadTestCases(\r\n testFilePath: string,\r\n repoRoot: URL | string,\r\n options?: LoadOptions,\r\n): Promise<readonly TestCase[]> {\r\n const verbose = options?.verbose ?? false;\r\n const absoluteTestPath = path.resolve(testFilePath);\r\n if (!(await fileExists(absoluteTestPath))) {\r\n throw new Error(`Test file not found: ${testFilePath}`);\r\n }\r\n\r\n const repoRootPath = resolveToAbsolutePath(repoRoot);\r\n const searchRoots = buildSearchRoots(absoluteTestPath, repoRootPath);\r\n\r\n const rawFile = await readFile(absoluteTestPath, \"utf8\");\r\n const parsed = parse(rawFile) as unknown;\r\n if (!isJsonObject(parsed)) {\r\n throw new Error(`Invalid test file format: ${testFilePath}`);\r\n }\r\n\r\n const suite = parsed as RawTestSuite;\r\n \r\n // Check $schema field to ensure V2 format\r\n const schema = suite.$schema;\r\n \r\n if (schema !== SCHEMA_EVAL_V2) {\r\n const message = typeof schema === 'string' \r\n ? `Invalid $schema value '${schema}' in ${testFilePath}. Expected '${SCHEMA_EVAL_V2}'`\r\n : `Missing required field '$schema' in ${testFilePath}.\\nPlease add '$schema: ${SCHEMA_EVAL_V2}' at the top of the file.`;\r\n throw new Error(message);\r\n }\r\n \r\n // V2 format: $schema is agentv-eval-v2\r\n const rawTestcases = suite.evalcases;\r\n if (!Array.isArray(rawTestcases)) {\r\n throw new Error(`Invalid test file format: ${testFilePath} - missing 'evalcases' field`);\r\n }\r\n\r\n const globalGrader = coerceGrader(suite.grader) ?? \"llm_judge\";\r\n const results: TestCase[] = [];\r\n\r\n for (const rawTestcase of rawTestcases) {\r\n if (!isJsonObject(rawTestcase)) {\r\n logWarning(\"Skipping invalid test case entry (expected object)\");\r\n continue;\r\n }\r\n\r\n const testcase = rawTestcase as RawTestCase;\r\n const id = asString(testcase.id);\r\n const conversationId = asString(testcase.conversation_id);\r\n const outcome = asString(testcase.outcome);\r\n \r\n const inputMessagesValue = testcase.input_messages;\r\n const expectedMessagesValue = testcase.expected_messages;\r\n\r\n if (!id || !outcome || !Array.isArray(inputMessagesValue)) {\r\n logWarning(`Skipping incomplete test case: ${id ?? \"unknown\"}`);\r\n continue;\r\n }\r\n \r\n if (!Array.isArray(expectedMessagesValue)) {\r\n logWarning(`Test case '${id}' missing expected_messages array`);\r\n continue;\r\n }\r\n\r\n // V2 format: input_messages contains system/user, expected_messages contains assistant\r\n const inputMessages = inputMessagesValue.filter((msg): msg is TestMessage => isTestMessage(msg));\r\n const expectedMessages = expectedMessagesValue.filter((msg): msg is TestMessage => isTestMessage(msg));\r\n \r\n const assistantMessages = expectedMessages.filter((message) => message.role === \"assistant\");\r\n const userMessages = inputMessages.filter((message) => message.role === \"user\");\r\n\r\n if (assistantMessages.length === 0) {\r\n logWarning(`No assistant message found for test case: ${id}`);\r\n continue;\r\n }\r\n\r\n if (assistantMessages.length > 1) {\r\n logWarning(`Multiple assistant messages found for test case: ${id}, using first`);\r\n }\r\n\r\n const userSegments: JsonObject[] = [];\r\n const guidelinePaths: string[] = [];\r\n const userTextParts: string[] = [];\r\n\r\n for (const userMessage of userMessages) {\r\n const content = userMessage.content;\r\n if (typeof content === \"string\") {\r\n userSegments.push({ type: \"text\", value: content });\r\n userTextParts.push(content);\r\n continue;\r\n }\r\n\r\n for (const rawSegment of content) {\r\n if (!isJsonObject(rawSegment)) {\r\n continue;\r\n }\r\n\r\n const segmentType = asString(rawSegment.type);\r\n if (segmentType === \"file\") {\r\n const rawValue = asString(rawSegment.value);\r\n if (!rawValue) {\r\n continue;\r\n }\r\n\r\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\r\n rawValue,\r\n searchRoots,\r\n );\r\n\r\n if (!resolvedPath) {\r\n const attempts = attempted.length\r\n ? [\" Tried:\", ...attempted.map((candidate) => ` ${candidate}`)]\r\n : undefined;\r\n logWarning(`File not found: ${displayPath}`, attempts);\r\n continue;\r\n }\r\n\r\n try {\r\n const fileContent = (await readFile(resolvedPath, \"utf8\")).replace(/\\r\\n/g, \"\\n\");\r\n if (isGuidelineFile(displayPath)) {\r\n guidelinePaths.push(path.resolve(resolvedPath));\r\n if (verbose) {\r\n console.log(` [Guideline] Found: ${displayPath}`);\r\n console.log(` Resolved to: ${resolvedPath}`);\r\n }\r\n } else {\r\n userSegments.push({\r\n type: \"file\",\r\n path: displayPath,\r\n text: fileContent,\r\n });\r\n if (verbose) {\r\n console.log(` [File] Found: ${displayPath}`);\r\n console.log(` Resolved to: ${resolvedPath}`);\r\n }\r\n }\r\n } catch (error) {\r\n logWarning(`Could not read file ${resolvedPath}: ${(error as Error).message}`);\r\n }\r\n continue;\r\n }\r\n\r\n const clonedSegment = cloneJsonObject(rawSegment);\r\n userSegments.push(clonedSegment);\r\n const inlineValue = clonedSegment.value;\r\n if (typeof inlineValue === \"string\") {\r\n userTextParts.push(inlineValue);\r\n }\r\n }\r\n }\r\n\r\n const codeSnippets = extractCodeBlocks(userSegments);\r\n const assistantContent = assistantMessages[0]?.content;\r\n const expectedAssistantRaw = await resolveAssistantContent(assistantContent, searchRoots, verbose);\r\n const userTextPrompt = userTextParts\r\n .map((part) => part.trim())\r\n .filter((part) => part.length > 0)\r\n .join(\" \");\r\n\r\n const testCaseGrader = coerceGrader(testcase.grader) ?? globalGrader;\r\n\r\n const testCase: TestCase = {\r\n id,\r\n conversation_id: conversationId,\r\n task: userTextPrompt,\r\n user_segments: userSegments,\r\n expected_assistant_raw: expectedAssistantRaw,\r\n guideline_paths: guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\r\n code_snippets: codeSnippets,\r\n outcome,\r\n grader: testCaseGrader,\r\n };\r\n\r\n if (verbose) {\r\n console.log(`\\n[Test Case: ${id}]`);\r\n if (testCase.guideline_paths.length > 0) {\r\n console.log(` Guidelines used: ${testCase.guideline_paths.length}`);\r\n for (const guidelinePath of testCase.guideline_paths) {\r\n console.log(` - ${guidelinePath}`);\r\n }\r\n } else {\r\n console.log(\" No guidelines found\");\r\n }\r\n }\r\n\r\n results.push(testCase);\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Build prompt inputs by consolidating user request context and guideline content.\r\n */\r\nexport async function buildPromptInputs(\r\n testCase: TestCase,\r\n): Promise<{ request: string; guidelines: string }> {\r\n const guidelineContents: string[] = [];\r\n for (const rawPath of testCase.guideline_paths) {\r\n const absolutePath = path.resolve(rawPath);\r\n if (!(await fileExists(absolutePath))) {\r\n logWarning(`Could not read guideline file ${absolutePath}: file does not exist`);\r\n continue;\r\n }\r\n\r\n try {\r\n const content = (await readFile(absolutePath, \"utf8\")).replace(/\\r\\n/g, \"\\n\");\r\n guidelineContents.push(`=== ${path.basename(absolutePath)} ===\\n${content}`);\r\n } catch (error) {\r\n logWarning(`Could not read guideline file ${absolutePath}: ${(error as Error).message}`);\r\n }\r\n }\r\n\r\n const requestParts: string[] = [];\r\n for (const segment of testCase.user_segments) {\r\n const typeValue = segment.type;\r\n if (typeof typeValue === \"string\" && typeValue === \"file\") {\r\n const pathValue = segment.path;\r\n const textValue = segment.text;\r\n const label = typeof pathValue === \"string\" ? pathValue : \"file\";\r\n const body = typeof textValue === \"string\" ? textValue : \"\";\r\n requestParts.push(`=== ${label} ===\\n${body}`);\r\n continue;\r\n }\r\n\r\n if (typeof typeValue === \"string\" && typeValue === \"text\") {\r\n const value = segment.value;\r\n if (typeof value === \"string\") {\r\n requestParts.push(value);\r\n }\r\n continue;\r\n }\r\n\r\n const genericValue = segment.value;\r\n if (typeof genericValue === \"string\") {\r\n requestParts.push(genericValue);\r\n }\r\n }\r\n\r\n if (testCase.code_snippets.length > 0) {\r\n requestParts.push(testCase.code_snippets.join(\"\\n\"));\r\n }\r\n\r\n const request = requestParts\r\n .map((part) => part.trim())\r\n .filter((part) => part.length > 0)\r\n .join(\"\\n\\n\");\r\n\r\n const guidelines = guidelineContents\r\n .map((part) => part.trim())\r\n .filter((part) => part.length > 0)\r\n .join(\"\\n\\n\");\r\n\r\n return { request, guidelines };\r\n}\r\n\r\nasync function fileExists(absolutePath: string): Promise<boolean> {\r\n try {\r\n await access(absolutePath, constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction resolveToAbsolutePath(candidate: URL | string): string {\r\n if (candidate instanceof URL) {\r\n return fileURLToPath(candidate);\r\n }\r\n if (typeof candidate === \"string\") {\r\n if (candidate.startsWith(\"file://\")) {\r\n return fileURLToPath(new URL(candidate));\r\n }\r\n return path.resolve(candidate);\r\n }\r\n throw new TypeError(\"Unsupported repoRoot value. Expected string or URL.\");\r\n}\r\n\r\nfunction asString(value: unknown): string | undefined {\r\n return typeof value === \"string\" ? value : undefined;\r\n}\r\n\r\nfunction cloneJsonObject(source: JsonObject): JsonObject {\r\n const entries = Object.entries(source).map(([key, value]) => [key, cloneJsonValue(value)]);\r\n return Object.fromEntries(entries) as JsonObject;\r\n}\r\n\r\nfunction cloneJsonValue(value: JsonValue): JsonValue {\r\n if (value === null) {\r\n return null;\r\n }\r\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\r\n return value;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.map((item) => cloneJsonValue(item)) as readonly JsonValue[];\r\n }\r\n return cloneJsonObject(value as JsonObject);\r\n}\r\n\r\nfunction normalizeAssistantContent(content: TestMessage[\"content\"] | undefined): string {\r\n if (typeof content === \"string\") {\r\n return content;\r\n }\r\n if (!content) {\r\n return \"\";\r\n }\r\n const parts: string[] = [];\r\n for (const entry of content) {\r\n if (typeof entry === \"string\") {\r\n parts.push(entry);\r\n continue;\r\n }\r\n const textValue = asString(entry[\"text\"]);\r\n if (typeof textValue === \"string\") {\r\n parts.push(textValue);\r\n continue;\r\n }\r\n const valueValue = asString(entry[\"value\"]);\r\n if (typeof valueValue === \"string\") {\r\n parts.push(valueValue);\r\n continue;\r\n }\r\n parts.push(JSON.stringify(entry));\r\n }\r\n return parts.join(\" \");\r\n}\r\n\r\n/**\r\n * Resolve assistant content including file references.\r\n * Similar to input message processing, but for expected assistant responses.\r\n */\r\nasync function resolveAssistantContent(\r\n content: TestMessage[\"content\"] | undefined,\r\n searchRoots: readonly string[],\r\n verbose: boolean,\r\n): Promise<string> {\r\n if (typeof content === \"string\") {\r\n return content;\r\n }\r\n if (!content) {\r\n return \"\";\r\n }\r\n \r\n const parts: string[] = [];\r\n for (const entry of content) {\r\n if (typeof entry === \"string\") {\r\n parts.push(entry);\r\n continue;\r\n }\r\n \r\n if (!isJsonObject(entry)) {\r\n continue;\r\n }\r\n \r\n const segmentType = asString(entry.type);\r\n \r\n // Handle file references\r\n if (segmentType === \"file\") {\r\n const rawValue = asString(entry.value);\r\n if (!rawValue) {\r\n continue;\r\n }\r\n \r\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\r\n rawValue,\r\n searchRoots,\r\n );\r\n \r\n if (!resolvedPath) {\r\n const attempts = attempted.length\r\n ? [\" Tried:\", ...attempted.map((candidate) => ` ${candidate}`)]\r\n : undefined;\r\n logWarning(`File not found in expected_messages: ${displayPath}`, attempts);\r\n continue;\r\n }\r\n \r\n try {\r\n const fileContent = (await readFile(resolvedPath, \"utf8\")).replace(/\\r\\n/g, \"\\n\");\r\n parts.push(fileContent);\r\n if (verbose) {\r\n console.log(` [Expected Assistant File] Found: ${displayPath}`);\r\n console.log(` Resolved to: ${resolvedPath}`);\r\n }\r\n } catch (error) {\r\n logWarning(`Could not read file ${resolvedPath}: ${(error as Error).message}`);\r\n }\r\n continue;\r\n }\r\n \r\n // Handle text segments\r\n const textValue = asString(entry.text);\r\n if (typeof textValue === \"string\") {\r\n parts.push(textValue);\r\n continue;\r\n }\r\n \r\n const valueValue = asString(entry.value);\r\n if (typeof valueValue === \"string\") {\r\n parts.push(valueValue);\r\n continue;\r\n }\r\n \r\n parts.push(JSON.stringify(entry));\r\n }\r\n return parts.join(\" \");\r\n}\r\n\r\nfunction coerceGrader(candidate: JsonValue | undefined): GraderKind | undefined {\r\n if (typeof candidate !== \"string\") {\r\n return undefined;\r\n }\r\n if (isGraderKind(candidate)) {\r\n return candidate;\r\n }\r\n logWarning(`Unknown grader '${candidate}', falling back to default`);\r\n return undefined;\r\n}\r\n\r\nfunction logWarning(message: string, details?: readonly string[]): void {\r\n if (details && details.length > 0) {\r\n const detailBlock = details.join(\"\\n\");\r\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\r\n } else {\r\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\r\n }\r\n}\r\n","import { AxAI } from \"@ax-llm/ax\";\r\nimport type { AxChatRequest, AxChatResponse, AxModelConfig } from \"@ax-llm/ax\";\r\n\r\nimport type {\r\n AnthropicResolvedConfig,\r\n AzureResolvedConfig,\r\n GeminiResolvedConfig,\r\n} from \"./targets.js\";\r\nimport type { Provider, ProviderRequest, ProviderResponse } from \"./types.js\";\r\nimport type { JsonObject } from \"../types.js\";\r\n\r\nconst DEFAULT_SYSTEM_PROMPT =\r\n \"You are a careful assistant. Follow all provided instructions and do not fabricate results.\";\r\n\r\ntype ChatPrompt = AxChatRequest[\"chatPrompt\"];\r\n\r\ntype AxAiInstance = ReturnType<typeof AxAI.create>;\r\n\r\nfunction buildChatPrompt(request: ProviderRequest): ChatPrompt {\r\n if (request.chatPrompt) {\r\n return request.chatPrompt;\r\n }\r\n\r\n const systemSegments: string[] = [];\r\n if (request.guidelines && request.guidelines.trim().length > 0) {\r\n systemSegments.push(`Guidelines:\\n${request.guidelines.trim()}`);\r\n }\r\n\r\n const metadataSystemPrompt =\r\n typeof request.metadata?.systemPrompt === \"string\" ? request.metadata.systemPrompt : undefined;\r\n if (metadataSystemPrompt && metadataSystemPrompt.trim().length > 0) {\r\n systemSegments.push(metadataSystemPrompt.trim());\r\n }\r\n\r\n const systemContent =\r\n systemSegments.length > 0 ? systemSegments.join(\"\\n\\n\") : DEFAULT_SYSTEM_PROMPT;\r\n const userContent = request.prompt.trim();\r\n\r\n const prompt: ChatPrompt = [\r\n {\r\n role: \"system\",\r\n content: systemContent,\r\n },\r\n {\r\n role: \"user\",\r\n content: userContent,\r\n },\r\n ];\r\n\r\n return prompt;\r\n}\r\n\r\nfunction extractModelConfig(\r\n request: ProviderRequest,\r\n defaults: { temperature?: number; maxOutputTokens?: number },\r\n): AxModelConfig | undefined {\r\n const temperature = request.temperature ?? defaults.temperature;\r\n const maxTokens = request.maxOutputTokens ?? defaults.maxOutputTokens;\r\n const config: AxModelConfig = {};\r\n if (temperature !== undefined) {\r\n config.temperature = temperature;\r\n }\r\n if (maxTokens !== undefined) {\r\n config.maxTokens = maxTokens;\r\n }\r\n return Object.keys(config).length > 0 ? config : undefined;\r\n}\r\n\r\nfunction mapResponse(response: AxChatResponse): ProviderResponse {\r\n const primary = response.results[0];\r\n const text = typeof primary?.content === \"string\" ? primary.content : \"\";\r\n const reasoning = primary?.thought ?? primary?.thoughtBlock?.data;\r\n const usage = toJsonObject(response.modelUsage);\r\n\r\n return {\r\n text,\r\n reasoning,\r\n raw: response,\r\n usage,\r\n };\r\n}\r\n\r\nfunction toJsonObject(value: unknown): JsonObject | undefined {\r\n if (!value || typeof value !== \"object\") {\r\n return undefined;\r\n }\r\n try {\r\n return JSON.parse(JSON.stringify(value)) as JsonObject;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction ensureChatResponse(result: unknown): AxChatResponse {\r\n if (typeof ReadableStream !== \"undefined\" && result instanceof ReadableStream) {\r\n throw new Error(\"Streaming responses are not supported for this provider\");\r\n }\r\n if (!result || typeof result !== \"object\" || !(\"results\" in result)) {\r\n throw new Error(\"Unexpected response type from AxAI provider\");\r\n }\r\n return result as AxChatResponse;\r\n}\r\n\r\nexport class AzureProvider implements Provider {\r\n readonly id: string;\r\n readonly kind = \"azure\" as const;\r\n readonly targetName: string;\r\n\r\n private readonly ai: AxAiInstance;\r\n private readonly defaults: { temperature?: number; maxOutputTokens?: number };\r\n\r\n constructor(\r\n targetName: string,\r\n private readonly config: AzureResolvedConfig,\r\n ) {\r\n this.id = `azure:${targetName}`;\r\n this.targetName = targetName;\r\n this.defaults = {\r\n temperature: config.temperature,\r\n maxOutputTokens: config.maxOutputTokens,\r\n };\r\n\r\n this.ai = AxAI.create({\r\n name: \"azure-openai\",\r\n apiKey: config.apiKey,\r\n resourceName: config.resourceName,\r\n deploymentName: config.deploymentName,\r\n version: config.version,\r\n config: {\r\n stream: false,\r\n },\r\n });\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n const chatPrompt = buildChatPrompt(request);\r\n const modelConfig = extractModelConfig(request, this.defaults);\r\n\r\n const response = await this.ai.chat(\r\n {\r\n chatPrompt,\r\n model: this.config.deploymentName,\r\n ...(modelConfig ? { modelConfig } : {}),\r\n },\r\n request.signal ? { abortSignal: request.signal } : undefined,\r\n );\r\n\r\n return mapResponse(ensureChatResponse(response));\r\n }\r\n}\r\n\r\nexport class AnthropicProvider implements Provider {\r\n readonly id: string;\r\n readonly kind = \"anthropic\" as const;\r\n\r\n readonly targetName: string;\r\n private readonly ai: AxAiInstance;\r\n private readonly defaults: {\r\n temperature?: number;\r\n maxOutputTokens?: number;\r\n thinkingBudget?: number;\r\n };\r\n\r\n constructor(\r\n targetName: string,\r\n private readonly config: AnthropicResolvedConfig,\r\n ) {\r\n this.id = `anthropic:${targetName}`;\r\n this.targetName = targetName;\r\n this.defaults = {\r\n temperature: config.temperature,\r\n maxOutputTokens: config.maxOutputTokens,\r\n thinkingBudget: config.thinkingBudget,\r\n };\r\n\r\n this.ai = AxAI.create({\r\n name: \"anthropic\",\r\n apiKey: config.apiKey,\r\n });\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n const chatPrompt = buildChatPrompt(request);\r\n const modelConfig = extractModelConfig(request, this.defaults);\r\n\r\n const response = await this.ai.chat(\r\n {\r\n chatPrompt,\r\n model: this.config.model,\r\n ...(modelConfig ? { modelConfig } : {}),\r\n },\r\n request.signal ? { abortSignal: request.signal } : undefined,\r\n );\r\n\r\n return mapResponse(ensureChatResponse(response));\r\n }\r\n}\r\n\r\nexport class GeminiProvider implements Provider {\r\n readonly id: string;\r\n readonly kind = \"gemini\" as const;\r\n\r\n readonly targetName: string;\r\n private readonly ai: AxAiInstance;\r\n private readonly defaults: {\r\n temperature?: number;\r\n maxOutputTokens?: number;\r\n };\r\n\r\n constructor(\r\n targetName: string,\r\n private readonly config: GeminiResolvedConfig,\r\n ) {\r\n this.id = `gemini:${targetName}`;\r\n this.targetName = targetName;\r\n this.defaults = {\r\n temperature: config.temperature,\r\n maxOutputTokens: config.maxOutputTokens,\r\n };\r\n\r\n this.ai = AxAI.create({\r\n name: \"google-gemini\",\r\n apiKey: config.apiKey,\r\n });\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n const chatPrompt = buildChatPrompt(request);\r\n const modelConfig = extractModelConfig(request, this.defaults);\r\n\r\n const response = await this.ai.chat(\r\n {\r\n chatPrompt,\r\n model: this.config.model,\r\n ...(modelConfig ? { modelConfig } : {}),\r\n },\r\n request.signal ? { abortSignal: request.signal } : undefined,\r\n );\r\n\r\n return mapResponse(ensureChatResponse(response));\r\n }\r\n}\r\n","import type { MockResolvedConfig } from \"./targets.js\";\r\nimport type { Provider, ProviderRequest, ProviderResponse } from \"./types.js\";\r\n\r\nconst DEFAULT_MOCK_RESPONSE =\r\n '{\"answer\":\"Mock provider response. Configure targets.yaml to supply a custom value.\"}';\r\n\r\nexport class MockProvider implements Provider {\r\n readonly id: string;\r\n readonly kind = \"mock\" as const;\r\n readonly targetName: string;\r\n\r\n private readonly cannedResponse: string;\r\n private readonly delayMs: number;\r\n private readonly delayMinMs: number;\r\n private readonly delayMaxMs: number;\r\n\r\n constructor(targetName: string, config: MockResolvedConfig) {\r\n this.id = `mock:${targetName}`;\r\n this.targetName = targetName;\r\n this.cannedResponse = config.response ?? DEFAULT_MOCK_RESPONSE;\r\n this.delayMs = config.delayMs ?? 0;\r\n this.delayMinMs = config.delayMinMs ?? 0;\r\n this.delayMaxMs = config.delayMaxMs ?? 0;\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n const delay = this.calculateDelay();\r\n if (delay > 0) {\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n }\r\n\r\n return {\r\n text: this.cannedResponse,\r\n raw: {\r\n prompt: request.prompt,\r\n guidelines: request.guidelines,\r\n },\r\n };\r\n }\r\n\r\n private calculateDelay(): number {\r\n // If range is specified, use uniform random distribution\r\n if (this.delayMinMs > 0 || this.delayMaxMs > 0) {\r\n const min = Math.max(0, this.delayMinMs);\r\n const max = Math.max(min, this.delayMaxMs);\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n }\r\n // Otherwise use fixed delay\r\n return this.delayMs;\r\n }\r\n}\r\n","import { z } from \"zod\";\r\n\r\nimport type { EnvLookup, TargetDefinition } from \"./types.js\";\r\n\r\nexport interface AzureResolvedConfig {\r\n readonly resourceName: string;\r\n readonly deploymentName: string;\r\n readonly apiKey: string;\r\n readonly version?: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n}\r\n\r\nexport interface AnthropicResolvedConfig {\r\n readonly apiKey: string;\r\n readonly model: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly thinkingBudget?: number;\r\n}\r\n\r\nexport interface GeminiResolvedConfig {\r\n readonly apiKey: string;\r\n readonly model: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n}\r\n\r\nexport interface MockResolvedConfig {\r\n readonly response?: string;\r\n readonly delayMs?: number;\r\n readonly delayMinMs?: number;\r\n readonly delayMaxMs?: number;\r\n}\r\n\r\nexport interface VSCodeResolvedConfig {\r\n readonly command: string;\r\n readonly waitForResponse: boolean;\r\n readonly dryRun: boolean;\r\n readonly subagentRoot?: string;\r\n readonly workspaceTemplate?: string;\r\n}\r\n\r\nexport type ResolvedTarget =\r\n | {\r\n readonly kind: \"azure\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly config: AzureResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"anthropic\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly config: AnthropicResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"gemini\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly config: GeminiResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"mock\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly config: MockResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"vscode\" | \"vscode-insiders\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly config: VSCodeResolvedConfig;\r\n };\r\n\r\nconst BASE_TARGET_SCHEMA = z.object({\r\n name: z.string().min(1, \"target name is required\"),\r\n provider: z.string().min(1, \"provider is required\"),\r\n settings: z.record(z.unknown()).optional(),\r\n judge_target: z.string().optional(),\r\n workers: z.number().int().min(1).optional(),\r\n});\r\n\r\nconst DEFAULT_AZURE_API_VERSION = \"2024-10-01-preview\";\r\n\r\nfunction normalizeAzureApiVersion(value: string | undefined): string {\r\n if (!value) {\r\n return DEFAULT_AZURE_API_VERSION;\r\n }\r\n\r\n const trimmed = value.trim();\r\n if (trimmed.length === 0) {\r\n return DEFAULT_AZURE_API_VERSION;\r\n }\r\n\r\n const withoutPrefix = trimmed.replace(/^api[-_]?version\\s*=\\s*/i, \"\").trim();\r\n return withoutPrefix.length > 0 ? withoutPrefix : DEFAULT_AZURE_API_VERSION;\r\n}\r\n\r\nexport function resolveTargetDefinition(\r\n definition: TargetDefinition,\r\n env: EnvLookup = process.env,\r\n): ResolvedTarget {\r\n const parsed = BASE_TARGET_SCHEMA.parse(definition);\r\n const provider = parsed.provider.toLowerCase();\r\n\r\n switch (provider) {\r\n case \"azure\":\r\n case \"azure-openai\":\r\n return {\r\n kind: \"azure\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n config: resolveAzureConfig(parsed, env),\r\n };\r\n case \"anthropic\":\r\n return {\r\n kind: \"anthropic\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n config: resolveAnthropicConfig(parsed, env),\r\n };\r\n case \"gemini\":\r\n case \"google\":\r\n case \"google-gemini\":\r\n return {\r\n kind: \"gemini\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n config: resolveGeminiConfig(parsed, env),\r\n };\r\n case \"mock\":\r\n return {\r\n kind: \"mock\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n config: resolveMockConfig(parsed),\r\n };\r\n case \"vscode\":\r\n case \"vscode-insiders\":\r\n return {\r\n kind: provider as \"vscode\" | \"vscode-insiders\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n config: resolveVSCodeConfig(parsed, env, provider === \"vscode-insiders\"),\r\n };\r\n default:\r\n throw new Error(`Unsupported provider '${parsed.provider}' in target '${parsed.name}'`);\r\n }\r\n}\r\n\r\nfunction resolveAzureConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): AzureResolvedConfig {\r\n const settings = target.settings ?? {};\r\n const endpointSource = settings.endpoint ?? settings.resource ?? settings.resourceName;\r\n const apiKeySource = settings.api_key ?? settings.apiKey;\r\n const deploymentSource = settings.deployment ?? settings.deploymentName ?? settings.model;\r\n const versionSource = settings.version ?? settings.api_version;\r\n const temperatureSource = settings.temperature;\r\n const maxTokensSource = settings.max_output_tokens ?? settings.maxTokens;\r\n\r\n const resourceName = resolveString(endpointSource, env, `${target.name} endpoint`);\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} api key`);\r\n const deploymentName = resolveString(deploymentSource, env, `${target.name} deployment`);\r\n const version = normalizeAzureApiVersion(\r\n resolveOptionalString(versionSource, env, `${target.name} api version`),\r\n );\r\n const temperature = resolveOptionalNumber(temperatureSource, `${target.name} temperature`);\r\n const maxOutputTokens = resolveOptionalNumber(\r\n maxTokensSource,\r\n `${target.name} max output tokens`,\r\n );\r\n\r\n return {\r\n resourceName,\r\n deploymentName,\r\n apiKey,\r\n version,\r\n temperature,\r\n maxOutputTokens,\r\n };\r\n}\r\n\r\nfunction resolveAnthropicConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): AnthropicResolvedConfig {\r\n const settings = target.settings ?? {};\r\n const apiKeySource = settings.api_key ?? settings.apiKey;\r\n const modelSource = settings.model ?? settings.deployment ?? settings.variant;\r\n const temperatureSource = settings.temperature;\r\n const maxTokensSource = settings.max_output_tokens ?? settings.maxTokens;\r\n const thinkingBudgetSource = settings.thinking_budget ?? settings.thinkingBudget;\r\n\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} Anthropic api key`);\r\n const model = resolveString(modelSource, env, `${target.name} Anthropic model`);\r\n\r\n return {\r\n apiKey,\r\n model,\r\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\r\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\r\n thinkingBudget: resolveOptionalNumber(thinkingBudgetSource, `${target.name} thinking budget`),\r\n };\r\n}\r\n\r\nfunction resolveGeminiConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): GeminiResolvedConfig {\r\n const settings = target.settings ?? {};\r\n const apiKeySource = settings.api_key ?? settings.apiKey;\r\n const modelSource = settings.model ?? settings.deployment ?? settings.variant;\r\n const temperatureSource = settings.temperature;\r\n const maxTokensSource = settings.max_output_tokens ?? settings.maxTokens;\r\n\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} Google API key`);\r\n const model =\r\n resolveOptionalString(modelSource, env, `${target.name} Gemini model`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n }) ?? \"gemini-2.5-flash\";\r\n\r\n return {\r\n apiKey,\r\n model,\r\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\r\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\r\n };\r\n}\r\n\r\nfunction resolveMockConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): MockResolvedConfig {\r\n const settings = target.settings ?? {};\r\n const response = typeof settings.response === \"string\" ? settings.response : undefined;\r\n return { response };\r\n}\r\n\r\nfunction resolveVSCodeConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n insiders: boolean,\r\n): VSCodeResolvedConfig {\r\n const settings = target.settings ?? {};\r\n const workspaceTemplateEnvVar = resolveOptionalLiteralString(settings.workspace_template ?? settings.workspaceTemplate);\r\n const workspaceTemplate = workspaceTemplateEnvVar\r\n ? resolveOptionalString(workspaceTemplateEnvVar, env, `${target.name} workspace template path`, {\r\n allowLiteral: false,\r\n optionalEnv: true,\r\n })\r\n : undefined;\r\n\r\n const commandSource = settings.vscode_cmd ?? settings.command;\r\n const waitSource = settings.wait;\r\n const dryRunSource = settings.dry_run ?? settings.dryRun;\r\n const subagentRootSource = settings.subagent_root ?? settings.subagentRoot;\r\n\r\n const defaultCommand = insiders ? \"code-insiders\" : \"code\";\r\n const command = resolveOptionalLiteralString(commandSource) ?? defaultCommand;\r\n\r\n return {\r\n command,\r\n waitForResponse: resolveOptionalBoolean(waitSource) ?? true,\r\n dryRun: resolveOptionalBoolean(dryRunSource) ?? false,\r\n subagentRoot: resolveOptionalString(subagentRootSource, env, `${target.name} subagent root`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n }),\r\n workspaceTemplate,\r\n };\r\n}\r\n\r\nfunction resolveString(\r\n source: unknown,\r\n env: EnvLookup,\r\n description: string,\r\n allowLiteral = false,\r\n): string {\r\n const value = resolveOptionalString(source, env, description, {\r\n allowLiteral,\r\n optionalEnv: false,\r\n });\r\n if (value === undefined) {\r\n throw new Error(`${description} is required`);\r\n }\r\n return value;\r\n}\r\n\r\nfunction resolveOptionalString(\r\n source: unknown,\r\n env: EnvLookup,\r\n description: string,\r\n options?: { allowLiteral?: boolean; optionalEnv?: boolean },\r\n): string | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (typeof source !== \"string\") {\r\n throw new Error(`${description} must be a string`);\r\n }\r\n const trimmed = source.trim();\r\n if (trimmed.length === 0) {\r\n return undefined;\r\n }\r\n const envValue = env[trimmed];\r\n if (envValue !== undefined) {\r\n if (envValue.trim().length === 0) {\r\n throw new Error(`Environment variable '${trimmed}' for ${description} is empty`);\r\n }\r\n return envValue;\r\n }\r\n const allowLiteral = options?.allowLiteral ?? false;\r\n const optionalEnv = options?.optionalEnv ?? false;\r\n if (!allowLiteral && isLikelyEnvReference(trimmed)) {\r\n if (optionalEnv) {\r\n return undefined;\r\n }\r\n throw new Error(`Environment variable '${trimmed}' required for ${description} is not set`);\r\n }\r\n return trimmed;\r\n}\r\n\r\nfunction resolveOptionalLiteralString(source: unknown): string | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (typeof source !== \"string\") {\r\n throw new Error(\"expected string value\");\r\n }\r\n const trimmed = source.trim();\r\n return trimmed.length > 0 ? trimmed : undefined;\r\n}\r\n\r\nfunction resolveOptionalNumber(source: unknown, description: string): number | undefined {\r\n if (source === undefined || source === null || source === \"\") {\r\n return undefined;\r\n }\r\n if (typeof source === \"number\") {\r\n return Number.isFinite(source) ? source : undefined;\r\n }\r\n if (typeof source === \"string\") {\r\n const numeric = Number(source);\r\n if (Number.isFinite(numeric)) {\r\n return numeric;\r\n }\r\n }\r\n throw new Error(`${description} must be a number`);\r\n}\r\n\r\nfunction resolveOptionalBoolean(source: unknown): boolean | undefined {\r\n if (source === undefined || source === null || source === \"\") {\r\n return undefined;\r\n }\r\n if (typeof source === \"boolean\") {\r\n return source;\r\n }\r\n if (typeof source === \"string\") {\r\n const lowered = source.trim().toLowerCase();\r\n if (lowered === \"true\" || lowered === \"1\") {\r\n return true;\r\n }\r\n if (lowered === \"false\" || lowered === \"0\") {\r\n return false;\r\n }\r\n }\r\n throw new Error(\"expected boolean value\");\r\n}\r\n\r\nfunction isLikelyEnvReference(value: string): boolean {\r\n return /^[A-Z0-9_]+$/.test(value);\r\n}\r\n","import { mkdtemp, readFile, rm, writeFile } from \"node:fs/promises\";\r\nimport { tmpdir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { dispatchAgentSession, getSubagentRoot, provisionSubagents } from \"subagent\";\r\n\r\nimport type { VSCodeResolvedConfig } from \"./targets.js\";\r\nimport type { Provider, ProviderRequest, ProviderResponse } from \"./types.js\";\r\n\r\nconst PROMPT_FILE_PREFIX = \"agentv-vscode-\";\r\n\r\nexport class VSCodeProvider implements Provider {\r\n readonly id: string;\r\n readonly kind: \"vscode\" | \"vscode-insiders\";\r\n readonly targetName: string;\r\n\r\n private readonly config: VSCodeResolvedConfig;\r\n\r\n constructor(\r\n targetName: string,\r\n config: VSCodeResolvedConfig,\r\n kind: \"vscode\" | \"vscode-insiders\",\r\n ) {\r\n this.id = `${kind}:${targetName}`;\r\n this.kind = kind;\r\n this.targetName = targetName;\r\n this.config = config;\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n if (request.signal?.aborted) {\r\n throw new Error(\"VS Code provider request was aborted before dispatch\");\r\n }\r\n\r\n const attachments = normalizeAttachments(request.attachments);\r\n const promptContent = buildPromptDocument(request, attachments);\r\n const directory = await mkdtemp(path.join(tmpdir(), PROMPT_FILE_PREFIX));\r\n const promptPath = path.join(directory, `${request.testCaseId ?? \"request\"}.prompt.md`);\r\n\r\n try {\r\n await writeFile(promptPath, promptContent, \"utf8\");\r\n\r\n const session = await dispatchAgentSession({\r\n userQuery: composeUserQuery(request),\r\n promptFile: promptPath,\r\n extraAttachments: attachments,\r\n wait: this.config.waitForResponse,\r\n dryRun: this.config.dryRun,\r\n vscodeCmd: this.config.command,\r\n subagentRoot: this.config.subagentRoot,\r\n workspaceTemplate: this.config.workspaceTemplate,\r\n silent: true,\r\n });\r\n\r\n if (session.exitCode !== 0 || !session.responseFile) {\r\n const failure = session.error ?? \"VS Code subagent did not produce a response\";\r\n throw new Error(failure);\r\n }\r\n\r\n if (this.config.dryRun) {\r\n return {\r\n text: \"\",\r\n raw: {\r\n session,\r\n promptFile: promptPath,\r\n attachments,\r\n },\r\n };\r\n }\r\n\r\n const responseText = await readFile(session.responseFile, \"utf8\");\r\n\r\n return {\r\n text: responseText,\r\n raw: {\r\n session,\r\n promptFile: promptPath,\r\n attachments,\r\n },\r\n };\r\n } finally {\r\n await rm(directory, { recursive: true, force: true });\r\n }\r\n }\r\n}\r\n\r\nfunction buildPromptDocument(\r\n request: ProviderRequest,\r\n attachments: readonly string[] | undefined,\r\n): string {\r\n const parts: string[] = [];\r\n\r\n const instructionFiles = collectInstructionFiles(attachments);\r\n if (instructionFiles.length > 0) {\r\n parts.push(buildMandatoryPrereadBlock(instructionFiles));\r\n }\r\n\r\n parts.push(`# AgentV Request`);\r\n if (request.testCaseId) {\r\n parts.push(`- Test Case: ${request.testCaseId}`);\r\n }\r\n if (request.metadata?.target) {\r\n parts.push(`- Target: ${String(request.metadata.target)}`);\r\n }\r\n\r\n parts.push(\"\\n## Task\\n\", request.prompt.trim());\r\n\r\n if (request.guidelines && request.guidelines.trim().length > 0) {\r\n parts.push(\"\\n## Guidelines\\n\", request.guidelines.trim());\r\n }\r\n\r\n if (attachments && attachments.length > 0) {\r\n const attachmentList = attachments.map((item) => `- ${item}`).join(\"\\n\");\r\n parts.push(\"\\n## Attachments\\n\", attachmentList);\r\n }\r\n\r\n return parts.join(\"\\n\").trim();\r\n}\r\n\r\nfunction buildMandatoryPrereadBlock(instructionFiles: readonly string[]): string {\r\n if (instructionFiles.length === 0) {\r\n return \"\";\r\n }\r\n\r\n const fileList: string[] = [];\r\n const tokenList: string[] = [];\r\n let counter = 0;\r\n\r\n for (const absolutePath of instructionFiles) {\r\n counter += 1;\r\n const fileName = path.basename(absolutePath);\r\n const fileUri = pathToFileUri(absolutePath);\r\n fileList.push(`[${fileName}](${fileUri})`);\r\n tokenList.push(`INSTRUCTIONS_READ: \\`${fileName}\\` i=${counter} SHA256=<hex>`);\r\n }\r\n\r\n const filesText = fileList.join(\", \");\r\n const tokensText = tokenList.join(\"\\n\");\r\n\r\n const instruction = [\r\n `Read all instruction files: ${filesText}.`,\r\n `After reading each file, compute its SHA256 hash using this PowerShell command:`,\r\n \"`Get-FileHash -Algorithm SHA256 -LiteralPath '<file-path>' | Select-Object -ExpandProperty Hash`.\",\r\n `Then include, at the top of your reply, these exact tokens on separate lines:\\n`,\r\n tokensText,\r\n `\\nReplace \\`<hex>\\` with the actual SHA256 hash value computed from the PowerShell command.`,\r\n `If any file is missing, fail with ERROR: missing-file <filename> and stop.\\n`,\r\n `Then fetch all documentation required by the instructions before proceeding with your task.`,\r\n ].join(\" \");\r\n\r\n return `[[ ## mandatory_pre_read ## ]]\\n\\n${instruction}\\n\\n`;\r\n}\r\n\r\nfunction collectInstructionFiles(attachments: readonly string[] | undefined): string[] {\r\n if (!attachments || attachments.length === 0) {\r\n return [];\r\n }\r\n\r\n const unique = new Map<string, string>();\r\n for (const attachment of attachments) {\r\n if (!isInstructionPath(attachment)) {\r\n continue;\r\n }\r\n const absolutePath = path.resolve(attachment);\r\n if (!unique.has(absolutePath)) {\r\n unique.set(absolutePath, absolutePath);\r\n }\r\n }\r\n\r\n return Array.from(unique.values());\r\n}\r\n\r\nfunction isInstructionPath(filePath: string): boolean {\r\n const normalized = filePath.split(path.sep).join(\"/\");\r\n return (\r\n normalized.endsWith(\".instructions.md\") ||\r\n normalized.includes(\"/instructions/\") ||\r\n normalized.endsWith(\".prompt.md\") ||\r\n normalized.includes(\"/prompts/\")\r\n );\r\n}\r\n\r\nfunction pathToFileUri(filePath: string): string {\r\n // Convert to absolute path if relative\r\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\r\n\r\n // On Windows, convert backslashes to forward slashes\r\n const normalizedPath = absolutePath.replace(/\\\\/g, \"/\");\r\n\r\n // Handle Windows drive letters (e.g., C:/ becomes file:///C:/)\r\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\r\n return `file:///${normalizedPath}`;\r\n }\r\n\r\n // Unix-like paths\r\n return `file://${normalizedPath}`;\r\n}\r\n\r\nfunction composeUserQuery(request: ProviderRequest): string {\r\n const segments: string[] = [];\r\n segments.push(request.prompt.trim());\r\n if (request.guidelines && request.guidelines.trim().length > 0) {\r\n segments.push(\"\\nGuidelines:\\n\", request.guidelines.trim());\r\n }\r\n return segments.join(\"\\n\").trim();\r\n}\r\n\r\nfunction normalizeAttachments(attachments: readonly string[] | undefined): string[] | undefined {\r\n if (!attachments || attachments.length === 0) {\r\n return undefined;\r\n }\r\n const deduped = new Set<string>();\r\n for (const attachment of attachments) {\r\n deduped.add(path.resolve(attachment));\r\n }\r\n return Array.from(deduped);\r\n}\r\n\r\nexport interface EnsureSubagentsOptions {\r\n readonly kind: \"vscode\" | \"vscode-insiders\";\r\n readonly count: number;\r\n readonly verbose?: boolean;\r\n}\r\n\r\nexport interface EnsureSubagentsResult {\r\n readonly provisioned: boolean;\r\n readonly message?: string;\r\n}\r\n\r\n/**\r\n * Ensures the required number of VSCode subagents are provisioned using the subagent package.\r\n * This guarantees version compatibility by using the same subagent package version.\r\n * \r\n * @param options - Configuration for subagent provisioning\r\n * @returns Information about the provisioning result\r\n */\r\nexport async function ensureVSCodeSubagents(\r\n options: EnsureSubagentsOptions,\r\n): Promise<EnsureSubagentsResult> {\r\n const { kind, count, verbose = false } = options;\r\n const vscodeCmd = kind === \"vscode-insiders\" ? \"code-insiders\" : \"code\";\r\n const subagentRoot = getSubagentRoot(vscodeCmd);\r\n \r\n try {\r\n if (verbose) {\r\n console.log(`Provisioning ${count} subagent(s) via: subagent ${vscodeCmd} provision`);\r\n }\r\n \r\n const result = await provisionSubagents({\r\n targetRoot: subagentRoot,\r\n subagents: count,\r\n dryRun: false,\r\n });\r\n \r\n if (verbose) {\r\n if (result.created.length > 0) {\r\n console.log(`Created ${result.created.length} new subagent(s)`);\r\n }\r\n if (result.skippedExisting.length > 0) {\r\n console.log(`Reusing ${result.skippedExisting.length} existing unlocked subagent(s)`);\r\n }\r\n console.log(`\\ntotal unlocked subagents available: ${result.created.length + result.skippedExisting.length}`);\r\n }\r\n \r\n return {\r\n provisioned: true,\r\n message: `Provisioned ${count} subagent(s): ${result.created.length} created, ${result.skippedExisting.length} reused`,\r\n };\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n \r\n // Don't fail if provisioning fails - agents might already exist\r\n if (verbose) {\r\n console.warn(`Provisioning failed (continuing anyway): ${errorMessage}`);\r\n }\r\n \r\n return {\r\n provisioned: false,\r\n message: `Provisioning failed: ${errorMessage}`,\r\n };\r\n }\r\n}\r\n","import { constants } from \"node:fs\";\r\nimport { access, readFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { parse } from \"yaml\";\r\n\r\nimport { TARGETS_SCHEMA_V2 } from \"./types.js\";\r\nimport type { TargetDefinition } from \"./types.js\";\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction checkSchema(parsed: Record<string, unknown>, absolutePath: string): void {\r\n const schema = parsed.$schema;\r\n\r\n if (schema === undefined) {\r\n throw new Error(\r\n `Missing $schema field in targets.yaml at ${absolutePath}.\\n` +\r\n `Please add '$schema: ${TARGETS_SCHEMA_V2}' at the top of the file.`\r\n );\r\n }\r\n\r\n if (typeof schema !== 'string') {\r\n throw new Error(\r\n `Invalid $schema field in targets.yaml at ${absolutePath}.\\n` +\r\n `Expected a string value '${TARGETS_SCHEMA_V2}'.`\r\n );\r\n }\r\n\r\n if (schema !== TARGETS_SCHEMA_V2) {\r\n throw new Error(\r\n `Invalid $schema '${schema}' in targets.yaml at ${absolutePath}.\\n` +\r\n `Expected '${TARGETS_SCHEMA_V2}'.`\r\n );\r\n }\r\n}\r\n\r\nfunction extractTargetsArray(parsed: Record<string, unknown>, absolutePath: string): unknown[] {\r\n const targets = parsed.targets;\r\n if (!Array.isArray(targets)) {\r\n throw new Error(`targets.yaml at ${absolutePath} must have a 'targets' array`);\r\n }\r\n return targets;\r\n}\r\n\r\nfunction assertTargetDefinition(value: unknown, index: number, filePath: string): TargetDefinition {\r\n if (!isRecord(value)) {\r\n throw new Error(`targets.yaml entry at index ${index} in ${filePath} must be an object`);\r\n }\r\n\r\n const name = value.name;\r\n const provider = value.provider;\r\n const settings = value.settings;\r\n const judgeTarget = value.judge_target;\r\n\r\n if (typeof name !== \"string\" || name.trim().length === 0) {\r\n throw new Error(`targets.yaml entry at index ${index} in ${filePath} is missing a valid 'name'`);\r\n }\r\n\r\n if (typeof provider !== \"string\" || provider.trim().length === 0) {\r\n throw new Error(`targets.yaml entry '${name}' in ${filePath} is missing a valid 'provider'`);\r\n }\r\n\r\n return {\r\n name,\r\n provider,\r\n settings: isRecord(settings) ? settings : undefined,\r\n judge_target: typeof judgeTarget === \"string\" ? judgeTarget : undefined,\r\n } satisfies TargetDefinition;\r\n}\r\n\r\nasync function fileExists(filePath: string): Promise<boolean> {\r\n try {\r\n await access(filePath, constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport async function readTargetDefinitions(filePath: string): Promise<readonly TargetDefinition[]> {\r\n const absolutePath = path.resolve(filePath);\r\n if (!(await fileExists(absolutePath))) {\r\n throw new Error(`targets.yaml not found at ${absolutePath}`);\r\n }\r\n\r\n const raw = await readFile(absolutePath, \"utf8\");\r\n const parsed = parse(raw) as unknown;\r\n\r\n if (!isRecord(parsed)) {\r\n throw new Error(`targets.yaml at ${absolutePath} must be a YAML object with '$schema' and 'targets' fields`);\r\n }\r\n\r\n checkSchema(parsed, absolutePath);\r\n\r\n const targets = extractTargetsArray(parsed, absolutePath);\r\n const definitions = targets.map((entry, index) => assertTargetDefinition(entry, index, absolutePath));\r\n return definitions;\r\n}\r\n\r\nexport function listTargetNames(definitions: readonly TargetDefinition[]): readonly string[] {\r\n return definitions.map((definition) => definition.name);\r\n}\r\n","import { AnthropicProvider, AzureProvider, GeminiProvider } from \"./ax.js\";\r\nimport { MockProvider } from \"./mock.js\";\r\nimport type { ResolvedTarget } from \"./targets.js\";\r\nimport { resolveTargetDefinition } from \"./targets.js\";\r\nimport type { EnvLookup, Provider, TargetDefinition } from \"./types.js\";\r\nimport { VSCodeProvider } from \"./vscode.js\";\r\n\r\nexport type {\r\n EnvLookup,\r\n Provider,\r\n ProviderKind,\r\n ProviderRequest,\r\n ProviderResponse,\r\n TargetDefinition,\r\n} from \"./types.js\";\r\n\r\nexport type {\r\n AnthropicResolvedConfig,\r\n AzureResolvedConfig,\r\n GeminiResolvedConfig,\r\n MockResolvedConfig,\r\n ResolvedTarget,\r\n VSCodeResolvedConfig,\r\n} from \"./targets.js\";\r\n\r\nexport { resolveTargetDefinition };\r\nexport { readTargetDefinitions, listTargetNames } from \"./targets-file.js\";\r\nexport { ensureVSCodeSubagents, type EnsureSubagentsOptions, type EnsureSubagentsResult } from \"./vscode.js\";\r\n\r\nexport function createProvider(target: ResolvedTarget): Provider {\r\n switch (target.kind) {\r\n case \"azure\":\r\n return new AzureProvider(target.name, target.config);\r\n case \"anthropic\":\r\n return new AnthropicProvider(target.name, target.config);\r\n case \"gemini\":\r\n return new GeminiProvider(target.name, target.config);\r\n case \"mock\":\r\n return new MockProvider(target.name, target.config);\r\n case \"vscode\":\r\n case \"vscode-insiders\":\r\n return new VSCodeProvider(target.name, target.config, target.kind);\r\n default: {\r\n // Exhaustive check\r\n const neverTarget: never = target;\r\n throw new Error(`Unsupported provider kind ${(neverTarget as { kind: string }).kind}`);\r\n }\r\n }\r\n}\r\n\r\nexport function resolveAndCreateProvider(\r\n definition: TargetDefinition,\r\n env: EnvLookup = process.env,\r\n): Provider {\r\n const resolved = resolveTargetDefinition(definition, env);\r\n return createProvider(resolved);\r\n}\r\n","const KEY_TERM_MATCH_THRESHOLD = 0.5;\r\n\r\nconst ACTION_WORDS = new Set([\r\n \"use\",\r\n \"avoid\",\r\n \"prefer\",\r\n \"replace\",\r\n \"consider\",\r\n \"ensure\",\r\n \"remove\",\r\n \"add\",\r\n]);\r\n\r\nconst STOP_WORDS = new Set([\r\n \"the\",\r\n \"a\",\r\n \"an\",\r\n \"and\",\r\n \"or\",\r\n \"but\",\r\n \"in\",\r\n \"on\",\r\n \"at\",\r\n \"to\",\r\n \"for\",\r\n \"of\",\r\n \"with\",\r\n \"by\",\r\n \"is\",\r\n \"are\",\r\n \"was\",\r\n \"were\",\r\n \"be\",\r\n \"been\",\r\n \"being\",\r\n \"have\",\r\n \"has\",\r\n \"had\",\r\n \"do\",\r\n \"does\",\r\n \"did\",\r\n \"will\",\r\n \"would\",\r\n \"could\",\r\n \"should\",\r\n]);\r\n\r\nconst ERROR_PREFIXES = [\r\n \"error:\",\r\n \"err:\",\r\n \"vs code command failed\",\r\n \"exception\",\r\n \"traceback\",\r\n \"no response file was generated\",\r\n \"timed out\",\r\n \"cli not found\",\r\n];\r\n\r\nexport interface HeuristicScore {\r\n readonly score: number;\r\n readonly hits: readonly string[];\r\n readonly misses: readonly string[];\r\n readonly hitCount: number;\r\n readonly totalAspects: number;\r\n readonly rawAspects: readonly string[];\r\n}\r\n\r\n/**\r\n * Extract individual evaluation aspects from the expected assistant response.\r\n */\r\nexport function extractAspects(expectedResponse: string): readonly string[] {\r\n const lines = expectedResponse.split(/\\r?\\n/).map((line) => line.trim());\r\n const aspects: string[] = [];\r\n\r\n for (const line of lines) {\r\n if (line.length === 0) {\r\n continue;\r\n }\r\n\r\n const bulletMatch = /^([-*•]|[0-9]+\\.)\\s*(.+)$/.exec(line);\r\n if (bulletMatch) {\r\n const normalized = normalizeAspect(bulletMatch[2]);\r\n if (normalized.length > 0) {\r\n aspects.push(normalized);\r\n }\r\n continue;\r\n }\r\n\r\n const lowered = line.toLowerCase();\r\n if (Array.from(ACTION_WORDS).some((word) => lowered.startsWith(word))) {\r\n const normalized = normalizeAspect(line);\r\n if (normalized.length > 0) {\r\n aspects.push(normalized);\r\n }\r\n }\r\n }\r\n\r\n return aspects;\r\n}\r\n\r\n/**\r\n * Determine which aspects were covered by the candidate response.\r\n */\r\nexport function calculateHits(\r\n candidateResponse: string,\r\n expectedAspects: readonly string[],\r\n): readonly string[] {\r\n const { normalizedText, words } = normalizeCandidate(candidateResponse);\r\n const hits: string[] = [];\r\n\r\n for (const aspect of expectedAspects) {\r\n if (matchesAspect(aspect, normalizedText, words)) {\r\n hits.push(aspect);\r\n }\r\n }\r\n\r\n return hits;\r\n}\r\n\r\n/**\r\n * Determine which aspects were not satisfied by the candidate response.\r\n */\r\nexport function calculateMisses(\r\n candidateResponse: string,\r\n expectedAspects: readonly string[],\r\n resolvedHits?: readonly string[],\r\n): readonly string[] {\r\n const hits = new Set(resolvedHits ?? calculateHits(candidateResponse, expectedAspects));\r\n return expectedAspects.filter((aspect) => !hits.has(aspect));\r\n}\r\n\r\n/**\r\n * Evaluate the candidate response against the expected aspects.\r\n */\r\nexport function scoreCandidateResponse(\r\n candidateResponse: string,\r\n expectedAspects: readonly string[],\r\n): HeuristicScore {\r\n if (expectedAspects.length === 0) {\r\n if (isErrorLike(candidateResponse)) {\r\n return {\r\n score: 0,\r\n hits: [],\r\n misses: [\"Model produced an error instead of an answer.\"],\r\n hitCount: 0,\r\n totalAspects: 0,\r\n rawAspects: [],\r\n };\r\n }\r\n\r\n return {\r\n score: 1,\r\n hits: [],\r\n misses: [],\r\n hitCount: 0,\r\n totalAspects: 0,\r\n rawAspects: [],\r\n };\r\n }\r\n\r\n const hits = calculateHits(candidateResponse, expectedAspects);\r\n const misses = expectedAspects.filter((aspect) => !hits.includes(aspect));\r\n const score = expectedAspects.length > 0 ? hits.length / expectedAspects.length : 0;\r\n\r\n return {\r\n score,\r\n hits,\r\n misses,\r\n hitCount: hits.length,\r\n totalAspects: expectedAspects.length,\r\n rawAspects: expectedAspects,\r\n };\r\n}\r\n\r\n/**\r\n * Detect common error-prefixed outputs from providers.\r\n */\r\nexport function isErrorLike(text: string | undefined | null): boolean {\r\n if (!text) {\r\n return false;\r\n }\r\n const lowered = text.trim().toLowerCase();\r\n return ERROR_PREFIXES.some((prefix) => lowered.startsWith(prefix));\r\n}\r\n\r\nfunction normalizeAspect(aspect: string): string {\r\n const sanitized = aspect\r\n .toLowerCase()\r\n .replace(/[^\\w\\s]/g, \" \")\r\n .replace(/\\s+/g, \" \")\r\n .trim();\r\n return sanitized;\r\n}\r\n\r\nfunction normalizeCandidate(candidate: string): {\r\n readonly normalizedText: string;\r\n readonly words: ReadonlySet<string>;\r\n} {\r\n const lowered = candidate.toLowerCase();\r\n const normalizedText = lowered.replace(/[^\\w\\s]/g, \" \");\r\n const words = new Set(normalizedText.split(/\\s+/).filter((word) => word.length > 0));\r\n return { normalizedText, words };\r\n}\r\n\r\nfunction matchesAspect(\r\n aspect: string,\r\n candidateNormalized: string,\r\n candidateWords: ReadonlySet<string>,\r\n): boolean {\r\n const keyTerms = extractKeyTerms(aspect);\r\n if (keyTerms.length === 0) {\r\n return false;\r\n }\r\n\r\n const matches = keyTerms.filter((term) => candidateWords.has(term)).length;\r\n const ratio = matches / keyTerms.length;\r\n if (ratio >= KEY_TERM_MATCH_THRESHOLD) {\r\n return true;\r\n }\r\n\r\n const aspectWords = aspect.split(\" \");\r\n if (aspectWords.length >= 2) {\r\n for (let index = 0; index < aspectWords.length - 1; index += 1) {\r\n const phrase = `${aspectWords[index]} ${aspectWords[index + 1]}`;\r\n if (candidateNormalized.includes(phrase)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction extractKeyTerms(aspect: string, maxTerms = 5): string[] {\r\n const terms: string[] = [];\r\n const words = aspect.split(\" \");\r\n\r\n for (const word of words) {\r\n if (word.length <= 2) {\r\n continue;\r\n }\r\n if (STOP_WORDS.has(word)) {\r\n continue;\r\n }\r\n terms.push(word);\r\n if (terms.length >= maxTerms) {\r\n break;\r\n }\r\n }\r\n\r\n return terms;\r\n}\r\n","import { randomUUID } from \"node:crypto\";\r\n\r\nimport type { ResolvedTarget } from \"./providers/targets.js\";\r\nimport type { Provider, ProviderResponse } from \"./providers/types.js\";\r\nimport { extractAspects, isErrorLike, scoreCandidateResponse } from \"./scoring.js\";\r\nimport type { JsonObject, TestCase } from \"./types.js\";\r\n\r\nexport interface GradeContext {\r\n readonly testCase: TestCase;\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly attempt: number;\r\n readonly promptInputs: {\r\n readonly request: string;\r\n readonly guidelines: string;\r\n };\r\n readonly now: Date;\r\n readonly judgeProvider?: Provider;\r\n}\r\n\r\nexport interface GradeResult {\r\n readonly score: number;\r\n readonly hits: readonly string[];\r\n readonly misses: readonly string[];\r\n readonly expectedAspectCount: number;\r\n readonly reasoning?: string;\r\n readonly rawAspects?: readonly string[];\r\n readonly graderRawRequest?: JsonObject;\r\n}\r\n\r\nexport interface Grader {\r\n readonly kind: string;\r\n grade(context: GradeContext): Promise<GradeResult> | GradeResult;\r\n}\r\n\r\nexport class HeuristicGrader implements Grader {\r\n readonly kind = \"heuristic\";\r\n\r\n grade(context: GradeContext): GradeResult {\r\n const expectedAspects = extractAspects(context.testCase.expected_assistant_raw);\r\n const result = scoreCandidateResponse(context.candidate, expectedAspects);\r\n\r\n const misses = [...result.misses];\r\n if (expectedAspects.length === 0 && isErrorLike(context.candidate)) {\r\n const firstLine = context.candidate.split(/\\r?\\n/)[0]?.trim();\r\n if (firstLine && !misses.includes(firstLine)) {\r\n misses.unshift(firstLine);\r\n }\r\n }\r\n\r\n return {\r\n score: result.score,\r\n hits: result.hits,\r\n misses,\r\n expectedAspectCount: result.totalAspects,\r\n rawAspects: result.rawAspects,\r\n };\r\n }\r\n}\r\n\r\ntype JudgeProviderResolver = (context: GradeContext) => Promise<Provider | undefined>;\r\n\r\nexport interface QualityGraderOptions {\r\n readonly resolveJudgeProvider: JudgeProviderResolver;\r\n readonly maxOutputTokens?: number;\r\n readonly temperature?: number;\r\n}\r\n\r\nexport class QualityGrader implements Grader {\r\n readonly kind = \"llm_judge\";\r\n\r\n private readonly resolveJudgeProvider: JudgeProviderResolver;\r\n private readonly maxOutputTokens?: number;\r\n private readonly temperature?: number;\r\n\r\n constructor(options: QualityGraderOptions) {\r\n this.resolveJudgeProvider = options.resolveJudgeProvider;\r\n this.maxOutputTokens = options.maxOutputTokens;\r\n this.temperature = options.temperature;\r\n }\r\n\r\n async grade(context: GradeContext): Promise<GradeResult> {\r\n const judgeProvider = await this.resolveJudgeProvider(context);\r\n if (!judgeProvider) {\r\n throw new Error(\"No judge provider available for LLM grading\");\r\n }\r\n\r\n const prompt = buildQualityPrompt(context.testCase, context.candidate);\r\n const metadata: JsonObject = {\r\n systemPrompt: QUALITY_SYSTEM_PROMPT,\r\n };\r\n\r\n const response = await judgeProvider.invoke({\r\n prompt,\r\n metadata,\r\n testCaseId: context.testCase.id,\r\n attempt: context.attempt,\r\n maxOutputTokens: this.maxOutputTokens,\r\n temperature: this.temperature,\r\n });\r\n\r\n const parsed = parseQualityResponse(response);\r\n const score = clampScore(parsed.score ?? 0);\r\n const hits = Array.isArray(parsed.hits)\r\n ? parsed.hits.filter(isNonEmptyString).slice(0, 4)\r\n : [];\r\n const misses = Array.isArray(parsed.misses)\r\n ? parsed.misses.filter(isNonEmptyString).slice(0, 4)\r\n : [];\r\n\r\n const reasoning = parsed.reasoning ?? response.reasoning;\r\n\r\n const graderRawRequest: JsonObject = {\r\n id: randomUUID(),\r\n provider: judgeProvider.id,\r\n prompt,\r\n systemPrompt: QUALITY_SYSTEM_PROMPT,\r\n target: context.target.name,\r\n };\r\n\r\n return {\r\n score,\r\n hits,\r\n misses,\r\n expectedAspectCount: hits.length + misses.length || 1,\r\n reasoning,\r\n graderRawRequest,\r\n };\r\n }\r\n}\r\n\r\nconst QUALITY_SYSTEM_PROMPT = [\r\n \"You are an expert evaluator. Your goal is to grade the generated_answer based on how well it achieves the expected_outcome for the original task.\",\r\n \"\",\r\n \"Use the reference_answer as a gold standard for a high-quality response. The generated_answer does not need to match it verbatim, but it should capture the key points and follow the same spirit.\",\r\n \"\",\r\n \"Be concise and focused in your evaluation. Provide succinct, specific feedback rather than verbose explanations.\",\r\n \"\",\r\n \"You must respond with a single JSON object matching this schema:\",\r\n \"\",\r\n \"{\",\r\n ' \"score\": <number between 0.0 and 1.0>,',\r\n ' \"hits\": [<array of strings, max 4 items, brief specific achievements>],',\r\n ' \"misses\": [<array of strings, max 4 items, brief specific failures or omissions, empty if none>],',\r\n ' \"reasoning\": \"<string, concise explanation for the score, 1-2 sentences max>\"',\r\n \"}\",\r\n].join(\"\\n\");\r\n\r\nfunction buildQualityPrompt(testCase: TestCase, candidate: string): string {\r\n const parts = [\r\n \"[[ ## expected_outcome ## ]]\",\r\n testCase.outcome,\r\n \"\",\r\n \"[[ ## request ## ]]\",\r\n testCase.task,\r\n \"\",\r\n \"[[ ## reference_answer ## ]]\",\r\n testCase.expected_assistant_raw,\r\n \"\",\r\n \"[[ ## generated_answer ## ]]\",\r\n candidate,\r\n \"\",\r\n \"Respond with a single JSON object matching the schema described in the system prompt.\",\r\n ];\r\n return parts.join(\"\\n\");\r\n}\r\n\r\nfunction clampScore(value: number): number {\r\n if (Number.isNaN(value) || !Number.isFinite(value)) {\r\n return 0;\r\n }\r\n if (value < 0) {\r\n return 0;\r\n }\r\n if (value > 1) {\r\n return 1;\r\n }\r\n return value;\r\n}\r\n\r\nfunction parseQualityResponse(response: ProviderResponse): {\r\n readonly score?: number;\r\n readonly hits?: unknown;\r\n readonly misses?: unknown;\r\n readonly reasoning?: string;\r\n} {\r\n const text = typeof response.text === \"string\" ? response.text.trim() : \"\";\r\n if (text.length === 0) {\r\n return {};\r\n }\r\n\r\n // Try parsing JSON directly\r\n const direct = attemptParseJson(text);\r\n if (direct && validateQualityJson(direct)) {\r\n return direct;\r\n }\r\n\r\n // Try extracting JSON from markdown code blocks or surrounding text\r\n const extracted = extractJsonBlob(text);\r\n if (extracted) {\r\n const parsed = attemptParseJson(extracted);\r\n if (parsed && validateQualityJson(parsed)) {\r\n return parsed;\r\n }\r\n }\r\n\r\n return {};\r\n}\r\n\r\nfunction attemptParseJson(text: string):\r\n | {\r\n readonly score?: number;\r\n readonly hits?: unknown;\r\n readonly misses?: unknown;\r\n readonly reasoning?: string;\r\n }\r\n | undefined {\r\n try {\r\n const parsed = JSON.parse(text) as Record<string, unknown>;\r\n const score = typeof parsed.score === \"number\" ? parsed.score : undefined;\r\n const hits = parsed.hits;\r\n const misses = parsed.misses;\r\n const reasoning = typeof parsed.reasoning === \"string\" ? parsed.reasoning : undefined;\r\n return { score, hits, misses, reasoning };\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction validateQualityJson(parsed: {\r\n readonly score?: number;\r\n readonly hits?: unknown;\r\n readonly misses?: unknown;\r\n readonly reasoning?: string;\r\n}): boolean {\r\n // Validate score is present and in valid range [0.0, 1.0]\r\n if (typeof parsed.score !== \"number\") {\r\n return false;\r\n }\r\n if (Number.isNaN(parsed.score) || !Number.isFinite(parsed.score)) {\r\n return false;\r\n }\r\n if (parsed.score < 0 || parsed.score > 1) {\r\n return false;\r\n }\r\n\r\n // Validate hits is an array of strings (max 4 will be enforced during extraction)\r\n if (parsed.hits !== undefined) {\r\n if (!Array.isArray(parsed.hits)) {\r\n return false;\r\n }\r\n if (!parsed.hits.every((item) => typeof item === \"string\")) {\r\n return false;\r\n }\r\n }\r\n\r\n // Validate misses is an array of strings (max 4 will be enforced during extraction)\r\n if (parsed.misses !== undefined) {\r\n if (!Array.isArray(parsed.misses)) {\r\n return false;\r\n }\r\n if (!parsed.misses.every((item) => typeof item === \"string\")) {\r\n return false;\r\n }\r\n }\r\n\r\n // Validate reasoning is a string if present\r\n if (parsed.reasoning !== undefined && typeof parsed.reasoning !== \"string\") {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction extractJsonBlob(text: string): string | undefined {\r\n const match = text.match(/\\{[\\s\\S]*\\}/);\r\n return match?.[0];\r\n}\r\n\r\nfunction isNonEmptyString(value: unknown): value is string {\r\n return typeof value === \"string\" && value.trim().length > 0;\r\n}\r\n","import { createHash, randomUUID } from \"node:crypto\";\r\nimport { mkdir, writeFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport pLimit from \"p-limit\";\r\n\r\nimport {\r\n HeuristicGrader,\r\n QualityGrader,\r\n type GradeResult,\r\n type Grader,\r\n} from \"./grading.js\";\r\nimport { createProvider } from \"./providers/index.js\";\r\nimport { resolveTargetDefinition, type ResolvedTarget } from \"./providers/targets.js\";\r\nimport type { EnvLookup, Provider, ProviderResponse, TargetDefinition } from \"./providers/types.js\";\r\nimport type { EvaluationResult, JsonObject, TestCase } from \"./types.js\";\r\nimport { buildPromptInputs, loadTestCases } from \"./yaml-parser.js\";\r\n\r\ntype MaybePromise<T> = T | Promise<T>;\r\n\r\nexport interface EvaluationCache {\r\n get(key: string): MaybePromise<ProviderResponse | undefined>;\r\n set(key: string, value: ProviderResponse): MaybePromise<void>;\r\n}\r\n\r\nexport interface RunTestCaseOptions {\r\n readonly testCase: TestCase;\r\n readonly provider: Provider;\r\n readonly target: ResolvedTarget;\r\n readonly graders: Partial<Record<string, Grader>>;\r\n readonly now?: () => Date;\r\n readonly maxRetries?: number;\r\n readonly agentTimeoutMs?: number;\r\n readonly promptDumpDir?: string;\r\n readonly cache?: EvaluationCache;\r\n readonly useCache?: boolean;\r\n readonly signal?: AbortSignal;\r\n readonly judgeProvider?: Provider;\r\n}\r\n\r\nexport interface ProgressEvent {\r\n readonly workerId: number;\r\n readonly evalId: string;\r\n readonly status: \"pending\" | \"running\" | \"completed\" | \"failed\";\r\n readonly startedAt?: number;\r\n readonly completedAt?: number;\r\n readonly error?: string;\r\n}\r\n\r\nexport interface RunEvaluationOptions {\r\n readonly testFilePath: string;\r\n readonly repoRoot: URL | string;\r\n readonly target: ResolvedTarget;\r\n readonly targets?: readonly TargetDefinition[];\r\n readonly env?: EnvLookup;\r\n readonly providerFactory?: (target: ResolvedTarget) => Provider;\r\n readonly graders?: Partial<Record<string, Grader>>;\r\n readonly maxRetries?: number;\r\n readonly agentTimeoutMs?: number;\r\n readonly promptDumpDir?: string;\r\n readonly cache?: EvaluationCache;\r\n readonly useCache?: boolean;\r\n readonly now?: () => Date;\r\n readonly evalId?: string;\r\n readonly verbose?: boolean;\r\n readonly maxConcurrency?: number;\r\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\r\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\r\n}\r\n\r\nexport async function runEvaluation(options: RunEvaluationOptions): Promise<readonly EvaluationResult[]> {\r\n const {\r\n testFilePath,\r\n repoRoot,\r\n target,\r\n targets,\r\n env,\r\n providerFactory,\r\n graders,\r\n maxRetries,\r\n agentTimeoutMs,\r\n promptDumpDir,\r\n cache,\r\n useCache,\r\n now,\r\n evalId,\r\n verbose,\r\n onResult,\r\n onProgress,\r\n } = options;\r\n\r\n const load = loadTestCases;\r\n const testCases = await load(testFilePath, repoRoot, { verbose });\r\n\r\n const filteredTestCases = filterTestCases(testCases, evalId);\r\n if (filteredTestCases.length === 0) {\r\n if (evalId) {\r\n throw new Error(`Test case with id '${evalId}' not found in ${testFilePath}`);\r\n }\r\n return [];\r\n }\r\n\r\n const resolvedTargetsByName = new Map<string, ResolvedTarget>();\r\n resolvedTargetsByName.set(target.name, target);\r\n\r\n const targetDefinitions = new Map<string, TargetDefinition>();\r\n for (const definition of targets ?? []) {\r\n targetDefinitions.set(definition.name, definition);\r\n }\r\n\r\n const envLookup: EnvLookup = env ?? process.env;\r\n const providerCache = new Map<string, Provider>();\r\n\r\n const getOrCreateProvider = (resolved: ResolvedTarget): Provider => {\r\n const existing = providerCache.get(resolved.name);\r\n if (existing) {\r\n return existing;\r\n }\r\n const factory = providerFactory ?? createProvider;\r\n const instance = factory(resolved);\r\n providerCache.set(resolved.name, instance);\r\n return instance;\r\n };\r\n\r\n const resolveTargetByName = (name: string): ResolvedTarget | undefined => {\r\n if (resolvedTargetsByName.has(name)) {\r\n return resolvedTargetsByName.get(name);\r\n }\r\n const definition = targetDefinitions.get(name);\r\n if (!definition) {\r\n return undefined;\r\n }\r\n const resolved = resolveTargetDefinition(definition, envLookup);\r\n resolvedTargetsByName.set(name, resolved);\r\n return resolved;\r\n };\r\n\r\n const resolveJudgeProvider = async (targetContext: ResolvedTarget): Promise<Provider | undefined> => {\r\n const judgeName = targetContext.judgeTarget ?? targetContext.name;\r\n const resolvedJudge = resolveTargetByName(judgeName);\r\n if (!resolvedJudge) {\r\n return getOrCreateProvider(targetContext);\r\n }\r\n return getOrCreateProvider(resolvedJudge);\r\n };\r\n\r\n const graderRegistry = buildGraderRegistry(graders, resolveJudgeProvider);\r\n\r\n const primaryProvider = getOrCreateProvider(target);\r\n\r\n // Notify about total test count before starting\r\n if (onProgress && filteredTestCases.length > 0) {\r\n // Emit initial pending events for all tests\r\n for (let i = 0; i < filteredTestCases.length; i++) {\r\n await onProgress({\r\n workerId: i + 1,\r\n evalId: filteredTestCases[i].id,\r\n status: \"pending\",\r\n });\r\n }\r\n }\r\n\r\n // Resolve worker count: CLI option > target setting > default (1)\r\n const workers = options.maxConcurrency ?? target.workers ?? 1;\r\n const limit = pLimit(workers);\r\n\r\n // Track worker assignments for progress reporting\r\n let nextWorkerId = 1;\r\n const workerIdByEvalId = new Map<string, number>();\r\n\r\n // Map test cases to limited promises for parallel execution\r\n const promises = filteredTestCases.map((testCase) =>\r\n limit(async () => {\r\n // Assign worker ID when test starts executing\r\n const workerId = nextWorkerId++;\r\n workerIdByEvalId.set(testCase.id, workerId);\r\n\r\n if (onProgress) {\r\n await onProgress({\r\n workerId,\r\n evalId: testCase.id,\r\n status: \"running\",\r\n startedAt: Date.now(),\r\n });\r\n }\r\n\r\n try {\r\n const judgeProvider = await resolveJudgeProvider(target);\r\n const result = await runTestCase({\r\n testCase,\r\n provider: primaryProvider,\r\n target,\r\n graders: graderRegistry,\r\n maxRetries,\r\n agentTimeoutMs,\r\n promptDumpDir,\r\n cache,\r\n useCache,\r\n now,\r\n judgeProvider,\r\n });\r\n\r\n if (onProgress) {\r\n await onProgress({\r\n workerId,\r\n evalId: testCase.id,\r\n status: \"completed\",\r\n startedAt: 0, // Not used for completed status\r\n completedAt: Date.now(),\r\n });\r\n }\r\n\r\n if (onResult) {\r\n await onResult(result);\r\n }\r\n return result;\r\n } catch (error) {\r\n if (onProgress) {\r\n await onProgress({\r\n workerId,\r\n evalId: testCase.id,\r\n status: \"failed\",\r\n completedAt: Date.now(),\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n }\r\n throw error;\r\n }\r\n }),\r\n );\r\n\r\n // Wait for all workers to complete\r\n const settled = await Promise.allSettled(promises);\r\n\r\n // Extract results, handling both fulfilled and rejected promises\r\n const results: EvaluationResult[] = [];\r\n for (let i = 0; i < settled.length; i++) {\r\n const outcome = settled[i];\r\n if (outcome.status === \"fulfilled\") {\r\n results.push(outcome.value);\r\n } else {\r\n // Build error result for rejected promise\r\n const testCase = filteredTestCases[i];\r\n const promptInputs = await buildPromptInputs(testCase);\r\n const errorResult = buildErrorResult(\r\n testCase,\r\n target.name,\r\n (now ?? (() => new Date()))(),\r\n outcome.reason,\r\n promptInputs,\r\n );\r\n results.push(errorResult);\r\n if (onResult) {\r\n await onResult(errorResult);\r\n }\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\nexport async function runTestCase(options: RunTestCaseOptions): Promise<EvaluationResult> {\r\n const {\r\n testCase,\r\n provider,\r\n target,\r\n graders,\r\n now,\r\n maxRetries,\r\n agentTimeoutMs,\r\n promptDumpDir,\r\n cache,\r\n useCache,\r\n signal,\r\n judgeProvider,\r\n } = options;\r\n\r\n const promptInputs = await buildPromptInputs(testCase);\r\n if (promptDumpDir) {\r\n await dumpPrompt(promptDumpDir, testCase, promptInputs);\r\n }\r\n\r\n const cacheKey = useCache ? createCacheKey(provider, target, testCase, promptInputs) : undefined;\r\n let cachedResponse: ProviderResponse | undefined;\r\n if (cacheKey && cache) {\r\n cachedResponse = await cache.get(cacheKey);\r\n }\r\n\r\n const nowFn = now ?? (() => new Date());\r\n\r\n const attemptBudget = (maxRetries ?? 0) + 1;\r\n let attempt = 0;\r\n let providerResponse: ProviderResponse | undefined = cachedResponse;\r\n let lastError: unknown;\r\n\r\n while (!providerResponse && attempt < attemptBudget) {\r\n try {\r\n providerResponse = await invokeProvider(provider, {\r\n testCase,\r\n target,\r\n promptInputs,\r\n attempt,\r\n agentTimeoutMs,\r\n signal,\r\n });\r\n } catch (error) {\r\n lastError = error;\r\n if (isTimeoutLike(error) && attempt + 1 < attemptBudget) {\r\n attempt += 1;\r\n continue;\r\n }\r\n return buildErrorResult(testCase, target.name, nowFn(), error, promptInputs);\r\n }\r\n }\r\n\r\n if (!providerResponse) {\r\n return buildErrorResult(\r\n testCase,\r\n target.name,\r\n nowFn(),\r\n lastError ?? new Error(\"Provider did not return a response\"),\r\n promptInputs,\r\n );\r\n }\r\n\r\n if (cacheKey && cache && !cachedResponse) {\r\n await cache.set(cacheKey, providerResponse);\r\n }\r\n\r\n const graderKind = testCase.grader ?? \"heuristic\";\r\n const activeGrader = graders[graderKind] ?? graders.heuristic;\r\n if (!activeGrader) {\r\n throw new Error(`No grader registered for kind '${graderKind}'`);\r\n }\r\n\r\n let grade: GradeResult;\r\n try {\r\n const gradeTimestamp = nowFn();\r\n grade = await activeGrader.grade({\r\n testCase,\r\n candidate: providerResponse.text ?? \"\",\r\n target,\r\n provider,\r\n attempt,\r\n promptInputs,\r\n now: gradeTimestamp,\r\n judgeProvider,\r\n });\r\n } catch (error) {\r\n return buildErrorResult(testCase, target.name, nowFn(), error, promptInputs);\r\n }\r\n\r\n const completedAt = nowFn();\r\n const rawRequest: JsonObject = {\r\n request: promptInputs.request,\r\n guidelines: promptInputs.guidelines,\r\n guideline_paths: testCase.guideline_paths,\r\n } as JsonObject;\r\n\r\n return {\r\n eval_id: testCase.id,\r\n conversation_id: testCase.conversation_id,\r\n score: grade.score,\r\n hits: grade.hits,\r\n misses: grade.misses,\r\n model_answer: providerResponse.text ?? \"\",\r\n expected_aspect_count: grade.expectedAspectCount,\r\n target: target.name,\r\n timestamp: completedAt.toISOString(),\r\n reasoning: grade.reasoning,\r\n raw_aspects: grade.rawAspects,\r\n raw_request: rawRequest,\r\n grader_raw_request: grade.graderRawRequest,\r\n } satisfies EvaluationResult;\r\n}\r\n\r\nfunction filterTestCases(testCases: readonly TestCase[], evalId?: string): readonly TestCase[] {\r\n if (!evalId) {\r\n return testCases;\r\n }\r\n return testCases.filter((testCase) => testCase.id === evalId);\r\n}\r\n\r\nfunction buildGraderRegistry(\r\n overrides: Partial<Record<string, Grader>> | undefined,\r\n resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>,\r\n): Partial<Record<string, Grader>> & { readonly heuristic: Grader } {\r\n const heuristic = overrides?.heuristic ?? new HeuristicGrader();\r\n const llmJudge =\r\n overrides?.llm_judge ??\r\n new QualityGrader({\r\n resolveJudgeProvider: async (context) => {\r\n if (context.judgeProvider) {\r\n return context.judgeProvider;\r\n }\r\n return resolveJudgeProvider(context.target);\r\n },\r\n });\r\n\r\n return {\r\n ...overrides,\r\n heuristic,\r\n llm_judge: llmJudge,\r\n };\r\n}\r\n\r\nasync function dumpPrompt(\r\n directory: string,\r\n testCase: TestCase,\r\n promptInputs: { readonly request: string; readonly guidelines: string },\r\n): Promise<void> {\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\r\n const filename = `${timestamp}_${sanitizeFilename(testCase.id)}.json`;\r\n const filePath = path.resolve(directory, filename);\r\n\r\n await mkdir(path.dirname(filePath), { recursive: true });\r\n const payload = {\r\n eval_id: testCase.id,\r\n request: promptInputs.request,\r\n guidelines: promptInputs.guidelines,\r\n guideline_paths: testCase.guideline_paths,\r\n } satisfies Record<string, unknown>;\r\n\r\n await writeFile(filePath, JSON.stringify(payload, null, 2), \"utf8\");\r\n}\r\n\r\nfunction sanitizeFilename(value: string): string {\r\n if (!value) {\r\n return \"prompt\";\r\n }\r\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, \"_\");\r\n return sanitized.length > 0 ? sanitized : randomUUID();\r\n}\r\n\r\nasync function invokeProvider(\r\n provider: Provider,\r\n options: {\r\n readonly testCase: TestCase;\r\n readonly target: ResolvedTarget;\r\n readonly promptInputs: { readonly request: string; readonly guidelines: string };\r\n readonly attempt: number;\r\n readonly agentTimeoutMs?: number;\r\n readonly signal?: AbortSignal;\r\n },\r\n): Promise<ProviderResponse> {\r\n const { testCase, target, promptInputs, attempt, agentTimeoutMs, signal } = options;\r\n\r\n const controller = new AbortController();\r\n const timeout = agentTimeoutMs\r\n ? setTimeout(() => controller.abort(), agentTimeoutMs)\r\n : undefined;\r\n\r\n if (signal) {\r\n signal.addEventListener(\"abort\", () => controller.abort(), { once: true });\r\n }\r\n\r\n try {\r\n return await provider.invoke({\r\n prompt: promptInputs.request,\r\n guidelines: promptInputs.guidelines,\r\n attachments: testCase.guideline_paths,\r\n testCaseId: testCase.id,\r\n attempt,\r\n metadata: {\r\n target: target.name,\r\n grader: testCase.grader,\r\n },\r\n signal: controller.signal,\r\n });\r\n } finally {\r\n if (timeout !== undefined) {\r\n clearTimeout(timeout);\r\n }\r\n }\r\n}\r\n\r\nfunction buildErrorResult(\r\n testCase: TestCase,\r\n targetName: string,\r\n timestamp: Date,\r\n error: unknown,\r\n promptInputs: { readonly request: string; readonly guidelines: string },\r\n): EvaluationResult {\r\n const message = error instanceof Error ? error.message : String(error);\r\n\r\n const rawRequest: JsonObject = {\r\n request: promptInputs.request,\r\n guidelines: promptInputs.guidelines,\r\n guideline_paths: testCase.guideline_paths,\r\n error: message,\r\n } as JsonObject;\r\n\r\n return {\r\n eval_id: testCase.id,\r\n conversation_id: testCase.conversation_id,\r\n score: 0,\r\n hits: [],\r\n misses: [`Error: ${message}`],\r\n model_answer: `Error occurred: ${message}`,\r\n expected_aspect_count: 0,\r\n target: targetName,\r\n timestamp: timestamp.toISOString(),\r\n raw_aspects: [],\r\n raw_request: rawRequest,\r\n } satisfies EvaluationResult;\r\n}\r\n\r\nfunction createCacheKey(\r\n provider: Provider,\r\n target: ResolvedTarget,\r\n testCase: TestCase,\r\n promptInputs: { readonly request: string; readonly guidelines: string },\r\n): string {\r\n const hash = createHash(\"sha256\");\r\n hash.update(provider.id);\r\n hash.update(target.name);\r\n hash.update(testCase.id);\r\n hash.update(promptInputs.request);\r\n hash.update(promptInputs.guidelines);\r\n return hash.digest(\"hex\");\r\n}\r\n\r\nfunction isTimeoutLike(error: unknown): boolean {\r\n if (!error) {\r\n return false;\r\n }\r\n if (typeof DOMException !== \"undefined\" && error instanceof DOMException && error.name === \"AbortError\") {\r\n return true;\r\n }\r\n if (error instanceof Error) {\r\n const name = error.name?.toLowerCase();\r\n const message = error.message?.toLowerCase();\r\n return name.includes(\"timeout\") || message.includes(\"timeout\");\r\n }\r\n const value = String(error).toLowerCase();\r\n return value.includes(\"timeout\");\r\n}\r\n","/*\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\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","export * from \"./evaluation/types.js\";\r\nexport * from \"./evaluation/yaml-parser.js\";\r\nexport * from \"./evaluation/providers/index.js\";\r\nexport * from \"./evaluation/scoring.js\";\r\nexport * from \"./evaluation/grading.js\";\r\nexport * from \"./evaluation/orchestrator.js\";\r\n\r\nexport type AgentKernel = {\r\n status: string;\r\n};\r\n\r\nexport function createAgentKernel(): AgentKernel {\r\n return { status: \"stub\" };\r\n}\r\n"],"mappings":"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","names":["readFile","path","constants","access","readFile","path","parse","fileExists","access","constants","path","readFile","parse","randomUUID","writeFile","path","path","writeFile","randomUUID"]}
1
+ {"version":3,"sources":["../src/evaluation/types.ts","../src/evaluation/yaml-parser.ts","../src/evaluation/providers/ax.ts","../src/evaluation/providers/mock.ts","../src/evaluation/providers/targets.ts","../src/evaluation/providers/vscode.ts","../src/evaluation/providers/targets-file.ts","../src/evaluation/providers/index.ts","../src/evaluation/scoring.ts","../src/evaluation/grading.ts","../src/evaluation/orchestrator.ts","../../../node_modules/.pnpm/yocto-queue@1.2.1/node_modules/yocto-queue/index.js","../../../node_modules/.pnpm/p-limit@6.2.0/node_modules/p-limit/index.js","../src/index.ts"],"sourcesContent":["/**\r\n * JSON primitive values appearing in AgentV payloads.\r\n */\r\nexport type JsonPrimitive = string | number | boolean | null;\r\n\r\n/**\r\n * Immutable JSON object representation for test fixtures.\r\n */\r\nexport interface JsonObject {\r\n readonly [key: string]: JsonValue;\r\n}\r\n\r\n/**\r\n * Recursive JSON value supporting nested structures.\r\n */\r\nexport type JsonValue = JsonPrimitive | JsonObject | readonly JsonValue[];\r\n\r\nconst TEST_MESSAGE_ROLE_VALUES = [\"system\", \"user\", \"assistant\", \"tool\"] as const;\r\n\r\n/**\r\n * Immutable list of supported message roles.\r\n */\r\nexport const TEST_MESSAGE_ROLES = TEST_MESSAGE_ROLE_VALUES;\r\n\r\n/**\r\n * Role literals used by test messages.\r\n */\r\nexport type TestMessageRole = (typeof TEST_MESSAGE_ROLE_VALUES)[number];\r\n\r\nconst TEST_MESSAGE_ROLE_SET: ReadonlySet<string> = new Set(TEST_MESSAGE_ROLE_VALUES);\r\n\r\n/**\r\n * Text or structured payload attached to a message.\r\n */\r\nexport type TestMessageContent = string | readonly JsonObject[];\r\n\r\n/**\r\n * System-authored instruction message.\r\n */\r\nexport type SystemTestMessage = {\r\n readonly role: \"system\";\r\n readonly content: TestMessageContent;\r\n};\r\n\r\n/**\r\n * User-authored prompt message.\r\n */\r\nexport type UserTestMessage = {\r\n readonly role: \"user\";\r\n readonly content: TestMessageContent;\r\n};\r\n\r\n/**\r\n * Assistant response message.\r\n */\r\nexport type AssistantTestMessage = {\r\n readonly role: \"assistant\";\r\n readonly content: TestMessageContent;\r\n};\r\n\r\n/**\r\n * Tool invocation message.\r\n */\r\nexport type ToolTestMessage = {\r\n readonly role: \"tool\";\r\n readonly content: TestMessageContent;\r\n};\r\n\r\n/**\r\n * Conversation message union with role discrimination.\r\n */\r\nexport type TestMessage =\r\n | SystemTestMessage\r\n | UserTestMessage\r\n | AssistantTestMessage\r\n | ToolTestMessage;\r\n\r\n/**\r\n * Guard validating supported message roles.\r\n */\r\nexport function isTestMessageRole(value: unknown): value is TestMessageRole {\r\n return typeof value === \"string\" && TEST_MESSAGE_ROLE_SET.has(value);\r\n}\r\n\r\n/**\r\n * Guard matching AgentV JSON objects.\r\n */\r\nexport function isJsonObject(value: unknown): value is JsonObject {\r\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\r\n return false;\r\n }\r\n return Object.values(value as Record<string, unknown>).every(isJsonValue);\r\n}\r\n\r\n/**\r\n * Guard matching AgentV JSON values.\r\n */\r\nexport function isJsonValue(value: unknown): value is JsonValue {\r\n if (\r\n value === null ||\r\n typeof value === \"string\" ||\r\n typeof value === \"number\" ||\r\n typeof value === \"boolean\"\r\n ) {\r\n return true;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.every(isJsonValue);\r\n }\r\n if (typeof value === \"object\") {\r\n return isJsonObject(value);\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Guard validating raw test messages.\r\n */\r\nexport function isTestMessage(value: unknown): value is TestMessage {\r\n if (typeof value !== \"object\" || value === null) {\r\n return false;\r\n }\r\n const candidate = value as { role?: unknown; content?: unknown };\r\n if (!isTestMessageRole(candidate.role)) {\r\n return false;\r\n }\r\n if (typeof candidate.content === \"string\") {\r\n return true;\r\n }\r\n if (!Array.isArray(candidate.content)) {\r\n return false;\r\n }\r\n return candidate.content.every(isJsonObject);\r\n}\r\n\r\nconst GRADER_KIND_VALUES = [\"heuristic\", \"llm_judge\"] as const;\r\n\r\n/**\r\n * Supported grader implementations.\r\n */\r\nexport const GRADER_KINDS = GRADER_KIND_VALUES;\r\n\r\n/**\r\n * Grader identifiers available to the pipeline.\r\n */\r\nexport type GraderKind = (typeof GRADER_KIND_VALUES)[number];\r\n\r\nconst GRADER_KIND_SET: ReadonlySet<string> = new Set(GRADER_KIND_VALUES);\r\n\r\n/**\r\n * Guard validating grader identifiers.\r\n */\r\nexport function isGraderKind(value: unknown): value is GraderKind {\r\n return typeof value === \"string\" && GRADER_KIND_SET.has(value);\r\n}\r\n\r\n/**\r\n * Test case definition sourced from AgentV specs.\r\n */\r\nexport interface EvalCase {\r\n readonly id: string;\r\n readonly conversation_id?: string;\r\n readonly task: string;\r\n readonly user_segments: readonly JsonObject[];\r\n readonly system_message?: string;\r\n readonly expected_assistant_raw: string;\r\n readonly guideline_paths: readonly string[];\r\n readonly guideline_patterns?: readonly string[];\r\n readonly file_paths: readonly string[];\r\n readonly code_snippets: readonly string[];\r\n readonly outcome: string;\r\n readonly grader: GraderKind;\r\n}\r\n\r\n/**\r\n * Evaluator scorecard for a single test case run.\r\n */\r\nexport interface EvaluationResult {\r\n readonly eval_id: string;\r\n readonly conversation_id?: string;\r\n readonly score: number;\r\n readonly hits: readonly string[];\r\n readonly misses: readonly string[];\r\n readonly model_answer: string;\r\n readonly expected_aspect_count: number;\r\n readonly target: string;\r\n readonly timestamp: string;\r\n readonly reasoning?: string;\r\n readonly raw_aspects?: readonly string[];\r\n readonly raw_request?: JsonObject;\r\n readonly grader_raw_request?: JsonObject;\r\n}\r\n\r\n/**\r\n * Convenience accessor matching the Python hit_count property.\r\n */\r\nexport function getHitCount(result: Pick<EvaluationResult, \"hits\">): number {\r\n return result.hits.length;\r\n}\r\n","import micromatch from \"micromatch\";\r\nimport { constants } from \"node:fs\";\r\nimport { access, readFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { parse } from \"yaml\";\r\n\r\nimport { buildDirectoryChain, buildSearchRoots, resolveFileReference } from \"./file-utils.js\";\r\nimport type { GraderKind, JsonObject, JsonValue, EvalCase, TestMessage } from \"./types.js\";\r\nimport { isGraderKind, isJsonObject, isTestMessage } from \"./types.js\";\r\n\r\nconst CODE_BLOCK_PATTERN = /```[\\s\\S]*?```/g;\r\nconst ANSI_YELLOW = \"\\u001b[33m\";\r\nconst ANSI_RESET = \"\\u001b[0m\";\r\nconst SCHEMA_EVAL_V2 = \"agentv-eval-v2\";\r\nconst SCHEMA_CONFIG_V2 = \"agentv-config-v2\";\r\n\r\ntype AgentVConfig = {\r\n readonly $schema?: JsonValue;\r\n readonly guideline_patterns?: readonly string[];\r\n};\r\n\r\n/**\r\n * Load optional .agentv/config.yaml configuration file.\r\n * Searches from eval file directory up to repo root.\r\n */\r\nasync function loadConfig(evalFilePath: string, repoRoot: string): Promise<AgentVConfig | null> {\r\n const directories = buildDirectoryChain(evalFilePath, repoRoot);\r\n \r\n for (const directory of directories) {\r\n const configPath = path.join(directory, \".agentv\", \"config.yaml\");\r\n \r\n if (!(await fileExists(configPath))) {\r\n continue;\r\n }\r\n \r\n try {\r\n const rawConfig = await readFile(configPath, \"utf8\");\r\n const parsed = parse(rawConfig) as unknown;\r\n \r\n if (!isJsonObject(parsed)) {\r\n logWarning(`Invalid .agentv/config.yaml format at ${configPath}`);\r\n continue;\r\n }\r\n \r\n const config = parsed as AgentVConfig;\r\n \r\n // Check $schema field to ensure V2 format\r\n const schema = config.$schema;\r\n \r\n if (schema !== SCHEMA_CONFIG_V2) {\r\n const message = typeof schema === 'string' \r\n ? `Invalid $schema value '${schema}' in ${configPath}. Expected '${SCHEMA_CONFIG_V2}'`\r\n : `Missing required field '$schema' in ${configPath}.\\nPlease add '$schema: ${SCHEMA_CONFIG_V2}' at the top of the file.`;\r\n logWarning(message);\r\n continue;\r\n }\r\n \r\n const guidelinePatterns = config.guideline_patterns;\r\n if (guidelinePatterns !== undefined && !Array.isArray(guidelinePatterns)) {\r\n logWarning(`Invalid guideline_patterns in ${configPath}, expected array`);\r\n continue;\r\n }\r\n \r\n if (Array.isArray(guidelinePatterns) && !guidelinePatterns.every((p) => typeof p === \"string\")) {\r\n logWarning(`Invalid guideline_patterns in ${configPath}, all entries must be strings`);\r\n continue;\r\n }\r\n \r\n return {\r\n guideline_patterns: guidelinePatterns as readonly string[] | undefined,\r\n };\r\n } catch (error) {\r\n logWarning(`Could not read .agentv/config.yaml at ${configPath}: ${(error as Error).message}`);\r\n continue;\r\n }\r\n }\r\n \r\n return null;\r\n}\r\n\r\n/**\r\n * Determine whether a path references guideline content (instructions or prompts).\r\n */\r\nexport function isGuidelineFile(filePath: string, patterns?: readonly string[]): boolean {\r\n const normalized = filePath.split(\"\\\\\").join(\"/\");\r\n const patternsToUse = patterns ?? [];\r\n \r\n return micromatch.isMatch(normalized, patternsToUse as string[]);\r\n}\r\n\r\n/**\r\n * Extract fenced code blocks from AgentV user segments.\r\n */\r\nexport function extractCodeBlocks(segments: readonly JsonObject[]): readonly string[] {\r\n const codeBlocks: string[] = [];\r\n for (const segment of segments) {\r\n const typeValue = segment[\"type\"];\r\n if (typeof typeValue !== \"string\" || typeValue !== \"text\") {\r\n continue;\r\n }\r\n const textValue = segment[\"value\"];\r\n if (typeof textValue !== \"string\") {\r\n continue;\r\n }\r\n const matches = textValue.match(CODE_BLOCK_PATTERN);\r\n if (matches) {\r\n codeBlocks.push(...matches);\r\n }\r\n }\r\n return codeBlocks;\r\n}\r\n\r\ntype LoadOptions = {\r\n readonly verbose?: boolean;\r\n};\r\n\r\ntype RawTestSuite = JsonObject & {\r\n readonly $schema?: JsonValue;\r\n readonly grader?: JsonValue;\r\n readonly evalcases?: JsonValue;\r\n readonly target?: JsonValue;\r\n};\r\n\r\ntype RawEvalCase = JsonObject & {\r\n readonly id?: JsonValue;\r\n readonly conversation_id?: JsonValue;\r\n readonly outcome?: JsonValue;\r\n readonly input_messages?: JsonValue;\r\n readonly expected_messages?: JsonValue;\r\n readonly grader?: JsonValue;\r\n readonly execution?: JsonValue;\r\n};\r\n\r\n/**\r\n * Load eval cases from a AgentV YAML specification file.\r\n */\r\nexport async function loadEvalCases(\r\n evalFilePath: string,\r\n repoRoot: URL | string,\r\n options?: LoadOptions,\r\n): Promise<readonly EvalCase[]> {\r\n const verbose = options?.verbose ?? false;\r\n const absoluteTestPath = path.resolve(evalFilePath);\r\n if (!(await fileExists(absoluteTestPath))) {\r\n throw new Error(`Test file not found: ${evalFilePath}`);\r\n }\r\n\r\n const repoRootPath = resolveToAbsolutePath(repoRoot);\r\n const searchRoots = buildSearchRoots(absoluteTestPath, repoRootPath);\r\n\r\n // Load configuration (walks up directory tree to repo root)\r\n const config = await loadConfig(absoluteTestPath, repoRootPath);\r\n const guidelinePatterns = config?.guideline_patterns;\r\n\r\n const rawFile = await readFile(absoluteTestPath, \"utf8\");\r\n const parsed = parse(rawFile) as unknown;\r\n if (!isJsonObject(parsed)) {\r\n throw new Error(`Invalid test file format: ${evalFilePath}`);\r\n }\r\n\r\n const suite = parsed as RawTestSuite;\r\n \r\n // Check $schema field to ensure V2 format\r\n const schema = suite.$schema;\r\n \r\n if (schema !== SCHEMA_EVAL_V2) {\r\n const message = typeof schema === 'string' \r\n ? `Invalid $schema value '${schema}' in ${evalFilePath}. Expected '${SCHEMA_EVAL_V2}'`\r\n : `Missing required field '$schema' in ${evalFilePath}.\\nPlease add '$schema: ${SCHEMA_EVAL_V2}' at the top of the file.`;\r\n throw new Error(message);\r\n }\r\n \r\n // V2 format: $schema is agentv-eval-v2\r\n const rawTestcases = suite.evalcases;\r\n if (!Array.isArray(rawTestcases)) {\r\n throw new Error(`Invalid test file format: ${evalFilePath} - missing 'evalcases' field`);\r\n }\r\n\r\n const globalGrader = coerceGrader(suite.grader) ?? \"llm_judge\";\r\n const results: EvalCase[] = [];\r\n\r\n for (const rawEvalcase of rawTestcases) {\r\n if (!isJsonObject(rawEvalcase)) {\r\n logWarning(\"Skipping invalid test case entry (expected object)\");\r\n continue;\r\n }\r\n\r\n const evalcase = rawEvalcase as RawEvalCase;\r\n const id = asString(evalcase.id);\r\n const conversationId = asString(evalcase.conversation_id);\r\n const outcome = asString(evalcase.outcome);\r\n \r\n const inputMessagesValue = evalcase.input_messages;\r\n const expectedMessagesValue = evalcase.expected_messages;\r\n\r\n if (!id || !outcome || !Array.isArray(inputMessagesValue)) {\r\n logWarning(`Skipping incomplete test case: ${id ?? \"unknown\"}`);\r\n continue;\r\n }\r\n \r\n if (!Array.isArray(expectedMessagesValue)) {\r\n logWarning(`Test case '${id}' missing expected_messages array`);\r\n continue;\r\n }\r\n\r\n // V2 format: input_messages contains system/user, expected_messages contains assistant\r\n const inputMessages = inputMessagesValue.filter((msg): msg is TestMessage => isTestMessage(msg));\r\n const expectedMessages = expectedMessagesValue.filter((msg): msg is TestMessage => isTestMessage(msg));\r\n \r\n const assistantMessages = expectedMessages.filter((message) => message.role === \"assistant\");\r\n const userMessages = inputMessages.filter((message) => message.role === \"user\");\r\n const systemMessages = inputMessages.filter((message) => message.role === \"system\");\r\n\r\n if (assistantMessages.length === 0) {\r\n logWarning(`No assistant message found for test case: ${id}`);\r\n continue;\r\n }\r\n\r\n if (assistantMessages.length > 1) {\r\n logWarning(`Multiple assistant messages found for test case: ${id}, using first`);\r\n }\r\n\r\n if (systemMessages.length > 1) {\r\n logWarning(`Multiple system messages found for test case: ${id}, using first`);\r\n }\r\n\r\n // Extract system message content if present\r\n let systemMessageContent: string | undefined;\r\n if (systemMessages.length > 0) {\r\n const content = systemMessages[0]?.content;\r\n if (typeof content === \"string\") {\r\n systemMessageContent = content;\r\n } else if (Array.isArray(content)) {\r\n // For array content, extract text values\r\n const textParts: string[] = [];\r\n for (const segment of content) {\r\n if (isJsonObject(segment)) {\r\n const value = segment.value;\r\n if (typeof value === \"string\") {\r\n textParts.push(value);\r\n }\r\n }\r\n }\r\n if (textParts.length > 0) {\r\n systemMessageContent = textParts.join(\"\\n\\n\");\r\n }\r\n }\r\n }\r\n\r\n const userSegments: JsonObject[] = [];\r\n const guidelinePaths: string[] = [];\r\n const userTextParts: string[] = [];\r\n\r\n for (const userMessage of userMessages) {\r\n const content = userMessage.content;\r\n if (typeof content === \"string\") {\r\n userSegments.push({ type: \"text\", value: content });\r\n userTextParts.push(content);\r\n continue;\r\n }\r\n\r\n for (const rawSegment of content) {\r\n if (!isJsonObject(rawSegment)) {\r\n continue;\r\n }\r\n\r\n const segmentType = asString(rawSegment.type);\r\n if (segmentType === \"file\") {\r\n const rawValue = asString(rawSegment.value);\r\n if (!rawValue) {\r\n continue;\r\n }\r\n\r\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\r\n rawValue,\r\n searchRoots,\r\n );\r\n\r\n if (!resolvedPath) {\r\n const attempts = attempted.length\r\n ? [\" Tried:\", ...attempted.map((candidate) => ` ${candidate}`)]\r\n : undefined;\r\n logWarning(`File not found: ${displayPath}`, attempts);\r\n continue;\r\n }\r\n\r\n try {\r\n const fileContent = (await readFile(resolvedPath, \"utf8\")).replace(/\\r\\n/g, \"\\n\");\r\n \r\n // Calculate path relative to repo root for matching to handle \"..\" in displayPath\r\n const relativeToRepo = path.relative(repoRootPath, resolvedPath);\r\n\r\n if (isGuidelineFile(relativeToRepo, guidelinePatterns)) {\r\n guidelinePaths.push(path.resolve(resolvedPath));\r\n if (verbose) {\r\n console.log(` [Guideline] Found: ${displayPath}`);\r\n console.log(` Resolved to: ${resolvedPath}`);\r\n }\r\n } else {\r\n userSegments.push({\r\n type: \"file\",\r\n path: displayPath,\r\n text: fileContent,\r\n resolvedPath: path.resolve(resolvedPath),\r\n });\r\n if (verbose) {\r\n console.log(` [File] Found: ${displayPath}`);\r\n console.log(` Resolved to: ${resolvedPath}`);\r\n }\r\n }\r\n } catch (error) {\r\n logWarning(`Could not read file ${resolvedPath}: ${(error as Error).message}`);\r\n }\r\n continue;\r\n }\r\n\r\n const clonedSegment = cloneJsonObject(rawSegment);\r\n userSegments.push(clonedSegment);\r\n const inlineValue = clonedSegment.value;\r\n if (typeof inlineValue === \"string\") {\r\n userTextParts.push(inlineValue);\r\n }\r\n }\r\n }\r\n\r\n const codeSnippets = extractCodeBlocks(userSegments);\r\n const assistantContent = assistantMessages[0]?.content;\r\n const expectedAssistantRaw = await resolveAssistantContent(assistantContent, searchRoots, verbose);\r\n const userTextPrompt = userTextParts\r\n .map((part) => part.trim())\r\n .filter((part) => part.length > 0)\r\n .join(\" \");\r\n\r\n const testCaseGrader = coerceGrader(evalcase.grader) ?? globalGrader;\r\n\r\n // Extract file paths from user_segments (non-guideline files)\r\n const userFilePaths: string[] = [];\r\n for (const segment of userSegments) {\r\n if (segment.type === \"file\" && typeof segment.resolvedPath === \"string\") {\r\n userFilePaths.push(segment.resolvedPath);\r\n }\r\n }\r\n\r\n // Combine all file paths (guidelines + regular files)\r\n const allFilePaths = [\r\n ...guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\r\n ...userFilePaths,\r\n ];\r\n\r\n const testCase: EvalCase = {\r\n id,\r\n conversation_id: conversationId,\r\n task: userTextPrompt,\r\n user_segments: userSegments,\r\n system_message: systemMessageContent,\r\n expected_assistant_raw: expectedAssistantRaw,\r\n guideline_paths: guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\r\n guideline_patterns: guidelinePatterns,\r\n file_paths: allFilePaths,\r\n code_snippets: codeSnippets,\r\n outcome,\r\n grader: testCaseGrader,\r\n };\r\n\r\n if (verbose) {\r\n console.log(`\\n[Test Case: ${id}]`);\r\n if (testCase.guideline_paths.length > 0) {\r\n console.log(` Guidelines used: ${testCase.guideline_paths.length}`);\r\n for (const guidelinePath of testCase.guideline_paths) {\r\n console.log(` - ${guidelinePath}`);\r\n }\r\n } else {\r\n console.log(\" No guidelines found\");\r\n }\r\n }\r\n\r\n results.push(testCase);\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Build prompt inputs by consolidating user request context and guideline content.\r\n */\r\nexport async function buildPromptInputs(\r\n testCase: EvalCase,\r\n): Promise<{ request: string; guidelines: string; systemMessage?: string }> {\r\n const guidelineContents: string[] = [];\r\n for (const rawPath of testCase.guideline_paths) {\r\n const absolutePath = path.resolve(rawPath);\r\n if (!(await fileExists(absolutePath))) {\r\n logWarning(`Could not read guideline file ${absolutePath}: file does not exist`);\r\n continue;\r\n }\r\n\r\n try {\r\n const content = (await readFile(absolutePath, \"utf8\")).replace(/\\r\\n/g, \"\\n\");\r\n guidelineContents.push(`=== ${path.basename(absolutePath)} ===\\n${content}`);\r\n } catch (error) {\r\n logWarning(`Could not read guideline file ${absolutePath}: ${(error as Error).message}`);\r\n }\r\n }\r\n\r\n const requestParts: string[] = [];\r\n for (const segment of testCase.user_segments) {\r\n const typeValue = segment.type;\r\n if (typeof typeValue === \"string\" && typeValue === \"file\") {\r\n const pathValue = segment.path;\r\n const textValue = segment.text;\r\n const label = typeof pathValue === \"string\" ? pathValue : \"file\";\r\n const body = typeof textValue === \"string\" ? textValue : \"\";\r\n requestParts.push(`=== ${label} ===\\n${body}`);\r\n continue;\r\n }\r\n\r\n if (typeof typeValue === \"string\" && typeValue === \"text\") {\r\n const value = segment.value;\r\n if (typeof value === \"string\") {\r\n requestParts.push(value);\r\n }\r\n continue;\r\n }\r\n\r\n const genericValue = segment.value;\r\n if (typeof genericValue === \"string\") {\r\n requestParts.push(genericValue);\r\n }\r\n }\r\n\r\n if (testCase.code_snippets.length > 0) {\r\n requestParts.push(testCase.code_snippets.join(\"\\n\"));\r\n }\r\n\r\n const request = requestParts\r\n .map((part) => part.trim())\r\n .filter((part) => part.length > 0)\r\n .join(\"\\n\\n\");\r\n\r\n const guidelines = guidelineContents\r\n .map((part) => part.trim())\r\n .filter((part) => part.length > 0)\r\n .join(\"\\n\\n\");\r\n\r\n return { request, guidelines, systemMessage: testCase.system_message };\r\n}\r\n\r\nasync function fileExists(absolutePath: string): Promise<boolean> {\r\n try {\r\n await access(absolutePath, constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction resolveToAbsolutePath(candidate: URL | string): string {\r\n if (candidate instanceof URL) {\r\n return fileURLToPath(candidate);\r\n }\r\n if (typeof candidate === \"string\") {\r\n if (candidate.startsWith(\"file://\")) {\r\n return fileURLToPath(new URL(candidate));\r\n }\r\n return path.resolve(candidate);\r\n }\r\n throw new TypeError(\"Unsupported repoRoot value. Expected string or URL.\");\r\n}\r\n\r\nfunction asString(value: unknown): string | undefined {\r\n return typeof value === \"string\" ? value : undefined;\r\n}\r\n\r\nfunction cloneJsonObject(source: JsonObject): JsonObject {\r\n const entries = Object.entries(source).map(([key, value]) => [key, cloneJsonValue(value)]);\r\n return Object.fromEntries(entries) as JsonObject;\r\n}\r\n\r\nfunction cloneJsonValue(value: JsonValue): JsonValue {\r\n if (value === null) {\r\n return null;\r\n }\r\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\r\n return value;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.map((item) => cloneJsonValue(item)) as readonly JsonValue[];\r\n }\r\n return cloneJsonObject(value as JsonObject);\r\n}\r\n\r\n/**\r\n * Resolve assistant content including file references.\r\n * Similar to input message processing, but for expected assistant responses.\r\n */\r\nasync function resolveAssistantContent(\r\n content: TestMessage[\"content\"] | undefined,\r\n searchRoots: readonly string[],\r\n verbose: boolean,\r\n): Promise<string> {\r\n if (typeof content === \"string\") {\r\n return content;\r\n }\r\n if (!content) {\r\n return \"\";\r\n }\r\n \r\n const parts: string[] = [];\r\n for (const entry of content) {\r\n if (typeof entry === \"string\") {\r\n parts.push(entry);\r\n continue;\r\n }\r\n \r\n if (!isJsonObject(entry)) {\r\n continue;\r\n }\r\n \r\n const segmentType = asString(entry.type);\r\n \r\n // Handle file references\r\n if (segmentType === \"file\") {\r\n const rawValue = asString(entry.value);\r\n if (!rawValue) {\r\n continue;\r\n }\r\n \r\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\r\n rawValue,\r\n searchRoots,\r\n );\r\n \r\n if (!resolvedPath) {\r\n const attempts = attempted.length\r\n ? [\" Tried:\", ...attempted.map((candidate) => ` ${candidate}`)]\r\n : undefined;\r\n logWarning(`File not found in expected_messages: ${displayPath}`, attempts);\r\n continue;\r\n }\r\n \r\n try {\r\n const fileContent = (await readFile(resolvedPath, \"utf8\")).replace(/\\r\\n/g, \"\\n\");\r\n parts.push(fileContent);\r\n if (verbose) {\r\n console.log(` [Expected Assistant File] Found: ${displayPath}`);\r\n console.log(` Resolved to: ${resolvedPath}`);\r\n }\r\n } catch (error) {\r\n logWarning(`Could not read file ${resolvedPath}: ${(error as Error).message}`);\r\n }\r\n continue;\r\n }\r\n \r\n // Handle text segments\r\n const textValue = asString(entry.text);\r\n if (typeof textValue === \"string\") {\r\n parts.push(textValue);\r\n continue;\r\n }\r\n \r\n const valueValue = asString(entry.value);\r\n if (typeof valueValue === \"string\") {\r\n parts.push(valueValue);\r\n continue;\r\n }\r\n \r\n parts.push(JSON.stringify(entry));\r\n }\r\n return parts.join(\" \");\r\n}\r\n\r\nfunction coerceGrader(candidate: JsonValue | undefined): GraderKind | undefined {\r\n if (typeof candidate !== \"string\") {\r\n return undefined;\r\n }\r\n if (isGraderKind(candidate)) {\r\n return candidate;\r\n }\r\n logWarning(`Unknown grader '${candidate}', falling back to default`);\r\n return undefined;\r\n}\r\n\r\nfunction logWarning(message: string, details?: readonly string[]): void {\r\n if (details && details.length > 0) {\r\n const detailBlock = details.join(\"\\n\");\r\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\r\n } else {\r\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\r\n }\r\n}\r\n","import { AxAI } from \"@ax-llm/ax\";\r\nimport type { AxChatRequest, AxChatResponse, AxModelConfig } from \"@ax-llm/ax\";\r\n\r\nimport type {\r\n AnthropicResolvedConfig,\r\n AzureResolvedConfig,\r\n GeminiResolvedConfig,\r\n} from \"./targets.js\";\r\nimport type { Provider, ProviderRequest, ProviderResponse } from \"./types.js\";\r\nimport type { JsonObject } from \"../types.js\";\r\n\r\nconst DEFAULT_SYSTEM_PROMPT =\r\n \"You are a careful assistant. Follow all provided instructions and do not fabricate results.\";\r\n\r\ntype ChatPrompt = AxChatRequest[\"chatPrompt\"];\r\n\r\ntype AxAiInstance = ReturnType<typeof AxAI.create>;\r\n\r\nfunction buildChatPrompt(request: ProviderRequest): ChatPrompt {\r\n if (request.chatPrompt) {\r\n return request.chatPrompt;\r\n }\r\n\r\n const systemSegments: string[] = [];\r\n \r\n // Add metadata system prompt first (general instructions)\r\n const metadataSystemPrompt =\r\n typeof request.metadata?.systemPrompt === \"string\" ? request.metadata.systemPrompt : undefined;\r\n if (metadataSystemPrompt && metadataSystemPrompt.trim().length > 0) {\r\n systemSegments.push(metadataSystemPrompt.trim());\r\n } else {\r\n // Use default if no custom system prompt provided\r\n systemSegments.push(DEFAULT_SYSTEM_PROMPT);\r\n }\r\n \r\n // Add guidelines after system prompt (specific constraints for this eval)\r\n if (request.guidelines && request.guidelines.trim().length > 0) {\r\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${request.guidelines.trim()}`);\r\n }\r\n\r\n const systemContent = systemSegments.join(\"\\n\\n\");\r\n const userContent = request.prompt.trim();\r\n\r\n const prompt: ChatPrompt = [\r\n {\r\n role: \"system\",\r\n content: systemContent,\r\n },\r\n {\r\n role: \"user\",\r\n content: userContent,\r\n },\r\n ];\r\n\r\n return prompt;\r\n}\r\n\r\nfunction extractModelConfig(\r\n request: ProviderRequest,\r\n defaults: { temperature?: number; maxOutputTokens?: number },\r\n): AxModelConfig | undefined {\r\n const temperature = request.temperature ?? defaults.temperature;\r\n const maxTokens = request.maxOutputTokens ?? defaults.maxOutputTokens;\r\n const config: AxModelConfig = {};\r\n if (temperature !== undefined) {\r\n config.temperature = temperature;\r\n }\r\n if (maxTokens !== undefined) {\r\n config.maxTokens = maxTokens;\r\n }\r\n return Object.keys(config).length > 0 ? config : undefined;\r\n}\r\n\r\nfunction mapResponse(response: AxChatResponse): ProviderResponse {\r\n const primary = response.results[0];\r\n const text = typeof primary?.content === \"string\" ? primary.content : \"\";\r\n const reasoning = primary?.thought ?? primary?.thoughtBlock?.data;\r\n const usage = toJsonObject(response.modelUsage);\r\n\r\n return {\r\n text,\r\n reasoning,\r\n raw: response,\r\n usage,\r\n };\r\n}\r\n\r\nfunction toJsonObject(value: unknown): JsonObject | undefined {\r\n if (!value || typeof value !== \"object\") {\r\n return undefined;\r\n }\r\n try {\r\n return JSON.parse(JSON.stringify(value)) as JsonObject;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction ensureChatResponse(result: unknown): AxChatResponse {\r\n if (typeof ReadableStream !== \"undefined\" && result instanceof ReadableStream) {\r\n throw new Error(\"Streaming responses are not supported for this provider\");\r\n }\r\n if (!result || typeof result !== \"object\" || !(\"results\" in result)) {\r\n throw new Error(\"Unexpected response type from AxAI provider\");\r\n }\r\n return result as AxChatResponse;\r\n}\r\n\r\nexport class AzureProvider implements Provider {\r\n readonly id: string;\r\n readonly kind = \"azure\" as const;\r\n readonly targetName: string;\r\n\r\n private readonly ai: AxAiInstance;\r\n private readonly defaults: { temperature?: number; maxOutputTokens?: number };\r\n\r\n constructor(\r\n targetName: string,\r\n private readonly config: AzureResolvedConfig,\r\n ) {\r\n this.id = `azure:${targetName}`;\r\n this.targetName = targetName;\r\n this.defaults = {\r\n temperature: config.temperature,\r\n maxOutputTokens: config.maxOutputTokens,\r\n };\r\n\r\n this.ai = AxAI.create({\r\n name: \"azure-openai\",\r\n apiKey: config.apiKey,\r\n resourceName: config.resourceName,\r\n deploymentName: config.deploymentName,\r\n version: config.version,\r\n config: {\r\n stream: false,\r\n },\r\n });\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n const chatPrompt = buildChatPrompt(request);\r\n const modelConfig = extractModelConfig(request, this.defaults);\r\n\r\n const response = await this.ai.chat(\r\n {\r\n chatPrompt,\r\n model: this.config.deploymentName,\r\n ...(modelConfig ? { modelConfig } : {}),\r\n },\r\n request.signal ? { abortSignal: request.signal } : undefined,\r\n );\r\n\r\n return mapResponse(ensureChatResponse(response));\r\n }\r\n}\r\n\r\nexport class AnthropicProvider implements Provider {\r\n readonly id: string;\r\n readonly kind = \"anthropic\" as const;\r\n\r\n readonly targetName: string;\r\n private readonly ai: AxAiInstance;\r\n private readonly defaults: {\r\n temperature?: number;\r\n maxOutputTokens?: number;\r\n thinkingBudget?: number;\r\n };\r\n\r\n constructor(\r\n targetName: string,\r\n private readonly config: AnthropicResolvedConfig,\r\n ) {\r\n this.id = `anthropic:${targetName}`;\r\n this.targetName = targetName;\r\n this.defaults = {\r\n temperature: config.temperature,\r\n maxOutputTokens: config.maxOutputTokens,\r\n thinkingBudget: config.thinkingBudget,\r\n };\r\n\r\n this.ai = AxAI.create({\r\n name: \"anthropic\",\r\n apiKey: config.apiKey,\r\n });\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n const chatPrompt = buildChatPrompt(request);\r\n const modelConfig = extractModelConfig(request, this.defaults);\r\n\r\n const response = await this.ai.chat(\r\n {\r\n chatPrompt,\r\n model: this.config.model,\r\n ...(modelConfig ? { modelConfig } : {}),\r\n },\r\n request.signal ? { abortSignal: request.signal } : undefined,\r\n );\r\n\r\n return mapResponse(ensureChatResponse(response));\r\n }\r\n}\r\n\r\nexport class GeminiProvider implements Provider {\r\n readonly id: string;\r\n readonly kind = \"gemini\" as const;\r\n\r\n readonly targetName: string;\r\n private readonly ai: AxAiInstance;\r\n private readonly defaults: {\r\n temperature?: number;\r\n maxOutputTokens?: number;\r\n };\r\n\r\n constructor(\r\n targetName: string,\r\n private readonly config: GeminiResolvedConfig,\r\n ) {\r\n this.id = `gemini:${targetName}`;\r\n this.targetName = targetName;\r\n this.defaults = {\r\n temperature: config.temperature,\r\n maxOutputTokens: config.maxOutputTokens,\r\n };\r\n\r\n this.ai = AxAI.create({\r\n name: \"google-gemini\",\r\n apiKey: config.apiKey,\r\n });\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n const chatPrompt = buildChatPrompt(request);\r\n const modelConfig = extractModelConfig(request, this.defaults);\r\n\r\n const response = await this.ai.chat(\r\n {\r\n chatPrompt,\r\n model: this.config.model,\r\n ...(modelConfig ? { modelConfig } : {}),\r\n },\r\n request.signal ? { abortSignal: request.signal } : undefined,\r\n );\r\n\r\n return mapResponse(ensureChatResponse(response));\r\n }\r\n}\r\n","import type { MockResolvedConfig } from \"./targets.js\";\r\nimport type { Provider, ProviderRequest, ProviderResponse } from \"./types.js\";\r\n\r\nconst DEFAULT_MOCK_RESPONSE =\r\n '{\"answer\":\"Mock provider response. Configure targets.yaml to supply a custom value.\"}';\r\n\r\nexport class MockProvider implements Provider {\r\n readonly id: string;\r\n readonly kind = \"mock\" as const;\r\n readonly targetName: string;\r\n\r\n private readonly cannedResponse: string;\r\n private readonly delayMs: number;\r\n private readonly delayMinMs: number;\r\n private readonly delayMaxMs: number;\r\n\r\n constructor(targetName: string, config: MockResolvedConfig) {\r\n this.id = `mock:${targetName}`;\r\n this.targetName = targetName;\r\n this.cannedResponse = config.response ?? DEFAULT_MOCK_RESPONSE;\r\n this.delayMs = config.delayMs ?? 0;\r\n this.delayMinMs = config.delayMinMs ?? 0;\r\n this.delayMaxMs = config.delayMaxMs ?? 0;\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n const delay = this.calculateDelay();\r\n if (delay > 0) {\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n }\r\n\r\n return {\r\n text: this.cannedResponse,\r\n raw: {\r\n prompt: request.prompt,\r\n guidelines: request.guidelines,\r\n },\r\n };\r\n }\r\n\r\n private calculateDelay(): number {\r\n // If range is specified, use uniform random distribution\r\n if (this.delayMinMs > 0 || this.delayMaxMs > 0) {\r\n const min = Math.max(0, this.delayMinMs);\r\n const max = Math.max(min, this.delayMaxMs);\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n }\r\n // Otherwise use fixed delay\r\n return this.delayMs;\r\n }\r\n}\r\n","import { z } from \"zod\";\r\n\r\nimport type { EnvLookup, TargetDefinition } from \"./types.js\";\r\n\r\nexport interface AzureResolvedConfig {\r\n readonly resourceName: string;\r\n readonly deploymentName: string;\r\n readonly apiKey: string;\r\n readonly version?: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n}\r\n\r\nexport interface AnthropicResolvedConfig {\r\n readonly apiKey: string;\r\n readonly model: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly thinkingBudget?: number;\r\n}\r\n\r\nexport interface GeminiResolvedConfig {\r\n readonly apiKey: string;\r\n readonly model: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n}\r\n\r\nexport interface MockResolvedConfig {\r\n readonly response?: string;\r\n readonly delayMs?: number;\r\n readonly delayMinMs?: number;\r\n readonly delayMaxMs?: number;\r\n}\r\n\r\nexport interface VSCodeResolvedConfig {\r\n readonly command: string;\r\n readonly waitForResponse: boolean;\r\n readonly dryRun: boolean;\r\n readonly subagentRoot?: string;\r\n readonly workspaceTemplate?: string;\r\n}\r\n\r\nexport type ResolvedTarget =\r\n | {\r\n readonly kind: \"azure\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly config: AzureResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"anthropic\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly config: AnthropicResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"gemini\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly config: GeminiResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"mock\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly config: MockResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"vscode\" | \"vscode-insiders\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly config: VSCodeResolvedConfig;\r\n };\r\n\r\nconst BASE_TARGET_SCHEMA = z.object({\r\n name: z.string().min(1, \"target name is required\"),\r\n provider: z.string().min(1, \"provider is required\"),\r\n settings: z.record(z.unknown()).optional(),\r\n judge_target: z.string().optional(),\r\n workers: z.number().int().min(1).optional(),\r\n});\r\n\r\nconst DEFAULT_AZURE_API_VERSION = \"2024-10-01-preview\";\r\n\r\nfunction normalizeAzureApiVersion(value: string | undefined): string {\r\n if (!value) {\r\n return DEFAULT_AZURE_API_VERSION;\r\n }\r\n\r\n const trimmed = value.trim();\r\n if (trimmed.length === 0) {\r\n return DEFAULT_AZURE_API_VERSION;\r\n }\r\n\r\n const withoutPrefix = trimmed.replace(/^api[-_]?version\\s*=\\s*/i, \"\").trim();\r\n return withoutPrefix.length > 0 ? withoutPrefix : DEFAULT_AZURE_API_VERSION;\r\n}\r\n\r\nexport function resolveTargetDefinition(\r\n definition: TargetDefinition,\r\n env: EnvLookup = process.env,\r\n): ResolvedTarget {\r\n const parsed = BASE_TARGET_SCHEMA.parse(definition);\r\n const provider = parsed.provider.toLowerCase();\r\n\r\n switch (provider) {\r\n case \"azure\":\r\n case \"azure-openai\":\r\n return {\r\n kind: \"azure\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n config: resolveAzureConfig(parsed, env),\r\n };\r\n case \"anthropic\":\r\n return {\r\n kind: \"anthropic\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n config: resolveAnthropicConfig(parsed, env),\r\n };\r\n case \"gemini\":\r\n case \"google\":\r\n case \"google-gemini\":\r\n return {\r\n kind: \"gemini\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n config: resolveGeminiConfig(parsed, env),\r\n };\r\n case \"mock\":\r\n return {\r\n kind: \"mock\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n config: resolveMockConfig(parsed),\r\n };\r\n case \"vscode\":\r\n case \"vscode-insiders\":\r\n return {\r\n kind: provider as \"vscode\" | \"vscode-insiders\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n config: resolveVSCodeConfig(parsed, env, provider === \"vscode-insiders\"),\r\n };\r\n default:\r\n throw new Error(`Unsupported provider '${parsed.provider}' in target '${parsed.name}'`);\r\n }\r\n}\r\n\r\nfunction resolveAzureConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): AzureResolvedConfig {\r\n const settings = target.settings ?? {};\r\n const endpointSource = settings.endpoint ?? settings.resource ?? settings.resourceName;\r\n const apiKeySource = settings.api_key ?? settings.apiKey;\r\n const deploymentSource = settings.deployment ?? settings.deploymentName ?? settings.model;\r\n const versionSource = settings.version ?? settings.api_version;\r\n const temperatureSource = settings.temperature;\r\n const maxTokensSource = settings.max_output_tokens ?? settings.maxTokens;\r\n\r\n const resourceName = resolveString(endpointSource, env, `${target.name} endpoint`);\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} api key`);\r\n const deploymentName = resolveString(deploymentSource, env, `${target.name} deployment`);\r\n const version = normalizeAzureApiVersion(\r\n resolveOptionalString(versionSource, env, `${target.name} api version`),\r\n );\r\n const temperature = resolveOptionalNumber(temperatureSource, `${target.name} temperature`);\r\n const maxOutputTokens = resolveOptionalNumber(\r\n maxTokensSource,\r\n `${target.name} max output tokens`,\r\n );\r\n\r\n return {\r\n resourceName,\r\n deploymentName,\r\n apiKey,\r\n version,\r\n temperature,\r\n maxOutputTokens,\r\n };\r\n}\r\n\r\nfunction resolveAnthropicConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): AnthropicResolvedConfig {\r\n const settings = target.settings ?? {};\r\n const apiKeySource = settings.api_key ?? settings.apiKey;\r\n const modelSource = settings.model ?? settings.deployment ?? settings.variant;\r\n const temperatureSource = settings.temperature;\r\n const maxTokensSource = settings.max_output_tokens ?? settings.maxTokens;\r\n const thinkingBudgetSource = settings.thinking_budget ?? settings.thinkingBudget;\r\n\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} Anthropic api key`);\r\n const model = resolveString(modelSource, env, `${target.name} Anthropic model`);\r\n\r\n return {\r\n apiKey,\r\n model,\r\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\r\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\r\n thinkingBudget: resolveOptionalNumber(thinkingBudgetSource, `${target.name} thinking budget`),\r\n };\r\n}\r\n\r\nfunction resolveGeminiConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): GeminiResolvedConfig {\r\n const settings = target.settings ?? {};\r\n const apiKeySource = settings.api_key ?? settings.apiKey;\r\n const modelSource = settings.model ?? settings.deployment ?? settings.variant;\r\n const temperatureSource = settings.temperature;\r\n const maxTokensSource = settings.max_output_tokens ?? settings.maxTokens;\r\n\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} Google API key`);\r\n const model =\r\n resolveOptionalString(modelSource, env, `${target.name} Gemini model`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n }) ?? \"gemini-2.5-flash\";\r\n\r\n return {\r\n apiKey,\r\n model,\r\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\r\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\r\n };\r\n}\r\n\r\nfunction resolveMockConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): MockResolvedConfig {\r\n const settings = target.settings ?? {};\r\n const response = typeof settings.response === \"string\" ? settings.response : undefined;\r\n return { response };\r\n}\r\n\r\nfunction resolveVSCodeConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n insiders: boolean,\r\n): VSCodeResolvedConfig {\r\n const settings = target.settings ?? {};\r\n const workspaceTemplateEnvVar = resolveOptionalLiteralString(settings.workspace_template ?? settings.workspaceTemplate);\r\n const workspaceTemplate = workspaceTemplateEnvVar\r\n ? resolveOptionalString(workspaceTemplateEnvVar, env, `${target.name} workspace template path`, {\r\n allowLiteral: false,\r\n optionalEnv: true,\r\n })\r\n : undefined;\r\n\r\n const commandSource = settings.vscode_cmd ?? settings.command;\r\n const waitSource = settings.wait;\r\n const dryRunSource = settings.dry_run ?? settings.dryRun;\r\n const subagentRootSource = settings.subagent_root ?? settings.subagentRoot;\r\n\r\n const defaultCommand = insiders ? \"code-insiders\" : \"code\";\r\n const command = resolveOptionalLiteralString(commandSource) ?? defaultCommand;\r\n\r\n return {\r\n command,\r\n waitForResponse: resolveOptionalBoolean(waitSource) ?? true,\r\n dryRun: resolveOptionalBoolean(dryRunSource) ?? false,\r\n subagentRoot: resolveOptionalString(subagentRootSource, env, `${target.name} subagent root`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n }),\r\n workspaceTemplate,\r\n };\r\n}\r\n\r\nfunction resolveString(\r\n source: unknown,\r\n env: EnvLookup,\r\n description: string,\r\n allowLiteral = false,\r\n): string {\r\n const value = resolveOptionalString(source, env, description, {\r\n allowLiteral,\r\n optionalEnv: false,\r\n });\r\n if (value === undefined) {\r\n throw new Error(`${description} is required`);\r\n }\r\n return value;\r\n}\r\n\r\nfunction resolveOptionalString(\r\n source: unknown,\r\n env: EnvLookup,\r\n description: string,\r\n options?: { allowLiteral?: boolean; optionalEnv?: boolean },\r\n): string | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (typeof source !== \"string\") {\r\n throw new Error(`${description} must be a string`);\r\n }\r\n const trimmed = source.trim();\r\n if (trimmed.length === 0) {\r\n return undefined;\r\n }\r\n const envValue = env[trimmed];\r\n if (envValue !== undefined) {\r\n if (envValue.trim().length === 0) {\r\n throw new Error(`Environment variable '${trimmed}' for ${description} is empty`);\r\n }\r\n return envValue;\r\n }\r\n const allowLiteral = options?.allowLiteral ?? false;\r\n const optionalEnv = options?.optionalEnv ?? false;\r\n if (!allowLiteral && isLikelyEnvReference(trimmed)) {\r\n if (optionalEnv) {\r\n return undefined;\r\n }\r\n throw new Error(`Environment variable '${trimmed}' required for ${description} is not set`);\r\n }\r\n return trimmed;\r\n}\r\n\r\nfunction resolveOptionalLiteralString(source: unknown): string | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (typeof source !== \"string\") {\r\n throw new Error(\"expected string value\");\r\n }\r\n const trimmed = source.trim();\r\n return trimmed.length > 0 ? trimmed : undefined;\r\n}\r\n\r\nfunction resolveOptionalNumber(source: unknown, description: string): number | undefined {\r\n if (source === undefined || source === null || source === \"\") {\r\n return undefined;\r\n }\r\n if (typeof source === \"number\") {\r\n return Number.isFinite(source) ? source : undefined;\r\n }\r\n if (typeof source === \"string\") {\r\n const numeric = Number(source);\r\n if (Number.isFinite(numeric)) {\r\n return numeric;\r\n }\r\n }\r\n throw new Error(`${description} must be a number`);\r\n}\r\n\r\nfunction resolveOptionalBoolean(source: unknown): boolean | undefined {\r\n if (source === undefined || source === null || source === \"\") {\r\n return undefined;\r\n }\r\n if (typeof source === \"boolean\") {\r\n return source;\r\n }\r\n if (typeof source === \"string\") {\r\n const lowered = source.trim().toLowerCase();\r\n if (lowered === \"true\" || lowered === \"1\") {\r\n return true;\r\n }\r\n if (lowered === \"false\" || lowered === \"0\") {\r\n return false;\r\n }\r\n }\r\n throw new Error(\"expected boolean value\");\r\n}\r\n\r\nfunction isLikelyEnvReference(value: string): boolean {\r\n return /^[A-Z0-9_]+$/.test(value);\r\n}\r\n","import { mkdtemp, readFile, rm, writeFile } from \"node:fs/promises\";\r\nimport { tmpdir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { dispatchAgentSession, getSubagentRoot, provisionSubagents } from \"subagent\";\r\n\r\nimport { isGuidelineFile } from \"../yaml-parser.js\";\r\nimport type { VSCodeResolvedConfig } from \"./targets.js\";\r\nimport type { Provider, ProviderRequest, ProviderResponse } from \"./types.js\";\r\n\r\nconst PROMPT_FILE_PREFIX = \"agentv-vscode-\";\r\n\r\nexport class VSCodeProvider implements Provider {\r\n readonly id: string;\r\n readonly kind: \"vscode\" | \"vscode-insiders\";\r\n readonly targetName: string;\r\n\r\n private readonly config: VSCodeResolvedConfig;\r\n\r\n constructor(\r\n targetName: string,\r\n config: VSCodeResolvedConfig,\r\n kind: \"vscode\" | \"vscode-insiders\",\r\n ) {\r\n this.id = `${kind}:${targetName}`;\r\n this.kind = kind;\r\n this.targetName = targetName;\r\n this.config = config;\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n if (request.signal?.aborted) {\r\n throw new Error(\"VS Code provider request was aborted before dispatch\");\r\n }\r\n\r\n const attachments = normalizeAttachments(request.attachments);\r\n const promptContent = buildPromptDocument(request, attachments, request.guideline_patterns);\r\n\r\n const session = await dispatchAgentSession({\r\n userQuery: promptContent, // Use full prompt content instead of just request.prompt\r\n extraAttachments: attachments,\r\n wait: this.config.waitForResponse,\r\n dryRun: this.config.dryRun,\r\n vscodeCmd: this.config.command,\r\n subagentRoot: this.config.subagentRoot,\r\n workspaceTemplate: this.config.workspaceTemplate,\r\n silent: true,\r\n });\r\n\r\n if (session.exitCode !== 0 || !session.responseFile) {\r\n const failure = session.error ?? \"VS Code subagent did not produce a response\";\r\n throw new Error(failure);\r\n }\r\n\r\n if (this.config.dryRun) {\r\n return {\r\n text: \"\",\r\n raw: {\r\n session,\r\n attachments,\r\n },\r\n };\r\n }\r\n\r\n const responseText = await readFile(session.responseFile, \"utf8\");\r\n\r\n return {\r\n text: responseText,\r\n raw: {\r\n session,\r\n attachments,\r\n },\r\n };\r\n }\r\n}\r\n\r\nfunction buildPromptDocument(\r\n request: ProviderRequest,\r\n attachments: readonly string[] | undefined,\r\n guidelinePatterns: readonly string[] | undefined,\r\n): string {\r\n const parts: string[] = [];\r\n\r\n const guidelineFiles = collectGuidelineFiles(attachments, guidelinePatterns);\r\n if (guidelineFiles.length > 0) {\r\n parts.push(\"\\n\", buildMandatoryPrereadBlock(guidelineFiles));\r\n }\r\n\r\n parts.push(\"\\n[[ ## user_query ## ]]\\n\", request.prompt.trim());\r\n\r\n return parts.join(\"\\n\").trim();\r\n}\r\n\r\nfunction buildMandatoryPrereadBlock(guidelineFiles: readonly string[]): string {\r\n if (guidelineFiles.length === 0) {\r\n return \"\";\r\n }\r\n\r\n const fileList: string[] = [];\r\n let counter = 0;\r\n\r\n for (const absolutePath of guidelineFiles) {\r\n counter += 1;\r\n const fileName = path.basename(absolutePath);\r\n const fileUri = pathToFileUri(absolutePath);\r\n fileList.push(`* [${fileName}](${fileUri})`);\r\n }\r\n\r\n const filesText = fileList.join(\"\\n\");\r\n\r\n const instruction = [\r\n `Read all guideline files:\\n${filesText}.\\n`,\r\n `If any file is missing, fail with ERROR: missing-file <filename> and stop.\\n`,\r\n `Then apply system_instructions on the user query below.`,\r\n ].join(\"\");\r\n\r\n return `${instruction}`;\r\n}\r\n\r\nfunction collectGuidelineFiles(\r\n attachments: readonly string[] | undefined,\r\n guidelinePatterns: readonly string[] | undefined,\r\n): string[] {\r\n if (!attachments || attachments.length === 0) {\r\n return [];\r\n }\r\n\r\n const unique = new Map<string, string>();\r\n for (const attachment of attachments) {\r\n const absolutePath = path.resolve(attachment);\r\n const normalized = absolutePath.split(path.sep).join(\"/\");\r\n \r\n if (isGuidelineFile(normalized, guidelinePatterns)) {\r\n if (!unique.has(absolutePath)) {\r\n unique.set(absolutePath, absolutePath);\r\n }\r\n }\r\n }\r\n\r\n return Array.from(unique.values());\r\n}\r\n\r\nfunction pathToFileUri(filePath: string): string {\r\n // Convert to absolute path if relative\r\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\r\n\r\n // On Windows, convert backslashes to forward slashes\r\n const normalizedPath = absolutePath.replace(/\\\\/g, \"/\");\r\n\r\n // Handle Windows drive letters (e.g., C:/ becomes file:///C:/)\r\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\r\n return `file:///${normalizedPath}`;\r\n }\r\n\r\n // Unix-like paths\r\n return `file://${normalizedPath}`;\r\n}\r\n\r\nfunction composeUserQuery(request: ProviderRequest): string {\r\n // For VS Code, guidelines are handled via file attachments\r\n // Do NOT include guideline content in the user query\r\n return request.prompt.trim();\r\n}\r\n\r\nfunction normalizeAttachments(attachments: readonly string[] | undefined): string[] | undefined {\r\n if (!attachments || attachments.length === 0) {\r\n return undefined;\r\n }\r\n const deduped = new Set<string>();\r\n for (const attachment of attachments) {\r\n deduped.add(path.resolve(attachment));\r\n }\r\n return Array.from(deduped);\r\n}\r\n\r\nexport interface EnsureSubagentsOptions {\r\n readonly kind: \"vscode\" | \"vscode-insiders\";\r\n readonly count: number;\r\n readonly verbose?: boolean;\r\n}\r\n\r\nexport interface EnsureSubagentsResult {\r\n readonly provisioned: boolean;\r\n readonly message?: string;\r\n}\r\n\r\n/**\r\n * Ensures the required number of VSCode subagents are provisioned using the subagent package.\r\n * This guarantees version compatibility by using the same subagent package version.\r\n * \r\n * @param options - Configuration for subagent provisioning\r\n * @returns Information about the provisioning result\r\n */\r\nexport async function ensureVSCodeSubagents(\r\n options: EnsureSubagentsOptions,\r\n): Promise<EnsureSubagentsResult> {\r\n const { kind, count, verbose = false } = options;\r\n const vscodeCmd = kind === \"vscode-insiders\" ? \"code-insiders\" : \"code\";\r\n const subagentRoot = getSubagentRoot(vscodeCmd);\r\n \r\n try {\r\n if (verbose) {\r\n console.log(`Provisioning ${count} subagent(s) via: subagent ${vscodeCmd} provision`);\r\n }\r\n \r\n const result = await provisionSubagents({\r\n targetRoot: subagentRoot,\r\n subagents: count,\r\n dryRun: false,\r\n });\r\n \r\n if (verbose) {\r\n if (result.created.length > 0) {\r\n console.log(`Created ${result.created.length} new subagent(s)`);\r\n }\r\n if (result.skippedExisting.length > 0) {\r\n console.log(`Reusing ${result.skippedExisting.length} existing unlocked subagent(s)`);\r\n }\r\n console.log(`\\ntotal unlocked subagents available: ${result.created.length + result.skippedExisting.length}`);\r\n }\r\n \r\n return {\r\n provisioned: true,\r\n message: `Provisioned ${count} subagent(s): ${result.created.length} created, ${result.skippedExisting.length} reused`,\r\n };\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n \r\n // Don't fail if provisioning fails - agents might already exist\r\n if (verbose) {\r\n console.warn(`Provisioning failed (continuing anyway): ${errorMessage}`);\r\n }\r\n \r\n return {\r\n provisioned: false,\r\n message: `Provisioning failed: ${errorMessage}`,\r\n };\r\n }\r\n}\r\n","import { constants } from \"node:fs\";\r\nimport { access, readFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { parse } from \"yaml\";\r\n\r\nimport { TARGETS_SCHEMA_V2 } from \"./types.js\";\r\nimport type { TargetDefinition } from \"./types.js\";\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction checkSchema(parsed: Record<string, unknown>, absolutePath: string): void {\r\n const schema = parsed.$schema;\r\n\r\n if (schema === undefined) {\r\n throw new Error(\r\n `Missing $schema field in targets.yaml at ${absolutePath}.\\n` +\r\n `Please add '$schema: ${TARGETS_SCHEMA_V2}' at the top of the file.`\r\n );\r\n }\r\n\r\n if (typeof schema !== 'string') {\r\n throw new Error(\r\n `Invalid $schema field in targets.yaml at ${absolutePath}.\\n` +\r\n `Expected a string value '${TARGETS_SCHEMA_V2}'.`\r\n );\r\n }\r\n\r\n if (schema !== TARGETS_SCHEMA_V2) {\r\n throw new Error(\r\n `Invalid $schema '${schema}' in targets.yaml at ${absolutePath}.\\n` +\r\n `Expected '${TARGETS_SCHEMA_V2}'.`\r\n );\r\n }\r\n}\r\n\r\nfunction extractTargetsArray(parsed: Record<string, unknown>, absolutePath: string): unknown[] {\r\n const targets = parsed.targets;\r\n if (!Array.isArray(targets)) {\r\n throw new Error(`targets.yaml at ${absolutePath} must have a 'targets' array`);\r\n }\r\n return targets;\r\n}\r\n\r\nfunction assertTargetDefinition(value: unknown, index: number, filePath: string): TargetDefinition {\r\n if (!isRecord(value)) {\r\n throw new Error(`targets.yaml entry at index ${index} in ${filePath} must be an object`);\r\n }\r\n\r\n const name = value.name;\r\n const provider = value.provider;\r\n const settings = value.settings;\r\n const judgeTarget = value.judge_target;\r\n\r\n if (typeof name !== \"string\" || name.trim().length === 0) {\r\n throw new Error(`targets.yaml entry at index ${index} in ${filePath} is missing a valid 'name'`);\r\n }\r\n\r\n if (typeof provider !== \"string\" || provider.trim().length === 0) {\r\n throw new Error(`targets.yaml entry '${name}' in ${filePath} is missing a valid 'provider'`);\r\n }\r\n\r\n return {\r\n name,\r\n provider,\r\n settings: isRecord(settings) ? settings : undefined,\r\n judge_target: typeof judgeTarget === \"string\" ? judgeTarget : undefined,\r\n } satisfies TargetDefinition;\r\n}\r\n\r\nasync function fileExists(filePath: string): Promise<boolean> {\r\n try {\r\n await access(filePath, constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport async function readTargetDefinitions(filePath: string): Promise<readonly TargetDefinition[]> {\r\n const absolutePath = path.resolve(filePath);\r\n if (!(await fileExists(absolutePath))) {\r\n throw new Error(`targets.yaml not found at ${absolutePath}`);\r\n }\r\n\r\n const raw = await readFile(absolutePath, \"utf8\");\r\n const parsed = parse(raw) as unknown;\r\n\r\n if (!isRecord(parsed)) {\r\n throw new Error(`targets.yaml at ${absolutePath} must be a YAML object with '$schema' and 'targets' fields`);\r\n }\r\n\r\n checkSchema(parsed, absolutePath);\r\n\r\n const targets = extractTargetsArray(parsed, absolutePath);\r\n const definitions = targets.map((entry, index) => assertTargetDefinition(entry, index, absolutePath));\r\n return definitions;\r\n}\r\n\r\nexport function listTargetNames(definitions: readonly TargetDefinition[]): readonly string[] {\r\n return definitions.map((definition) => definition.name);\r\n}\r\n","import { AnthropicProvider, AzureProvider, GeminiProvider } from \"./ax.js\";\r\nimport { MockProvider } from \"./mock.js\";\r\nimport type { ResolvedTarget } from \"./targets.js\";\r\nimport { resolveTargetDefinition } from \"./targets.js\";\r\nimport type { EnvLookup, Provider, TargetDefinition } from \"./types.js\";\r\nimport { VSCodeProvider } from \"./vscode.js\";\r\n\r\nexport type {\r\n EnvLookup,\r\n Provider,\r\n ProviderKind,\r\n ProviderRequest,\r\n ProviderResponse,\r\n TargetDefinition,\r\n} from \"./types.js\";\r\n\r\nexport type {\r\n AnthropicResolvedConfig,\r\n AzureResolvedConfig,\r\n GeminiResolvedConfig,\r\n MockResolvedConfig,\r\n ResolvedTarget,\r\n VSCodeResolvedConfig,\r\n} from \"./targets.js\";\r\n\r\nexport { resolveTargetDefinition };\r\nexport { readTargetDefinitions, listTargetNames } from \"./targets-file.js\";\r\nexport { ensureVSCodeSubagents, type EnsureSubagentsOptions, type EnsureSubagentsResult } from \"./vscode.js\";\r\n\r\nexport function createProvider(target: ResolvedTarget): Provider {\r\n switch (target.kind) {\r\n case \"azure\":\r\n return new AzureProvider(target.name, target.config);\r\n case \"anthropic\":\r\n return new AnthropicProvider(target.name, target.config);\r\n case \"gemini\":\r\n return new GeminiProvider(target.name, target.config);\r\n case \"mock\":\r\n return new MockProvider(target.name, target.config);\r\n case \"vscode\":\r\n case \"vscode-insiders\":\r\n return new VSCodeProvider(target.name, target.config, target.kind);\r\n default: {\r\n // Exhaustive check\r\n const neverTarget: never = target;\r\n throw new Error(`Unsupported provider kind ${(neverTarget as { kind: string }).kind}`);\r\n }\r\n }\r\n}\r\n\r\nexport function resolveAndCreateProvider(\r\n definition: TargetDefinition,\r\n env: EnvLookup = process.env,\r\n): Provider {\r\n const resolved = resolveTargetDefinition(definition, env);\r\n return createProvider(resolved);\r\n}\r\n","const KEY_TERM_MATCH_THRESHOLD = 0.5;\r\n\r\nconst ACTION_WORDS = new Set([\r\n \"use\",\r\n \"avoid\",\r\n \"prefer\",\r\n \"replace\",\r\n \"consider\",\r\n \"ensure\",\r\n \"remove\",\r\n \"add\",\r\n]);\r\n\r\nconst STOP_WORDS = new Set([\r\n \"the\",\r\n \"a\",\r\n \"an\",\r\n \"and\",\r\n \"or\",\r\n \"but\",\r\n \"in\",\r\n \"on\",\r\n \"at\",\r\n \"to\",\r\n \"for\",\r\n \"of\",\r\n \"with\",\r\n \"by\",\r\n \"is\",\r\n \"are\",\r\n \"was\",\r\n \"were\",\r\n \"be\",\r\n \"been\",\r\n \"being\",\r\n \"have\",\r\n \"has\",\r\n \"had\",\r\n \"do\",\r\n \"does\",\r\n \"did\",\r\n \"will\",\r\n \"would\",\r\n \"could\",\r\n \"should\",\r\n]);\r\n\r\nconst ERROR_PREFIXES = [\r\n \"error:\",\r\n \"err:\",\r\n \"vs code command failed\",\r\n \"exception\",\r\n \"traceback\",\r\n \"no response file was generated\",\r\n \"timed out\",\r\n \"cli not found\",\r\n];\r\n\r\nexport interface HeuristicScore {\r\n readonly score: number;\r\n readonly hits: readonly string[];\r\n readonly misses: readonly string[];\r\n readonly hitCount: number;\r\n readonly totalAspects: number;\r\n readonly rawAspects: readonly string[];\r\n}\r\n\r\n/**\r\n * Extract individual evaluation aspects from the expected assistant response.\r\n */\r\nexport function extractAspects(expectedResponse: string): readonly string[] {\r\n const lines = expectedResponse.split(/\\r?\\n/).map((line) => line.trim());\r\n const aspects: string[] = [];\r\n\r\n for (const line of lines) {\r\n if (line.length === 0) {\r\n continue;\r\n }\r\n\r\n const bulletMatch = /^([-*•]|[0-9]+\\.)\\s*(.+)$/.exec(line);\r\n if (bulletMatch) {\r\n const normalized = normalizeAspect(bulletMatch[2]);\r\n if (normalized.length > 0) {\r\n aspects.push(normalized);\r\n }\r\n continue;\r\n }\r\n\r\n const lowered = line.toLowerCase();\r\n if (Array.from(ACTION_WORDS).some((word) => lowered.startsWith(word))) {\r\n const normalized = normalizeAspect(line);\r\n if (normalized.length > 0) {\r\n aspects.push(normalized);\r\n }\r\n }\r\n }\r\n\r\n return aspects;\r\n}\r\n\r\n/**\r\n * Determine which aspects were covered by the candidate response.\r\n */\r\nexport function calculateHits(\r\n candidateResponse: string,\r\n expectedAspects: readonly string[],\r\n): readonly string[] {\r\n const { normalizedText, words } = normalizeCandidate(candidateResponse);\r\n const hits: string[] = [];\r\n\r\n for (const aspect of expectedAspects) {\r\n if (matchesAspect(aspect, normalizedText, words)) {\r\n hits.push(aspect);\r\n }\r\n }\r\n\r\n return hits;\r\n}\r\n\r\n/**\r\n * Determine which aspects were not satisfied by the candidate response.\r\n */\r\nexport function calculateMisses(\r\n candidateResponse: string,\r\n expectedAspects: readonly string[],\r\n resolvedHits?: readonly string[],\r\n): readonly string[] {\r\n const hits = new Set(resolvedHits ?? calculateHits(candidateResponse, expectedAspects));\r\n return expectedAspects.filter((aspect) => !hits.has(aspect));\r\n}\r\n\r\n/**\r\n * Evaluate the candidate response against the expected aspects.\r\n */\r\nexport function scoreCandidateResponse(\r\n candidateResponse: string,\r\n expectedAspects: readonly string[],\r\n): HeuristicScore {\r\n if (expectedAspects.length === 0) {\r\n if (isErrorLike(candidateResponse)) {\r\n return {\r\n score: 0,\r\n hits: [],\r\n misses: [\"Model produced an error instead of an answer.\"],\r\n hitCount: 0,\r\n totalAspects: 0,\r\n rawAspects: [],\r\n };\r\n }\r\n\r\n return {\r\n score: 1,\r\n hits: [],\r\n misses: [],\r\n hitCount: 0,\r\n totalAspects: 0,\r\n rawAspects: [],\r\n };\r\n }\r\n\r\n const hits = calculateHits(candidateResponse, expectedAspects);\r\n const misses = expectedAspects.filter((aspect) => !hits.includes(aspect));\r\n const score = expectedAspects.length > 0 ? hits.length / expectedAspects.length : 0;\r\n\r\n return {\r\n score,\r\n hits,\r\n misses,\r\n hitCount: hits.length,\r\n totalAspects: expectedAspects.length,\r\n rawAspects: expectedAspects,\r\n };\r\n}\r\n\r\n/**\r\n * Detect common error-prefixed outputs from providers.\r\n */\r\nexport function isErrorLike(text: string | undefined | null): boolean {\r\n if (!text) {\r\n return false;\r\n }\r\n const lowered = text.trim().toLowerCase();\r\n return ERROR_PREFIXES.some((prefix) => lowered.startsWith(prefix));\r\n}\r\n\r\nfunction normalizeAspect(aspect: string): string {\r\n const sanitized = aspect\r\n .toLowerCase()\r\n .replace(/[^\\w\\s]/g, \" \")\r\n .replace(/\\s+/g, \" \")\r\n .trim();\r\n return sanitized;\r\n}\r\n\r\nfunction normalizeCandidate(candidate: string): {\r\n readonly normalizedText: string;\r\n readonly words: ReadonlySet<string>;\r\n} {\r\n const lowered = candidate.toLowerCase();\r\n const normalizedText = lowered.replace(/[^\\w\\s]/g, \" \");\r\n const words = new Set(normalizedText.split(/\\s+/).filter((word) => word.length > 0));\r\n return { normalizedText, words };\r\n}\r\n\r\nfunction matchesAspect(\r\n aspect: string,\r\n candidateNormalized: string,\r\n candidateWords: ReadonlySet<string>,\r\n): boolean {\r\n const keyTerms = extractKeyTerms(aspect);\r\n if (keyTerms.length === 0) {\r\n return false;\r\n }\r\n\r\n const matches = keyTerms.filter((term) => candidateWords.has(term)).length;\r\n const ratio = matches / keyTerms.length;\r\n if (ratio >= KEY_TERM_MATCH_THRESHOLD) {\r\n return true;\r\n }\r\n\r\n const aspectWords = aspect.split(\" \");\r\n if (aspectWords.length >= 2) {\r\n for (let index = 0; index < aspectWords.length - 1; index += 1) {\r\n const phrase = `${aspectWords[index]} ${aspectWords[index + 1]}`;\r\n if (candidateNormalized.includes(phrase)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction extractKeyTerms(aspect: string, maxTerms = 5): string[] {\r\n const terms: string[] = [];\r\n const words = aspect.split(\" \");\r\n\r\n for (const word of words) {\r\n if (word.length <= 2) {\r\n continue;\r\n }\r\n if (STOP_WORDS.has(word)) {\r\n continue;\r\n }\r\n terms.push(word);\r\n if (terms.length >= maxTerms) {\r\n break;\r\n }\r\n }\r\n\r\n return terms;\r\n}\r\n","import { randomUUID } from \"node:crypto\";\r\n\r\nimport type { ResolvedTarget } from \"./providers/targets.js\";\r\nimport type { Provider, ProviderResponse } from \"./providers/types.js\";\r\nimport { extractAspects, isErrorLike, scoreCandidateResponse } from \"./scoring.js\";\r\nimport type { JsonObject, EvalCase } from \"./types.js\";\r\n\r\nexport interface GradeContext {\r\n readonly evalCase: EvalCase;\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly attempt: number;\r\n readonly promptInputs: {\r\n readonly request: string;\r\n readonly guidelines: string;\r\n };\r\n readonly now: Date;\r\n readonly judgeProvider?: Provider;\r\n}\r\n\r\nexport interface GradeResult {\r\n readonly score: number;\r\n readonly hits: readonly string[];\r\n readonly misses: readonly string[];\r\n readonly expectedAspectCount: number;\r\n readonly reasoning?: string;\r\n readonly rawAspects?: readonly string[];\r\n readonly graderRawRequest?: JsonObject;\r\n}\r\n\r\nexport interface Grader {\r\n readonly kind: string;\r\n grade(context: GradeContext): Promise<GradeResult> | GradeResult;\r\n}\r\n\r\nexport class HeuristicGrader implements Grader {\r\n readonly kind = \"heuristic\";\r\n\r\n grade(context: GradeContext): GradeResult {\r\n const expectedAspects = extractAspects(context.evalCase.expected_assistant_raw);\r\n const result = scoreCandidateResponse(context.candidate, expectedAspects);\r\n\r\n const misses = [...result.misses];\r\n if (expectedAspects.length === 0 && isErrorLike(context.candidate)) {\r\n const firstLine = context.candidate.split(/\\r?\\n/)[0]?.trim();\r\n if (firstLine && !misses.includes(firstLine)) {\r\n misses.unshift(firstLine);\r\n }\r\n }\r\n\r\n return {\r\n score: result.score,\r\n hits: result.hits,\r\n misses,\r\n expectedAspectCount: result.totalAspects,\r\n rawAspects: result.rawAspects,\r\n };\r\n }\r\n}\r\n\r\ntype JudgeProviderResolver = (context: GradeContext) => Promise<Provider | undefined>;\r\n\r\nexport interface QualityGraderOptions {\r\n readonly resolveJudgeProvider: JudgeProviderResolver;\r\n readonly maxOutputTokens?: number;\r\n readonly temperature?: number;\r\n}\r\n\r\nexport class QualityGrader implements Grader {\r\n readonly kind = \"llm_judge\";\r\n\r\n private readonly resolveJudgeProvider: JudgeProviderResolver;\r\n private readonly maxOutputTokens?: number;\r\n private readonly temperature?: number;\r\n\r\n constructor(options: QualityGraderOptions) {\r\n this.resolveJudgeProvider = options.resolveJudgeProvider;\r\n this.maxOutputTokens = options.maxOutputTokens;\r\n this.temperature = options.temperature;\r\n }\r\n\r\n async grade(context: GradeContext): Promise<GradeResult> {\r\n const judgeProvider = await this.resolveJudgeProvider(context);\r\n if (!judgeProvider) {\r\n throw new Error(\"No judge provider available for LLM grading\");\r\n }\r\n\r\n const prompt = buildQualityPrompt(context.evalCase, context.candidate);\r\n const metadata: JsonObject = {\r\n systemPrompt: QUALITY_SYSTEM_PROMPT,\r\n };\r\n\r\n const response = await judgeProvider.invoke({\r\n prompt,\r\n metadata,\r\n evalCaseId: context.evalCase.id,\r\n attempt: context.attempt,\r\n maxOutputTokens: this.maxOutputTokens,\r\n temperature: this.temperature,\r\n });\r\n\r\n const parsed = parseQualityResponse(response);\r\n const score = clampScore(parsed.score ?? 0);\r\n const hits = Array.isArray(parsed.hits)\r\n ? parsed.hits.filter(isNonEmptyString).slice(0, 4)\r\n : [];\r\n const misses = Array.isArray(parsed.misses)\r\n ? parsed.misses.filter(isNonEmptyString).slice(0, 4)\r\n : [];\r\n\r\n const reasoning = parsed.reasoning ?? response.reasoning;\r\n\r\n const graderRawRequest: JsonObject = {\r\n id: randomUUID(),\r\n provider: judgeProvider.id,\r\n prompt,\r\n systemPrompt: QUALITY_SYSTEM_PROMPT,\r\n target: context.target.name,\r\n };\r\n\r\n return {\r\n score,\r\n hits,\r\n misses,\r\n expectedAspectCount: hits.length + misses.length || 1,\r\n reasoning,\r\n graderRawRequest,\r\n };\r\n }\r\n}\r\n\r\nconst QUALITY_SYSTEM_PROMPT = [\r\n \"You are an expert evaluator. Your goal is to grade the generated_answer based on how well it achieves the expected_outcome for the original task.\",\r\n \"\",\r\n \"Use the reference_answer as a gold standard for a high-quality response. The generated_answer does not need to match it verbatim, but it should capture the key points and follow the same spirit.\",\r\n \"\",\r\n \"Be concise and focused in your evaluation. Provide succinct, specific feedback rather than verbose explanations.\",\r\n \"\",\r\n \"You must respond with a single JSON object matching this schema:\",\r\n \"\",\r\n \"{\",\r\n ' \"score\": <number between 0.0 and 1.0>,',\r\n ' \"hits\": [<array of strings, max 4 items, brief specific achievements>],',\r\n ' \"misses\": [<array of strings, max 4 items, brief specific failures or omissions, empty if none>],',\r\n ' \"reasoning\": \"<string, concise explanation for the score, 1-2 sentences max>\"',\r\n \"}\",\r\n].join(\"\\n\");\r\n\r\nfunction buildQualityPrompt(testCase: EvalCase, candidate: string): string {\r\n const parts = [\r\n \"[[ ## expected_outcome ## ]]\",\r\n testCase.outcome.trim(),\r\n \"\",\r\n \"[[ ## request ## ]]\",\r\n testCase.task.trim(),\r\n \"\",\r\n \"[[ ## reference_answer ## ]]\",\r\n testCase.expected_assistant_raw.trim(),\r\n \"\",\r\n \"[[ ## generated_answer ## ]]\",\r\n candidate.trim(),\r\n \"\",\r\n \"Respond with a single JSON object matching the schema described in the system prompt.\",\r\n ];\r\n return parts.join(\"\\n\");\r\n}\r\n\r\nfunction clampScore(value: number): number {\r\n if (Number.isNaN(value) || !Number.isFinite(value)) {\r\n return 0;\r\n }\r\n if (value < 0) {\r\n return 0;\r\n }\r\n if (value > 1) {\r\n return 1;\r\n }\r\n return value;\r\n}\r\n\r\nfunction parseQualityResponse(response: ProviderResponse): {\r\n readonly score?: number;\r\n readonly hits?: unknown;\r\n readonly misses?: unknown;\r\n readonly reasoning?: string;\r\n} {\r\n const text = typeof response.text === \"string\" ? response.text.trim() : \"\";\r\n if (text.length === 0) {\r\n return {};\r\n }\r\n\r\n // Try parsing JSON directly\r\n const direct = attemptParseJson(text);\r\n if (direct && validateQualityJson(direct)) {\r\n return direct;\r\n }\r\n\r\n // Try extracting JSON from markdown code blocks or surrounding text\r\n const extracted = extractJsonBlob(text);\r\n if (extracted) {\r\n const parsed = attemptParseJson(extracted);\r\n if (parsed && validateQualityJson(parsed)) {\r\n return parsed;\r\n }\r\n }\r\n\r\n return {};\r\n}\r\n\r\nfunction attemptParseJson(text: string):\r\n | {\r\n readonly score?: number;\r\n readonly hits?: unknown;\r\n readonly misses?: unknown;\r\n readonly reasoning?: string;\r\n }\r\n | undefined {\r\n try {\r\n const parsed = JSON.parse(text) as Record<string, unknown>;\r\n const score = typeof parsed.score === \"number\" ? parsed.score : undefined;\r\n const hits = parsed.hits;\r\n const misses = parsed.misses;\r\n const reasoning = typeof parsed.reasoning === \"string\" ? parsed.reasoning : undefined;\r\n return { score, hits, misses, reasoning };\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction validateQualityJson(parsed: {\r\n readonly score?: number;\r\n readonly hits?: unknown;\r\n readonly misses?: unknown;\r\n readonly reasoning?: string;\r\n}): boolean {\r\n // Validate score is present and in valid range [0.0, 1.0]\r\n if (typeof parsed.score !== \"number\") {\r\n return false;\r\n }\r\n if (Number.isNaN(parsed.score) || !Number.isFinite(parsed.score)) {\r\n return false;\r\n }\r\n if (parsed.score < 0 || parsed.score > 1) {\r\n return false;\r\n }\r\n\r\n // Validate hits is an array of strings (max 4 will be enforced during extraction)\r\n if (parsed.hits !== undefined) {\r\n if (!Array.isArray(parsed.hits)) {\r\n return false;\r\n }\r\n if (!parsed.hits.every((item) => typeof item === \"string\")) {\r\n return false;\r\n }\r\n }\r\n\r\n // Validate misses is an array of strings (max 4 will be enforced during extraction)\r\n if (parsed.misses !== undefined) {\r\n if (!Array.isArray(parsed.misses)) {\r\n return false;\r\n }\r\n if (!parsed.misses.every((item) => typeof item === \"string\")) {\r\n return false;\r\n }\r\n }\r\n\r\n // Validate reasoning is a string if present\r\n if (parsed.reasoning !== undefined && typeof parsed.reasoning !== \"string\") {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction extractJsonBlob(text: string): string | undefined {\r\n const match = text.match(/\\{[\\s\\S]*\\}/);\r\n return match?.[0];\r\n}\r\n\r\nfunction isNonEmptyString(value: unknown): value is string {\r\n return typeof value === \"string\" && value.trim().length > 0;\r\n}\r\n","import { createHash, randomUUID } from \"node:crypto\";\r\nimport { mkdir, writeFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport pLimit from \"p-limit\";\r\n\r\nimport {\r\n HeuristicGrader,\r\n QualityGrader,\r\n type GradeResult,\r\n type Grader,\r\n} from \"./grading.js\";\r\nimport { createProvider } from \"./providers/index.js\";\r\nimport { resolveTargetDefinition, type ResolvedTarget } from \"./providers/targets.js\";\r\nimport type { EnvLookup, Provider, ProviderResponse, TargetDefinition } from \"./providers/types.js\";\r\nimport type { EvaluationResult, JsonObject, EvalCase } from \"./types.js\";\r\nimport { buildPromptInputs, loadEvalCases } from \"./yaml-parser.js\";\r\n\r\ntype MaybePromise<T> = T | Promise<T>;\r\n\r\nexport interface EvaluationCache {\r\n get(key: string): MaybePromise<ProviderResponse | undefined>;\r\n set(key: string, value: ProviderResponse): MaybePromise<void>;\r\n}\r\n\r\nexport interface RunEvalCaseOptions {\r\n readonly evalCase: EvalCase;\r\n readonly provider: Provider;\r\n readonly target: ResolvedTarget;\r\n readonly graders: Partial<Record<string, Grader>>;\r\n readonly now?: () => Date;\r\n readonly maxRetries?: number;\r\n readonly agentTimeoutMs?: number;\r\n readonly promptDumpDir?: string;\r\n readonly cache?: EvaluationCache;\r\n readonly useCache?: boolean;\r\n readonly signal?: AbortSignal;\r\n readonly judgeProvider?: Provider;\r\n}\r\n\r\nexport interface ProgressEvent {\r\n readonly workerId: number;\r\n readonly evalId: string;\r\n readonly status: \"pending\" | \"running\" | \"completed\" | \"failed\";\r\n readonly startedAt?: number;\r\n readonly completedAt?: number;\r\n readonly error?: string;\r\n}\r\n\r\nexport interface RunEvaluationOptions {\r\n readonly testFilePath: string;\r\n readonly repoRoot: URL | string;\r\n readonly target: ResolvedTarget;\r\n readonly targets?: readonly TargetDefinition[];\r\n readonly env?: EnvLookup;\r\n readonly providerFactory?: (target: ResolvedTarget) => Provider;\r\n readonly graders?: Partial<Record<string, Grader>>;\r\n readonly maxRetries?: number;\r\n readonly agentTimeoutMs?: number;\r\n readonly promptDumpDir?: string;\r\n readonly cache?: EvaluationCache;\r\n readonly useCache?: boolean;\r\n readonly now?: () => Date;\r\n readonly evalId?: string;\r\n readonly verbose?: boolean;\r\n readonly maxConcurrency?: number;\r\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\r\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\r\n}\r\n\r\nexport async function runEvaluation(options: RunEvaluationOptions): Promise<readonly EvaluationResult[]> {\r\n const {\r\n testFilePath,\r\n repoRoot,\r\n target,\r\n targets,\r\n env,\r\n providerFactory,\r\n graders,\r\n maxRetries,\r\n agentTimeoutMs,\r\n promptDumpDir,\r\n cache,\r\n useCache,\r\n now,\r\n evalId,\r\n verbose,\r\n onResult,\r\n onProgress,\r\n } = options;\r\n\r\n const load = loadEvalCases;\r\n const evalCases = await load(testFilePath, repoRoot, { verbose });\r\n\r\n const filteredEvalCases = filterEvalCases(evalCases, evalId);\r\n if (filteredEvalCases.length === 0) {\r\n if (evalId) {\r\n throw new Error(`Test case with id '${evalId}' not found in ${testFilePath}`);\r\n }\r\n return [];\r\n }\r\n\r\n const resolvedTargetsByName = new Map<string, ResolvedTarget>();\r\n resolvedTargetsByName.set(target.name, target);\r\n\r\n const targetDefinitions = new Map<string, TargetDefinition>();\r\n for (const definition of targets ?? []) {\r\n targetDefinitions.set(definition.name, definition);\r\n }\r\n\r\n const envLookup: EnvLookup = env ?? process.env;\r\n const providerCache = new Map<string, Provider>();\r\n\r\n const getOrCreateProvider = (resolved: ResolvedTarget): Provider => {\r\n const existing = providerCache.get(resolved.name);\r\n if (existing) {\r\n return existing;\r\n }\r\n const factory = providerFactory ?? createProvider;\r\n const instance = factory(resolved);\r\n providerCache.set(resolved.name, instance);\r\n return instance;\r\n };\r\n\r\n const resolveTargetByName = (name: string): ResolvedTarget | undefined => {\r\n if (resolvedTargetsByName.has(name)) {\r\n return resolvedTargetsByName.get(name);\r\n }\r\n const definition = targetDefinitions.get(name);\r\n if (!definition) {\r\n return undefined;\r\n }\r\n const resolved = resolveTargetDefinition(definition, envLookup);\r\n resolvedTargetsByName.set(name, resolved);\r\n return resolved;\r\n };\r\n\r\n const resolveJudgeProvider = async (targetContext: ResolvedTarget): Promise<Provider | undefined> => {\r\n const judgeName = targetContext.judgeTarget ?? targetContext.name;\r\n const resolvedJudge = resolveTargetByName(judgeName);\r\n if (!resolvedJudge) {\r\n return getOrCreateProvider(targetContext);\r\n }\r\n return getOrCreateProvider(resolvedJudge);\r\n };\r\n\r\n const graderRegistry = buildGraderRegistry(graders, resolveJudgeProvider);\r\n\r\n const primaryProvider = getOrCreateProvider(target);\r\n\r\n // Notify about total test count before starting\r\n if (onProgress && filteredEvalCases.length > 0) {\r\n // Emit initial pending events for all tests\r\n for (let i = 0; i < filteredEvalCases.length; i++) {\r\n await onProgress({\r\n workerId: i + 1,\r\n evalId: filteredEvalCases[i].id,\r\n status: \"pending\",\r\n });\r\n }\r\n }\r\n\r\n // Resolve worker count: CLI option > target setting > default (1)\r\n const workers = options.maxConcurrency ?? target.workers ?? 1;\r\n const limit = pLimit(workers);\r\n\r\n // Track worker assignments for progress reporting\r\n let nextWorkerId = 1;\r\n const workerIdByEvalId = new Map<string, number>();\r\n\r\n // Map test cases to limited promises for parallel execution\r\n const promises = filteredEvalCases.map((evalCase) =>\r\n limit(async () => {\r\n // Assign worker ID when test starts executing\r\n const workerId = nextWorkerId++;\r\n workerIdByEvalId.set(evalCase.id, workerId);\r\n\r\n if (onProgress) {\r\n await onProgress({\r\n workerId,\r\n evalId: evalCase.id,\r\n status: \"running\",\r\n startedAt: Date.now(),\r\n });\r\n }\r\n\r\n try {\r\n const judgeProvider = await resolveJudgeProvider(target);\r\n const result = await runEvalCase({\r\n evalCase: evalCase,\r\n provider: primaryProvider,\r\n target,\r\n graders: graderRegistry,\r\n maxRetries,\r\n agentTimeoutMs,\r\n promptDumpDir,\r\n cache,\r\n useCache,\r\n now,\r\n judgeProvider,\r\n });\r\n\r\n if (onProgress) {\r\n await onProgress({\r\n workerId,\r\n evalId: evalCase.id,\r\n status: \"completed\",\r\n startedAt: 0, // Not used for completed status\r\n completedAt: Date.now(),\r\n });\r\n }\r\n\r\n if (onResult) {\r\n await onResult(result);\r\n }\r\n return result;\r\n } catch (error) {\r\n if (onProgress) {\r\n await onProgress({\r\n workerId,\r\n evalId: evalCase.id,\r\n status: \"failed\",\r\n completedAt: Date.now(),\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n }\r\n throw error;\r\n }\r\n }),\r\n );\r\n\r\n // Wait for all workers to complete\r\n const settled = await Promise.allSettled(promises);\r\n\r\n // Extract results, handling both fulfilled and rejected promises\r\n const results: EvaluationResult[] = [];\r\n for (let i = 0; i < settled.length; i++) {\r\n const outcome = settled[i];\r\n if (outcome.status === \"fulfilled\") {\r\n results.push(outcome.value);\r\n } else {\r\n // Build error result for rejected promise\r\n const evalCase = filteredEvalCases[i];\r\n const promptInputs = await buildPromptInputs(evalCase);\r\n const errorResult = buildErrorResult(\r\n evalCase,\r\n target.name,\r\n (now ?? (() => new Date()))(),\r\n outcome.reason,\r\n promptInputs,\r\n );\r\n results.push(errorResult);\r\n if (onResult) {\r\n await onResult(errorResult);\r\n }\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\nexport async function runEvalCase(options: RunEvalCaseOptions): Promise<EvaluationResult> {\r\n const {\r\n evalCase: evalCase,\r\n provider,\r\n target,\r\n graders,\r\n now,\r\n maxRetries,\r\n agentTimeoutMs,\r\n promptDumpDir,\r\n cache,\r\n useCache,\r\n signal,\r\n judgeProvider,\r\n } = options;\r\n\r\n const promptInputs = await buildPromptInputs(evalCase);\r\n if (promptDumpDir) {\r\n await dumpPrompt(promptDumpDir, evalCase, promptInputs);\r\n }\r\n\r\n const cacheKey = useCache ? createCacheKey(provider, target, evalCase, promptInputs) : undefined;\r\n let cachedResponse: ProviderResponse | undefined;\r\n if (cacheKey && cache) {\r\n cachedResponse = await cache.get(cacheKey);\r\n }\r\n\r\n const nowFn = now ?? (() => new Date());\r\n\r\n const attemptBudget = (maxRetries ?? 0) + 1;\r\n let attempt = 0;\r\n let providerResponse: ProviderResponse | undefined = cachedResponse;\r\n let lastError: unknown;\r\n\r\n while (!providerResponse && attempt < attemptBudget) {\r\n try {\r\n providerResponse = await invokeProvider(provider, {\r\n evalCase: evalCase,\r\n target,\r\n promptInputs,\r\n attempt,\r\n agentTimeoutMs,\r\n signal,\r\n });\r\n } catch (error) {\r\n lastError = error;\r\n if (isTimeoutLike(error) && attempt + 1 < attemptBudget) {\r\n attempt += 1;\r\n continue;\r\n }\r\n return buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs);\r\n }\r\n }\r\n\r\n if (!providerResponse) {\r\n return buildErrorResult(\r\n evalCase,\r\n target.name,\r\n nowFn(),\r\n lastError ?? new Error(\"Provider did not return a response\"),\r\n promptInputs,\r\n );\r\n }\r\n\r\n if (cacheKey && cache && !cachedResponse) {\r\n await cache.set(cacheKey, providerResponse);\r\n }\r\n\r\n const graderKind = evalCase.grader ?? \"heuristic\";\r\n const activeGrader = graders[graderKind] ?? graders.heuristic;\r\n if (!activeGrader) {\r\n throw new Error(`No grader registered for kind '${graderKind}'`);\r\n }\r\n\r\n let grade: GradeResult;\r\n try {\r\n const gradeTimestamp = nowFn();\r\n grade = await activeGrader.grade({\r\n evalCase: evalCase,\r\n candidate: providerResponse.text ?? \"\",\r\n target,\r\n provider,\r\n attempt,\r\n promptInputs,\r\n now: gradeTimestamp,\r\n judgeProvider,\r\n });\r\n } catch (error) {\r\n return buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs);\r\n }\r\n\r\n const completedAt = nowFn();\r\n const rawRequest: JsonObject = {\r\n request: promptInputs.request,\r\n guidelines: promptInputs.guidelines,\r\n guideline_paths: evalCase.guideline_paths,\r\n system_message: promptInputs.systemMessage ?? \"\",\r\n } as JsonObject;\r\n\r\n return {\r\n eval_id: evalCase.id,\r\n conversation_id: evalCase.conversation_id,\r\n score: grade.score,\r\n hits: grade.hits,\r\n misses: grade.misses,\r\n model_answer: providerResponse.text ?? \"\",\r\n expected_aspect_count: grade.expectedAspectCount,\r\n target: target.name,\r\n timestamp: completedAt.toISOString(),\r\n reasoning: grade.reasoning,\r\n raw_aspects: grade.rawAspects,\r\n raw_request: rawRequest,\r\n grader_raw_request: grade.graderRawRequest,\r\n } satisfies EvaluationResult;\r\n}\r\n\r\nfunction filterEvalCases(evalCases: readonly EvalCase[], evalId?: string): readonly EvalCase[] {\r\n if (!evalId) {\r\n return evalCases;\r\n }\r\n return evalCases.filter((evalCase) => evalCase.id === evalId);\r\n}\r\n\r\nfunction buildGraderRegistry(\r\n overrides: Partial<Record<string, Grader>> | undefined,\r\n resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>,\r\n): Partial<Record<string, Grader>> & { readonly heuristic: Grader } {\r\n const heuristic = overrides?.heuristic ?? new HeuristicGrader();\r\n const llmJudge =\r\n overrides?.llm_judge ??\r\n new QualityGrader({\r\n resolveJudgeProvider: async (context) => {\r\n if (context.judgeProvider) {\r\n return context.judgeProvider;\r\n }\r\n return resolveJudgeProvider(context.target);\r\n },\r\n });\r\n\r\n return {\r\n ...overrides,\r\n heuristic,\r\n llm_judge: llmJudge,\r\n };\r\n}\r\n\r\nasync function dumpPrompt(\r\n directory: string,\r\n evalCase: EvalCase,\r\n promptInputs: { readonly request: string; readonly guidelines: string },\r\n): Promise<void> {\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\r\n const filename = `${timestamp}_${sanitizeFilename(evalCase.id)}.json`;\r\n const filePath = path.resolve(directory, filename);\r\n\r\n await mkdir(path.dirname(filePath), { recursive: true });\r\n const payload = {\r\n eval_id: evalCase.id,\r\n request: promptInputs.request,\r\n guidelines: promptInputs.guidelines,\r\n guideline_paths: evalCase.guideline_paths,\r\n } satisfies Record<string, unknown>;\r\n\r\n await writeFile(filePath, JSON.stringify(payload, null, 2), \"utf8\");\r\n}\r\n\r\nfunction sanitizeFilename(value: string): string {\r\n if (!value) {\r\n return \"prompt\";\r\n }\r\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, \"_\");\r\n return sanitized.length > 0 ? sanitized : randomUUID();\r\n}\r\n\r\nasync function invokeProvider(\r\n provider: Provider,\r\n options: {\r\n readonly evalCase: EvalCase;\r\n readonly target: ResolvedTarget;\r\n readonly promptInputs: { readonly request: string; readonly guidelines: string; readonly systemMessage?: string };\r\n readonly attempt: number;\r\n readonly agentTimeoutMs?: number;\r\n readonly signal?: AbortSignal;\r\n },\r\n): Promise<ProviderResponse> {\r\n const { evalCase: evalCase, target, promptInputs, attempt, agentTimeoutMs, signal } = options;\r\n\r\n const controller = new AbortController();\r\n const timeout = agentTimeoutMs\r\n ? setTimeout(() => controller.abort(), agentTimeoutMs)\r\n : undefined;\r\n\r\n if (signal) {\r\n signal.addEventListener(\"abort\", () => controller.abort(), { once: true });\r\n }\r\n\r\n try {\r\n return await provider.invoke({\r\n prompt: promptInputs.request,\r\n guidelines: promptInputs.guidelines,\r\n guideline_patterns: evalCase.guideline_patterns,\r\n attachments: evalCase.file_paths,\r\n evalCaseId: evalCase.id,\r\n attempt,\r\n metadata: {\r\n systemPrompt: promptInputs.systemMessage ?? \"\",\r\n },\r\n signal: controller.signal,\r\n });\r\n } finally {\r\n if (timeout !== undefined) {\r\n clearTimeout(timeout);\r\n }\r\n }\r\n}\r\n\r\nfunction buildErrorResult(\r\n evalCase: EvalCase,\r\n targetName: string,\r\n timestamp: Date,\r\n error: unknown,\r\n promptInputs: { readonly request: string; readonly guidelines: string; readonly systemMessage?: string },\r\n): EvaluationResult {\r\n const message = error instanceof Error ? error.message : String(error);\r\n\r\n const rawRequest: JsonObject = {\r\n request: promptInputs.request,\r\n guidelines: promptInputs.guidelines,\r\n guideline_paths: evalCase.guideline_paths,\r\n system_message: promptInputs.systemMessage ?? \"\",\r\n error: message,\r\n } as JsonObject;\r\n\r\n return {\r\n eval_id: evalCase.id,\r\n conversation_id: evalCase.conversation_id,\r\n score: 0,\r\n hits: [],\r\n misses: [`Error: ${message}`],\r\n model_answer: `Error occurred: ${message}`,\r\n expected_aspect_count: 0,\r\n target: targetName,\r\n timestamp: timestamp.toISOString(),\r\n raw_aspects: [],\r\n raw_request: rawRequest,\r\n } satisfies EvaluationResult;\r\n}\r\n\r\nfunction createCacheKey(\r\n provider: Provider,\r\n target: ResolvedTarget,\r\n evalCase: EvalCase,\r\n promptInputs: { readonly request: string; readonly guidelines: string; readonly systemMessage?: string },\r\n): string {\r\n const hash = createHash(\"sha256\");\r\n hash.update(provider.id);\r\n hash.update(target.name);\r\n hash.update(evalCase.id);\r\n hash.update(promptInputs.request);\r\n hash.update(promptInputs.guidelines);\r\n hash.update(promptInputs.systemMessage ?? \"\");\r\n return hash.digest(\"hex\");\r\n}\r\n\r\nfunction isTimeoutLike(error: unknown): boolean {\r\n if (!error) {\r\n return false;\r\n }\r\n if (typeof DOMException !== \"undefined\" && error instanceof DOMException && error.name === \"AbortError\") {\r\n return true;\r\n }\r\n if (error instanceof Error) {\r\n const name = error.name?.toLowerCase();\r\n const message = error.message?.toLowerCase();\r\n return name.includes(\"timeout\") || message.includes(\"timeout\");\r\n }\r\n const value = String(error).toLowerCase();\r\n return value.includes(\"timeout\");\r\n}\r\n","/*\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\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","export * from \"./evaluation/types.js\";\r\nexport * from \"./evaluation/yaml-parser.js\";\r\nexport * from \"./evaluation/file-utils.js\";\r\nexport * from \"./evaluation/providers/index.js\";\r\nexport * from \"./evaluation/scoring.js\";\r\nexport * from \"./evaluation/grading.js\";\r\nexport * from \"./evaluation/orchestrator.js\";\r\n\r\nexport type AgentKernel = {\r\n status: string;\r\n};\r\n\r\nexport function createAgentKernel(): AgentKernel {\r\n return { status: \"stub\" };\r\n}\r\n"],"mappings":"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","names":["fileExists","readFile","path","readFile","path","path","constants","access","readFile","path","parse","fileExists","access","constants","path","readFile","parse","randomUUID","writeFile","path","path","writeFile","randomUUID"]}