@agentv/core 0.10.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/evaluation/types.ts","../src/evaluation/yaml-parser.ts","../src/evaluation/file-utils.ts","../src/evaluation/providers/ax.ts","../src/evaluation/providers/cli.ts","../src/evaluation/providers/codex.ts","../src/evaluation/providers/codex-log-tracker.ts","../src/evaluation/providers/preread.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/types.ts","../src/evaluation/providers/index.ts","../src/evaluation/evaluators.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"],"sourcesContent":["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/evaluators.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","/**\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\n\r\n\r\nconst EVALUATOR_KIND_VALUES = [\"code\", \"llm_judge\"] as const;\r\n\r\nexport type EvaluatorKind = (typeof EVALUATOR_KIND_VALUES)[number];\r\n\r\nconst EVALUATOR_KIND_SET: ReadonlySet<string> = new Set(EVALUATOR_KIND_VALUES);\r\n\r\nexport function isEvaluatorKind(value: unknown): value is EvaluatorKind {\r\n return typeof value === \"string\" && EVALUATOR_KIND_SET.has(value);\r\n}\r\n\r\nexport type CodeEvaluatorConfig = {\r\n readonly name: string;\r\n readonly type: \"code\";\r\n readonly script: string;\r\n readonly resolvedScriptPath?: string;\r\n readonly cwd?: string;\r\n readonly resolvedCwd?: string;\r\n};\r\n\r\nexport type LlmJudgeEvaluatorConfig = {\r\n readonly name: string;\r\n readonly type: \"llm_judge\";\r\n readonly prompt?: string;\r\n readonly promptPath?: string;\r\n};\r\n\r\nexport type EvaluatorConfig = CodeEvaluatorConfig | LlmJudgeEvaluatorConfig;\r\n\r\n/**\r\n * Eval case definition sourced from AgentV specs.\r\n */\r\nexport interface EvalCase {\r\n readonly id: string;\r\n readonly dataset?: string;\r\n readonly conversation_id?: string;\r\n readonly question: string;\r\n readonly input_messages: readonly TestMessage[];\r\n readonly input_segments: readonly JsonObject[];\r\n readonly output_segments: readonly JsonObject[];\r\n readonly reference_answer?: 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 expected_outcome: string;\r\n readonly evaluator?: EvaluatorKind;\r\n readonly evaluators?: readonly EvaluatorConfig[];\r\n}\r\n\r\n/**\r\n * Evaluator scorecard for a single eval case run.\r\n */\r\nexport interface EvaluationResult {\r\n readonly eval_id: string;\r\n readonly dataset?: 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 candidate_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 agent_provider_request?: JsonObject;\r\n readonly lm_provider_request?: JsonObject;\r\n readonly evaluator_raw_request?: JsonObject;\r\n readonly evaluator_results?: readonly EvaluatorResult[];\r\n readonly error?: string;\r\n}\r\n\r\nexport interface EvaluatorResult {\r\n readonly name: string;\r\n readonly type: EvaluatorKind;\r\n readonly score: number;\r\n readonly hits: readonly string[];\r\n readonly misses: readonly string[];\r\n readonly reasoning?: string;\r\n readonly raw_request?: JsonObject;\r\n readonly evaluator_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 { ChatPrompt } from \"./providers/types.js\";\r\nimport type {\r\n EvaluatorConfig,\r\n EvaluatorKind,\r\n JsonObject,\r\n JsonValue,\r\n EvalCase,\r\n TestMessage,\r\n} from \"./types.js\";\r\nimport { isEvaluatorKind, 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 * Read metadata from a test suite file (like target name).\r\n * This is a convenience function for CLI tools that need metadata without loading all eval cases.\r\n */\r\nexport async function readTestSuiteMetadata(testFilePath: string): Promise<{ target?: string }> {\r\n try {\r\n const absolutePath = path.resolve(testFilePath);\r\n const content = await readFile(absolutePath, \"utf8\");\r\n const parsed = parse(content) as unknown;\r\n \r\n if (!isJsonObject(parsed)) {\r\n return {};\r\n }\r\n \r\n return { target: extractTargetFromSuite(parsed) };\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * Extract target name from parsed eval suite (checks execution.target then falls back to root-level target).\r\n */\r\nfunction extractTargetFromSuite(suite: JsonObject): string | undefined {\r\n // Check execution.target first (new location), fallback to root-level target (legacy)\r\n const execution = suite.execution;\r\n if (execution && typeof execution === \"object\" && !Array.isArray(execution)) {\r\n const executionTarget = (execution as Record<string, unknown>).target;\r\n if (typeof executionTarget === \"string\" && executionTarget.trim().length > 0) {\r\n return executionTarget.trim();\r\n }\r\n }\r\n \r\n // Fallback to legacy root-level target\r\n const targetValue = suite.target;\r\n if (typeof targetValue === \"string\" && targetValue.trim().length > 0) {\r\n return targetValue.trim();\r\n }\r\n \r\n return undefined;\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 readonly evalId?: string;\r\n};\r\n\r\ntype RawTestSuite = JsonObject & {\r\n readonly $schema?: JsonValue;\r\n readonly evalcases?: JsonValue;\r\n readonly target?: JsonValue;\r\n readonly execution?: JsonValue;\r\n readonly dataset?: 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 execution?: JsonValue;\r\n readonly evaluators?: JsonValue;\r\n};\r\n\r\n/**\r\n * Process message content into structured segments with file resolution.\r\n */\r\nasync function processMessages(options: {\r\n readonly messages: readonly TestMessage[];\r\n readonly searchRoots: readonly string[];\r\n readonly repoRootPath: string;\r\n readonly guidelinePatterns?: readonly string[];\r\n readonly guidelinePaths?: string[];\r\n readonly textParts?: string[];\r\n readonly messageType: \"input\" | \"output\";\r\n readonly verbose: boolean;\r\n}): Promise<JsonObject[]> {\r\n const {\r\n messages,\r\n searchRoots,\r\n repoRootPath,\r\n guidelinePatterns,\r\n guidelinePaths,\r\n textParts,\r\n messageType,\r\n verbose,\r\n } = options;\r\n\r\n const segments: JsonObject[] = [];\r\n\r\n for (const message of messages) {\r\n const content = message.content;\r\n if (typeof content === \"string\") {\r\n segments.push({ type: \"text\", value: content });\r\n if (textParts) {\r\n textParts.push(content);\r\n }\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 const context = messageType === \"input\" ? \"\" : \" in expected_messages\";\r\n logWarning(`File not found${context}: ${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 // Only check for guidelines in input messages\r\n if (messageType === \"input\" && guidelinePatterns && guidelinePaths) {\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 continue;\r\n }\r\n }\r\n\r\n segments.push({\r\n type: \"file\",\r\n path: displayPath,\r\n text: fileContent,\r\n resolvedPath: path.resolve(resolvedPath),\r\n });\r\n\r\n if (verbose) {\r\n const label = messageType === \"input\" ? \"[File]\" : \"[Expected Output File]\";\r\n console.log(` ${label} Found: ${displayPath}`);\r\n console.log(` Resolved to: ${resolvedPath}`);\r\n }\r\n } catch (error) {\r\n const context = messageType === \"input\" ? \"\" : \" expected output\";\r\n logWarning(`Could not read${context} file ${resolvedPath}: ${(error as Error).message}`);\r\n }\r\n continue;\r\n }\r\n\r\n const clonedSegment = cloneJsonObject(rawSegment);\r\n segments.push(clonedSegment);\r\n const inlineValue = clonedSegment.value;\r\n if (typeof inlineValue === \"string\" && textParts) {\r\n textParts.push(inlineValue);\r\n }\r\n }\r\n }\r\n\r\n return segments;\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 evalIdFilter = options?.evalId;\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 const datasetNameFromSuite = asString(suite.dataset)?.trim();\r\n const fallbackDataset = path.basename(absoluteTestPath).replace(/\\.ya?ml$/i, \"\") || \"eval\";\r\n const datasetName =\r\n datasetNameFromSuite && datasetNameFromSuite.length > 0 ? datasetNameFromSuite : fallbackDataset;\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 globalEvaluator = coerceEvaluator(suite.evaluator, \"global\") ?? \"llm_judge\";\r\n \r\n // Extract global target from execution.target (or legacy root-level target)\r\n const globalExecution = isJsonObject(suite.execution) ? suite.execution : undefined;\r\n const globalTarget = asString(globalExecution?.target) ?? asString(suite.target);\r\n \r\n const results: EvalCase[] = [];\r\n\r\n for (const rawEvalcase of rawTestcases) {\r\n if (!isJsonObject(rawEvalcase)) {\r\n logWarning(\"Skipping invalid eval 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 \r\n // Skip eval cases that don't match the filter\r\n if (evalIdFilter && id !== evalIdFilter) {\r\n continue;\r\n }\r\n \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 eval case: ${id ?? \"unknown\"}`);\r\n continue;\r\n }\r\n \r\n // expected_messages is optional - for outcome-only evaluation\r\n const hasExpectedMessages = Array.isArray(expectedMessagesValue) && expectedMessagesValue.length > 0;\r\n\r\n // V2 format: input_messages vs expected_messages\r\n const inputMessages = inputMessagesValue.filter((msg): msg is TestMessage => isTestMessage(msg));\r\n const expectedMessages = hasExpectedMessages \r\n ? expectedMessagesValue.filter((msg): msg is TestMessage => isTestMessage(msg))\r\n : [];\r\n \r\n if (hasExpectedMessages && expectedMessages.length === 0) {\r\n logWarning(`No valid expected message found for eval case: ${id}`);\r\n continue;\r\n }\r\n\r\n if (expectedMessages.length > 1) {\r\n logWarning(`Multiple expected messages found for eval case: ${id}, using first`);\r\n }\r\n\r\n const guidelinePaths: string[] = [];\r\n const inputTextParts: string[] = [];\r\n\r\n // Process all input messages to extract files and guidelines\r\n const inputSegments = await processMessages({\r\n messages: inputMessages,\r\n searchRoots,\r\n repoRootPath,\r\n guidelinePatterns,\r\n guidelinePaths,\r\n textParts: inputTextParts,\r\n messageType: \"input\",\r\n verbose,\r\n });\r\n\r\n // Process expected_messages into segments (only if provided)\r\n const outputSegments = hasExpectedMessages\r\n ? await processMessages({\r\n messages: expectedMessages,\r\n searchRoots,\r\n repoRootPath,\r\n guidelinePatterns,\r\n messageType: \"output\",\r\n verbose,\r\n })\r\n : [];\r\n\r\n const codeSnippets = extractCodeBlocks(inputSegments);\r\n const expectedContent = expectedMessages[0]?.content;\r\n const referenceAnswer = expectedContent \r\n ? await resolveAssistantContent(expectedContent, searchRoots, verbose)\r\n : \"\";\r\n const question = inputTextParts\r\n .map((part) => part.trim())\r\n .filter((part) => part.length > 0)\r\n .join(\" \");\r\n\r\n const evalCaseEvaluatorKind = coerceEvaluator(evalcase.evaluator, id) ?? globalEvaluator;\r\n const evaluators = await parseEvaluators(evalcase, globalExecution, searchRoots, id ?? \"unknown\");\r\n\r\n // Extract file paths from all input segments (non-guideline files)\r\n const userFilePaths: string[] = [];\r\n for (const segment of inputSegments) {\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 dataset: datasetName,\r\n conversation_id: conversationId,\r\n question: question,\r\n input_messages: inputMessages,\r\n input_segments: inputSegments,\r\n output_segments: outputSegments,\r\n reference_answer: referenceAnswer,\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 expected_outcome: outcome,\r\n evaluator: evalCaseEvaluatorKind,\r\n evaluators,\r\n };\r\n\r\n if (verbose) {\r\n console.log(`\\n[Eval 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 * Detect if role markers are needed based on conversational structure.\r\n * \r\n * Role markers ([System]:, [User]:, etc.) are added when:\r\n * 1. There are assistant/tool messages (true multi-turn conversation), OR\r\n * 2. There are multiple messages that will produce visible content in the formatted output\r\n */\r\nfunction needsRoleMarkers(\r\n messages: readonly TestMessage[],\r\n processedSegmentsByMessage: readonly (readonly JsonObject[])[],\r\n): boolean {\r\n // Check for multi-turn conversation (assistant/tool messages)\r\n if (messages.some((msg) => msg.role === \"assistant\" || msg.role === \"tool\")) {\r\n return true;\r\n }\r\n \r\n // Count how many messages have actual content after processing\r\n let messagesWithContent = 0;\r\n \r\n for (const segments of processedSegmentsByMessage) {\r\n if (hasVisibleContent(segments)) {\r\n messagesWithContent++;\r\n }\r\n }\r\n \r\n return messagesWithContent > 1;\r\n}\r\n\r\n/**\r\n * Check if processed segments contain visible content (text or file attachments).\r\n */\r\nfunction hasVisibleContent(segments: readonly JsonObject[]): boolean {\r\n return segments.some((segment) => {\r\n const type = asString(segment.type);\r\n \r\n if (type === \"text\") {\r\n const value = asString(segment.value);\r\n return value !== undefined && value.trim().length > 0;\r\n }\r\n\r\n if (type === \"guideline_ref\") {\r\n return false;\r\n }\r\n \r\n if (type === \"file\") {\r\n const text = asString(segment.text);\r\n return text !== undefined && text.trim().length > 0;\r\n }\r\n \r\n return false;\r\n });\r\n}\r\n\r\n/**\r\n * Format a segment into its display string.\r\n * Text segments return their value; file segments return formatted file content with header.\r\n */\r\nfunction formatSegment(segment: JsonObject): string | undefined {\r\n const type = asString(segment.type);\r\n \r\n if (type === \"text\") {\r\n return asString(segment.value);\r\n }\r\n\r\n if (type === \"guideline_ref\") {\r\n const refPath = asString(segment.path);\r\n return refPath ? `<Attached: ${refPath}>` : undefined;\r\n }\r\n \r\n if (type === \"file\") {\r\n const text = asString(segment.text);\r\n const filePath = asString(segment.path);\r\n if (text && filePath) {\r\n return `=== ${filePath} ===\\n${text}`;\r\n }\r\n }\r\n \r\n return undefined;\r\n}\r\n\r\n/**\r\n * Build prompt inputs by consolidating user request context and guideline content.\r\n */\r\nexport interface PromptInputs {\r\n readonly question: string;\r\n readonly guidelines: string;\r\n readonly chatPrompt?: ChatPrompt;\r\n readonly systemMessage?: string;\r\n}\r\n\r\nexport async function buildPromptInputs(testCase: EvalCase): Promise<PromptInputs> {\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 guidelines = guidelineContents\r\n .map((part) => part.trim())\r\n .filter((part) => part.length > 0)\r\n .join(\"\\n\\n\");\r\n\r\n // Build segments per message to determine if role markers are needed\r\n const segmentsByMessage: JsonObject[][] = [];\r\n const fileContentsByPath = new Map<string, string>();\r\n for (const segment of testCase.input_segments) {\r\n if (segment.type === \"file\" && typeof segment.path === \"string\" && typeof segment.text === \"string\") {\r\n fileContentsByPath.set(segment.path, segment.text);\r\n }\r\n }\r\n \r\n for (const message of testCase.input_messages) {\r\n const messageSegments: JsonObject[] = [];\r\n \r\n if (typeof message.content === \"string\") {\r\n if (message.content.trim().length > 0) {\r\n messageSegments.push({ type: \"text\", value: message.content });\r\n }\r\n } else if (Array.isArray(message.content)) {\r\n for (const segment of message.content) {\r\n if (typeof segment === \"string\") {\r\n if (segment.trim().length > 0) {\r\n messageSegments.push({ type: \"text\", value: segment });\r\n }\r\n } else if (isJsonObject(segment)) {\r\n const type = asString(segment.type);\r\n \r\n if (type === \"file\") {\r\n const value = asString(segment.value);\r\n if (!value) continue;\r\n \r\n // Check if this is a guideline file (extracted separately)\r\n if (testCase.guideline_patterns && isGuidelineFile(value, testCase.guideline_patterns)) {\r\n // Reference marker only - actual content is in guidelines field\r\n messageSegments.push({ type: \"guideline_ref\", path: value });\r\n continue;\r\n }\r\n \r\n // Find the file content from input_segments\r\n const fileText = fileContentsByPath.get(value);\r\n \r\n if (fileText !== undefined) {\r\n messageSegments.push({ type: \"file\", text: fileText, path: value });\r\n }\r\n } else if (type === \"text\") {\r\n const textValue = asString(segment.value);\r\n if (textValue && textValue.trim().length > 0) {\r\n messageSegments.push({ type: \"text\", value: textValue });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n segmentsByMessage.push(messageSegments);\r\n }\r\n\r\n // Determine if we need role markers based on actual processed content\r\n const useRoleMarkers = needsRoleMarkers(testCase.input_messages, segmentsByMessage);\r\n\r\n let question: string;\r\n \r\n if (useRoleMarkers) {\r\n // Multi-turn format with role markers using pre-computed segments\r\n const messageParts: string[] = [];\r\n \r\n for (let i = 0; i < testCase.input_messages.length; i++) {\r\n const message = testCase.input_messages[i];\r\n const segments = segmentsByMessage[i];\r\n \r\n if (!hasVisibleContent(segments)) {\r\n continue;\r\n }\r\n \r\n const roleLabel = message.role.charAt(0).toUpperCase() + message.role.slice(1);\r\n const contentParts: string[] = [];\r\n \r\n for (const segment of segments) {\r\n const formattedContent = formatSegment(segment);\r\n if (formattedContent) {\r\n contentParts.push(formattedContent);\r\n }\r\n }\r\n \r\n if (contentParts.length > 0) {\r\n const messageContent = contentParts.join(\"\\n\");\r\n messageParts.push(`@[${roleLabel}]:\\n${messageContent}`);\r\n }\r\n }\r\n \r\n question = messageParts.join(\"\\n\\n\");\r\n } else {\r\n // Single-turn flat format\r\n const questionParts: string[] = [];\r\n for (const segment of testCase.input_segments) {\r\n const formattedContent = formatSegment(segment);\r\n if (formattedContent) {\r\n questionParts.push(formattedContent);\r\n }\r\n }\r\n\r\n if (testCase.code_snippets.length > 0) {\r\n questionParts.push(testCase.code_snippets.join(\"\\n\"));\r\n }\r\n\r\n question = questionParts\r\n .map((part) => part.trim())\r\n .filter((part) => part.length > 0)\r\n .join(\"\\n\\n\");\r\n }\r\n\r\n const chatPrompt = useRoleMarkers\r\n ? buildChatPromptFromSegments({\r\n messages: testCase.input_messages,\r\n segmentsByMessage,\r\n guidelinePatterns: testCase.guideline_patterns,\r\n guidelineContent: guidelines,\r\n })\r\n : undefined;\r\n\r\n return { question, guidelines, chatPrompt };\r\n}\r\n\r\nfunction buildChatPromptFromSegments(options: {\r\n readonly messages: readonly TestMessage[];\r\n readonly segmentsByMessage: readonly JsonObject[][];\r\n readonly guidelinePatterns?: readonly string[];\r\n readonly guidelineContent?: string;\r\n readonly systemPrompt?: string;\r\n}): ChatPrompt | undefined {\r\n const { messages, segmentsByMessage, guidelinePatterns, guidelineContent, systemPrompt } = options;\r\n\r\n if (messages.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const systemSegments: string[] = [];\r\n\r\n if (systemPrompt && systemPrompt.trim().length > 0) {\r\n systemSegments.push(systemPrompt.trim());\r\n }\r\n\r\n if (guidelineContent && guidelineContent.trim().length > 0) {\r\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${guidelineContent.trim()}`);\r\n }\r\n\r\n let startIndex = 0;\r\n while (startIndex < messages.length && messages[startIndex].role === \"system\") {\r\n const segments = segmentsByMessage[startIndex];\r\n const contentParts: string[] = [];\r\n\r\n for (const segment of segments) {\r\n const formatted = formatSegment(segment);\r\n if (formatted) {\r\n contentParts.push(formatted);\r\n }\r\n }\r\n\r\n if (contentParts.length > 0) {\r\n systemSegments.push(contentParts.join(\"\\n\"));\r\n }\r\n\r\n startIndex += 1;\r\n }\r\n\r\n const chatPrompt: ChatPrompt = [];\r\n\r\n if (systemSegments.length > 0) {\r\n chatPrompt.push({\r\n role: \"system\",\r\n content: systemSegments.join(\"\\n\\n\"),\r\n });\r\n }\r\n\r\n for (let i = startIndex; i < messages.length; i++) {\r\n const message = messages[i];\r\n const segments = segmentsByMessage[i];\r\n const contentParts: string[] = [];\r\n\r\n let role: string = message.role;\r\n let name: string | undefined;\r\n\r\n if (role === \"system\") {\r\n role = \"assistant\";\r\n contentParts.push(\"@[System]:\");\r\n } else if (role === \"tool\") {\r\n // Map 'tool' to 'function' for Ax compatibility\r\n role = \"function\";\r\n name = \"tool\";\r\n }\r\n\r\n for (const segment of segments) {\r\n if (segment.type === \"guideline_ref\") {\r\n continue;\r\n }\r\n const formatted = formatSegment(segment);\r\n if (formatted) {\r\n const isGuidelineRef =\r\n segment.type === \"file\" &&\r\n typeof segment.path === \"string\" &&\r\n guidelinePatterns &&\r\n isGuidelineFile(segment.path, guidelinePatterns);\r\n\r\n if (isGuidelineRef) {\r\n continue;\r\n }\r\n\r\n contentParts.push(formatted);\r\n }\r\n }\r\n\r\n if (contentParts.length === 0) {\r\n continue;\r\n }\r\n\r\n chatPrompt.push({\r\n role: role,\r\n content: contentParts.join(\"\\n\"),\r\n ...(name ? { name } : {}),\r\n } as unknown as ChatPrompt[number]);\r\n }\r\n\r\n return chatPrompt.length > 0 ? chatPrompt : undefined;\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\nasync function parseEvaluators(\r\n rawEvalCase: RawEvalCase,\r\n globalExecution: JsonObject | undefined,\r\n searchRoots: readonly string[],\r\n evalId: string,\r\n): Promise<readonly EvaluatorConfig[] | undefined> {\r\n const execution = rawEvalCase.execution;\r\n // Priority: case-level execution.evaluators > case-level evaluators > global execution.evaluators\r\n const candidateEvaluators = isJsonObject(execution) \r\n ? execution.evaluators ?? rawEvalCase.evaluators \r\n : rawEvalCase.evaluators ?? globalExecution?.evaluators;\r\n if (candidateEvaluators === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (!Array.isArray(candidateEvaluators)) {\r\n logWarning(`Skipping evaluators for '${evalId}': expected array`);\r\n return undefined;\r\n }\r\n\r\n const evaluators: EvaluatorConfig[] = [];\r\n\r\n for (const rawEvaluator of candidateEvaluators) {\r\n if (!isJsonObject(rawEvaluator)) {\r\n logWarning(`Skipping invalid evaluator entry for '${evalId}' (expected object)`);\r\n continue;\r\n }\r\n\r\n const name = asString(rawEvaluator.name);\r\n const typeValue = rawEvaluator.type;\r\n\r\n if (!name || !isEvaluatorKind(typeValue)) {\r\n logWarning(`Skipping evaluator with invalid name/type in '${evalId}'`);\r\n continue;\r\n }\r\n\r\n if (typeValue === \"code\") {\r\n const script = asString(rawEvaluator.script);\r\n if (!script) {\r\n logWarning(`Skipping code evaluator '${name}' in '${evalId}': missing script`);\r\n continue;\r\n }\r\n\r\n const cwd = asString(rawEvaluator.cwd);\r\n let resolvedCwd: string | undefined;\r\n\r\n // Resolve cwd if provided (relative to eval file), otherwise default to eval file directory\r\n if (cwd) {\r\n const resolved = await resolveFileReference(cwd, searchRoots);\r\n if (resolved.resolvedPath) {\r\n resolvedCwd = path.resolve(resolved.resolvedPath);\r\n } else {\r\n logWarning(\r\n `Code evaluator '${name}' in '${evalId}': cwd not found (${resolved.displayPath})`,\r\n resolved.attempted.length > 0 ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`) : undefined,\r\n );\r\n }\r\n } else {\r\n // Default to the directory containing the eval file (first search root)\r\n resolvedCwd = searchRoots[0];\r\n }\r\n\r\n evaluators.push({\r\n name,\r\n type: \"code\",\r\n script,\r\n cwd,\r\n resolvedCwd,\r\n });\r\n continue;\r\n }\r\n\r\n const prompt = asString(rawEvaluator.prompt);\r\n let promptPath: string | undefined;\r\n if (prompt) {\r\n const resolved = await resolveFileReference(prompt, searchRoots);\r\n if (resolved.resolvedPath) {\r\n promptPath = path.resolve(resolved.resolvedPath);\r\n } else {\r\n logWarning(\r\n `Inline prompt used for evaluator '${name}' in '${evalId}' (file not found: ${resolved.displayPath})`,\r\n resolved.attempted.length > 0 ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`) : undefined,\r\n );\r\n }\r\n }\r\n\r\n const model = asString(rawEvaluator.model);\r\n\r\n evaluators.push({\r\n name,\r\n type: \"llm_judge\",\r\n prompt,\r\n promptPath\r\n });\r\n }\r\n\r\n return evaluators.length > 0 ? evaluators : undefined;\r\n}\r\n\r\nfunction coerceEvaluator(candidate: JsonValue | undefined, contextId: string): EvaluatorKind | undefined {\r\n if (typeof candidate !== \"string\") {\r\n return undefined;\r\n }\r\n if (isEvaluatorKind(candidate)) {\r\n return candidate;\r\n }\r\n logWarning(`Unknown evaluator '${candidate}' in ${contextId}, 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 { constants } from \"node:fs\";\r\nimport { access, readFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nexport async function fileExists(filePath: string): Promise<boolean> {\r\n try {\r\n await access(filePath, constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Normalize line endings to LF (\\n).\r\n * This ensures consistent behavior across Windows (CRLF) and Unix (LF) systems.\r\n */\r\nexport function normalizeLineEndings(content: string): string {\r\n return content.replace(/\\r\\n/g, \"\\n\");\r\n}\r\n\r\n/**\r\n * Read a text file and normalize line endings to LF (\\n).\r\n * This ensures consistent behavior across Windows (CRLF) and Unix (LF) systems.\r\n */\r\nexport async function readTextFile(filePath: string): Promise<string> {\r\n const content = await readFile(filePath, \"utf8\");\r\n return normalizeLineEndings(content);\r\n}\r\n\r\n/**\r\n * Find git repository root by walking up the directory tree.\r\n */\r\nexport async function findGitRoot(startPath: string): Promise<string | null> {\r\n let currentDir = path.dirname(path.resolve(startPath));\r\n const root = path.parse(currentDir).root;\r\n\r\n while (currentDir !== root) {\r\n const gitPath = path.join(currentDir, \".git\");\r\n if (await fileExists(gitPath)) {\r\n return currentDir;\r\n }\r\n\r\n const parentDir = path.dirname(currentDir);\r\n if (parentDir === currentDir) {\r\n break;\r\n }\r\n currentDir = parentDir;\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Build a chain of directories walking from a file's location up to repo root.\r\n * Used for discovering configuration files like targets.yaml or config.yaml.\r\n */\r\nexport function buildDirectoryChain(filePath: string, repoRoot: string): readonly string[] {\r\n const directories: string[] = [];\r\n const seen = new Set<string>();\r\n const boundary = path.resolve(repoRoot);\r\n let current: string | undefined = path.resolve(path.dirname(filePath));\r\n\r\n while (current !== undefined) {\r\n if (!seen.has(current)) {\r\n directories.push(current);\r\n seen.add(current);\r\n }\r\n if (current === boundary) {\r\n break;\r\n }\r\n const parent = path.dirname(current);\r\n if (parent === current) {\r\n break;\r\n }\r\n current = parent;\r\n }\r\n\r\n if (!seen.has(boundary)) {\r\n directories.push(boundary);\r\n }\r\n\r\n return directories;\r\n}\r\n\r\n/**\r\n * Build search roots for file resolution, matching yaml-parser behavior.\r\n * Searches from eval file directory up to repo root.\r\n */\r\nexport function buildSearchRoots(evalPath: string, repoRoot: string): readonly string[] {\r\n const uniqueRoots: string[] = [];\r\n const addRoot = (root: string): void => {\r\n const normalized = path.resolve(root);\r\n if (!uniqueRoots.includes(normalized)) {\r\n uniqueRoots.push(normalized);\r\n }\r\n };\r\n\r\n let currentDir = path.dirname(evalPath);\r\n let reachedBoundary = false;\r\n while (!reachedBoundary) {\r\n addRoot(currentDir);\r\n const parentDir = path.dirname(currentDir);\r\n if (currentDir === repoRoot || parentDir === currentDir) {\r\n reachedBoundary = true;\r\n } else {\r\n currentDir = parentDir;\r\n }\r\n }\r\n\r\n addRoot(repoRoot);\r\n addRoot(process.cwd());\r\n return uniqueRoots;\r\n}\r\n\r\n/**\r\n * Trim leading path separators for display.\r\n */\r\nfunction trimLeadingSeparators(value: string): string {\r\n const trimmed = value.replace(/^[/\\\\]+/, \"\");\r\n return trimmed.length > 0 ? trimmed : value;\r\n}\r\n\r\n/**\r\n * Resolve a file reference using search roots, matching yaml-parser behavior.\r\n */\r\nexport async function resolveFileReference(\r\n rawValue: string,\r\n searchRoots: readonly string[],\r\n): Promise<{\r\n readonly displayPath: string;\r\n readonly resolvedPath?: string;\r\n readonly attempted: readonly string[];\r\n}> {\r\n const displayPath = trimLeadingSeparators(rawValue);\r\n const potentialPaths: string[] = [];\r\n\r\n if (path.isAbsolute(rawValue)) {\r\n potentialPaths.push(path.normalize(rawValue));\r\n }\r\n\r\n for (const base of searchRoots) {\r\n potentialPaths.push(path.resolve(base, displayPath));\r\n }\r\n\r\n const attempted: string[] = [];\r\n const seen = new Set<string>();\r\n for (const candidate of potentialPaths) {\r\n const absoluteCandidate = path.resolve(candidate);\r\n if (seen.has(absoluteCandidate)) {\r\n continue;\r\n }\r\n seen.add(absoluteCandidate);\r\n attempted.push(absoluteCandidate);\r\n if (await fileExists(absoluteCandidate)) {\r\n return { displayPath, resolvedPath: absoluteCandidate, attempted };\r\n }\r\n }\r\n\r\n return { displayPath, attempted };\r\n}\r\n","import { 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 RetryConfig,\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 const hasSystemMessage = request.chatPrompt.some((message) => message.role === \"system\");\r\n if (hasSystemMessage) {\r\n return request.chatPrompt;\r\n }\r\n\r\n const systemContent = resolveSystemContent(request);\r\n return [{ role: \"system\", content: systemContent }, ...request.chatPrompt];\r\n }\r\n\r\n const systemContent = resolveSystemContent(request);\r\n const userContent = request.question.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 resolveSystemContent(request: ProviderRequest): string {\r\n const systemSegments: string[] = [];\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 } else {\r\n systemSegments.push(DEFAULT_SYSTEM_PROMPT);\r\n }\r\n\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 return systemSegments.join(\"\\n\\n\");\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\nfunction isRetryableError(error: unknown, retryableStatusCodes: readonly number[]): boolean {\r\n if (!error || typeof error !== \"object\") {\r\n return false;\r\n }\r\n\r\n // Check for status code in various error formats\r\n if (\"status\" in error && typeof error.status === \"number\") {\r\n return retryableStatusCodes.includes(error.status);\r\n }\r\n\r\n // Check for HTTP status in error message\r\n if (\"message\" in error && typeof error.message === \"string\") {\r\n const match = error.message.match(/HTTP (\\d{3})/);\r\n if (match) {\r\n const status = Number.parseInt(match[1], 10);\r\n return retryableStatusCodes.includes(status);\r\n }\r\n }\r\n\r\n // Network errors are retryable\r\n if (\"name\" in error && error.name === \"AxAIServiceNetworkError\") {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction calculateRetryDelay(attempt: number, config: Required<RetryConfig>): number {\r\n const delay = Math.min(\r\n config.maxDelayMs,\r\n config.initialDelayMs * config.backoffFactor ** attempt,\r\n );\r\n // Add jitter (0.75-1.25x of calculated delay)\r\n return delay * (0.75 + Math.random() * 0.5);\r\n}\r\n\r\nasync function sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nasync function withRetry<T>(\r\n fn: () => Promise<T>,\r\n retryConfig?: RetryConfig,\r\n signal?: AbortSignal,\r\n): Promise<T> {\r\n // Use default retry config if not provided\r\n const config: Required<RetryConfig> = {\r\n maxRetries: retryConfig?.maxRetries ?? 3,\r\n initialDelayMs: retryConfig?.initialDelayMs ?? 1000,\r\n maxDelayMs: retryConfig?.maxDelayMs ?? 60000,\r\n backoffFactor: retryConfig?.backoffFactor ?? 2,\r\n retryableStatusCodes: retryConfig?.retryableStatusCodes ?? [500, 408, 429, 502, 503, 504],\r\n };\r\n\r\n let lastError: unknown;\r\n\r\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\r\n // Check if aborted before attempting\r\n if (signal?.aborted) {\r\n throw new Error(`Request aborted: ${signal.reason ?? \"Unknown reason\"}`);\r\n }\r\n\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n lastError = error;\r\n\r\n // Don't retry if this is the last attempt\r\n if (attempt >= config.maxRetries) {\r\n break;\r\n }\r\n\r\n // Check if error is retryable\r\n if (!isRetryableError(error, config.retryableStatusCodes)) {\r\n throw error;\r\n }\r\n\r\n // Calculate delay and wait\r\n const delay = calculateRetryDelay(attempt, config);\r\n await sleep(delay);\r\n\r\n // Check if aborted during sleep\r\n if (signal?.aborted) {\r\n throw new Error(`Request aborted: ${signal.reason ?? \"Unknown reason\"}`);\r\n }\r\n }\r\n }\r\n\r\n // All retries exhausted\r\n throw lastError;\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 private readonly retryConfig?: RetryConfig;\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 this.retryConfig = config.retry;\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 withRetry(\r\n async () =>\r\n 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 this.retryConfig,\r\n request.signal,\r\n );\r\n\r\n return mapResponse(ensureChatResponse(response));\r\n }\r\n\r\n getAxAI(): AxAiInstance {\r\n return this.ai;\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 private readonly retryConfig?: RetryConfig;\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 this.retryConfig = config.retry;\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 withRetry(\r\n async () =>\r\n 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 this.retryConfig,\r\n request.signal,\r\n );\r\n\r\n return mapResponse(ensureChatResponse(response));\r\n }\r\n\r\n getAxAI(): AxAiInstance {\r\n return this.ai;\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 private readonly retryConfig?: RetryConfig;\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 this.retryConfig = config.retry;\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 withRetry(\r\n async () =>\r\n 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 this.retryConfig,\r\n request.signal,\r\n );\r\n\r\n return mapResponse(ensureChatResponse(response));\r\n }\r\n\r\n getAxAI(): AxAiInstance {\r\n return this.ai;\r\n }\r\n}\r\n","import { exec as execWithCallback, type ExecException, type ExecOptions } from \"node:child_process\";\r\nimport fs from \"node:fs/promises\";\r\nimport os from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { promisify } from \"node:util\";\r\n\r\nimport type { CliResolvedConfig } from \"./targets.js\";\r\nimport type { Provider, ProviderRequest, ProviderResponse } from \"./types.js\";\r\nimport { readTextFile } from \"../file-utils.js\";\r\n\r\nconst execAsync = promisify(execWithCallback);\r\nconst DEFAULT_MAX_BUFFER = 10 * 1024 * 1024; // 10 MB to accommodate verbose CLI output\r\n\r\nexport interface CommandRunOptions {\r\n readonly cwd?: string;\r\n readonly env?: NodeJS.ProcessEnv;\r\n readonly timeoutMs?: number;\r\n readonly signal?: AbortSignal;\r\n}\r\n\r\nexport interface CommandRunResult {\r\n readonly stdout: string;\r\n readonly stderr: string;\r\n readonly exitCode: number | null;\r\n readonly failed: boolean;\r\n readonly timedOut?: boolean;\r\n readonly signal?: NodeJS.Signals | null;\r\n}\r\n\r\nexport type CommandRunner = (command: string, options: CommandRunOptions) => Promise<CommandRunResult>;\r\n\r\nasync function defaultCommandRunner(\r\n command: string,\r\n options: CommandRunOptions,\r\n): Promise<CommandRunResult> {\r\n const execOptions: ExecOptions = {\r\n cwd: options.cwd,\r\n env: options.env,\r\n timeout: options.timeoutMs,\r\n signal: options.signal,\r\n maxBuffer: DEFAULT_MAX_BUFFER,\r\n shell: process.platform === \"win32\" ? \"powershell.exe\" : undefined,\r\n };\r\n\r\n try {\r\n const { stdout, stderr } = await execAsync(command, execOptions);\r\n\r\n return {\r\n stdout,\r\n stderr,\r\n exitCode: 0,\r\n failed: false,\r\n timedOut: false,\r\n signal: null,\r\n };\r\n } catch (error) {\r\n const execError = error as ExecException & {\r\n stdout?: string;\r\n stderr?: string;\r\n timedOut?: boolean;\r\n killed?: boolean;\r\n };\r\n\r\n return {\r\n stdout: execError.stdout ?? \"\",\r\n stderr: execError.stderr ?? \"\",\r\n exitCode: typeof execError.code === \"number\" ? execError.code : null,\r\n failed: true,\r\n timedOut: execError.timedOut === true || execError.killed === true,\r\n signal: execError.signal ?? null,\r\n };\r\n }\r\n}\r\n\r\nexport class CliProvider implements Provider {\r\n readonly id: string;\r\n readonly kind = \"cli\";\r\n readonly targetName: string;\r\n readonly supportsBatch = false;\r\n\r\n private readonly config: CliResolvedConfig;\r\n private readonly runCommand: CommandRunner;\r\n private healthcheckPromise?: Promise<void>;\r\n\r\n constructor(targetName: string, config: CliResolvedConfig, runner: CommandRunner = defaultCommandRunner) {\r\n this.targetName = targetName;\r\n this.id = `cli:${targetName}`;\r\n this.config = config;\r\n this.runCommand = runner;\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n if (request.signal?.aborted) {\r\n throw new Error(\"CLI provider request was aborted before execution\");\r\n }\r\n\r\n await this.ensureHealthy(request.signal);\r\n\r\n const outputFilePath = generateOutputFilePath(request.evalCaseId);\r\n const templateValues = buildTemplateValues(request, this.config, outputFilePath);\r\n const renderedCommand = renderTemplate(this.config.commandTemplate, templateValues);\r\n\r\n const result = await this.runCommand(renderedCommand, {\r\n cwd: this.config.cwd,\r\n env: process.env,\r\n timeoutMs: this.config.timeoutMs,\r\n signal: request.signal,\r\n });\r\n\r\n if (result.failed || (result.exitCode ?? 0) !== 0) {\r\n if (request.signal?.aborted) {\r\n throw new Error(\"CLI provider request was aborted\");\r\n }\r\n if (result.timedOut) {\r\n throw new Error(\r\n `CLI provider timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\r\n );\r\n }\r\n const codeText = result.exitCode !== null ? result.exitCode : \"unknown\";\r\n const detail = result.stderr.trim() || result.stdout.trim();\r\n const message = detail ? `${detail} (exit code ${codeText})` : `CLI exited with code ${codeText}`;\r\n throw new Error(message);\r\n }\r\n\r\n // Read from output file\r\n const responseText = await this.readAndCleanupOutputFile(outputFilePath);\r\n\r\n return {\r\n text: responseText,\r\n raw: {\r\n command: renderedCommand,\r\n stderr: result.stderr,\r\n exitCode: result.exitCode ?? 0,\r\n cwd: this.config.cwd,\r\n outputFile: outputFilePath,\r\n },\r\n };\r\n }\r\n\r\n private async readAndCleanupOutputFile(filePath: string): Promise<string> {\r\n try {\r\n const content = await readTextFile(filePath);\r\n return content;\r\n } catch (error) {\r\n const errorMsg = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Failed to read output file '${filePath}': ${errorMsg}`);\r\n } finally {\r\n // Clean up temp file - ignore errors as the file might not exist on read failure\r\n await fs.unlink(filePath).catch(() => {/* ignore cleanup errors */});\r\n }\r\n }\r\n\r\n private async ensureHealthy(signal?: AbortSignal): Promise<void> {\r\n if (!this.config.healthcheck) {\r\n return;\r\n }\r\n if (!this.healthcheckPromise) {\r\n this.healthcheckPromise = this.runHealthcheck(this.config.healthcheck, signal);\r\n }\r\n return this.healthcheckPromise;\r\n }\r\n\r\n private async runHealthcheck(\r\n healthcheck: CliResolvedConfig[\"healthcheck\"],\r\n signal?: AbortSignal,\r\n ): Promise<void> {\r\n if (!healthcheck) {\r\n return;\r\n }\r\n\r\n const timeoutMs = healthcheck.timeoutMs ?? this.config.timeoutMs;\r\n\r\n if (healthcheck.type === \"http\") {\r\n const controller = new AbortController();\r\n const timer = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : undefined;\r\n signal?.addEventListener(\"abort\", () => controller.abort(), { once: true });\r\n\r\n try {\r\n const response = await fetch(healthcheck.url, { method: \"GET\", signal: controller.signal });\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\r\n }\r\n } catch (error) {\r\n const reason = error instanceof Error ? error.message : String(error);\r\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${reason}`);\r\n } finally {\r\n if (timer !== undefined) {\r\n clearTimeout(timer);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const renderedCommand = renderTemplate(\r\n healthcheck.commandTemplate,\r\n buildTemplateValues(\r\n {\r\n question: \"\",\r\n guidelines: \"\",\r\n inputFiles: [],\r\n evalCaseId: \"healthcheck\",\r\n attempt: 0,\r\n },\r\n this.config,\r\n generateOutputFilePath(\"healthcheck\"),\r\n ),\r\n );\r\n\r\n const result = await this.runCommand(renderedCommand, {\r\n cwd: healthcheck.cwd ?? this.config.cwd,\r\n env: process.env,\r\n timeoutMs,\r\n signal,\r\n });\r\n\r\n if (result.failed || (result.exitCode ?? 0) !== 0) {\r\n const codeText = result.exitCode !== null ? result.exitCode : \"unknown\";\r\n const detail = result.stderr.trim() || result.stdout.trim();\r\n const message = detail\r\n ? `${detail} (exit code ${codeText})`\r\n : `CLI healthcheck command exited with code ${codeText}`;\r\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${message}`);\r\n }\r\n }\r\n}\r\n\r\nfunction buildTemplateValues(\r\n request: Pick<\r\n ProviderRequest,\r\n \"question\" | \"guidelines\" | \"inputFiles\" | \"evalCaseId\" | \"attempt\"\r\n >,\r\n config: CliResolvedConfig,\r\n outputFilePath: string,\r\n): Record<string, string> {\r\n const inputFiles = normalizeInputFiles(request.inputFiles);\r\n return {\r\n PROMPT: shellEscape(request.question ?? \"\"),\r\n GUIDELINES: shellEscape(request.guidelines ?? \"\"),\r\n EVAL_ID: shellEscape(request.evalCaseId ?? \"\"),\r\n ATTEMPT: shellEscape(String(request.attempt ?? 0)),\r\n FILES: formatFileList(inputFiles, config.filesFormat),\r\n OUTPUT_FILE: shellEscape(outputFilePath),\r\n };\r\n}\r\n\r\nfunction normalizeInputFiles(\r\n inputFiles: readonly string[] | undefined,\r\n): readonly string[] | undefined {\r\n if (!inputFiles || inputFiles.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const unique = new Map<string, string>();\r\n for (const inputFile of inputFiles) {\r\n const absolutePath = path.resolve(inputFile);\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 formatFileList(\r\n files: readonly string[] | undefined,\r\n template: string | undefined,\r\n): string {\r\n if (!files || files.length === 0) {\r\n return \"\";\r\n }\r\n\r\n const formatter = template ?? \"{path}\";\r\n return files\r\n .map((filePath) => {\r\n const escapedPath = shellEscape(filePath);\r\n const escapedName = shellEscape(path.basename(filePath));\r\n return formatter.replaceAll(\"{path}\", escapedPath).replaceAll(\"{basename}\", escapedName);\r\n })\r\n .join(\" \");\r\n}\r\n\r\nfunction renderTemplate(template: string, values: Record<string, string>): string {\r\n return template.replace(/\\{([A-Z_]+)\\}/g, (match, key) => {\r\n const replacement = values[key];\r\n return replacement !== undefined ? replacement : match;\r\n });\r\n}\r\n\r\nfunction shellEscape(value: string): string {\r\n if (value.length === 0) {\r\n return \"''\";\r\n }\r\n\r\n if (process.platform === \"win32\") {\r\n // PowerShell uses backtick (`) for escaping, not backslash\r\n // Double quotes inside the string need to be escaped with backtick\r\n // Single quotes can be used instead for simpler escaping\r\n const escaped = value.replace(/'/g, \"''\");\r\n return `'${escaped}'`;\r\n }\r\n\r\n return `'${value.replace(/'/g, \"'\\\"'\\\"'\")}'`;\r\n}\r\n\r\nfunction generateOutputFilePath(evalCaseId?: string): string {\r\n const safeEvalId = evalCaseId || \"unknown\";\r\n const timestamp = Date.now();\r\n const random = Math.random().toString(36).substring(2, 9);\r\n return path.join(os.tmpdir(), `agentv-${safeEvalId}-${timestamp}-${random}.json`);\r\n}\r\n\r\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\r\n if (!timeoutMs || timeoutMs <= 0) {\r\n return \"\";\r\n }\r\n const seconds = Math.ceil(timeoutMs / 1000);\r\n return ` after ${seconds}s`;\r\n}\r\n","import { exec as execCallback, spawn } from \"node:child_process\";\r\nimport { randomUUID } from \"node:crypto\";\r\nimport { constants, createWriteStream } from \"node:fs\";\r\nimport type { WriteStream } from \"node:fs\";\r\nimport { access, mkdtemp, mkdir, rm, writeFile } from \"node:fs/promises\";\r\nimport { tmpdir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { promisify } from \"node:util\";\r\n\r\nimport { recordCodexLogEntry } from \"./codex-log-tracker.js\";\r\nimport { buildPromptDocument, normalizeInputFiles } from \"./preread.js\";\r\nimport type { CodexResolvedConfig } from \"./targets.js\";\r\nimport type { Provider, ProviderRequest, ProviderResponse } from \"./types.js\";\r\n\r\nconst execAsync = promisify(execCallback);\r\nconst WORKSPACE_PREFIX = \"agentv-codex-\";\r\nconst PROMPT_FILENAME = \"prompt.md\";\r\nconst JSONL_TYPE_ITEM_COMPLETED = \"item.completed\";\r\n\r\ninterface CodexRunOptions {\r\n readonly executable: string;\r\n readonly args: readonly string[];\r\n readonly cwd: string;\r\n readonly prompt: string;\r\n readonly timeoutMs?: number;\r\n readonly env: NodeJS.ProcessEnv;\r\n readonly signal?: AbortSignal;\r\n readonly onStdoutChunk?: (chunk: string) => void;\r\n readonly onStderrChunk?: (chunk: string) => void;\r\n}\r\n\r\ninterface CodexRunResult {\r\n readonly stdout: string;\r\n readonly stderr: string;\r\n readonly exitCode: number;\r\n readonly timedOut?: boolean;\r\n}\r\n\r\ntype CodexRunner = (options: CodexRunOptions) => Promise<CodexRunResult>;\r\n\r\nexport class CodexProvider implements Provider {\r\n readonly id: string;\r\n readonly kind = \"codex\" as const;\r\n readonly targetName: string;\r\n readonly supportsBatch = false;\r\n\r\n private readonly config: CodexResolvedConfig;\r\n private readonly runCodex: CodexRunner;\r\n private environmentCheck?: Promise<void>;\r\n private resolvedExecutable?: string;\r\n\r\n constructor(targetName: string, config: CodexResolvedConfig, runner: CodexRunner = defaultCodexRunner) {\r\n this.id = `codex:${targetName}`;\r\n this.targetName = targetName;\r\n this.config = config;\r\n this.runCodex = runner;\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n if (request.signal?.aborted) {\r\n throw new Error(\"Codex provider request was aborted before execution\");\r\n }\r\n\r\n await this.ensureEnvironmentReady();\r\n\r\n const inputFiles = normalizeInputFiles(request.inputFiles);\r\n\r\n const workspaceRoot = await this.createWorkspace();\r\n const logger = await this.createStreamLogger(request).catch(() => undefined);\r\n try {\r\n const promptContent = buildPromptDocument(request, inputFiles);\r\n const promptFile = path.join(workspaceRoot, PROMPT_FILENAME);\r\n await writeFile(promptFile, promptContent, \"utf8\");\r\n\r\n const args = this.buildCodexArgs();\r\n const cwd = this.resolveCwd(workspaceRoot);\r\n\r\n const result = await this.executeCodex(args, cwd, promptContent, request.signal, logger);\r\n\r\n if (result.timedOut) {\r\n throw new Error(\r\n `Codex CLI timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\r\n );\r\n }\r\n\r\n if (result.exitCode !== 0) {\r\n const detail = pickDetail(result.stderr, result.stdout);\r\n const prefix = `Codex CLI exited with code ${result.exitCode}`;\r\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\r\n }\r\n\r\n const parsed = parseCodexJson(result.stdout);\r\n const assistantText = extractAssistantText(parsed);\r\n\r\n return {\r\n text: assistantText,\r\n raw: {\r\n response: parsed,\r\n stdout: result.stdout,\r\n stderr: result.stderr,\r\n exitCode: result.exitCode,\r\n args,\r\n executable: this.resolvedExecutable ?? this.config.executable,\r\n promptFile,\r\n workspace: workspaceRoot,\r\n inputFiles,\r\n logFile: logger?.filePath,\r\n },\r\n };\r\n } finally {\r\n await logger?.close();\r\n await this.cleanupWorkspace(workspaceRoot);\r\n }\r\n }\r\n\r\n private async ensureEnvironmentReady(): Promise<void> {\r\n if (!this.environmentCheck) {\r\n this.environmentCheck = this.validateEnvironment();\r\n }\r\n await this.environmentCheck;\r\n }\r\n\r\n private async validateEnvironment(): Promise<void> {\r\n this.resolvedExecutable = await locateExecutable(this.config.executable);\r\n }\r\n\r\n private resolveCwd(workspaceRoot: string): string {\r\n if (!this.config.cwd) {\r\n return workspaceRoot;\r\n }\r\n return path.resolve(this.config.cwd);\r\n }\r\n\r\n private buildCodexArgs(): string[] {\r\n // Global flags must come before 'exec' subcommand\r\n const args = [\"--ask-for-approval\", \"never\", \"exec\", \"--json\", \"--color\", \"never\", \"--skip-git-repo-check\"];\r\n if (this.config.args && this.config.args.length > 0) {\r\n args.push(...this.config.args);\r\n }\r\n args.push(\"-\");\r\n return args;\r\n }\r\n\r\n private async executeCodex(\r\n args: readonly string[],\r\n cwd: string,\r\n promptContent: string,\r\n signal: AbortSignal | undefined,\r\n logger: CodexStreamLogger | undefined,\r\n ): Promise<CodexRunResult> {\r\n try {\r\n return await this.runCodex({\r\n executable: this.resolvedExecutable ?? this.config.executable,\r\n args,\r\n cwd,\r\n prompt: promptContent,\r\n timeoutMs: this.config.timeoutMs,\r\n env: process.env,\r\n signal,\r\n onStdoutChunk: logger ? (chunk) => logger.handleStdoutChunk(chunk) : undefined,\r\n onStderrChunk: logger ? (chunk) => logger.handleStderrChunk(chunk) : undefined,\r\n });\r\n } catch (error) {\r\n const err = error as NodeJS.ErrnoException;\r\n if (err.code === \"ENOENT\") {\r\n throw new Error(\r\n `Codex executable '${this.config.executable}' was not found. Update the target settings.executable or add it to PATH.`,\r\n );\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n private async createWorkspace(): Promise<string> {\r\n return await mkdtemp(path.join(tmpdir(), WORKSPACE_PREFIX));\r\n }\r\n\r\n private async cleanupWorkspace(workspaceRoot: string): Promise<void> {\r\n try {\r\n await rm(workspaceRoot, { recursive: true, force: true });\r\n } catch {\r\n // Best-effort cleanup\r\n }\r\n }\r\n\r\n private resolveLogDirectory(): string | undefined {\r\n const disabled = isCodexLogStreamingDisabled();\r\n if (disabled) {\r\n return undefined;\r\n }\r\n if (this.config.logDir) {\r\n return path.resolve(this.config.logDir);\r\n }\r\n return path.join(process.cwd(), \".agentv\", \"logs\", \"codex\");\r\n }\r\n\r\n private async createStreamLogger(request: ProviderRequest): Promise<CodexStreamLogger | undefined> {\r\n const logDir = this.resolveLogDirectory();\r\n if (!logDir) {\r\n return undefined;\r\n }\r\n try {\r\n await mkdir(logDir, { recursive: true });\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n console.warn(`Skipping Codex stream logging (could not create ${logDir}): ${message}`);\r\n return undefined;\r\n }\r\n\r\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\r\n\r\n try {\r\n const logger = await CodexStreamLogger.create({\r\n filePath,\r\n targetName: this.targetName,\r\n evalCaseId: request.evalCaseId,\r\n attempt: request.attempt,\r\n format: this.config.logFormat ?? \"summary\",\r\n });\r\n recordCodexLogEntry({\r\n filePath,\r\n targetName: this.targetName,\r\n evalCaseId: request.evalCaseId,\r\n attempt: request.attempt,\r\n });\r\n return logger;\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n console.warn(`Skipping Codex stream logging for ${filePath}: ${message}`);\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\nclass CodexStreamLogger {\r\n readonly filePath: string;\r\n private readonly stream: WriteStream;\r\n private readonly startedAt = Date.now();\r\n private stdoutBuffer = \"\";\r\n private stderrBuffer = \"\";\r\n private readonly format: \"summary\" | \"json\";\r\n\r\n private constructor(filePath: string, format: \"summary\" | \"json\") {\r\n this.filePath = filePath;\r\n this.format = format;\r\n this.stream = createWriteStream(filePath, { flags: \"a\" });\r\n }\r\n\r\n static async create(options: {\r\n readonly filePath: string;\r\n readonly targetName: string;\r\n readonly evalCaseId?: string;\r\n readonly attempt?: number;\r\n readonly format: \"summary\" | \"json\";\r\n }): Promise<CodexStreamLogger> {\r\n const logger = new CodexStreamLogger(options.filePath, options.format);\r\n const header = [\r\n \"# Codex CLI stream log\",\r\n `# target: ${options.targetName}`,\r\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\r\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\r\n `# started: ${new Date().toISOString()}`,\r\n \"\",\r\n ].filter((line): line is string => Boolean(line));\r\n logger.writeLines(header);\r\n return logger;\r\n }\r\n\r\n handleStdoutChunk(chunk: string): void {\r\n this.stdoutBuffer += chunk;\r\n this.flushBuffer(\"stdout\");\r\n }\r\n\r\n handleStderrChunk(chunk: string): void {\r\n this.stderrBuffer += chunk;\r\n this.flushBuffer(\"stderr\");\r\n }\r\n\r\n async close(): Promise<void> {\r\n this.flushBuffer(\"stdout\");\r\n this.flushBuffer(\"stderr\");\r\n this.flushRemainder();\r\n await new Promise<void>((resolve, reject) => {\r\n this.stream.once(\"error\", reject);\r\n this.stream.end(() => resolve());\r\n });\r\n }\r\n\r\n private writeLines(lines: readonly string[]): void {\r\n for (const line of lines) {\r\n this.stream.write(`${line}\\n`);\r\n }\r\n }\r\n\r\n private flushBuffer(source: \"stdout\" | \"stderr\"): void {\r\n const buffer = source === \"stdout\" ? this.stdoutBuffer : this.stderrBuffer;\r\n const lines = buffer.split(/\\r?\\n/);\r\n const remainder = lines.pop() ?? \"\";\r\n if (source === \"stdout\") {\r\n this.stdoutBuffer = remainder;\r\n } else {\r\n this.stderrBuffer = remainder;\r\n }\r\n for (const line of lines) {\r\n const formatted = this.formatLine(line, source);\r\n if (formatted) {\r\n this.stream.write(formatted);\r\n this.stream.write(\"\\n\");\r\n }\r\n }\r\n }\r\n\r\n private formatLine(rawLine: string, source: \"stdout\" | \"stderr\"): string | undefined {\r\n const trimmed = rawLine.trim();\r\n if (trimmed.length === 0) {\r\n return undefined;\r\n }\r\n const message =\r\n this.format === \"json\"\r\n ? formatCodexJsonLog(trimmed)\r\n : formatCodexLogMessage(trimmed, source);\r\n return `[+${formatElapsed(this.startedAt)}] [${source}] ${message}`;\r\n }\r\n\r\n private flushRemainder(): void {\r\n const stdoutRemainder = this.stdoutBuffer.trim();\r\n if (stdoutRemainder.length > 0) {\r\n const formatted = this.formatLine(stdoutRemainder, \"stdout\");\r\n if (formatted) {\r\n this.stream.write(formatted);\r\n this.stream.write(\"\\n\");\r\n }\r\n }\r\n const stderrRemainder = this.stderrBuffer.trim();\r\n if (stderrRemainder.length > 0) {\r\n const formatted = this.formatLine(stderrRemainder, \"stderr\");\r\n if (formatted) {\r\n this.stream.write(formatted);\r\n this.stream.write(\"\\n\");\r\n }\r\n }\r\n this.stdoutBuffer = \"\";\r\n this.stderrBuffer = \"\";\r\n }\r\n}\r\n\r\nfunction isCodexLogStreamingDisabled(): boolean {\r\n const envValue = process.env.AGENTV_CODEX_STREAM_LOGS;\r\n if (!envValue) {\r\n return false;\r\n }\r\n const normalized = envValue.trim().toLowerCase();\r\n return normalized === \"false\" || normalized === \"0\" || normalized === \"off\";\r\n}\r\n\r\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\r\n const evalId = sanitizeForFilename(request.evalCaseId ?? \"codex\");\r\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : \"\";\r\n const target = sanitizeForFilename(targetName);\r\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\r\n}\r\n\r\nfunction sanitizeForFilename(value: string): string {\r\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, \"_\");\r\n return sanitized.length > 0 ? sanitized : \"codex\";\r\n}\r\n\r\nfunction formatElapsed(startedAt: number): string {\r\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\r\n const hours = Math.floor(elapsedSeconds / 3600);\r\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\r\n const seconds = elapsedSeconds % 60;\r\n if (hours > 0) {\r\n return `${hours.toString().padStart(2, \"0\")}:${minutes.toString().padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}`;\r\n }\r\n return `${minutes.toString().padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}`;\r\n}\r\n\r\nfunction formatCodexLogMessage(rawLine: string, source: \"stdout\" | \"stderr\"): string {\r\n const parsed = tryParseJsonValue(rawLine);\r\n if (parsed) {\r\n const summary = summarizeCodexEvent(parsed);\r\n if (summary) {\r\n return summary;\r\n }\r\n }\r\n if (source === \"stderr\") {\r\n return `stderr: ${rawLine}`;\r\n }\r\n return rawLine;\r\n}\r\n\r\nfunction formatCodexJsonLog(rawLine: string): string {\r\n const parsed = tryParseJsonValue(rawLine);\r\n if (!parsed) {\r\n return rawLine;\r\n }\r\n try {\r\n return JSON.stringify(parsed, null, 2);\r\n } catch {\r\n return rawLine;\r\n }\r\n}\r\n\r\nfunction summarizeCodexEvent(event: unknown): string | undefined {\r\n if (!event || typeof event !== \"object\") {\r\n return undefined;\r\n }\r\n const record = event as Record<string, unknown>;\r\n const type = typeof record.type === \"string\" ? record.type : undefined;\r\n let message = extractFromEvent(event) ?? extractFromItem(record.item) ?? flattenContent(record.output ?? record.content);\r\n if (!message && type === JSONL_TYPE_ITEM_COMPLETED) {\r\n const item = record.item;\r\n if (item && typeof item === \"object\") {\r\n const candidate = flattenContent(\r\n (item as Record<string, unknown>).text ??\r\n (item as Record<string, unknown>).content ??\r\n (item as Record<string, unknown>).output,\r\n );\r\n if (candidate) {\r\n message = candidate;\r\n }\r\n }\r\n }\r\n if (!message) {\r\n const itemType =\r\n typeof (record.item as Record<string, unknown> | undefined)?.type === \"string\"\r\n ? (record.item as Record<string, unknown>).type\r\n : undefined;\r\n if (type && itemType) {\r\n return `${type}:${itemType}`;\r\n }\r\n if (type) {\r\n return type;\r\n }\r\n }\r\n if (type && message) {\r\n return `${type}: ${message}`;\r\n }\r\n if (message) {\r\n return message;\r\n }\r\n return type;\r\n}\r\n\r\nfunction tryParseJsonValue(rawLine: string): unknown | undefined {\r\n try {\r\n return JSON.parse(rawLine);\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nasync function locateExecutable(candidate: string): Promise<string> {\r\n const includesPathSeparator = candidate.includes(\"/\") || candidate.includes(\"\\\\\");\r\n if (includesPathSeparator) {\r\n const resolved = path.isAbsolute(candidate) ? candidate : path.resolve(candidate);\r\n const executablePath = await ensureWindowsExecutableVariant(resolved);\r\n await access(executablePath, constants.F_OK);\r\n return executablePath;\r\n }\r\n\r\n const locator = process.platform === \"win32\" ? \"where\" : \"which\";\r\n try {\r\n const { stdout } = await execAsync(`${locator} ${candidate}`);\r\n const lines = stdout\r\n .split(/\\r?\\n/)\r\n .map((line) => line.trim())\r\n .filter((line) => line.length > 0);\r\n const preferred = selectExecutableCandidate(lines);\r\n if (preferred) {\r\n const executablePath = await ensureWindowsExecutableVariant(preferred);\r\n await access(executablePath, constants.F_OK);\r\n return executablePath;\r\n }\r\n } catch {\r\n // ignore and fall back to error below\r\n }\r\n\r\n throw new Error(`Codex executable '${candidate}' was not found on PATH`);\r\n}\r\n\r\nfunction selectExecutableCandidate(candidates: readonly string[]): string | undefined {\r\n if (candidates.length === 0) {\r\n return undefined;\r\n }\r\n if (process.platform !== \"win32\") {\r\n return candidates[0];\r\n }\r\n const extensions = getWindowsExecutableExtensions();\r\n for (const ext of extensions) {\r\n const match = candidates.find((candidate) => candidate.toLowerCase().endsWith(ext));\r\n if (match) {\r\n return match;\r\n }\r\n }\r\n return candidates[0];\r\n}\r\n\r\nasync function ensureWindowsExecutableVariant(candidate: string): Promise<string> {\r\n if (process.platform !== \"win32\") {\r\n return candidate;\r\n }\r\n if (hasExecutableExtension(candidate)) {\r\n return candidate;\r\n }\r\n\r\n const extensions = getWindowsExecutableExtensions();\r\n for (const ext of extensions) {\r\n const withExtension = `${candidate}${ext}`;\r\n try {\r\n await access(withExtension, constants.F_OK);\r\n return withExtension;\r\n } catch {\r\n // keep searching\r\n }\r\n }\r\n return candidate;\r\n}\r\n\r\nfunction hasExecutableExtension(candidate: string): boolean {\r\n const lower = candidate.toLowerCase();\r\n return getWindowsExecutableExtensions().some((ext) => lower.endsWith(ext));\r\n}\r\n\r\nconst DEFAULT_WINDOWS_EXTENSIONS = [\".com\", \".exe\", \".bat\", \".cmd\", \".ps1\"] as const;\r\n\r\nfunction getWindowsExecutableExtensions(): readonly string[] {\r\n if (process.platform !== \"win32\") {\r\n return [];\r\n }\r\n const fromEnv = process.env.PATHEXT?.split(\";\")\r\n .map((ext) => ext.trim().toLowerCase())\r\n .filter((ext) => ext.length > 0);\r\n return fromEnv && fromEnv.length > 0 ? fromEnv : DEFAULT_WINDOWS_EXTENSIONS;\r\n}\r\n\r\nfunction parseCodexJson(output: string): unknown {\r\n const trimmed = output.trim();\r\n if (trimmed.length === 0) {\r\n throw new Error(\"Codex CLI produced no output in --json mode\");\r\n }\r\n try {\r\n return JSON.parse(trimmed);\r\n } catch {\r\n const lineObjects = parseJsonLines(trimmed);\r\n if (lineObjects) {\r\n return lineObjects;\r\n }\r\n const lastBrace = trimmed.lastIndexOf(\"{\");\r\n if (lastBrace >= 0) {\r\n const candidate = trimmed.slice(lastBrace);\r\n try {\r\n return JSON.parse(candidate);\r\n } catch {\r\n // fallthrough\r\n }\r\n }\r\n const preview = trimmed.slice(0, 200);\r\n throw new Error(`Codex CLI emitted invalid JSON: ${preview}${trimmed.length > 200 ? \"…\" : \"\"}`);\r\n }\r\n}\r\n\r\nfunction extractAssistantText(parsed: unknown): string {\r\n if (Array.isArray(parsed)) {\r\n const text = extractFromEventStream(parsed);\r\n if (text) {\r\n return text;\r\n }\r\n }\r\n\r\n if (!parsed || typeof parsed !== \"object\") {\r\n throw new Error(\"Codex CLI JSON response did not include an assistant message\");\r\n }\r\n\r\n const record = parsed as Record<string, unknown>;\r\n const eventText = extractFromEvent(record);\r\n if (eventText) {\r\n return eventText;\r\n }\r\n\r\n const messages = Array.isArray(record.messages) ? record.messages : undefined;\r\n if (messages) {\r\n for (let index = messages.length - 1; index >= 0; index -= 1) {\r\n const entry = messages[index];\r\n if (!entry || typeof entry !== \"object\") {\r\n continue;\r\n }\r\n const role = (entry as Record<string, unknown>).role;\r\n if (role !== \"assistant\") {\r\n continue;\r\n }\r\n const content = (entry as Record<string, unknown>).content;\r\n const flattened = flattenContent(content);\r\n if (flattened) {\r\n return flattened;\r\n }\r\n }\r\n }\r\n\r\n const response = record.response;\r\n if (response && typeof response === \"object\") {\r\n const content = (response as Record<string, unknown>).content;\r\n const flattened = flattenContent(content);\r\n if (flattened) {\r\n return flattened;\r\n }\r\n }\r\n\r\n const output = record.output;\r\n const flattenedOutput = flattenContent(output);\r\n if (flattenedOutput) {\r\n return flattenedOutput;\r\n }\r\n\r\n throw new Error(\"Codex CLI JSON response did not include an assistant message\");\r\n}\r\n\r\nfunction extractFromEventStream(events: readonly unknown[]): string | undefined {\r\n for (let index = events.length - 1; index >= 0; index -= 1) {\r\n const candidate = events[index];\r\n const text = extractFromEvent(candidate);\r\n if (text) {\r\n return text;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction extractFromEvent(event: unknown): string | undefined {\r\n if (!event || typeof event !== \"object\") {\r\n return undefined;\r\n }\r\n const record = event as Record<string, unknown>;\r\n const type = typeof record.type === \"string\" ? record.type : undefined;\r\n if (type === JSONL_TYPE_ITEM_COMPLETED) {\r\n const item = record.item;\r\n const text = extractFromItem(item);\r\n if (text) {\r\n return text;\r\n }\r\n }\r\n const output = record.output ?? record.content;\r\n const flattened = flattenContent(output);\r\n if (flattened) {\r\n return flattened;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction extractFromItem(item: unknown): string | undefined {\r\n if (!item || typeof item !== \"object\") {\r\n return undefined;\r\n }\r\n const record = item as Record<string, unknown>;\r\n const itemType = typeof record.type === \"string\" ? record.type : undefined;\r\n if (itemType === \"agent_message\" || itemType === \"response\" || itemType === \"output\") {\r\n const text = flattenContent(record.text ?? record.content ?? record.output);\r\n if (text) {\r\n return text;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction flattenContent(value: unknown): string | undefined {\r\n if (typeof value === \"string\") {\r\n return value;\r\n }\r\n if (Array.isArray(value)) {\r\n const parts = value\r\n .map((segment) => {\r\n if (typeof segment === \"string\") {\r\n return segment;\r\n }\r\n if (segment && typeof segment === \"object\" && \"text\" in segment) {\r\n const text = (segment as Record<string, unknown>).text;\r\n return typeof text === \"string\" ? text : undefined;\r\n }\r\n return undefined;\r\n })\r\n .filter((part): part is string => typeof part === \"string\" && part.length > 0);\r\n return parts.length > 0 ? parts.join(\" \\n\") : undefined;\r\n }\r\n if (value && typeof value === \"object\" && \"text\" in value) {\r\n const text = (value as Record<string, unknown>).text;\r\n return typeof text === \"string\" ? text : undefined;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction parseJsonLines(output: string): unknown[] | undefined {\r\n const lines = output\r\n .split(/\\r?\\n/)\r\n .map((line) => line.trim())\r\n .filter((line) => line.length > 0);\r\n if (lines.length <= 1) {\r\n return undefined;\r\n }\r\n const parsed: unknown[] = [];\r\n for (const line of lines) {\r\n try {\r\n parsed.push(JSON.parse(line));\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n return parsed;\r\n}\r\n\r\nfunction pickDetail(stderr: string, stdout: string): string | undefined {\r\n const errorText = stderr.trim();\r\n if (errorText.length > 0) {\r\n return errorText;\r\n }\r\n const stdoutText = stdout.trim();\r\n return stdoutText.length > 0 ? stdoutText : undefined;\r\n}\r\n\r\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\r\n if (!timeoutMs || timeoutMs <= 0) {\r\n return \"\";\r\n }\r\n const seconds = Math.ceil(timeoutMs / 1000);\r\n return ` after ${seconds}s`;\r\n}\r\n\r\nasync function defaultCodexRunner(options: CodexRunOptions): Promise<CodexRunResult> {\r\n return await new Promise<CodexRunResult>((resolve, reject) => {\r\n const child = spawn(options.executable, options.args, {\r\n cwd: options.cwd,\r\n env: options.env,\r\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\r\n shell: shouldShellExecute(options.executable),\r\n });\r\n\r\n let stdout = \"\";\r\n let stderr = \"\";\r\n let timedOut = false;\r\n\r\n const onAbort = (): void => {\r\n child.kill(\"SIGTERM\");\r\n };\r\n\r\n if (options.signal) {\r\n if (options.signal.aborted) {\r\n onAbort();\r\n } else {\r\n options.signal.addEventListener(\"abort\", onAbort, { once: true });\r\n }\r\n }\r\n\r\n let timeoutHandle: NodeJS.Timeout | undefined;\r\n if (options.timeoutMs && options.timeoutMs > 0) {\r\n timeoutHandle = setTimeout(() => {\r\n timedOut = true;\r\n child.kill(\"SIGTERM\");\r\n }, options.timeoutMs);\r\n timeoutHandle.unref?.();\r\n }\r\n\r\n child.stdout.setEncoding(\"utf8\");\r\n child.stdout.on(\"data\", (chunk) => {\r\n stdout += chunk;\r\n options.onStdoutChunk?.(chunk);\r\n });\r\n\r\n child.stderr.setEncoding(\"utf8\");\r\n child.stderr.on(\"data\", (chunk) => {\r\n stderr += chunk;\r\n options.onStderrChunk?.(chunk);\r\n });\r\n\r\n child.stdin.end(options.prompt);\r\n\r\n const cleanup = (): void => {\r\n if (timeoutHandle) {\r\n clearTimeout(timeoutHandle);\r\n }\r\n if (options.signal) {\r\n options.signal.removeEventListener(\"abort\", onAbort);\r\n }\r\n };\r\n\r\n child.on(\"error\", (error) => {\r\n cleanup();\r\n reject(error);\r\n });\r\n\r\n child.on(\"close\", (code) => {\r\n cleanup();\r\n resolve({\r\n stdout,\r\n stderr,\r\n exitCode: typeof code === \"number\" ? code : -1,\r\n timedOut,\r\n });\r\n });\r\n });\r\n}\r\n\r\nfunction shouldShellExecute(executable: string): boolean {\r\n if (process.platform !== \"win32\") {\r\n return false;\r\n }\r\n const lower = executable.toLowerCase();\r\n return lower.endsWith(\".cmd\") || lower.endsWith(\".bat\") || lower.endsWith(\".ps1\");\r\n}\r\n","export type CodexLogEntry = {\r\n readonly filePath: string;\r\n readonly evalCaseId?: string;\r\n readonly targetName: string;\r\n readonly attempt?: number;\r\n};\r\n\r\nconst GLOBAL_LOGS_KEY = Symbol.for(\"agentv.codexLogs\");\r\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for(\"agentv.codexLogSubscribers\");\r\n\r\ntype CodexLogListener = (entry: CodexLogEntry) => void;\r\n\r\ntype GlobalWithCodexLogs = typeof globalThis & {\r\n [GLOBAL_LOGS_KEY]?: CodexLogEntry[];\r\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<CodexLogListener>;\r\n};\r\n\r\nfunction getCodexLogStore(): CodexLogEntry[] {\r\n const globalObject = globalThis as GlobalWithCodexLogs;\r\n const existing = globalObject[GLOBAL_LOGS_KEY];\r\n if (existing) {\r\n return existing;\r\n }\r\n const created: CodexLogEntry[] = [];\r\n globalObject[GLOBAL_LOGS_KEY] = created;\r\n return created;\r\n}\r\n\r\nfunction getSubscriberStore(): Set<CodexLogListener> {\r\n const globalObject = globalThis as GlobalWithCodexLogs;\r\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\r\n if (existing) {\r\n return existing;\r\n }\r\n const created = new Set<CodexLogListener>();\r\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\r\n return created;\r\n}\r\n\r\nfunction notifySubscribers(entry: CodexLogEntry): void {\r\n const subscribers = Array.from(getSubscriberStore());\r\n for (const listener of subscribers) {\r\n try {\r\n listener(entry);\r\n } catch (error) {\r\n // Avoid surfacing subscriber errors to providers; log for visibility.\r\n const message = error instanceof Error ? error.message : String(error);\r\n console.warn(`Codex log subscriber failed: ${message}`);\r\n }\r\n }\r\n}\r\n\r\nexport function recordCodexLogEntry(entry: CodexLogEntry): void {\r\n getCodexLogStore().push(entry);\r\n notifySubscribers(entry);\r\n}\r\n\r\nexport function consumeCodexLogEntries(): CodexLogEntry[] {\r\n const store = getCodexLogStore();\r\n if (store.length === 0) {\r\n return [];\r\n }\r\n return store.splice(0, store.length);\r\n}\r\n\r\nexport function subscribeToCodexLogEntries(listener: CodexLogListener): () => void {\r\n const store = getSubscriberStore();\r\n store.add(listener);\r\n return () => {\r\n store.delete(listener);\r\n };\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport type { ProviderRequest } from \"./types.js\";\r\nimport { isGuidelineFile } from \"../yaml-parser.js\";\r\n\r\nexport interface PromptDocumentOptions {\r\n readonly guidelinePatterns?: readonly string[];\r\n readonly guidelineOverrides?: ReadonlySet<string>;\r\n}\r\n\r\nexport function buildPromptDocument(\r\n request: ProviderRequest,\r\n inputFiles: readonly string[] | undefined,\r\n options?: PromptDocumentOptions,\r\n): string {\r\n const parts: string[] = [];\r\n\r\n const guidelineFiles = collectGuidelineFiles(\r\n inputFiles,\r\n options?.guidelinePatterns ?? request.guideline_patterns,\r\n options?.guidelineOverrides,\r\n );\r\n const inputFilesList = collectInputFiles(inputFiles);\r\n\r\n const nonGuidelineInputFiles = inputFilesList.filter(\r\n (file) => !guidelineFiles.includes(file),\r\n );\r\n\r\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineInputFiles);\r\n if (prereadBlock.length > 0) {\r\n parts.push(\"\\n\", prereadBlock);\r\n }\r\n\r\n parts.push(\"\\n[[ ## user_query ## ]]\\n\", request.question.trim());\r\n\r\n return parts.join(\"\\n\").trim();\r\n}\r\n\r\nexport function normalizeInputFiles(inputFiles: readonly string[] | undefined): string[] | undefined {\r\n if (!inputFiles || inputFiles.length === 0) {\r\n return undefined;\r\n }\r\n const deduped = new Map<string, string>();\r\n for (const inputFile of inputFiles) {\r\n const absolutePath = path.resolve(inputFile);\r\n if (!deduped.has(absolutePath)) {\r\n deduped.set(absolutePath, absolutePath);\r\n }\r\n }\r\n return Array.from(deduped.values());\r\n}\r\n\r\nexport function collectGuidelineFiles(\r\n inputFiles: readonly string[] | undefined,\r\n guidelinePatterns: readonly string[] | undefined,\r\n overrides?: ReadonlySet<string>,\r\n): string[] {\r\n if (!inputFiles || inputFiles.length === 0) {\r\n return [];\r\n }\r\n\r\n const unique = new Map<string, string>();\r\n for (const inputFile of inputFiles) {\r\n const absolutePath = path.resolve(inputFile);\r\n if (overrides?.has(absolutePath)) {\r\n if (!unique.has(absolutePath)) {\r\n unique.set(absolutePath, absolutePath);\r\n }\r\n continue;\r\n }\r\n\r\n const normalized = absolutePath.split(path.sep).join(\"/\");\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 collectInputFiles(inputFiles: readonly string[] | undefined): string[] {\r\n if (!inputFiles || inputFiles.length === 0) {\r\n return [];\r\n }\r\n const unique = new Map<string, string>();\r\n for (const inputFile of inputFiles) {\r\n const absolutePath = path.resolve(inputFile);\r\n if (!unique.has(absolutePath)) {\r\n unique.set(absolutePath, absolutePath);\r\n }\r\n }\r\n return Array.from(unique.values());\r\n}\r\n\r\nfunction buildMandatoryPrereadBlock(\r\n guidelineFiles: readonly string[],\r\n inputFiles: readonly string[],\r\n): string {\r\n if (guidelineFiles.length === 0 && inputFiles.length === 0) {\r\n return \"\";\r\n }\r\n\r\n const buildList = (files: readonly string[]): string[] =>\r\n files.map((absolutePath) => {\r\n const fileName = path.basename(absolutePath);\r\n const fileUri = pathToFileUri(absolutePath);\r\n return `* [${fileName}](${fileUri})`;\r\n });\r\n\r\n const sections: string[] = [];\r\n if (guidelineFiles.length > 0) {\r\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join(\"\\n\")}.`);\r\n }\r\n\r\n if (inputFiles.length > 0) {\r\n sections.push(`Read all input files:\\n${buildList(inputFiles).join(\"\\n\")}.`);\r\n }\r\n\r\n sections.push(\r\n \"If any file is missing, fail with ERROR: missing-file <filename> and stop.\",\r\n \"Then apply system_instructions on the user query below.\",\r\n );\r\n\r\n return sections.join(\"\\n\");\r\n}\r\n\r\nfunction pathToFileUri(filePath: string): string {\r\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\r\n const normalizedPath = absolutePath.replace(/\\\\/g, \"/\");\r\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\r\n return `file:///${normalizedPath}`;\r\n }\r\n return `file://${normalizedPath}`;\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 question: request.question,\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 const CLI_PLACEHOLDERS = new Set([\"PROMPT\", \"GUIDELINES\", \"EVAL_ID\", \"ATTEMPT\", \"FILES\", \"OUTPUT_FILE\"]);\r\n\r\nexport interface RetryConfig {\r\n readonly maxRetries?: number;\r\n readonly initialDelayMs?: number;\r\n readonly maxDelayMs?: number;\r\n readonly backoffFactor?: number;\r\n readonly retryableStatusCodes?: readonly number[];\r\n}\r\n\r\nexport interface AzureResolvedConfig {\r\n readonly resourceName: string;\r\n readonly deploymentName: string;\r\n readonly apiKey: string;\r\n readonly version?: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly retry?: RetryConfig;\r\n}\r\n\r\nexport interface AnthropicResolvedConfig {\r\n readonly apiKey: string;\r\n readonly model: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly thinkingBudget?: number;\r\n readonly retry?: RetryConfig;\r\n}\r\n\r\nexport interface GeminiResolvedConfig {\r\n readonly apiKey: string;\r\n readonly model: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly retry?: RetryConfig;\r\n}\r\n\r\nexport interface CodexResolvedConfig {\r\n readonly executable: string;\r\n readonly args?: readonly string[];\r\n readonly cwd?: string;\r\n readonly timeoutMs?: number;\r\n readonly logDir?: string;\r\n readonly logFormat?: \"summary\" | \"json\";\r\n}\r\n\r\nexport interface MockResolvedConfig {\r\n readonly response?: string;\r\n readonly delayMs?: number;\r\n readonly delayMinMs?: number;\r\n readonly delayMaxMs?: number;\r\n}\r\n\r\nexport interface VSCodeResolvedConfig {\r\n readonly command: string;\r\n readonly waitForResponse: boolean;\r\n readonly dryRun: boolean;\r\n readonly subagentRoot?: string;\r\n readonly workspaceTemplate?: string;\r\n}\r\n\r\nexport type CliHealthcheck =\r\n | {\r\n readonly type: \"http\";\r\n readonly url: string;\r\n readonly timeoutMs?: number;\r\n }\r\n | {\r\n readonly type: \"command\";\r\n readonly commandTemplate: string;\r\n readonly timeoutMs?: number;\r\n readonly cwd?: string;\r\n };\r\n\r\nexport interface CliResolvedConfig {\r\n readonly commandTemplate: string;\r\n readonly filesFormat?: string;\r\n readonly cwd?: string;\r\n readonly timeoutMs?: number;\r\n readonly healthcheck?: CliHealthcheck;\r\n}\r\n\r\nexport type ResolvedTarget =\r\n | {\r\n readonly kind: \"azure\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: AzureResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"anthropic\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: AnthropicResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"gemini\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: GeminiResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"codex\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: CodexResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"mock\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: MockResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"vscode\" | \"vscode-insiders\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: VSCodeResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"cli\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: CliResolvedConfig;\r\n };\r\n\r\nconst BASE_TARGET_SCHEMA = z.object({\r\n name: z.string().min(1, \"target name is required\"),\r\n provider: z.string().min(1, \"provider is required\"),\r\n judge_target: z.string().optional(),\r\n workers: z.number().int().min(1).optional(),\r\n}).passthrough();\r\n\r\nconst DEFAULT_AZURE_API_VERSION = \"2024-10-01-preview\";\r\n\r\nfunction normalizeAzureApiVersion(value: string | undefined): string {\r\n if (!value) {\r\n return DEFAULT_AZURE_API_VERSION;\r\n }\r\n\r\n const trimmed = value.trim();\r\n if (trimmed.length === 0) {\r\n return DEFAULT_AZURE_API_VERSION;\r\n }\r\n\r\n const withoutPrefix = trimmed.replace(/^api[-_]?version\\s*=\\s*/i, \"\").trim();\r\n return withoutPrefix.length > 0 ? withoutPrefix : DEFAULT_AZURE_API_VERSION;\r\n}\r\n\r\nfunction resolveRetryConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): RetryConfig | undefined {\r\n const maxRetries = resolveOptionalNumber(\r\n target.max_retries ?? target.maxRetries,\r\n `${target.name} max retries`,\r\n );\r\n const initialDelayMs = resolveOptionalNumber(\r\n target.retry_initial_delay_ms ?? target.retryInitialDelayMs,\r\n `${target.name} retry initial delay`,\r\n );\r\n const maxDelayMs = resolveOptionalNumber(\r\n target.retry_max_delay_ms ?? target.retryMaxDelayMs,\r\n `${target.name} retry max delay`,\r\n );\r\n const backoffFactor = resolveOptionalNumber(\r\n target.retry_backoff_factor ?? target.retryBackoffFactor,\r\n `${target.name} retry backoff factor`,\r\n );\r\n const retryableStatusCodes = resolveOptionalNumberArray(\r\n target.retry_status_codes ?? target.retryStatusCodes,\r\n `${target.name} retry status codes`,\r\n );\r\n\r\n // Only return retry config if at least one field is set\r\n if (\r\n maxRetries === undefined &&\r\n initialDelayMs === undefined &&\r\n maxDelayMs === undefined &&\r\n backoffFactor === undefined &&\r\n retryableStatusCodes === undefined\r\n ) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n maxRetries,\r\n initialDelayMs,\r\n maxDelayMs,\r\n backoffFactor,\r\n retryableStatusCodes,\r\n };\r\n}\r\n\r\nexport function resolveTargetDefinition(\r\n definition: TargetDefinition,\r\n env: EnvLookup = process.env,\r\n): ResolvedTarget {\r\n const parsed = BASE_TARGET_SCHEMA.parse(definition);\r\n const provider = parsed.provider.toLowerCase();\r\n const providerBatching = resolveOptionalBoolean(\r\n parsed.provider_batching ?? parsed.providerBatching,\r\n );\r\n\r\n switch (provider) {\r\n case \"azure\":\r\n case \"azure-openai\":\r\n return {\r\n kind: \"azure\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveAzureConfig(parsed, env),\r\n };\r\n case \"anthropic\":\r\n return {\r\n kind: \"anthropic\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveAnthropicConfig(parsed, env),\r\n };\r\n case \"gemini\":\r\n case \"google\":\r\n case \"google-gemini\":\r\n return {\r\n kind: \"gemini\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveGeminiConfig(parsed, env),\r\n };\r\n case \"codex\":\r\n case \"codex-cli\":\r\n return {\r\n kind: \"codex\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveCodexConfig(parsed, env),\r\n };\r\n case \"mock\":\r\n return {\r\n kind: \"mock\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveMockConfig(parsed),\r\n };\r\n case \"vscode\":\r\n case \"vscode-insiders\":\r\n return {\r\n kind: provider as \"vscode\" | \"vscode-insiders\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveVSCodeConfig(parsed, env, provider === \"vscode-insiders\"),\r\n };\r\n case \"cli\":\r\n return {\r\n kind: \"cli\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveCliConfig(parsed, env),\r\n };\r\n default:\r\n throw new Error(`Unsupported provider '${parsed.provider}' in target '${parsed.name}'`);\r\n }\r\n}\r\n\r\nfunction resolveAzureConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): AzureResolvedConfig {\r\n const endpointSource = target.endpoint ?? target.resource ?? target.resourceName;\r\n const apiKeySource = target.api_key ?? target.apiKey;\r\n const deploymentSource = target.deployment ?? target.deploymentName ?? target.model;\r\n const versionSource = target.version ?? target.api_version;\r\n const temperatureSource = target.temperature;\r\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\r\n\r\n const resourceName = resolveString(endpointSource, env, `${target.name} endpoint`);\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} api key`);\r\n const deploymentName = resolveString(deploymentSource, env, `${target.name} deployment`);\r\n const version = normalizeAzureApiVersion(\r\n resolveOptionalString(versionSource, env, `${target.name} api version`),\r\n );\r\n const temperature = resolveOptionalNumber(temperatureSource, `${target.name} temperature`);\r\n const maxOutputTokens = resolveOptionalNumber(\r\n maxTokensSource,\r\n `${target.name} max output tokens`,\r\n );\r\n const retry = resolveRetryConfig(target);\r\n\r\n return {\r\n resourceName,\r\n deploymentName,\r\n apiKey,\r\n version,\r\n temperature,\r\n maxOutputTokens,\r\n retry,\r\n };\r\n}\r\n\r\nfunction resolveAnthropicConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): AnthropicResolvedConfig {\r\n const apiKeySource = target.api_key ?? target.apiKey;\r\n const modelSource = target.model ?? target.deployment ?? target.variant;\r\n const temperatureSource = target.temperature;\r\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\r\n const thinkingBudgetSource = target.thinking_budget ?? target.thinkingBudget;\r\n\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} Anthropic api key`);\r\n const model = resolveString(modelSource, env, `${target.name} Anthropic model`);\r\n const retry = resolveRetryConfig(target);\r\n\r\n return {\r\n apiKey,\r\n model,\r\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\r\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\r\n thinkingBudget: resolveOptionalNumber(thinkingBudgetSource, `${target.name} thinking budget`),\r\n retry,\r\n };\r\n}\r\n\r\nfunction resolveGeminiConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): GeminiResolvedConfig {\r\n const apiKeySource = target.api_key ?? target.apiKey;\r\n const modelSource = target.model ?? target.deployment ?? target.variant;\r\n const temperatureSource = target.temperature;\r\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\r\n\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} Google API key`);\r\n const model =\r\n resolveOptionalString(modelSource, env, `${target.name} Gemini model`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n }) ?? \"gemini-2.5-flash\";\r\n const retry = resolveRetryConfig(target);\r\n\r\n return {\r\n apiKey,\r\n model,\r\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\r\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\r\n retry,\r\n };\r\n}\r\n\r\nfunction resolveCodexConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): CodexResolvedConfig {\r\n const executableSource = target.executable ?? target.command ?? target.binary;\r\n const argsSource = target.args ?? target.arguments;\r\n const cwdSource = target.cwd;\r\n const timeoutSource = target.timeout_seconds ?? target.timeoutSeconds;\r\n const logDirSource = target.log_dir ?? target.logDir ?? target.log_directory ?? target.logDirectory;\r\n const logFormatSource =\r\n target.log_format ??\r\n target.logFormat ??\r\n target.log_output_format ??\r\n target.logOutputFormat ??\r\n env.AGENTV_CODEX_LOG_FORMAT;\r\n\r\n const executable =\r\n resolveOptionalString(executableSource, env, `${target.name} codex executable`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n }) ?? \"codex\";\r\n\r\n const args = resolveOptionalStringArray(argsSource, env, `${target.name} codex args`);\r\n\r\n const cwd = resolveOptionalString(cwdSource, env, `${target.name} codex cwd`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n });\r\n const timeoutMs = resolveTimeoutMs(timeoutSource, `${target.name} codex timeout`);\r\n const logDir = resolveOptionalString(logDirSource, env, `${target.name} codex log directory`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n });\r\n const logFormat = normalizeCodexLogFormat(logFormatSource);\r\n\r\n return {\r\n executable,\r\n args,\r\n cwd,\r\n timeoutMs,\r\n logDir,\r\n logFormat,\r\n };\r\n}\r\n\r\nfunction normalizeCodexLogFormat(value: unknown): \"summary\" | \"json\" | undefined {\r\n if (value === undefined || value === null) {\r\n return undefined;\r\n }\r\n if (typeof value !== \"string\") {\r\n throw new Error(\"codex log format must be 'summary' or 'json'\");\r\n }\r\n const normalized = value.trim().toLowerCase();\r\n if (normalized === \"json\" || normalized === \"summary\") {\r\n return normalized;\r\n }\r\n throw new Error(\"codex log format must be 'summary' or 'json'\");\r\n}\r\n\r\nfunction resolveMockConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): MockResolvedConfig {\r\n const response = typeof target.response === \"string\" ? target.response : undefined;\r\n return { response };\r\n}\r\n\r\nfunction resolveVSCodeConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n insiders: boolean,\r\n): VSCodeResolvedConfig {\r\n const workspaceTemplateEnvVar = resolveOptionalLiteralString(target.workspace_template ?? target.workspaceTemplate);\r\n const workspaceTemplate = workspaceTemplateEnvVar\r\n ? resolveOptionalString(workspaceTemplateEnvVar, env, `${target.name} workspace template path`, {\r\n allowLiteral: false,\r\n optionalEnv: true,\r\n })\r\n : undefined;\r\n\r\n const commandSource = target.vscode_cmd ?? target.command;\r\n const waitSource = target.wait;\r\n const dryRunSource = target.dry_run ?? target.dryRun;\r\n const subagentRootSource = target.subagent_root ?? target.subagentRoot;\r\n\r\n const defaultCommand = insiders ? \"code-insiders\" : \"code\";\r\n const command = resolveOptionalLiteralString(commandSource) ?? defaultCommand;\r\n\r\n return {\r\n command,\r\n waitForResponse: resolveOptionalBoolean(waitSource) ?? true,\r\n dryRun: resolveOptionalBoolean(dryRunSource) ?? false,\r\n subagentRoot: resolveOptionalString(subagentRootSource, env, `${target.name} subagent root`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n }),\r\n workspaceTemplate,\r\n };\r\n}\r\n\r\nfunction resolveCliConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): CliResolvedConfig {\r\n const commandTemplateSource = target.command_template ?? target.commandTemplate;\r\n const filesFormat = resolveOptionalLiteralString(\r\n target.files_format ??\r\n target.filesFormat ??\r\n target.attachments_format ??\r\n target.attachmentsFormat,\r\n );\r\n const cwd = resolveOptionalString(target.cwd, env, `${target.name} working directory`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n });\r\n const timeoutMs = resolveTimeoutMs(target.timeout_seconds ?? target.timeoutSeconds, `${target.name} timeout`);\r\n const healthcheck = resolveCliHealthcheck(target.healthcheck, env, target.name);\r\n\r\n const commandTemplate = resolveString(\r\n commandTemplateSource,\r\n env,\r\n `${target.name} CLI command template`,\r\n true,\r\n );\r\n assertSupportedCliPlaceholders(commandTemplate, `${target.name} CLI command template`);\r\n\r\n return {\r\n commandTemplate,\r\n filesFormat,\r\n cwd,\r\n timeoutMs,\r\n healthcheck,\r\n };\r\n}\r\n\r\nfunction resolveTimeoutMs(source: unknown, description: string): number | undefined {\r\n const seconds = resolveOptionalNumber(source, `${description} (seconds)`);\r\n if (seconds === undefined) {\r\n return undefined;\r\n }\r\n if (seconds <= 0) {\r\n throw new Error(`${description} must be greater than zero seconds`);\r\n }\r\n return Math.floor(seconds * 1000);\r\n}\r\n\r\nfunction resolveCliHealthcheck(\r\n source: unknown,\r\n env: EnvLookup,\r\n targetName: string,\r\n): CliHealthcheck | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (typeof source !== \"object\" || Array.isArray(source)) {\r\n throw new Error(`${targetName} healthcheck must be an object`);\r\n }\r\n\r\n const candidate = source as Record<string, unknown>;\r\n const type = candidate.type;\r\n const timeoutMs = resolveTimeoutMs(\r\n candidate.timeout_seconds ?? candidate.timeoutSeconds,\r\n `${targetName} healthcheck timeout`,\r\n );\r\n\r\n if (type === \"http\") {\r\n const url = resolveString(candidate.url, env, `${targetName} healthcheck URL`);\r\n return {\r\n type: \"http\",\r\n url,\r\n timeoutMs,\r\n };\r\n }\r\n\r\n if (type === \"command\") {\r\n const commandTemplate = resolveString(\r\n candidate.command_template ?? candidate.commandTemplate,\r\n env,\r\n `${targetName} healthcheck command template`,\r\n true,\r\n );\r\n assertSupportedCliPlaceholders(commandTemplate, `${targetName} healthcheck command template`);\r\n const cwd = resolveOptionalString(candidate.cwd, env, `${targetName} healthcheck cwd`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n });\r\n return {\r\n type: \"command\",\r\n commandTemplate,\r\n timeoutMs,\r\n cwd,\r\n };\r\n }\r\n\r\n throw new Error(`${targetName} healthcheck type must be 'http' or 'command'`);\r\n}\r\n\r\nfunction assertSupportedCliPlaceholders(template: string, description: string): void {\r\n const placeholders = extractCliPlaceholders(template);\r\n for (const placeholder of placeholders) {\r\n if (!CLI_PLACEHOLDERS.has(placeholder)) {\r\n throw new Error(\r\n `${description} includes unsupported placeholder '{${placeholder}}'. Supported placeholders: ${Array.from(CLI_PLACEHOLDERS).join(\", \")}`,\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction extractCliPlaceholders(template: string): string[] {\r\n const matches = template.matchAll(/\\{([A-Z_]+)\\}/g);\r\n const results: string[] = [];\r\n for (const match of matches) {\r\n if (match[1]) {\r\n results.push(match[1]);\r\n }\r\n }\r\n return results;\r\n}\r\n\r\nfunction resolveString(\r\n source: unknown,\r\n env: EnvLookup,\r\n description: string,\r\n allowLiteral = false,\r\n): string {\r\n const value = resolveOptionalString(source, env, description, {\r\n allowLiteral,\r\n optionalEnv: false,\r\n });\r\n if (value === undefined) {\r\n throw new Error(`${description} is required`);\r\n }\r\n return value;\r\n}\r\n\r\nfunction resolveOptionalString(\r\n source: unknown,\r\n env: EnvLookup,\r\n description: string,\r\n options?: { allowLiteral?: boolean; optionalEnv?: boolean },\r\n): string | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (typeof source !== \"string\") {\r\n throw new Error(`${description} must be a string`);\r\n }\r\n const trimmed = source.trim();\r\n if (trimmed.length === 0) {\r\n return undefined;\r\n }\r\n\r\n // Check for ${{ variable }} syntax\r\n const envVarMatch = trimmed.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\r\n if (envVarMatch) {\r\n const varName = envVarMatch[1];\r\n const envValue = env[varName];\r\n if (envValue !== undefined) {\r\n if (envValue.trim().length === 0) {\r\n throw new Error(`Environment variable '${varName}' for ${description} is empty`);\r\n }\r\n return envValue;\r\n }\r\n const optionalEnv = options?.optionalEnv ?? false;\r\n if (optionalEnv) {\r\n return undefined;\r\n }\r\n throw new Error(`Environment variable '${varName}' required for ${description} is not set`);\r\n }\r\n\r\n // Return as literal value\r\n const allowLiteral = options?.allowLiteral ?? false;\r\n if (!allowLiteral) {\r\n throw new Error(`${description} must use \\${{ VARIABLE_NAME }} syntax for environment variables or be marked as allowing literals`);\r\n }\r\n return trimmed;\r\n}\r\n\r\nfunction resolveOptionalLiteralString(source: unknown): string | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (typeof source !== \"string\") {\r\n throw new Error(\"expected string value\");\r\n }\r\n const trimmed = source.trim();\r\n return trimmed.length > 0 ? trimmed : undefined;\r\n}\r\n\r\nfunction resolveOptionalNumber(source: unknown, description: string): number | undefined {\r\n if (source === undefined || source === null || source === \"\") {\r\n return undefined;\r\n }\r\n if (typeof source === \"number\") {\r\n return Number.isFinite(source) ? source : undefined;\r\n }\r\n if (typeof source === \"string\") {\r\n const numeric = Number(source);\r\n if (Number.isFinite(numeric)) {\r\n return numeric;\r\n }\r\n }\r\n throw new Error(`${description} must be a number`);\r\n}\r\n\r\nfunction resolveOptionalBoolean(source: unknown): boolean | undefined {\r\n if (source === undefined || source === null || source === \"\") {\r\n return undefined;\r\n }\r\n if (typeof source === \"boolean\") {\r\n return source;\r\n }\r\n if (typeof source === \"string\") {\r\n const lowered = source.trim().toLowerCase();\r\n if (lowered === \"true\" || lowered === \"1\") {\r\n return true;\r\n }\r\n if (lowered === \"false\" || lowered === \"0\") {\r\n return false;\r\n }\r\n }\r\n throw new Error(\"expected boolean value\");\r\n}\r\n\r\nfunction resolveOptionalStringArray(\r\n source: unknown,\r\n env: EnvLookup,\r\n description: string,\r\n): readonly string[] | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (!Array.isArray(source)) {\r\n throw new Error(`${description} must be an array of strings`);\r\n }\r\n if (source.length === 0) {\r\n return undefined;\r\n }\r\n const resolved: string[] = [];\r\n for (let i = 0; i < source.length; i++) {\r\n const item = source[i];\r\n if (typeof item !== \"string\") {\r\n throw new Error(`${description}[${i}] must be a string`);\r\n }\r\n const trimmed = item.trim();\r\n if (trimmed.length === 0) {\r\n throw new Error(`${description}[${i}] cannot be empty`);\r\n }\r\n\r\n // Check for ${{ variable }} syntax\r\n const envVarMatch = trimmed.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\r\n if (envVarMatch) {\r\n const varName = envVarMatch[1];\r\n const envValue = env[varName];\r\n if (envValue !== undefined) {\r\n if (envValue.trim().length === 0) {\r\n throw new Error(`Environment variable '${varName}' for ${description}[${i}] is empty`);\r\n }\r\n resolved.push(envValue);\r\n continue;\r\n }\r\n throw new Error(`Environment variable '${varName}' for ${description}[${i}] is not set`);\r\n }\r\n\r\n // Treat as literal value\r\n resolved.push(trimmed);\r\n }\r\n return resolved.length > 0 ? resolved : undefined;\r\n}\r\n\r\nfunction resolveOptionalNumberArray(\r\n source: unknown,\r\n description: string,\r\n): readonly number[] | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (!Array.isArray(source)) {\r\n throw new Error(`${description} must be an array of numbers`);\r\n }\r\n if (source.length === 0) {\r\n return undefined;\r\n }\r\n const resolved: number[] = [];\r\n for (let i = 0; i < source.length; i++) {\r\n const item = source[i];\r\n if (typeof item !== \"number\" || !Number.isFinite(item)) {\r\n throw new Error(`${description}[${i}] must be a number`);\r\n }\r\n resolved.push(item);\r\n }\r\n return resolved.length > 0 ? resolved : undefined;\r\n}\r\n","import path from \"node:path\";\r\nimport { dispatchAgentSession, dispatchBatchAgent, getSubagentRoot, provisionSubagents } from \"subagent\";\r\n\r\nimport type { VSCodeResolvedConfig } from \"./targets.js\";\r\nimport type { Provider, ProviderRequest, ProviderResponse } from \"./types.js\";\r\nimport { readTextFile } from \"../file-utils.js\";\r\nimport { isGuidelineFile } from \"../yaml-parser.js\";\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 readonly supportsBatch = true;\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 inputFiles = normalizeAttachments(request.inputFiles);\r\n const promptContent = buildPromptDocument(request, inputFiles, request.guideline_patterns);\r\n\r\n const session = await dispatchAgentSession({\r\n userQuery: promptContent,\r\n extraAttachments: inputFiles,\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 inputFiles,\r\n },\r\n };\r\n }\r\n\r\n const responseText = await readTextFile(session.responseFile);\r\n\r\n return {\r\n text: responseText,\r\n raw: {\r\n session,\r\n inputFiles,\r\n },\r\n };\r\n }\r\n\r\n async invokeBatch(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]> {\r\n if (requests.length === 0) {\r\n return [];\r\n }\r\n\r\n const normalizedRequests = requests.map((req) => ({\r\n request: req,\r\n inputFiles: normalizeAttachments(req.inputFiles),\r\n }));\r\n\r\n const combinedInputFiles = mergeAttachments(\r\n normalizedRequests.map(({ inputFiles }) => inputFiles),\r\n );\r\n const userQueries = normalizedRequests.map(({ request, inputFiles }) =>\r\n buildPromptDocument(request, inputFiles, request.guideline_patterns),\r\n );\r\n\r\n const session = await dispatchBatchAgent({\r\n userQueries,\r\n extraAttachments: combinedInputFiles,\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.responseFiles) {\r\n const failure = session.error ?? \"VS Code subagent did not produce batch responses\";\r\n throw new Error(failure);\r\n }\r\n\r\n if (this.config.dryRun) {\r\n return normalizedRequests.map(({ inputFiles }) => ({\r\n text: \"\",\r\n raw: {\r\n session,\r\n inputFiles,\r\n allInputFiles: combinedInputFiles,\r\n },\r\n }));\r\n }\r\n\r\n if (session.responseFiles.length !== requests.length) {\r\n throw new Error(\r\n `VS Code batch returned ${session.responseFiles.length} responses for ${requests.length} requests`,\r\n );\r\n }\r\n\r\n const responses: ProviderResponse[] = [];\r\n for (const [index, responseFile] of session.responseFiles.entries()) {\r\n const responseText = await readTextFile(responseFile);\r\n responses.push({\r\n text: responseText,\r\n raw: {\r\n session,\r\n inputFiles: normalizedRequests[index]?.inputFiles,\r\n allInputFiles: combinedInputFiles,\r\n responseFile,\r\n },\r\n });\r\n }\r\n\r\n return responses;\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 const attachmentFiles = collectAttachmentFiles(attachments);\r\n\r\n const nonGuidelineAttachments = attachmentFiles.filter(\r\n (file) => !guidelineFiles.includes(file),\r\n );\r\n\r\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineAttachments);\r\n if (prereadBlock.length > 0) {\r\n parts.push(\"\\n\", prereadBlock);\r\n }\r\n\r\n parts.push(\"\\n[[ ## user_query ## ]]\\n\", request.question.trim());\r\n\r\n return parts.join(\"\\n\").trim();\r\n}\r\n\r\nfunction buildMandatoryPrereadBlock(\r\n guidelineFiles: readonly string[],\r\n attachmentFiles: readonly string[],\r\n): string {\r\n if (guidelineFiles.length === 0 && attachmentFiles.length === 0) {\r\n return \"\";\r\n }\r\n\r\n const buildList = (files: readonly string[]): string[] =>\r\n files.map((absolutePath) => {\r\n const fileName = path.basename(absolutePath);\r\n const fileUri = pathToFileUri(absolutePath);\r\n return `* [${fileName}](${fileUri})`;\r\n });\r\n\r\n const sections: string[] = [];\r\n if (guidelineFiles.length > 0) {\r\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join(\"\\n\")}.`);\r\n }\r\n\r\n if (attachmentFiles.length > 0) {\r\n sections.push(`Read all attachment files:\\n${buildList(attachmentFiles).join(\"\\n\")}.`);\r\n }\r\n\r\n sections.push(\r\n \"If any file is missing, fail with ERROR: missing-file <filename> and stop.\",\r\n \"Then apply system_instructions on the user query below.\",\r\n );\r\n\r\n return sections.join(\"\\n\");\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 collectAttachmentFiles(\r\n attachments: readonly string[] | undefined,\r\n): string[] {\r\n if (!attachments || attachments.length === 0) {\r\n return [];\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 if (!unique.has(absolutePath)) {\r\n unique.set(absolutePath, absolutePath);\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.question.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\nfunction mergeAttachments(all: readonly (readonly string[] | undefined)[]): string[] | undefined {\r\n const deduped = new Set<string>();\r\n for (const list of all) {\r\n if (!list) continue;\r\n for (const inputFile of list) {\r\n deduped.add(path.resolve(inputFile));\r\n }\r\n }\r\n return deduped.size > 0 ? Array.from(deduped) : undefined;\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}\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\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 // Pass through all properties from the YAML to support the flattened schema\r\n // This includes all provider-specific settings at the top level\r\n return value as unknown as 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 type { AxChatRequest, AxAI } from \"@ax-llm/ax\";\r\n\r\nimport type { JsonObject } from \"../types.js\";\r\n\r\nexport type ChatPrompt = AxChatRequest[\"chatPrompt\"];\r\n\r\nexport type ProviderKind =\r\n | \"azure\"\r\n | \"anthropic\"\r\n | \"gemini\"\r\n | \"codex\"\r\n | \"cli\"\r\n | \"mock\"\r\n | \"vscode\"\r\n | \"vscode-insiders\";\r\n\r\n/**\r\n * Agent providers that have filesystem access and don't need unwrapped guidelines.\r\n * These providers read files directly from the filesystem using file:// URIs.\r\n */\r\nexport const AGENT_PROVIDER_KINDS: readonly ProviderKind[] = [\r\n \"codex\",\r\n \"vscode\",\r\n \"vscode-insiders\",\r\n] as const;\r\n\r\n/**\r\n * List of all supported provider kinds.\r\n * This is the source of truth for provider validation.\r\n */\r\nexport const KNOWN_PROVIDERS: readonly ProviderKind[] = [\r\n \"azure\",\r\n \"anthropic\",\r\n \"gemini\",\r\n \"codex\",\r\n \"cli\",\r\n \"mock\",\r\n \"vscode\",\r\n \"vscode-insiders\",\r\n] as const;\r\n\r\n/**\r\n * Provider aliases that are accepted in target definitions.\r\n * These map to the canonical ProviderKind values.\r\n */\r\nexport const PROVIDER_ALIASES: readonly string[] = [\r\n \"azure-openai\", // alias for \"azure\"\r\n \"google\", // alias for \"gemini\"\r\n \"google-gemini\", // alias for \"gemini\"\r\n \"codex-cli\", // alias for \"codex\"\r\n \"openai\", // legacy/future support\r\n \"bedrock\", // legacy/future support\r\n \"vertex\", // legacy/future support\r\n] as const;\r\n\r\n/**\r\n * Schema identifier for targets.yaml files (version 2).\r\n */\r\nexport const TARGETS_SCHEMA_V2 = \"agentv-targets-v2.2\";\r\n\r\nexport interface ProviderRequest {\r\n readonly question: string;\r\n readonly guidelines?: string;\r\n readonly guideline_patterns?: readonly string[];\r\n readonly chatPrompt?: ChatPrompt;\r\n readonly inputFiles?: readonly string[];\r\n readonly evalCaseId?: string;\r\n readonly attempt?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly temperature?: number;\r\n readonly metadata?: JsonObject;\r\n readonly signal?: AbortSignal;\r\n}\r\n\r\nexport interface ProviderResponse {\r\n readonly text: string;\r\n readonly reasoning?: string;\r\n readonly raw?: unknown;\r\n readonly usage?: JsonObject;\r\n}\r\n\r\n/**\r\n * Type guard to check if a provider is an agent provider with filesystem access.\r\n * Agent providers read files directly and don't need unwrapped guideline content.\r\n */\r\nexport function isAgentProvider(provider: Provider | undefined): boolean {\r\n return provider ? AGENT_PROVIDER_KINDS.includes(provider.kind) : false;\r\n}\r\n\r\nexport interface Provider {\r\n readonly id: string;\r\n readonly kind: ProviderKind;\r\n readonly targetName: string;\r\n invoke(request: ProviderRequest): Promise<ProviderResponse>;\r\n /**\r\n * Optional capability marker for provider-managed batching (single session handling multiple requests).\r\n */\r\n readonly supportsBatch?: boolean;\r\n /**\r\n * Optional batch invocation hook. When defined alongside supportsBatch=true,\r\n * the orchestrator may send multiple requests in a single provider session.\r\n */\r\n invokeBatch?(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]>;\r\n /**\r\n * Optional access to the underlying AxAI instance.\r\n * This enables using advanced Ax features like structured output signatures.\r\n */\r\n getAxAI?(): AxAI;\r\n}\r\n\r\nexport type EnvLookup = Readonly<Record<string, string | undefined>>;\r\n\r\nexport interface TargetDefinition {\r\n readonly name: string;\r\n readonly provider: ProviderKind | string;\r\n readonly judge_target?: string | undefined;\r\n readonly workers?: number | undefined;\r\n // Provider batching\r\n readonly provider_batching?: boolean | undefined;\r\n readonly providerBatching?: boolean | undefined;\r\n // Azure fields\r\n readonly endpoint?: string | unknown | undefined;\r\n readonly resource?: string | unknown | undefined;\r\n readonly resourceName?: string | unknown | undefined;\r\n readonly api_key?: string | unknown | undefined;\r\n readonly apiKey?: string | unknown | undefined;\r\n readonly deployment?: string | unknown | undefined;\r\n readonly deploymentName?: string | unknown | undefined;\r\n readonly model?: string | unknown | undefined;\r\n readonly version?: string | unknown | undefined;\r\n readonly api_version?: string | unknown | undefined;\r\n // Anthropic fields\r\n readonly variant?: string | unknown | undefined;\r\n readonly thinking_budget?: number | unknown | undefined;\r\n readonly thinkingBudget?: number | unknown | undefined;\r\n // Common fields\r\n readonly temperature?: number | unknown | undefined;\r\n readonly max_output_tokens?: number | unknown | undefined;\r\n readonly maxTokens?: number | unknown | undefined;\r\n // Codex fields\r\n readonly executable?: string | unknown | undefined;\r\n readonly command?: string | unknown | undefined;\r\n readonly binary?: string | unknown | undefined;\r\n readonly args?: unknown | undefined;\r\n readonly arguments?: unknown | undefined;\r\n readonly cwd?: string | unknown | undefined;\r\n readonly timeout_seconds?: number | unknown | undefined;\r\n readonly timeoutSeconds?: number | unknown | undefined;\r\n readonly log_dir?: string | unknown | undefined;\r\n readonly logDir?: string | unknown | undefined;\r\n readonly log_directory?: string | unknown | undefined;\r\n readonly logDirectory?: string | unknown | undefined;\r\n readonly log_format?: string | unknown | undefined;\r\n readonly logFormat?: string | unknown | undefined;\r\n readonly log_output_format?: string | unknown | undefined;\r\n readonly logOutputFormat?: string | unknown | undefined;\r\n // Mock fields\r\n readonly response?: string | unknown | undefined;\r\n readonly delayMs?: number | unknown | undefined;\r\n readonly delayMinMs?: number | unknown | undefined;\r\n readonly delayMaxMs?: number | unknown | undefined;\r\n // VSCode fields\r\n readonly vscode_cmd?: string | unknown | undefined;\r\n readonly wait?: boolean | unknown | undefined;\r\n readonly dry_run?: boolean | unknown | undefined;\r\n readonly dryRun?: boolean | unknown | undefined;\r\n readonly subagent_root?: string | unknown | undefined;\r\n readonly subagentRoot?: string | unknown | undefined;\r\n readonly workspace_template?: string | unknown | undefined;\r\n readonly workspaceTemplate?: string | unknown | undefined;\r\n // CLI fields\r\n readonly command_template?: string | unknown | undefined;\r\n readonly commandTemplate?: string | unknown | undefined;\r\n readonly files_format?: string | unknown | undefined;\r\n readonly filesFormat?: string | unknown | undefined;\r\n readonly attachments_format?: string | unknown | undefined;\r\n readonly attachmentsFormat?: string | unknown | undefined;\r\n readonly env?: unknown | undefined;\r\n readonly healthcheck?: unknown | undefined;\r\n // Retry configuration fields\r\n readonly max_retries?: number | unknown | undefined;\r\n readonly maxRetries?: number | unknown | undefined;\r\n readonly retry_initial_delay_ms?: number | unknown | undefined;\r\n readonly retryInitialDelayMs?: number | unknown | undefined;\r\n readonly retry_max_delay_ms?: number | unknown | undefined;\r\n readonly retryMaxDelayMs?: number | unknown | undefined;\r\n readonly retry_backoff_factor?: number | unknown | undefined;\r\n readonly retryBackoffFactor?: number | unknown | undefined;\r\n readonly retry_status_codes?: unknown | undefined;\r\n readonly retryStatusCodes?: unknown | undefined;\r\n}\r\n","import { AnthropicProvider, AzureProvider, GeminiProvider } from \"./ax.js\";\r\nimport { CliProvider } from \"./cli.js\";\r\nimport { CodexProvider } from \"./codex.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 CliResolvedConfig,\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\nexport { consumeCodexLogEntries, subscribeToCodexLogEntries } from \"./codex-log-tracker.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 \"cli\":\r\n return new CliProvider(target.name, target.config);\r\n case \"codex\":\r\n return new CodexProvider(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","import { randomUUID } from \"node:crypto\";\r\n\r\nimport type { ResolvedTarget } from \"./providers/targets.js\";\r\nimport type { Provider, ProviderResponse, ChatPrompt } from \"./providers/types.js\";\r\nimport type { EvaluatorConfig, JsonObject, EvalCase } from \"./types.js\";\r\n\r\nexport interface EvaluationContext {\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 question: string;\r\n readonly guidelines: string;\r\n readonly systemMessage?: string;\r\n readonly chatPrompt?: ChatPrompt;\r\n };\r\n readonly now: Date;\r\n readonly judgeProvider?: Provider;\r\n readonly systemPrompt?: string;\r\n readonly evaluator?: EvaluatorConfig;\r\n}\r\n\r\nexport interface EvaluationScore {\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 evaluatorRawRequest?: JsonObject;\r\n}\r\n\r\nexport interface Evaluator {\r\n readonly kind: string;\r\n evaluate(context: EvaluationContext): Promise<EvaluationScore> | EvaluationScore;\r\n}\r\n\r\ntype JudgeProviderResolver = (context: EvaluationContext) => Promise<Provider | undefined>;\r\n\r\nexport interface LlmJudgeEvaluatorOptions {\r\n readonly resolveJudgeProvider: JudgeProviderResolver;\r\n readonly maxOutputTokens?: number;\r\n readonly temperature?: number;\r\n readonly customPrompt?: string;\r\n}\r\n\r\nexport class LlmJudgeEvaluator implements Evaluator {\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 private readonly customPrompt?: string;\r\n\r\n constructor(options: LlmJudgeEvaluatorOptions) {\r\n this.resolveJudgeProvider = options.resolveJudgeProvider;\r\n this.maxOutputTokens = options.maxOutputTokens;\r\n this.temperature = options.temperature;\r\n this.customPrompt = options.customPrompt;\r\n }\r\n\r\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\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 return this.evaluateWithPrompt(context, judgeProvider);\r\n }\r\n\r\n private async evaluateWithPrompt(\r\n context: EvaluationContext,\r\n judgeProvider: Provider,\r\n ): Promise<EvaluationScore> {\r\n const hasReferenceAnswer = hasNonEmptyReferenceAnswer(context.evalCase);\r\n\r\n const formattedQuestion =\r\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\r\n ? context.promptInputs.question\r\n : context.evalCase.question;\r\n\r\n let prompt = buildQualityPrompt(context.evalCase, context.candidate, formattedQuestion);\r\n let systemPrompt = context.systemPrompt ?? this.customPrompt ?? buildSystemPrompt(hasReferenceAnswer);\r\n\r\n if (systemPrompt && hasTemplateVariables(systemPrompt)) {\r\n const variables = {\r\n input_messages: JSON.stringify(context.evalCase.input_segments, null, 2),\r\n output_messages: JSON.stringify(context.evalCase.output_segments, null, 2),\r\n candidate_answer: context.candidate,\r\n reference_answer: context.evalCase.reference_answer ?? \"\",\r\n expected_outcome: context.evalCase.expected_outcome,\r\n question: formattedQuestion,\r\n };\r\n prompt = substituteVariables(systemPrompt, variables);\r\n systemPrompt = buildSystemPrompt(hasReferenceAnswer);\r\n }\r\n\r\n const metadata: JsonObject = systemPrompt !== undefined ? { systemPrompt } : {};\r\n\r\n const response = await judgeProvider.invoke({\r\n question: 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 const reasoning = parsed.reasoning ?? response.reasoning;\r\n const expectedAspectCount = Math.max(hits.length + misses.length, 1);\r\n\r\n const evaluatorRawRequest: JsonObject = {\r\n id: randomUUID(),\r\n provider: judgeProvider.id,\r\n prompt,\r\n target: context.target.name,\r\n ...(systemPrompt !== undefined && { systemPrompt }),\r\n };\r\n\r\n return {\r\n score,\r\n hits,\r\n misses,\r\n expectedAspectCount,\r\n reasoning,\r\n evaluatorRawRequest,\r\n };\r\n }\r\n}\r\n\r\nfunction buildSystemPrompt(hasReferenceAnswer: boolean): string {\r\n const basePrompt = [\r\n \"You are an expert evaluator. Your goal is to grade the candidate_answer based on how well it achieves the expected_outcome for the original task.\",\r\n \"\",\r\n ];\r\n\r\n if (hasReferenceAnswer) {\r\n basePrompt.push(\r\n \"Use the reference_answer as a gold standard for a high-quality response. The candidate_answer does not need to match it verbatim, but should capture the key points and follow the same spirit.\",\r\n \"\",\r\n );\r\n }\r\n\r\n basePrompt.push(\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 );\r\n\r\n return basePrompt.join(\"\\n\");\r\n}\r\n\r\nfunction buildQualityPrompt(evalCase: EvalCase, candidate: string, question: string): string {\r\n const parts = [\r\n \"[[ ## expected_outcome ## ]]\",\r\n evalCase.expected_outcome.trim(),\r\n \"\",\r\n \"[[ ## question ## ]]\",\r\n question.trim(),\r\n \"\",\r\n ];\r\n \r\n // Only include reference_answer if provided\r\n if (hasNonEmptyReferenceAnswer(evalCase)) {\r\n parts.push(\r\n \"[[ ## reference_answer ## ]]\",\r\n evalCase.reference_answer!.trim(),\r\n \"\",\r\n );\r\n }\r\n \r\n parts.push(\r\n \"[[ ## candidate_answer ## ]]\",\r\n candidate.trim(),\r\n );\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\r\nfunction hasNonEmptyReferenceAnswer(evalCase: EvalCase): boolean {\r\n return (\r\n evalCase.reference_answer !== undefined &&\r\n evalCase.reference_answer.trim().length > 0\r\n );\r\n}\r\n\r\n// Code Evaluator\r\n\r\nexport interface CodeEvaluatorOptions {\r\n readonly script: string;\r\n readonly cwd?: string;\r\n readonly agentTimeoutMs?: number;\r\n}\r\n\r\nexport class CodeEvaluator implements Evaluator {\r\n readonly kind = \"code\";\r\n\r\n private readonly script: string;\r\n private readonly cwd?: string;\r\n private readonly agentTimeoutMs?: number;\r\n\r\n constructor(options: CodeEvaluatorOptions) {\r\n this.script = options.script;\r\n this.cwd = options.cwd;\r\n this.agentTimeoutMs = options.agentTimeoutMs;\r\n }\r\n\r\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\r\n const inputPayload = JSON.stringify(\r\n {\r\n question: context.evalCase.question,\r\n expected_outcome: context.evalCase.expected_outcome,\r\n reference_answer: context.evalCase.reference_answer,\r\n candidate_answer: context.candidate,\r\n guideline_paths: context.evalCase.guideline_paths,\r\n input_files: context.evalCase.file_paths,\r\n input_segments: context.evalCase.input_segments,\r\n },\r\n null,\r\n 2,\r\n );\r\n\r\n try {\r\n const stdout = await executeScript(this.script, inputPayload, this.agentTimeoutMs, this.cwd);\r\n const parsed = parseJsonSafe(stdout);\r\n const score = clampScore(typeof parsed?.score === \"number\" ? parsed.score : 0);\r\n const hits = Array.isArray(parsed?.hits) ? parsed.hits.filter(isNonEmptyString) : [];\r\n const misses = Array.isArray(parsed?.misses) ? parsed.misses.filter(isNonEmptyString) : [];\r\n const reasoning = typeof parsed?.reasoning === \"string\" ? parsed.reasoning : undefined;\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 evaluatorRawRequest: {\r\n script: this.script,\r\n ...(this.cwd ? { cwd: this.cwd } : {}),\r\n },\r\n };\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n return {\r\n score: 0,\r\n hits: [],\r\n misses: [`Code evaluator failed: ${message}`],\r\n expectedAspectCount: 1,\r\n reasoning: message,\r\n evaluatorRawRequest: {\r\n script: this.script,\r\n ...(this.cwd ? { cwd: this.cwd } : {}),\r\n error: message,\r\n },\r\n };\r\n }\r\n }\r\n}\r\n\r\n// Helper functions for CodeEvaluator\r\n\r\nasync function executeScript(\r\n scriptPath: string,\r\n input: string,\r\n agentTimeoutMs?: number,\r\n cwd?: string,\r\n): Promise<string> {\r\n const { spawn } = await import(\"node:child_process\");\r\n \r\n return await new Promise<string>((resolve, reject) => {\r\n const child = spawn(scriptPath, {\r\n shell: true,\r\n cwd,\r\n });\r\n\r\n let stdout = \"\";\r\n let stderr = \"\";\r\n\r\n const timeout = agentTimeoutMs\r\n ? setTimeout(() => {\r\n child.kill();\r\n reject(new Error(`Code evaluator timed out after ${agentTimeoutMs}ms`));\r\n }, agentTimeoutMs)\r\n : undefined;\r\n\r\n child.stdout?.on(\"data\", (data) => {\r\n stdout += data.toString();\r\n });\r\n child.stderr?.on(\"data\", (data) => {\r\n stderr += data.toString();\r\n });\r\n child.on(\"error\", (error) => {\r\n if (timeout !== undefined) {\r\n clearTimeout(timeout);\r\n }\r\n reject(error);\r\n });\r\n child.on(\"exit\", (code) => {\r\n if (timeout !== undefined) {\r\n clearTimeout(timeout);\r\n }\r\n if (code && code !== 0 && stderr.length > 0) {\r\n reject(new Error(`Code evaluator exited with code ${code}: ${stderr.trim()}`));\r\n return;\r\n }\r\n resolve(stdout.trim());\r\n });\r\n\r\n child.stdin?.write(input);\r\n child.stdin?.end();\r\n });\r\n}\r\n\r\nfunction parseJsonSafe(payload: string): Record<string, unknown> | undefined {\r\n try {\r\n return JSON.parse(payload) as Record<string, unknown>;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction hasTemplateVariables(text: string): boolean {\r\n return /\\$\\{[a-zA-Z0-9_]+\\}/.test(text);\r\n}\r\n\r\nfunction substituteVariables(template: string, variables: Record<string, string>): string {\r\n return template.replace(/\\$\\{([a-zA-Z0-9_]+)\\}/g, (match, varName) => {\r\n return variables[varName] ?? match;\r\n });\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 { LlmJudgeEvaluator, CodeEvaluator, type EvaluationScore, type Evaluator } from \"./evaluators.js\";\r\nimport { readTextFile } from \"./file-utils.js\";\r\nimport { createProvider } from \"./providers/index.js\";\r\nimport { resolveTargetDefinition, type ResolvedTarget } from \"./providers/targets.js\";\r\nimport type {\r\n EnvLookup,\r\n Provider,\r\n ProviderRequest,\r\n ProviderResponse,\r\n TargetDefinition,\r\n} from \"./providers/types.js\";\r\nimport { isAgentProvider } from \"./providers/types.js\";\r\nimport type { EvalCase, EvaluationResult, EvaluatorConfig, EvaluatorResult, JsonObject, JsonValue } from \"./types.js\";\r\nimport { buildPromptInputs, loadEvalCases, type PromptInputs } 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 evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\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 evaluators?: Partial<Record<string, Evaluator>>;\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: evalFilePath,\r\n repoRoot,\r\n target,\r\n targets,\r\n env,\r\n providerFactory,\r\n evaluators,\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(evalFilePath, repoRoot, { verbose, evalId });\r\n\r\n const filteredEvalCases = filterEvalCases(evalCases, evalId);\r\n if (filteredEvalCases.length === 0) {\r\n if (evalId) {\r\n throw new Error(`Eval case with id '${evalId}' not found in ${evalFilePath}`);\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 evaluatorRegistry = buildEvaluatorRegistry(evaluators, resolveJudgeProvider);\r\n\r\n const primaryProvider = getOrCreateProvider(target);\r\n const providerSupportsBatch =\r\n target.providerBatching === true &&\r\n primaryProvider.supportsBatch === true &&\r\n typeof primaryProvider.invokeBatch === \"function\";\r\n if (target.providerBatching && !providerSupportsBatch && verbose) {\r\n console.warn(\r\n `Provider batching requested for target '${target.name}', but provider does not advertise batch support. Using per-case dispatch.`,\r\n );\r\n }\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 if (providerSupportsBatch) {\r\n try {\r\n return await runBatchEvaluation({\r\n evalCases: filteredEvalCases,\r\n provider: primaryProvider,\r\n target,\r\n evaluatorRegistry,\r\n promptDumpDir,\r\n nowFn: now ?? (() => new Date()),\r\n onProgress,\r\n onResult,\r\n verbose,\r\n resolveJudgeProvider,\r\n agentTimeoutMs,\r\n });\r\n } catch (error) {\r\n if (verbose) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n console.warn(`Provider batch execution failed, falling back to per-case dispatch: ${message}`);\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 evaluators: evaluatorRegistry,\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: result.error ? \"failed\" : \"completed\",\r\n startedAt: 0, // Not used for completed status\r\n completedAt: Date.now(),\r\n error: result.error,\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 primaryProvider,\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\nasync function runBatchEvaluation(options: {\r\n readonly evalCases: readonly EvalCase[];\r\n readonly provider: Provider;\r\n readonly target: ResolvedTarget;\r\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\r\n readonly promptDumpDir?: string;\r\n readonly nowFn: () => Date;\r\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\r\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\r\n readonly verbose?: boolean;\r\n readonly resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>;\r\n readonly agentTimeoutMs?: number;\r\n}): Promise<readonly EvaluationResult[]> {\r\n const {\r\n evalCases,\r\n provider,\r\n target,\r\n evaluatorRegistry,\r\n promptDumpDir,\r\n nowFn,\r\n onProgress,\r\n onResult,\r\n resolveJudgeProvider,\r\n agentTimeoutMs,\r\n } = options;\r\n\r\n // Prepare prompt inputs up front so we can reuse them for grading.\r\n const promptInputsList: PromptInputs[] = [];\r\n for (const evalCase of evalCases) {\r\n const promptInputs = await buildPromptInputs(evalCase);\r\n if (promptDumpDir) {\r\n await dumpPrompt(promptDumpDir, evalCase, promptInputs);\r\n }\r\n promptInputsList.push(promptInputs);\r\n }\r\n\r\n const batchRequests: ProviderRequest[] = evalCases.map((evalCase, index) => {\r\n const promptInputs = promptInputsList[index];\r\n return {\r\n question: promptInputs.question,\r\n guidelines: promptInputs.guidelines,\r\n guideline_patterns: evalCase.guideline_patterns,\r\n inputFiles: evalCase.file_paths,\r\n evalCaseId: evalCase.id,\r\n metadata: {\r\n systemPrompt: promptInputs.systemMessage ?? \"\",\r\n },\r\n };\r\n });\r\n\r\n const batchResponse = await provider.invokeBatch?.(batchRequests);\r\n if (!Array.isArray(batchResponse)) {\r\n throw new Error(\"Provider batching failed: invokeBatch did not return an array\");\r\n }\r\n if (batchResponse.length !== evalCases.length) {\r\n throw new Error(\r\n `Provider batching failed: expected ${evalCases.length} responses, received ${batchResponse.length}`,\r\n );\r\n }\r\n\r\n if (onProgress) {\r\n const startedAt = Date.now();\r\n for (let i = 0; i < evalCases.length; i++) {\r\n await onProgress({\r\n workerId: 1,\r\n evalId: evalCases[i].id,\r\n status: \"running\",\r\n startedAt,\r\n });\r\n }\r\n }\r\n\r\n const results: EvaluationResult[] = [];\r\n for (let i = 0; i < evalCases.length; i++) {\r\n const evalCase = evalCases[i];\r\n const promptInputs = promptInputsList[i];\r\n const providerResponse = batchResponse[i];\r\n let result: EvaluationResult;\r\n try {\r\n result = await evaluateCandidate({\r\n evalCase,\r\n candidate: providerResponse.text ?? \"\",\r\n target,\r\n provider,\r\n evaluators: evaluatorRegistry,\r\n promptInputs,\r\n nowFn,\r\n attempt: 0,\r\n judgeProvider: await resolveJudgeProvider(target),\r\n agentTimeoutMs,\r\n });\r\n } catch (error) {\r\n const errorResult = buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs, provider);\r\n results.push(errorResult);\r\n if (onResult) {\r\n await onResult(errorResult);\r\n }\r\n if (onProgress) {\r\n await onProgress({\r\n workerId: 1,\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 continue;\r\n }\r\n\r\n results.push(result);\r\n if (onResult) {\r\n await onResult(result);\r\n }\r\n\r\n if (onProgress) {\r\n await onProgress({\r\n workerId: 1,\r\n evalId: evalCase.id,\r\n status: \"completed\",\r\n startedAt: 0,\r\n completedAt: Date.now(),\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 evaluators,\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, provider);\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 provider,\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 try {\r\n return await evaluateCandidate({\r\n evalCase,\r\n candidate: providerResponse.text ?? \"\",\r\n target,\r\n provider,\r\n evaluators,\r\n promptInputs,\r\n nowFn,\r\n attempt,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n });\r\n } catch (error) {\r\n return buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs, provider);\r\n }\r\n}\r\n\r\nasync function evaluateCandidate(options: {\r\n readonly evalCase: EvalCase;\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\r\n readonly promptInputs: PromptInputs;\r\n readonly nowFn: () => Date;\r\n readonly attempt: number;\r\n readonly judgeProvider?: Provider;\r\n readonly agentTimeoutMs?: number;\r\n}): Promise<EvaluationResult> {\r\n const {\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n evaluators,\r\n promptInputs,\r\n nowFn,\r\n attempt,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n } = options;\r\n\r\n const gradeTimestamp = nowFn();\r\n const { score, evaluatorResults } = await runEvaluatorsForCase({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n evaluators,\r\n attempt,\r\n promptInputs,\r\n now: gradeTimestamp,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n });\r\n\r\n const completedAt = nowFn();\r\n \r\n let agentProviderRequest: JsonObject | undefined;\r\n let lmProviderRequest: JsonObject | undefined;\r\n\r\n if (isAgentProvider(provider)) {\r\n agentProviderRequest = {\r\n question: promptInputs.question,\r\n guideline_paths: evalCase.guideline_paths,\r\n } as JsonObject;\r\n } else {\r\n if (promptInputs.chatPrompt) {\r\n lmProviderRequest = {\r\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\r\n guideline_paths: evalCase.guideline_paths,\r\n } as JsonObject;\r\n } else {\r\n lmProviderRequest = {\r\n question: promptInputs.question,\r\n guidelines: promptInputs.guidelines,\r\n guideline_paths: evalCase.guideline_paths,\r\n } as JsonObject;\r\n }\r\n }\r\n\r\n return {\r\n eval_id: evalCase.id,\r\n dataset: evalCase.dataset,\r\n conversation_id: evalCase.conversation_id,\r\n score: score.score,\r\n hits: score.hits,\r\n misses: score.misses,\r\n candidate_answer: candidate,\r\n expected_aspect_count: score.expectedAspectCount,\r\n target: target.name,\r\n timestamp: completedAt.toISOString(),\r\n reasoning: score.reasoning,\r\n raw_aspects: score.rawAspects,\r\n agent_provider_request: agentProviderRequest,\r\n lm_provider_request: lmProviderRequest,\r\n evaluator_raw_request: evaluatorResults ? undefined : score.evaluatorRawRequest,\r\n evaluator_results: evaluatorResults,\r\n };\r\n}\r\n\r\nasync function runEvaluatorsForCase(options: {\r\n readonly evalCase: EvalCase;\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\r\n readonly attempt: number;\r\n readonly promptInputs: PromptInputs;\r\n readonly now: Date;\r\n readonly judgeProvider?: Provider;\r\n readonly agentTimeoutMs?: number;\r\n}): Promise<{ score: EvaluationScore; evaluatorResults?: EvaluatorResult[] }> {\r\n const { evalCase, candidate, target, provider, evaluators, attempt, promptInputs, now, judgeProvider, agentTimeoutMs } =\r\n options;\r\n\r\n if (evalCase.evaluators && evalCase.evaluators.length > 0) {\r\n return runEvaluatorList({\r\n evalCase,\r\n evaluators: evalCase.evaluators,\r\n candidate,\r\n target,\r\n provider,\r\n evaluatorRegistry: evaluators,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n });\r\n }\r\n\r\n const evaluatorKind = evalCase.evaluator ?? \"llm_judge\";\r\n const activeEvaluator = evaluators[evaluatorKind] ?? evaluators.llm_judge;\r\n if (!activeEvaluator) {\r\n throw new Error(`No evaluator registered for kind '${evaluatorKind}'`);\r\n }\r\n\r\n const score = await activeEvaluator.evaluate({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n });\r\n\r\n return { score };\r\n}\r\n\r\nasync function runEvaluatorList(options: {\r\n readonly evalCase: EvalCase;\r\n readonly evaluators: readonly EvaluatorConfig[];\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\r\n readonly attempt: number;\r\n readonly promptInputs: PromptInputs;\r\n readonly now: Date;\r\n readonly judgeProvider?: Provider;\r\n readonly agentTimeoutMs?: number;\r\n}): Promise<{ score: EvaluationScore; evaluatorResults: EvaluatorResult[] }> {\r\n const {\r\n evalCase,\r\n evaluators,\r\n candidate,\r\n target,\r\n provider,\r\n evaluatorRegistry,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n } = options;\r\n\r\n const scored: Array<{ readonly score: EvaluationScore; readonly name: string; readonly type: string }> = [];\r\n const evaluatorResults: EvaluatorResult[] = [];\r\n\r\n for (const evaluator of evaluators ?? []) {\r\n try {\r\n if (evaluator.type === \"llm_judge\") {\r\n const score = await runLlmJudgeEvaluator({\r\n config: evaluator,\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n evaluatorRegistry,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n });\r\n scored.push({ score, name: evaluator.name, type: evaluator.type });\r\n evaluatorResults.push({\r\n name: evaluator.name,\r\n type: evaluator.type,\r\n score: score.score,\r\n hits: score.hits,\r\n misses: score.misses,\r\n reasoning: score.reasoning,\r\n evaluator_raw_request: score.evaluatorRawRequest,\r\n });\r\n continue;\r\n }\r\n\r\n if (evaluator.type === \"code\") {\r\n const codeEvaluator = new CodeEvaluator({\r\n script: evaluator.script,\r\n cwd: evaluator.resolvedCwd ?? evaluator.cwd,\r\n agentTimeoutMs,\r\n });\r\n const score = await codeEvaluator.evaluate({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n attempt,\r\n promptInputs,\r\n now,\r\n });\r\n scored.push({ score, name: evaluator.name, type: evaluator.type });\r\n evaluatorResults.push({\r\n name: evaluator.name,\r\n type: evaluator.type,\r\n score: score.score,\r\n hits: score.hits,\r\n misses: score.misses,\r\n reasoning: score.reasoning,\r\n evaluator_raw_request: score.evaluatorRawRequest,\r\n });\r\n continue;\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const fallbackScore: EvaluationScore = {\r\n score: 0,\r\n hits: [],\r\n misses: [`Evaluator '${evaluator.name}' failed: ${message}`],\r\n expectedAspectCount: 1,\r\n reasoning: message,\r\n };\r\n scored.push({ score: fallbackScore, name: evaluator.name ?? \"unknown\", type: evaluator.type ?? \"unknown\" });\r\n evaluatorResults.push({\r\n name: evaluator.name ?? \"unknown\",\r\n type: evaluator.type ?? \"unknown\",\r\n score: 0,\r\n hits: [],\r\n misses: [`Evaluator '${evaluator.name ?? \"unknown\"}' failed: ${message}`],\r\n reasoning: message,\r\n });\r\n }\r\n }\r\n\r\n const aggregateScore =\r\n scored.length > 0 ? scored.reduce((total, entry) => total + entry.score.score, 0) / scored.length : 0;\r\n const hits = scored.flatMap((entry) => entry.score.hits);\r\n const misses = scored.flatMap((entry) => entry.score.misses);\r\n const expectedAspectCount = scored.reduce((total, entry) => total + (entry.score.expectedAspectCount ?? 0), 0);\r\n const rawAspects = scored.flatMap((entry) => entry.score.rawAspects ?? []);\r\n const reasoningParts = scored\r\n .map((entry) => (entry.score.reasoning ? `${entry.name}: ${entry.score.reasoning}` : undefined))\r\n .filter(isNonEmptyString);\r\n const reasoning = reasoningParts.length > 0 ? reasoningParts.join(\" | \") : undefined;\r\n\r\n const score: EvaluationScore = {\r\n score: aggregateScore,\r\n hits,\r\n misses,\r\n expectedAspectCount,\r\n reasoning,\r\n rawAspects: rawAspects.length > 0 ? rawAspects : undefined,\r\n };\r\n\r\n return { score, evaluatorResults };\r\n}\r\n\r\nasync function runLlmJudgeEvaluator(options: {\r\n readonly config: Exclude<NonNullable<EvalCase[\"evaluators\"]>[number], { type: \"code\" }>;\r\n readonly evalCase: EvalCase;\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\r\n readonly attempt: number;\r\n readonly promptInputs: PromptInputs;\r\n readonly now: Date;\r\n readonly judgeProvider?: Provider;\r\n}): Promise<EvaluationScore> {\r\n const { config, evalCase, candidate, target, provider, evaluatorRegistry, attempt, promptInputs, now, judgeProvider } =\r\n options;\r\n const customPrompt = await resolveCustomPrompt(config);\r\n\r\n return evaluatorRegistry.llm_judge.evaluate({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n systemPrompt: customPrompt,\r\n evaluator: config,\r\n });\r\n}\r\n\r\nasync function resolveCustomPrompt(config: { readonly prompt?: string; readonly promptPath?: string }): Promise<string | undefined> {\r\n if (config.promptPath) {\r\n try {\r\n return await readTextFile(config.promptPath);\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n console.warn(`Could not read custom prompt at ${config.promptPath}: ${message}`);\r\n }\r\n }\r\n return config.prompt;\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\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 buildEvaluatorRegistry(\r\n overrides: Partial<Record<string, Evaluator>> | undefined,\r\n resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>,\r\n): Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator } {\r\n const llmJudge =\r\n overrides?.llm_judge ??\r\n new LlmJudgeEvaluator({\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 llm_judge: llmJudge,\r\n };\r\n}\r\n\r\nasync function dumpPrompt(\r\n directory: string,\r\n evalCase: EvalCase,\r\n promptInputs: PromptInputs,\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 question: promptInputs.question,\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: PromptInputs;\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, 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 question: promptInputs.question,\r\n guidelines: promptInputs.guidelines,\r\n guideline_patterns: evalCase.guideline_patterns,\r\n chatPrompt: promptInputs.chatPrompt,\r\n inputFiles: 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: PromptInputs,\r\n provider?: Provider,\r\n): EvaluationResult {\r\n const message = error instanceof Error ? error.message : String(error);\r\n\r\n let agentProviderRequest: JsonObject | undefined;\r\n let lmProviderRequest: JsonObject | undefined;\r\n\r\n if (isAgentProvider(provider)) {\r\n agentProviderRequest = {\r\n question: promptInputs.question,\r\n guideline_paths: evalCase.guideline_paths,\r\n error: message,\r\n } as JsonObject;\r\n } else {\r\n if (promptInputs.chatPrompt) {\r\n lmProviderRequest = {\r\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\r\n guideline_paths: evalCase.guideline_paths,\r\n error: message,\r\n } as JsonObject;\r\n } else {\r\n lmProviderRequest = {\r\n question: promptInputs.question,\r\n guidelines: promptInputs.guidelines,\r\n guideline_paths: evalCase.guideline_paths,\r\n error: message,\r\n } as JsonObject;\r\n }\r\n }\r\n\r\n return {\r\n eval_id: evalCase.id,\r\n dataset: evalCase.dataset,\r\n conversation_id: evalCase.conversation_id,\r\n score: 0,\r\n hits: [],\r\n misses: [`Error: ${message}`],\r\n candidate_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 agent_provider_request: agentProviderRequest,\r\n lm_provider_request: lmProviderRequest,\r\n error: message,\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: PromptInputs,\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.question);\r\n hash.update(promptInputs.guidelines);\r\n hash.update(promptInputs.systemMessage ?? \"\");\r\n if (promptInputs.chatPrompt) {\r\n hash.update(JSON.stringify(promptInputs.chatPrompt));\r\n }\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"],"mappings":"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","names":["import_node_fs","import_promises","import_node_path","path","path","fileExists","micromatch","systemContent","import_promises","import_node_path","execWithCallback","fs","path","os","import_node_child_process","import_node_fs","import_promises","import_node_os","import_node_path","import_node_util","import_node_path","normalizeInputFiles","path","execAsync","execCallback","normalizeInputFiles","path","formatTimeoutSuffix","import_node_path","buildPromptDocument","collectGuidelineFiles","buildMandatoryPrereadBlock","path","pathToFileUri","path","import_node_fs","import_promises","import_node_path","import_yaml","fileExists","path","import_node_crypto","spawn","import_node_crypto","import_promises","import_node_path","score","isNonEmptyString","path"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/evaluation/types.ts","../src/evaluation/yaml-parser.ts","../src/evaluation/formatting/segment-formatter.ts","../src/evaluation/loaders/config-loader.ts","../src/evaluation/loaders/file-resolver.ts","../src/evaluation/loaders/evaluator-parser.ts","../src/evaluation/loaders/message-processor.ts","../src/evaluation/formatting/prompt-builder.ts","../src/evaluation/file-utils.ts","../src/evaluation/providers/ax.ts","../src/evaluation/providers/cli.ts","../src/evaluation/providers/codex.ts","../src/evaluation/providers/codex-log-tracker.ts","../src/evaluation/providers/preread.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/types.ts","../src/evaluation/providers/index.ts","../src/evaluation/evaluators.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"],"sourcesContent":["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/evaluators.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","/**\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\n\r\n\r\nconst EVALUATOR_KIND_VALUES = [\"code\", \"llm_judge\"] as const;\r\n\r\nexport type EvaluatorKind = (typeof EVALUATOR_KIND_VALUES)[number];\r\n\r\nconst EVALUATOR_KIND_SET: ReadonlySet<string> = new Set(EVALUATOR_KIND_VALUES);\r\n\r\nexport function isEvaluatorKind(value: unknown): value is EvaluatorKind {\r\n return typeof value === \"string\" && EVALUATOR_KIND_SET.has(value);\r\n}\r\n\r\nexport type CodeEvaluatorConfig = {\r\n readonly name: string;\r\n readonly type: \"code\";\r\n readonly script: string;\r\n readonly resolvedScriptPath?: string;\r\n readonly cwd?: string;\r\n readonly resolvedCwd?: string;\r\n};\r\n\r\nexport type LlmJudgeEvaluatorConfig = {\r\n readonly name: string;\r\n readonly type: \"llm_judge\";\r\n readonly prompt?: string;\r\n readonly promptPath?: string;\r\n};\r\n\r\nexport type EvaluatorConfig = CodeEvaluatorConfig | LlmJudgeEvaluatorConfig;\r\n\r\n/**\r\n * Eval case definition sourced from AgentV specs.\r\n */\r\nexport interface EvalCase {\r\n readonly id: string;\r\n readonly dataset?: string;\r\n readonly conversation_id?: string;\r\n readonly question: string;\r\n readonly input_messages: readonly TestMessage[];\r\n readonly input_segments: readonly JsonObject[];\r\n readonly output_segments: readonly JsonObject[];\r\n readonly reference_answer?: 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 expected_outcome: string;\r\n readonly evaluator?: EvaluatorKind;\r\n readonly evaluators?: readonly EvaluatorConfig[];\r\n}\r\n\r\n/**\r\n * Evaluator scorecard for a single eval case run.\r\n */\r\nexport interface EvaluationResult {\r\n readonly timestamp: string;\r\n readonly eval_id: string;\r\n readonly dataset?: 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 candidate_answer: string;\r\n readonly target: string;\r\n readonly reasoning?: string;\r\n readonly raw_aspects?: readonly string[];\r\n readonly agent_provider_request?: JsonObject;\r\n readonly lm_provider_request?: JsonObject;\r\n readonly evaluator_provider_request?: JsonObject;\r\n readonly evaluator_results?: readonly EvaluatorResult[];\r\n readonly error?: string;\r\n}\r\n\r\nexport interface EvaluatorResult {\r\n readonly name: string;\r\n readonly type: EvaluatorKind;\r\n readonly score: number;\r\n readonly hits: readonly string[];\r\n readonly misses: readonly string[];\r\n readonly reasoning?: string;\r\n readonly raw_request?: JsonObject;\r\n readonly evaluator_provider_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 { readFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { parse } from \"yaml\";\r\n\r\nimport { extractCodeBlocks } from \"./formatting/segment-formatter.js\";\r\nimport { extractTargetFromSuite, loadConfig } from \"./loaders/config-loader.js\";\r\nimport { coerceEvaluator, parseEvaluators } from \"./loaders/evaluator-parser.js\";\r\nimport { buildSearchRoots, resolveToAbsolutePath } from \"./loaders/file-resolver.js\";\r\nimport { processMessages, resolveAssistantContent } from \"./loaders/message-processor.js\";\r\nimport type {\r\n EvalCase,\r\n JsonObject,\r\n JsonValue,\r\n TestMessage,\r\n} from \"./types.js\";\r\nimport { isJsonObject, isTestMessage } from \"./types.js\";\r\n\r\n// Re-export public APIs from modules\r\nexport { buildPromptInputs, type PromptInputs } from \"./formatting/prompt-builder.js\";\r\nexport { extractCodeBlocks } from \"./formatting/segment-formatter.js\";\r\nexport { isGuidelineFile } from \"./loaders/config-loader.js\";\r\n\r\nconst ANSI_YELLOW = \"\\u001b[33m\";\r\nconst ANSI_RESET = \"\\u001b[0m\";\r\nconst SCHEMA_EVAL_V2 = \"agentv-eval-v2\";\r\n\r\ntype LoadOptions = {\r\n readonly verbose?: boolean;\r\n readonly evalId?: string;\r\n};\r\n\r\ntype RawTestSuite = JsonObject & {\r\n readonly $schema?: JsonValue;\r\n readonly evalcases?: JsonValue;\r\n readonly target?: JsonValue;\r\n readonly execution?: JsonValue;\r\n readonly dataset?: 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 execution?: JsonValue;\r\n readonly evaluators?: JsonValue;\r\n};\r\n\r\n/**\r\n * Read metadata from a test suite file (like target name).\r\n * This is a convenience function for CLI tools that need metadata without loading all eval cases.\r\n */\r\nexport async function readTestSuiteMetadata(testFilePath: string): Promise<{ target?: string }> {\r\n try {\r\n const absolutePath = path.resolve(testFilePath);\r\n const content = await readFile(absolutePath, \"utf8\");\r\n const parsed = parse(content) as unknown;\r\n \r\n if (!isJsonObject(parsed)) {\r\n return {};\r\n }\r\n \r\n return { target: extractTargetFromSuite(parsed) };\r\n } catch {\r\n return {};\r\n }\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 evalIdFilter = options?.evalId;\r\n const absoluteTestPath = path.resolve(evalFilePath);\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 const datasetNameFromSuite = asString(suite.dataset)?.trim();\r\n const fallbackDataset = path.basename(absoluteTestPath).replace(/\\.ya?ml$/i, \"\") || \"eval\";\r\n const datasetName =\r\n datasetNameFromSuite && datasetNameFromSuite.length > 0 ? datasetNameFromSuite : fallbackDataset;\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 globalEvaluator = coerceEvaluator(suite.evaluator, \"global\") ?? \"llm_judge\";\r\n \r\n // Extract global target from execution.target (or legacy root-level target)\r\n const globalExecution = isJsonObject(suite.execution) ? suite.execution : undefined;\r\n const _globalTarget = asString(globalExecution?.target) ?? asString(suite.target);\r\n \r\n const results: EvalCase[] = [];\r\n\r\n for (const rawEvalcase of rawTestcases) {\r\n if (!isJsonObject(rawEvalcase)) {\r\n logWarning(\"Skipping invalid eval 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 \r\n // Skip eval cases that don't match the filter\r\n if (evalIdFilter && id !== evalIdFilter) {\r\n continue;\r\n }\r\n \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 eval case: ${id ?? \"unknown\"}`);\r\n continue;\r\n }\r\n \r\n // expected_messages is optional - for outcome-only evaluation\r\n const hasExpectedMessages = Array.isArray(expectedMessagesValue) && expectedMessagesValue.length > 0;\r\n\r\n // V2 format: input_messages vs expected_messages\r\n const inputMessages = inputMessagesValue.filter((msg): msg is TestMessage => isTestMessage(msg));\r\n const expectedMessages = hasExpectedMessages \r\n ? expectedMessagesValue.filter((msg): msg is TestMessage => isTestMessage(msg))\r\n : [];\r\n \r\n if (hasExpectedMessages && expectedMessages.length === 0) {\r\n logWarning(`No valid expected message found for eval case: ${id}`);\r\n continue;\r\n }\r\n\r\n if (expectedMessages.length > 1) {\r\n logWarning(`Multiple expected messages found for eval case: ${id}, using first`);\r\n }\r\n\r\n const guidelinePaths: string[] = [];\r\n const inputTextParts: string[] = [];\r\n\r\n // Process all input messages to extract files and guidelines\r\n const inputSegments = await processMessages({\r\n messages: inputMessages,\r\n searchRoots,\r\n repoRootPath,\r\n guidelinePatterns,\r\n guidelinePaths,\r\n textParts: inputTextParts,\r\n messageType: \"input\",\r\n verbose,\r\n });\r\n\r\n // Process expected_messages into segments (only if provided)\r\n const outputSegments = hasExpectedMessages\r\n ? await processMessages({\r\n messages: expectedMessages,\r\n searchRoots,\r\n repoRootPath,\r\n guidelinePatterns,\r\n messageType: \"output\",\r\n verbose,\r\n })\r\n : [];\r\n\r\n const codeSnippets = extractCodeBlocks(inputSegments);\r\n const expectedContent = expectedMessages[0]?.content;\r\n const referenceAnswer = expectedContent \r\n ? await resolveAssistantContent(expectedContent, searchRoots, verbose)\r\n : \"\";\r\n const question = inputTextParts\r\n .map((part) => part.trim())\r\n .filter((part) => part.length > 0)\r\n .join(\" \");\r\n\r\n const evalCaseEvaluatorKind = coerceEvaluator(evalcase.evaluator, id) ?? globalEvaluator;\r\n const evaluators = await parseEvaluators(evalcase, globalExecution, searchRoots, id ?? \"unknown\");\r\n\r\n // Extract file paths from all input segments (non-guideline files)\r\n const userFilePaths: string[] = [];\r\n for (const segment of inputSegments) {\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 dataset: datasetName,\r\n conversation_id: conversationId,\r\n question: question,\r\n input_messages: inputMessages,\r\n input_segments: inputSegments,\r\n output_segments: outputSegments,\r\n reference_answer: referenceAnswer,\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 expected_outcome: outcome,\r\n evaluator: evalCaseEvaluatorKind,\r\n evaluators,\r\n };\r\n\r\n if (verbose) {\r\n console.log(`\\n[Eval 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\nfunction asString(value: unknown): string | undefined {\r\n return typeof value === \"string\" ? value : 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 type { JsonObject } from \"../types.js\";\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 CODE_BLOCK_PATTERN = /```[\\s\\S]*?```/g;\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\n/**\r\n * Format file contents with XML tags for all files.\r\n */\r\nexport function formatFileContents(\r\n parts: Array<{ content: string; isFile: boolean; displayPath?: string }>\r\n): string {\r\n const fileCount = parts.filter(p => p.isFile).length;\r\n \r\n // Use XML tags if any files are present\r\n if (fileCount > 0) {\r\n return parts\r\n .map(part => {\r\n if (part.isFile && part.displayPath) {\r\n return `<file path=\"${part.displayPath}\">\\n${part.content}\\n</file>`;\r\n }\r\n return part.content;\r\n })\r\n .join(\"\\n\\n\");\r\n }\r\n \r\n // Otherwise, join normally\r\n return parts.map(p => p.content).join(\" \");\r\n}\r\n\r\n/**\r\n * Format a segment into its display string.\r\n * Text segments return their value; file segments return formatted file content with header.\r\n */\r\nexport function formatSegment(segment: JsonObject): string | undefined {\r\n const type = asString(segment.type);\r\n \r\n if (type === \"text\") {\r\n return asString(segment.value);\r\n }\r\n\r\n if (type === \"guideline_ref\") {\r\n const refPath = asString(segment.path);\r\n return refPath ? `<Attached: ${refPath}>` : undefined;\r\n }\r\n \r\n if (type === \"file\") {\r\n const text = asString(segment.text);\r\n const filePath = asString(segment.path);\r\n if (text && filePath) {\r\n // Use formatFileContents for consistent XML formatting\r\n return formatFileContents([{ content: text.trim(), isFile: true, displayPath: filePath }]);\r\n }\r\n }\r\n \r\n return undefined;\r\n}\r\n\r\n/**\r\n * Check if processed segments contain visible content (text or file attachments).\r\n */\r\nexport function hasVisibleContent(segments: readonly JsonObject[]): boolean {\r\n return segments.some((segment) => {\r\n const type = asString(segment.type);\r\n \r\n if (type === \"text\") {\r\n const value = asString(segment.value);\r\n return value !== undefined && value.trim().length > 0;\r\n }\r\n\r\n if (type === \"guideline_ref\") {\r\n return false;\r\n }\r\n \r\n if (type === \"file\") {\r\n const text = asString(segment.text);\r\n return text !== undefined && text.trim().length > 0;\r\n }\r\n \r\n return false;\r\n });\r\n}\r\n\r\nfunction asString(value: unknown): string | undefined {\r\n return typeof value === \"string\" ? value : undefined;\r\n}\r\n","import micromatch from \"micromatch\";\r\nimport { readFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { parse } from \"yaml\";\r\n\r\nimport { buildDirectoryChain, fileExists } from \"./file-resolver.js\";\r\nimport type { JsonObject, JsonValue } from \"../types.js\";\r\nimport { isJsonObject } from \"../types.js\";\r\n\r\nconst SCHEMA_CONFIG_V2 = \"agentv-config-v2\";\r\nconst ANSI_YELLOW = \"\\u001b[33m\";\r\nconst ANSI_RESET = \"\\u001b[0m\";\r\n\r\nexport type 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\nexport async 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 target name from parsed eval suite (checks execution.target then falls back to root-level target).\r\n */\r\nexport function extractTargetFromSuite(suite: JsonObject): string | undefined {\r\n // Check execution.target first (new location), fallback to root-level target (legacy)\r\n const execution = suite.execution;\r\n if (execution && typeof execution === \"object\" && !Array.isArray(execution)) {\r\n const executionTarget = (execution as Record<string, unknown>).target;\r\n if (typeof executionTarget === \"string\" && executionTarget.trim().length > 0) {\r\n return executionTarget.trim();\r\n }\r\n }\r\n \r\n // Fallback to legacy root-level target\r\n const targetValue = suite.target;\r\n if (typeof targetValue === \"string\" && targetValue.trim().length > 0) {\r\n return targetValue.trim();\r\n }\r\n \r\n return undefined;\r\n}\r\n\r\nfunction logWarning(message: string): void {\r\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\r\n}\r\n","import { constants } from \"node:fs\";\r\nimport { access } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\n/**\r\n * Check if a file exists on disk.\r\n */\r\nexport async 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\n/**\r\n * Convert URL or string to absolute file path.\r\n */\r\nexport function resolveToAbsolutePath(candidate: URL | string): string {\r\n if (candidate instanceof URL) {\r\n return new URL(candidate).pathname;\r\n }\r\n if (typeof candidate === \"string\") {\r\n if (candidate.startsWith(\"file://\")) {\r\n return new URL(candidate).pathname;\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\n/**\r\n * Build a chain of directories walking from a file's location up to repo root.\r\n * Used for discovering configuration files.\r\n */\r\nexport function buildDirectoryChain(filePath: string, repoRoot: string): readonly string[] {\r\n const directories: string[] = [];\r\n const seen = new Set<string>();\r\n const boundary = path.resolve(repoRoot);\r\n let current: string | undefined = path.resolve(path.dirname(filePath));\r\n\r\n while (current !== undefined) {\r\n if (!seen.has(current)) {\r\n directories.push(current);\r\n seen.add(current);\r\n }\r\n if (current === boundary) {\r\n break;\r\n }\r\n const parent = path.dirname(current);\r\n if (parent === current) {\r\n break;\r\n }\r\n current = parent;\r\n }\r\n\r\n if (!seen.has(boundary)) {\r\n directories.push(boundary);\r\n }\r\n\r\n return directories;\r\n}\r\n\r\n/**\r\n * Build search roots for file resolution.\r\n * Searches from eval file directory up to repo root.\r\n */\r\nexport function buildSearchRoots(evalPath: string, repoRoot: string): readonly string[] {\r\n const uniqueRoots: string[] = [];\r\n const addRoot = (root: string): void => {\r\n const normalized = path.resolve(root);\r\n if (!uniqueRoots.includes(normalized)) {\r\n uniqueRoots.push(normalized);\r\n }\r\n };\r\n\r\n let currentDir = path.dirname(evalPath);\r\n let reachedBoundary = false;\r\n while (!reachedBoundary) {\r\n addRoot(currentDir);\r\n const parentDir = path.dirname(currentDir);\r\n if (currentDir === repoRoot || parentDir === currentDir) {\r\n reachedBoundary = true;\r\n } else {\r\n currentDir = parentDir;\r\n }\r\n }\r\n\r\n addRoot(repoRoot);\r\n addRoot(process.cwd());\r\n return uniqueRoots;\r\n}\r\n\r\n/**\r\n * Trim leading path separators for display.\r\n */\r\nfunction trimLeadingSeparators(value: string): string {\r\n const trimmed = value.replace(/^[/\\\\]+/, \"\");\r\n return trimmed.length > 0 ? trimmed : value;\r\n}\r\n\r\n/**\r\n * Resolve a file reference using search roots.\r\n */\r\nexport async function resolveFileReference(\r\n rawValue: string,\r\n searchRoots: readonly string[],\r\n): Promise<{\r\n readonly displayPath: string;\r\n readonly resolvedPath?: string;\r\n readonly attempted: readonly string[];\r\n}> {\r\n const displayPath = trimLeadingSeparators(rawValue);\r\n const potentialPaths: string[] = [];\r\n\r\n if (path.isAbsolute(rawValue)) {\r\n potentialPaths.push(path.normalize(rawValue));\r\n }\r\n\r\n for (const base of searchRoots) {\r\n potentialPaths.push(path.resolve(base, displayPath));\r\n }\r\n\r\n const attempted: string[] = [];\r\n const seen = new Set<string>();\r\n for (const candidate of potentialPaths) {\r\n const absoluteCandidate = path.resolve(candidate);\r\n if (seen.has(absoluteCandidate)) {\r\n continue;\r\n }\r\n seen.add(absoluteCandidate);\r\n attempted.push(absoluteCandidate);\r\n if (await fileExists(absoluteCandidate)) {\r\n return { displayPath, resolvedPath: absoluteCandidate, attempted };\r\n }\r\n }\r\n\r\n return { displayPath, attempted };\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport { resolveFileReference } from \"./file-resolver.js\";\r\nimport type { EvaluatorConfig, EvaluatorKind, JsonObject, JsonValue } from \"../types.js\";\r\nimport { isEvaluatorKind } from \"../types.js\";\r\n\r\nconst ANSI_YELLOW = \"\\u001b[33m\";\r\nconst ANSI_RESET = \"\\u001b[0m\";\r\n\r\n/**\r\n * Parse evaluators from eval case configuration.\r\n */\r\nexport async function parseEvaluators(\r\n rawEvalCase: JsonObject & {\r\n readonly execution?: JsonValue;\r\n readonly evaluators?: JsonValue;\r\n },\r\n globalExecution: JsonObject | undefined,\r\n searchRoots: readonly string[],\r\n evalId: string,\r\n): Promise<readonly EvaluatorConfig[] | undefined> {\r\n const execution = rawEvalCase.execution;\r\n // Priority: case-level execution.evaluators > case-level evaluators > global execution.evaluators\r\n const candidateEvaluators = isJsonObject(execution) \r\n ? execution.evaluators ?? rawEvalCase.evaluators \r\n : rawEvalCase.evaluators ?? globalExecution?.evaluators;\r\n if (candidateEvaluators === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (!Array.isArray(candidateEvaluators)) {\r\n logWarning(`Skipping evaluators for '${evalId}': expected array`);\r\n return undefined;\r\n }\r\n\r\n const evaluators: EvaluatorConfig[] = [];\r\n\r\n for (const rawEvaluator of candidateEvaluators) {\r\n if (!isJsonObject(rawEvaluator)) {\r\n logWarning(`Skipping invalid evaluator entry for '${evalId}' (expected object)`);\r\n continue;\r\n }\r\n\r\n const name = asString(rawEvaluator.name);\r\n const typeValue = rawEvaluator.type;\r\n\r\n if (!name || !isEvaluatorKind(typeValue)) {\r\n logWarning(`Skipping evaluator with invalid name/type in '${evalId}'`);\r\n continue;\r\n }\r\n\r\n if (typeValue === \"code\") {\r\n const script = asString(rawEvaluator.script);\r\n if (!script) {\r\n logWarning(`Skipping code evaluator '${name}' in '${evalId}': missing script`);\r\n continue;\r\n }\r\n\r\n const cwd = asString(rawEvaluator.cwd);\r\n let resolvedCwd: string | undefined;\r\n\r\n // Resolve cwd if provided (relative to eval file), otherwise default to eval file directory\r\n if (cwd) {\r\n const resolved = await resolveFileReference(cwd, searchRoots);\r\n if (resolved.resolvedPath) {\r\n resolvedCwd = path.resolve(resolved.resolvedPath);\r\n } else {\r\n logWarning(\r\n `Code evaluator '${name}' in '${evalId}': cwd not found (${resolved.displayPath})`,\r\n resolved.attempted.length > 0 ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`) : undefined,\r\n );\r\n }\r\n } else {\r\n // Default to the directory containing the eval file (first search root)\r\n resolvedCwd = searchRoots[0];\r\n }\r\n\r\n evaluators.push({\r\n name,\r\n type: \"code\",\r\n script,\r\n cwd,\r\n resolvedCwd,\r\n });\r\n continue;\r\n }\r\n\r\n const prompt = asString(rawEvaluator.prompt);\r\n let promptPath: string | undefined;\r\n if (prompt) {\r\n const resolved = await resolveFileReference(prompt, searchRoots);\r\n if (resolved.resolvedPath) {\r\n promptPath = path.resolve(resolved.resolvedPath);\r\n } else {\r\n logWarning(\r\n `Inline prompt used for evaluator '${name}' in '${evalId}' (file not found: ${resolved.displayPath})`,\r\n resolved.attempted.length > 0 ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`) : undefined,\r\n );\r\n }\r\n }\r\n\r\n const _model = asString(rawEvaluator.model);\r\n\r\n evaluators.push({\r\n name,\r\n type: \"llm_judge\",\r\n prompt,\r\n promptPath\r\n });\r\n }\r\n\r\n return evaluators.length > 0 ? evaluators : undefined;\r\n}\r\n\r\n/**\r\n * Coerce evaluator value to valid EvaluatorKind.\r\n */\r\nexport function coerceEvaluator(candidate: JsonValue | undefined, contextId: string): EvaluatorKind | undefined {\r\n if (typeof candidate !== \"string\") {\r\n return undefined;\r\n }\r\n if (isEvaluatorKind(candidate)) {\r\n return candidate;\r\n }\r\n logWarning(`Unknown evaluator '${candidate}' in ${contextId}, falling back to default`);\r\n return undefined;\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 isJsonObject(value: unknown): value is JsonObject {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\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 { readFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport { isGuidelineFile } from \"./config-loader.js\";\r\nimport { resolveFileReference } from \"./file-resolver.js\";\r\nimport { formatFileContents } from \"../formatting/segment-formatter.js\";\r\nimport type { JsonObject, TestMessage } from \"../types.js\";\r\nimport { isJsonObject } from \"../types.js\";\r\n\r\nconst ANSI_YELLOW = \"\\u001b[33m\";\r\nconst ANSI_RESET = \"\\u001b[0m\";\r\n\r\ntype ProcessMessagesOptions = {\r\n readonly messages: readonly TestMessage[];\r\n readonly searchRoots: readonly string[];\r\n readonly repoRootPath: string;\r\n readonly guidelinePatterns?: readonly string[];\r\n readonly guidelinePaths?: string[];\r\n readonly textParts?: string[];\r\n readonly messageType: \"input\" | \"output\";\r\n readonly verbose: boolean;\r\n};\r\n\r\n/**\r\n * Process message content into structured segments with file resolution.\r\n */\r\nexport async function processMessages(options: ProcessMessagesOptions): Promise<JsonObject[]> {\r\n const {\r\n messages,\r\n searchRoots,\r\n repoRootPath,\r\n guidelinePatterns,\r\n guidelinePaths,\r\n textParts,\r\n messageType,\r\n verbose,\r\n } = options;\r\n\r\n const segments: JsonObject[] = [];\r\n\r\n for (const message of messages) {\r\n const content = message.content;\r\n if (typeof content === \"string\") {\r\n segments.push({ type: \"text\", value: content });\r\n if (textParts) {\r\n textParts.push(content);\r\n }\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 const context = messageType === \"input\" ? \"\" : \" in expected_messages\";\r\n logWarning(`File not found${context}: ${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 // Only check for guidelines in input messages\r\n if (messageType === \"input\" && guidelinePatterns && guidelinePaths) {\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 continue;\r\n }\r\n }\r\n\r\n segments.push({\r\n type: \"file\",\r\n path: displayPath,\r\n text: fileContent,\r\n resolvedPath: path.resolve(resolvedPath),\r\n });\r\n\r\n if (verbose) {\r\n const label = messageType === \"input\" ? \"[File]\" : \"[Expected Output File]\";\r\n console.log(` ${label} Found: ${displayPath}`);\r\n console.log(` Resolved to: ${resolvedPath}`);\r\n }\r\n } catch (error) {\r\n const context = messageType === \"input\" ? \"\" : \" expected output\";\r\n logWarning(`Could not read${context} file ${resolvedPath}: ${(error as Error).message}`);\r\n }\r\n continue;\r\n }\r\n\r\n const clonedSegment = cloneJsonObject(rawSegment);\r\n segments.push(clonedSegment);\r\n const inlineValue = clonedSegment.value;\r\n if (typeof inlineValue === \"string\" && textParts) {\r\n textParts.push(inlineValue);\r\n }\r\n }\r\n }\r\n\r\n return segments;\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\nexport async 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 // Track parts with metadata about whether they came from files\r\n const parts: Array<{ content: string; isFile: boolean; displayPath?: string }> = [];\r\n \r\n for (const entry of content) {\r\n if (typeof entry === \"string\") {\r\n parts.push({ content: entry, isFile: false });\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\").trim();\r\n parts.push({ content: fileContent, isFile: true, displayPath });\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({ content: textValue, isFile: false });\r\n continue;\r\n }\r\n \r\n const valueValue = asString(entry.value);\r\n if (typeof valueValue === \"string\") {\r\n parts.push({ content: valueValue, isFile: false });\r\n continue;\r\n }\r\n \r\n parts.push({ content: JSON.stringify(entry), isFile: false });\r\n }\r\n \r\n return formatFileContents(parts);\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: unknown): unknown {\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));\r\n }\r\n if (typeof value === \"object\") {\r\n return cloneJsonObject(value as JsonObject);\r\n }\r\n return value;\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 { readFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport { formatFileContents, formatSegment, hasVisibleContent } from \"./segment-formatter.js\";\r\nimport { isGuidelineFile } from \"../loaders/config-loader.js\";\r\nimport { fileExists } from \"../loaders/file-resolver.js\";\r\nimport type { ChatPrompt } from \"../providers/types.js\";\r\nimport type { EvalCase, JsonObject, TestMessage } from \"../types.js\";\r\nimport { isJsonObject } from \"../types.js\";\r\n\r\nconst ANSI_YELLOW = \"\\u001b[33m\";\r\nconst ANSI_RESET = \"\\u001b[0m\";\r\n\r\n/**\r\n * Build prompt inputs by consolidating user request context and guideline content.\r\n */\r\nexport interface PromptInputs {\r\n readonly question: string;\r\n readonly guidelines: string;\r\n readonly chatPrompt?: ChatPrompt;\r\n readonly systemMessage?: string;\r\n}\r\n\r\nexport async function buildPromptInputs(testCase: EvalCase): Promise<PromptInputs> {\r\n const guidelineParts: Array<{ content: string; isFile: boolean; displayPath?: 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\").trim();\r\n guidelineParts.push({\r\n content,\r\n isFile: true,\r\n displayPath: path.basename(absolutePath)\r\n });\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 guidelines = formatFileContents(guidelineParts);\r\n\r\n // Build segments per message to determine if role markers are needed\r\n const segmentsByMessage: JsonObject[][] = [];\r\n const fileContentsByPath = new Map<string, string>();\r\n for (const segment of testCase.input_segments) {\r\n if (segment.type === \"file\" && typeof segment.path === \"string\" && typeof segment.text === \"string\") {\r\n fileContentsByPath.set(segment.path, segment.text);\r\n }\r\n }\r\n \r\n for (const message of testCase.input_messages) {\r\n const messageSegments: JsonObject[] = [];\r\n \r\n if (typeof message.content === \"string\") {\r\n if (message.content.trim().length > 0) {\r\n messageSegments.push({ type: \"text\", value: message.content });\r\n }\r\n } else if (Array.isArray(message.content)) {\r\n for (const segment of message.content) {\r\n if (typeof segment === \"string\") {\r\n if (segment.trim().length > 0) {\r\n messageSegments.push({ type: \"text\", value: segment });\r\n }\r\n } else if (isJsonObject(segment)) {\r\n const type = asString(segment.type);\r\n \r\n if (type === \"file\") {\r\n const value = asString(segment.value);\r\n if (!value) continue;\r\n \r\n // Check if this is a guideline file (extracted separately)\r\n if (testCase.guideline_patterns && isGuidelineFile(value, testCase.guideline_patterns)) {\r\n // Reference marker only - actual content is in guidelines field\r\n messageSegments.push({ type: \"guideline_ref\", path: value });\r\n continue;\r\n }\r\n \r\n // Find the file content from input_segments\r\n const fileText = fileContentsByPath.get(value);\r\n \r\n if (fileText !== undefined) {\r\n messageSegments.push({ type: \"file\", text: fileText, path: value });\r\n }\r\n } else if (type === \"text\") {\r\n const textValue = asString(segment.value);\r\n if (textValue && textValue.trim().length > 0) {\r\n messageSegments.push({ type: \"text\", value: textValue });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n segmentsByMessage.push(messageSegments);\r\n }\r\n\r\n // Determine if we need role markers based on actual processed content\r\n const useRoleMarkers = needsRoleMarkers(testCase.input_messages, segmentsByMessage);\r\n\r\n let question: string;\r\n \r\n if (useRoleMarkers) {\r\n // Multi-turn format with role markers using pre-computed segments\r\n const messageParts: string[] = [];\r\n \r\n for (let i = 0; i < testCase.input_messages.length; i++) {\r\n const message = testCase.input_messages[i];\r\n const segments = segmentsByMessage[i];\r\n \r\n if (!hasVisibleContent(segments)) {\r\n continue;\r\n }\r\n \r\n const roleLabel = message.role.charAt(0).toUpperCase() + message.role.slice(1);\r\n const contentParts: string[] = [];\r\n \r\n for (const segment of segments) {\r\n const formattedContent = formatSegment(segment);\r\n if (formattedContent) {\r\n contentParts.push(formattedContent);\r\n }\r\n }\r\n \r\n if (contentParts.length > 0) {\r\n const messageContent = contentParts.join(\"\\n\");\r\n messageParts.push(`@[${roleLabel}]:\\n${messageContent}`);\r\n }\r\n }\r\n \r\n question = messageParts.join(\"\\n\\n\");\r\n } else {\r\n // Single-turn flat format\r\n const questionParts: string[] = [];\r\n for (const segment of testCase.input_segments) {\r\n const formattedContent = formatSegment(segment);\r\n if (formattedContent) {\r\n questionParts.push(formattedContent);\r\n }\r\n }\r\n\r\n if (testCase.code_snippets.length > 0) {\r\n questionParts.push(testCase.code_snippets.join(\"\\n\"));\r\n }\r\n\r\n question = questionParts\r\n .map((part) => part.trim())\r\n .filter((part) => part.length > 0)\r\n .join(\"\\n\\n\");\r\n }\r\n\r\n const chatPrompt = useRoleMarkers\r\n ? buildChatPromptFromSegments({\r\n messages: testCase.input_messages,\r\n segmentsByMessage,\r\n guidelinePatterns: testCase.guideline_patterns,\r\n guidelineContent: guidelines,\r\n })\r\n : undefined;\r\n\r\n return { question, guidelines, chatPrompt };\r\n}\r\n\r\n/**\r\n * Detect if role markers are needed based on conversational structure.\r\n * \r\n * Role markers ([System]:, [User]:, etc.) are added when:\r\n * 1. There are assistant/tool messages (true multi-turn conversation), OR\r\n * 2. There are multiple messages that will produce visible content in the formatted output\r\n */\r\nfunction needsRoleMarkers(\r\n messages: readonly TestMessage[],\r\n processedSegmentsByMessage: readonly (readonly JsonObject[])[],\r\n): boolean {\r\n // Check for multi-turn conversation (assistant/tool messages)\r\n if (messages.some((msg) => msg.role === \"assistant\" || msg.role === \"tool\")) {\r\n return true;\r\n }\r\n \r\n // Count how many messages have actual content after processing\r\n let messagesWithContent = 0;\r\n \r\n for (const segments of processedSegmentsByMessage) {\r\n if (hasVisibleContent(segments)) {\r\n messagesWithContent++;\r\n }\r\n }\r\n \r\n return messagesWithContent > 1;\r\n}\r\n\r\nfunction buildChatPromptFromSegments(options: {\r\n readonly messages: readonly TestMessage[];\r\n readonly segmentsByMessage: readonly JsonObject[][];\r\n readonly guidelinePatterns?: readonly string[];\r\n readonly guidelineContent?: string;\r\n readonly systemPrompt?: string;\r\n}): ChatPrompt | undefined {\r\n const { messages, segmentsByMessage, guidelinePatterns, guidelineContent, systemPrompt } = options;\r\n\r\n if (messages.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const systemSegments: string[] = [];\r\n\r\n if (systemPrompt && systemPrompt.trim().length > 0) {\r\n systemSegments.push(systemPrompt.trim());\r\n }\r\n\r\n if (guidelineContent && guidelineContent.trim().length > 0) {\r\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${guidelineContent.trim()}`);\r\n }\r\n\r\n let startIndex = 0;\r\n while (startIndex < messages.length && messages[startIndex].role === \"system\") {\r\n const segments = segmentsByMessage[startIndex];\r\n const contentParts: string[] = [];\r\n\r\n for (const segment of segments) {\r\n const formatted = formatSegment(segment);\r\n if (formatted) {\r\n contentParts.push(formatted);\r\n }\r\n }\r\n\r\n if (contentParts.length > 0) {\r\n systemSegments.push(contentParts.join(\"\\n\"));\r\n }\r\n\r\n startIndex += 1;\r\n }\r\n\r\n const chatPrompt: ChatPrompt = [];\r\n\r\n if (systemSegments.length > 0) {\r\n chatPrompt.push({\r\n role: \"system\",\r\n content: systemSegments.join(\"\\n\\n\"),\r\n });\r\n }\r\n\r\n for (let i = startIndex; i < messages.length; i++) {\r\n const message = messages[i];\r\n const segments = segmentsByMessage[i];\r\n const contentParts: string[] = [];\r\n\r\n let role: string = message.role;\r\n let name: string | undefined;\r\n\r\n if (role === \"system\") {\r\n role = \"assistant\";\r\n contentParts.push(\"@[System]:\");\r\n } else if (role === \"tool\") {\r\n // Map 'tool' to 'function' for Ax compatibility\r\n role = \"function\";\r\n name = \"tool\";\r\n }\r\n\r\n for (const segment of segments) {\r\n if (segment.type === \"guideline_ref\") {\r\n continue;\r\n }\r\n const formatted = formatSegment(segment);\r\n if (formatted) {\r\n const isGuidelineRef =\r\n segment.type === \"file\" &&\r\n typeof segment.path === \"string\" &&\r\n guidelinePatterns &&\r\n isGuidelineFile(segment.path, guidelinePatterns);\r\n\r\n if (isGuidelineRef) {\r\n continue;\r\n }\r\n\r\n contentParts.push(formatted);\r\n }\r\n }\r\n\r\n if (contentParts.length === 0) {\r\n continue;\r\n }\r\n\r\n chatPrompt.push({\r\n role: role,\r\n content: contentParts.join(\"\\n\"),\r\n ...(name ? { name } : {}),\r\n } as unknown as ChatPrompt[number]);\r\n }\r\n\r\n return chatPrompt.length > 0 ? chatPrompt : undefined;\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 logWarning(message: string): void {\r\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\r\n}\r\n","import { constants } from \"node:fs\";\r\nimport { access, readFile } from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nexport async function fileExists(filePath: string): Promise<boolean> {\r\n try {\r\n await access(filePath, constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Normalize line endings to LF (\\n).\r\n * This ensures consistent behavior across Windows (CRLF) and Unix (LF) systems.\r\n */\r\nexport function normalizeLineEndings(content: string): string {\r\n return content.replace(/\\r\\n/g, \"\\n\");\r\n}\r\n\r\n/**\r\n * Read a text file and normalize line endings to LF (\\n).\r\n * This ensures consistent behavior across Windows (CRLF) and Unix (LF) systems.\r\n */\r\nexport async function readTextFile(filePath: string): Promise<string> {\r\n const content = await readFile(filePath, \"utf8\");\r\n return normalizeLineEndings(content);\r\n}\r\n\r\n/**\r\n * Find git repository root by walking up the directory tree.\r\n */\r\nexport async function findGitRoot(startPath: string): Promise<string | null> {\r\n let currentDir = path.dirname(path.resolve(startPath));\r\n const root = path.parse(currentDir).root;\r\n\r\n while (currentDir !== root) {\r\n const gitPath = path.join(currentDir, \".git\");\r\n if (await fileExists(gitPath)) {\r\n return currentDir;\r\n }\r\n\r\n const parentDir = path.dirname(currentDir);\r\n if (parentDir === currentDir) {\r\n break;\r\n }\r\n currentDir = parentDir;\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Build a chain of directories walking from a file's location up to repo root.\r\n * Used for discovering configuration files like targets.yaml or config.yaml.\r\n */\r\nexport function buildDirectoryChain(filePath: string, repoRoot: string): readonly string[] {\r\n const directories: string[] = [];\r\n const seen = new Set<string>();\r\n const boundary = path.resolve(repoRoot);\r\n let current: string | undefined = path.resolve(path.dirname(filePath));\r\n\r\n while (current !== undefined) {\r\n if (!seen.has(current)) {\r\n directories.push(current);\r\n seen.add(current);\r\n }\r\n if (current === boundary) {\r\n break;\r\n }\r\n const parent = path.dirname(current);\r\n if (parent === current) {\r\n break;\r\n }\r\n current = parent;\r\n }\r\n\r\n if (!seen.has(boundary)) {\r\n directories.push(boundary);\r\n }\r\n\r\n return directories;\r\n}\r\n\r\n/**\r\n * Build search roots for file resolution, matching yaml-parser behavior.\r\n * Searches from eval file directory up to repo root.\r\n */\r\nexport function buildSearchRoots(evalPath: string, repoRoot: string): readonly string[] {\r\n const uniqueRoots: string[] = [];\r\n const addRoot = (root: string): void => {\r\n const normalized = path.resolve(root);\r\n if (!uniqueRoots.includes(normalized)) {\r\n uniqueRoots.push(normalized);\r\n }\r\n };\r\n\r\n let currentDir = path.dirname(evalPath);\r\n let reachedBoundary = false;\r\n while (!reachedBoundary) {\r\n addRoot(currentDir);\r\n const parentDir = path.dirname(currentDir);\r\n if (currentDir === repoRoot || parentDir === currentDir) {\r\n reachedBoundary = true;\r\n } else {\r\n currentDir = parentDir;\r\n }\r\n }\r\n\r\n addRoot(repoRoot);\r\n addRoot(process.cwd());\r\n return uniqueRoots;\r\n}\r\n\r\n/**\r\n * Trim leading path separators for display.\r\n */\r\nfunction trimLeadingSeparators(value: string): string {\r\n const trimmed = value.replace(/^[/\\\\]+/, \"\");\r\n return trimmed.length > 0 ? trimmed : value;\r\n}\r\n\r\n/**\r\n * Resolve a file reference using search roots, matching yaml-parser behavior.\r\n */\r\nexport async function resolveFileReference(\r\n rawValue: string,\r\n searchRoots: readonly string[],\r\n): Promise<{\r\n readonly displayPath: string;\r\n readonly resolvedPath?: string;\r\n readonly attempted: readonly string[];\r\n}> {\r\n const displayPath = trimLeadingSeparators(rawValue);\r\n const potentialPaths: string[] = [];\r\n\r\n if (path.isAbsolute(rawValue)) {\r\n potentialPaths.push(path.normalize(rawValue));\r\n }\r\n\r\n for (const base of searchRoots) {\r\n potentialPaths.push(path.resolve(base, displayPath));\r\n }\r\n\r\n const attempted: string[] = [];\r\n const seen = new Set<string>();\r\n for (const candidate of potentialPaths) {\r\n const absoluteCandidate = path.resolve(candidate);\r\n if (seen.has(absoluteCandidate)) {\r\n continue;\r\n }\r\n seen.add(absoluteCandidate);\r\n attempted.push(absoluteCandidate);\r\n if (await fileExists(absoluteCandidate)) {\r\n return { displayPath, resolvedPath: absoluteCandidate, attempted };\r\n }\r\n }\r\n\r\n return { displayPath, attempted };\r\n}\r\n","import { 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 RetryConfig,\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 const hasSystemMessage = request.chatPrompt.some((message) => message.role === \"system\");\r\n if (hasSystemMessage) {\r\n return request.chatPrompt;\r\n }\r\n\r\n const systemContent = resolveSystemContent(request);\r\n return [{ role: \"system\", content: systemContent }, ...request.chatPrompt];\r\n }\r\n\r\n const systemContent = resolveSystemContent(request);\r\n const userContent = request.question.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 resolveSystemContent(request: ProviderRequest): string {\r\n const systemSegments: string[] = [];\r\n\r\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\r\n systemSegments.push(request.systemPrompt.trim());\r\n } else {\r\n systemSegments.push(DEFAULT_SYSTEM_PROMPT);\r\n }\r\n\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 return systemSegments.join(\"\\n\\n\");\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\nfunction isRetryableError(error: unknown, retryableStatusCodes: readonly number[]): boolean {\r\n if (!error || typeof error !== \"object\") {\r\n return false;\r\n }\r\n\r\n // Check for status code in various error formats\r\n if (\"status\" in error && typeof error.status === \"number\") {\r\n return retryableStatusCodes.includes(error.status);\r\n }\r\n\r\n // Check for HTTP status in error message\r\n if (\"message\" in error && typeof error.message === \"string\") {\r\n const match = error.message.match(/HTTP (\\d{3})/);\r\n if (match) {\r\n const status = Number.parseInt(match[1], 10);\r\n return retryableStatusCodes.includes(status);\r\n }\r\n }\r\n\r\n // Network errors are retryable\r\n if (\"name\" in error && error.name === \"AxAIServiceNetworkError\") {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction calculateRetryDelay(attempt: number, config: Required<RetryConfig>): number {\r\n const delay = Math.min(\r\n config.maxDelayMs,\r\n config.initialDelayMs * config.backoffFactor ** attempt,\r\n );\r\n // Add jitter (0.75-1.25x of calculated delay)\r\n return delay * (0.75 + Math.random() * 0.5);\r\n}\r\n\r\nasync function sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nasync function withRetry<T>(\r\n fn: () => Promise<T>,\r\n retryConfig?: RetryConfig,\r\n signal?: AbortSignal,\r\n): Promise<T> {\r\n // Use default retry config if not provided\r\n const config: Required<RetryConfig> = {\r\n maxRetries: retryConfig?.maxRetries ?? 3,\r\n initialDelayMs: retryConfig?.initialDelayMs ?? 1000,\r\n maxDelayMs: retryConfig?.maxDelayMs ?? 60000,\r\n backoffFactor: retryConfig?.backoffFactor ?? 2,\r\n retryableStatusCodes: retryConfig?.retryableStatusCodes ?? [500, 408, 429, 502, 503, 504],\r\n };\r\n\r\n let lastError: unknown;\r\n\r\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\r\n // Check if aborted before attempting\r\n if (signal?.aborted) {\r\n throw new Error(`Request aborted: ${signal.reason ?? \"Unknown reason\"}`);\r\n }\r\n\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n lastError = error;\r\n\r\n // Don't retry if this is the last attempt\r\n if (attempt >= config.maxRetries) {\r\n break;\r\n }\r\n\r\n // Check if error is retryable\r\n if (!isRetryableError(error, config.retryableStatusCodes)) {\r\n throw error;\r\n }\r\n\r\n // Calculate delay and wait\r\n const delay = calculateRetryDelay(attempt, config);\r\n await sleep(delay);\r\n\r\n // Check if aborted during sleep\r\n if (signal?.aborted) {\r\n throw new Error(`Request aborted: ${signal.reason ?? \"Unknown reason\"}`);\r\n }\r\n }\r\n }\r\n\r\n // All retries exhausted\r\n throw lastError;\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 private readonly retryConfig?: RetryConfig;\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 this.retryConfig = config.retry;\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 withRetry(\r\n async () =>\r\n 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 this.retryConfig,\r\n request.signal,\r\n );\r\n\r\n return mapResponse(ensureChatResponse(response));\r\n }\r\n\r\n getAxAI(): AxAiInstance {\r\n return this.ai;\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 private readonly retryConfig?: RetryConfig;\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 this.retryConfig = config.retry;\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 withRetry(\r\n async () =>\r\n 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 this.retryConfig,\r\n request.signal,\r\n );\r\n\r\n return mapResponse(ensureChatResponse(response));\r\n }\r\n\r\n getAxAI(): AxAiInstance {\r\n return this.ai;\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 private readonly retryConfig?: RetryConfig;\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 this.retryConfig = config.retry;\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 withRetry(\r\n async () =>\r\n 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 this.retryConfig,\r\n request.signal,\r\n );\r\n\r\n return mapResponse(ensureChatResponse(response));\r\n }\r\n\r\n getAxAI(): AxAiInstance {\r\n return this.ai;\r\n }\r\n}\r\n","import { exec as execWithCallback, type ExecException, type ExecOptions } from \"node:child_process\";\r\nimport fs from \"node:fs/promises\";\r\nimport os from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { promisify } from \"node:util\";\r\n\r\nimport type { CliResolvedConfig } from \"./targets.js\";\r\nimport type { Provider, ProviderRequest, ProviderResponse } from \"./types.js\";\r\nimport { readTextFile } from \"../file-utils.js\";\r\n\r\nconst execAsync = promisify(execWithCallback);\r\nconst DEFAULT_MAX_BUFFER = 10 * 1024 * 1024; // 10 MB to accommodate verbose CLI output\r\n\r\nexport interface CommandRunOptions {\r\n readonly cwd?: string;\r\n readonly env?: NodeJS.ProcessEnv;\r\n readonly timeoutMs?: number;\r\n readonly signal?: AbortSignal;\r\n}\r\n\r\nexport interface CommandRunResult {\r\n readonly stdout: string;\r\n readonly stderr: string;\r\n readonly exitCode: number | null;\r\n readonly failed: boolean;\r\n readonly timedOut?: boolean;\r\n readonly signal?: NodeJS.Signals | null;\r\n}\r\n\r\nexport type CommandRunner = (command: string, options: CommandRunOptions) => Promise<CommandRunResult>;\r\n\r\nasync function defaultCommandRunner(\r\n command: string,\r\n options: CommandRunOptions,\r\n): Promise<CommandRunResult> {\r\n const execOptions: ExecOptions = {\r\n cwd: options.cwd,\r\n env: options.env,\r\n timeout: options.timeoutMs,\r\n signal: options.signal,\r\n maxBuffer: DEFAULT_MAX_BUFFER,\r\n shell: process.platform === \"win32\" ? \"powershell.exe\" : undefined,\r\n };\r\n\r\n try {\r\n const { stdout, stderr } = await execAsync(command, execOptions);\r\n\r\n return {\r\n stdout,\r\n stderr,\r\n exitCode: 0,\r\n failed: false,\r\n timedOut: false,\r\n signal: null,\r\n };\r\n } catch (error) {\r\n const execError = error as ExecException & {\r\n stdout?: string;\r\n stderr?: string;\r\n timedOut?: boolean;\r\n killed?: boolean;\r\n };\r\n\r\n return {\r\n stdout: execError.stdout ?? \"\",\r\n stderr: execError.stderr ?? \"\",\r\n exitCode: typeof execError.code === \"number\" ? execError.code : null,\r\n failed: true,\r\n timedOut: execError.timedOut === true || execError.killed === true,\r\n signal: execError.signal ?? null,\r\n };\r\n }\r\n}\r\n\r\nexport class CliProvider implements Provider {\r\n readonly id: string;\r\n readonly kind = \"cli\";\r\n readonly targetName: string;\r\n readonly supportsBatch = false;\r\n\r\n private readonly config: CliResolvedConfig;\r\n private readonly runCommand: CommandRunner;\r\n private healthcheckPromise?: Promise<void>;\r\n\r\n constructor(targetName: string, config: CliResolvedConfig, runner: CommandRunner = defaultCommandRunner) {\r\n this.targetName = targetName;\r\n this.id = `cli:${targetName}`;\r\n this.config = config;\r\n this.runCommand = runner;\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n if (request.signal?.aborted) {\r\n throw new Error(\"CLI provider request was aborted before execution\");\r\n }\r\n\r\n await this.ensureHealthy(request.signal);\r\n\r\n const outputFilePath = generateOutputFilePath(request.evalCaseId);\r\n const templateValues = buildTemplateValues(request, this.config, outputFilePath);\r\n const renderedCommand = renderTemplate(this.config.commandTemplate, templateValues);\r\n\r\n const result = await this.runCommand(renderedCommand, {\r\n cwd: this.config.cwd,\r\n env: process.env,\r\n timeoutMs: this.config.timeoutMs,\r\n signal: request.signal,\r\n });\r\n\r\n if (result.failed || (result.exitCode ?? 0) !== 0) {\r\n if (request.signal?.aborted) {\r\n throw new Error(\"CLI provider request was aborted\");\r\n }\r\n if (result.timedOut) {\r\n throw new Error(\r\n `CLI provider timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\r\n );\r\n }\r\n const codeText = result.exitCode !== null ? result.exitCode : \"unknown\";\r\n const detail = result.stderr.trim() || result.stdout.trim();\r\n const message = detail ? `${detail} (exit code ${codeText})` : `CLI exited with code ${codeText}`;\r\n throw new Error(message);\r\n }\r\n\r\n // Read from output file\r\n const responseText = await this.readAndCleanupOutputFile(outputFilePath);\r\n\r\n return {\r\n text: responseText,\r\n raw: {\r\n command: renderedCommand,\r\n stderr: result.stderr,\r\n exitCode: result.exitCode ?? 0,\r\n cwd: this.config.cwd,\r\n outputFile: outputFilePath,\r\n },\r\n };\r\n }\r\n\r\n private async readAndCleanupOutputFile(filePath: string): Promise<string> {\r\n try {\r\n const content = await readTextFile(filePath);\r\n return content;\r\n } catch (error) {\r\n const errorMsg = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Failed to read output file '${filePath}': ${errorMsg}`);\r\n } finally {\r\n // Clean up temp file - ignore errors as the file might not exist on read failure\r\n await fs.unlink(filePath).catch(() => {/* ignore cleanup errors */});\r\n }\r\n }\r\n\r\n private async ensureHealthy(signal?: AbortSignal): Promise<void> {\r\n if (!this.config.healthcheck) {\r\n return;\r\n }\r\n if (!this.healthcheckPromise) {\r\n this.healthcheckPromise = this.runHealthcheck(this.config.healthcheck, signal);\r\n }\r\n return this.healthcheckPromise;\r\n }\r\n\r\n private async runHealthcheck(\r\n healthcheck: CliResolvedConfig[\"healthcheck\"],\r\n signal?: AbortSignal,\r\n ): Promise<void> {\r\n if (!healthcheck) {\r\n return;\r\n }\r\n\r\n const timeoutMs = healthcheck.timeoutMs ?? this.config.timeoutMs;\r\n\r\n if (healthcheck.type === \"http\") {\r\n const controller = new AbortController();\r\n const timer = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : undefined;\r\n signal?.addEventListener(\"abort\", () => controller.abort(), { once: true });\r\n\r\n try {\r\n const response = await fetch(healthcheck.url, { method: \"GET\", signal: controller.signal });\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\r\n }\r\n } catch (error) {\r\n const reason = error instanceof Error ? error.message : String(error);\r\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${reason}`);\r\n } finally {\r\n if (timer !== undefined) {\r\n clearTimeout(timer);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const renderedCommand = renderTemplate(\r\n healthcheck.commandTemplate,\r\n buildTemplateValues(\r\n {\r\n question: \"\",\r\n guidelines: \"\",\r\n inputFiles: [],\r\n evalCaseId: \"healthcheck\",\r\n attempt: 0,\r\n },\r\n this.config,\r\n generateOutputFilePath(\"healthcheck\"),\r\n ),\r\n );\r\n\r\n const result = await this.runCommand(renderedCommand, {\r\n cwd: healthcheck.cwd ?? this.config.cwd,\r\n env: process.env,\r\n timeoutMs,\r\n signal,\r\n });\r\n\r\n if (result.failed || (result.exitCode ?? 0) !== 0) {\r\n const codeText = result.exitCode !== null ? result.exitCode : \"unknown\";\r\n const detail = result.stderr.trim() || result.stdout.trim();\r\n const message = detail\r\n ? `${detail} (exit code ${codeText})`\r\n : `CLI healthcheck command exited with code ${codeText}`;\r\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${message}`);\r\n }\r\n }\r\n}\r\n\r\nfunction buildTemplateValues(\r\n request: Pick<\r\n ProviderRequest,\r\n \"question\" | \"guidelines\" | \"inputFiles\" | \"evalCaseId\" | \"attempt\"\r\n >,\r\n config: CliResolvedConfig,\r\n outputFilePath: string,\r\n): Record<string, string> {\r\n const inputFiles = normalizeInputFiles(request.inputFiles);\r\n return {\r\n PROMPT: shellEscape(request.question ?? \"\"),\r\n GUIDELINES: shellEscape(request.guidelines ?? \"\"),\r\n EVAL_ID: shellEscape(request.evalCaseId ?? \"\"),\r\n ATTEMPT: shellEscape(String(request.attempt ?? 0)),\r\n FILES: formatFileList(inputFiles, config.filesFormat),\r\n OUTPUT_FILE: shellEscape(outputFilePath),\r\n };\r\n}\r\n\r\nfunction normalizeInputFiles(\r\n inputFiles: readonly string[] | undefined,\r\n): readonly string[] | undefined {\r\n if (!inputFiles || inputFiles.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const unique = new Map<string, string>();\r\n for (const inputFile of inputFiles) {\r\n const absolutePath = path.resolve(inputFile);\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 formatFileList(\r\n files: readonly string[] | undefined,\r\n template: string | undefined,\r\n): string {\r\n if (!files || files.length === 0) {\r\n return \"\";\r\n }\r\n\r\n const formatter = template ?? \"{path}\";\r\n return files\r\n .map((filePath) => {\r\n const escapedPath = shellEscape(filePath);\r\n const escapedName = shellEscape(path.basename(filePath));\r\n return formatter.replaceAll(\"{path}\", escapedPath).replaceAll(\"{basename}\", escapedName);\r\n })\r\n .join(\" \");\r\n}\r\n\r\nfunction renderTemplate(template: string, values: Record<string, string>): string {\r\n return template.replace(/\\{([A-Z_]+)\\}/g, (match, key) => {\r\n const replacement = values[key];\r\n return replacement !== undefined ? replacement : match;\r\n });\r\n}\r\n\r\nfunction shellEscape(value: string): string {\r\n if (value.length === 0) {\r\n return \"''\";\r\n }\r\n\r\n if (process.platform === \"win32\") {\r\n // PowerShell uses backtick (`) for escaping, not backslash\r\n // Double quotes inside the string need to be escaped with backtick\r\n // Single quotes can be used instead for simpler escaping\r\n const escaped = value.replace(/'/g, \"''\");\r\n return `'${escaped}'`;\r\n }\r\n\r\n return `'${value.replace(/'/g, \"'\\\"'\\\"'\")}'`;\r\n}\r\n\r\nfunction generateOutputFilePath(evalCaseId?: string): string {\r\n const safeEvalId = evalCaseId || \"unknown\";\r\n const timestamp = Date.now();\r\n const random = Math.random().toString(36).substring(2, 9);\r\n return path.join(os.tmpdir(), `agentv-${safeEvalId}-${timestamp}-${random}.json`);\r\n}\r\n\r\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\r\n if (!timeoutMs || timeoutMs <= 0) {\r\n return \"\";\r\n }\r\n const seconds = Math.ceil(timeoutMs / 1000);\r\n return ` after ${seconds}s`;\r\n}\r\n","import { exec as execCallback, spawn } from \"node:child_process\";\r\nimport { randomUUID } from \"node:crypto\";\r\nimport { constants, createWriteStream } from \"node:fs\";\r\nimport type { WriteStream } from \"node:fs\";\r\nimport { access, mkdtemp, mkdir, rm, writeFile } from \"node:fs/promises\";\r\nimport { tmpdir } from \"node:os\";\r\nimport path from \"node:path\";\r\nimport { promisify } from \"node:util\";\r\n\r\nimport { recordCodexLogEntry } from \"./codex-log-tracker.js\";\r\nimport { buildPromptDocument, normalizeInputFiles } from \"./preread.js\";\r\nimport type { CodexResolvedConfig } from \"./targets.js\";\r\nimport type { Provider, ProviderRequest, ProviderResponse } from \"./types.js\";\r\n\r\nconst execAsync = promisify(execCallback);\r\nconst WORKSPACE_PREFIX = \"agentv-codex-\";\r\nconst PROMPT_FILENAME = \"prompt.md\";\r\nconst JSONL_TYPE_ITEM_COMPLETED = \"item.completed\";\r\n\r\ninterface CodexRunOptions {\r\n readonly executable: string;\r\n readonly args: readonly string[];\r\n readonly cwd: string;\r\n readonly prompt: string;\r\n readonly timeoutMs?: number;\r\n readonly env: NodeJS.ProcessEnv;\r\n readonly signal?: AbortSignal;\r\n readonly onStdoutChunk?: (chunk: string) => void;\r\n readonly onStderrChunk?: (chunk: string) => void;\r\n}\r\n\r\ninterface CodexRunResult {\r\n readonly stdout: string;\r\n readonly stderr: string;\r\n readonly exitCode: number;\r\n readonly timedOut?: boolean;\r\n}\r\n\r\ntype CodexRunner = (options: CodexRunOptions) => Promise<CodexRunResult>;\r\n\r\nexport class CodexProvider implements Provider {\r\n readonly id: string;\r\n readonly kind = \"codex\" as const;\r\n readonly targetName: string;\r\n readonly supportsBatch = false;\r\n\r\n private readonly config: CodexResolvedConfig;\r\n private readonly runCodex: CodexRunner;\r\n private environmentCheck?: Promise<void>;\r\n private resolvedExecutable?: string;\r\n\r\n constructor(targetName: string, config: CodexResolvedConfig, runner: CodexRunner = defaultCodexRunner) {\r\n this.id = `codex:${targetName}`;\r\n this.targetName = targetName;\r\n this.config = config;\r\n this.runCodex = runner;\r\n }\r\n\r\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\r\n if (request.signal?.aborted) {\r\n throw new Error(\"Codex provider request was aborted before execution\");\r\n }\r\n\r\n await this.ensureEnvironmentReady();\r\n\r\n const inputFiles = normalizeInputFiles(request.inputFiles);\r\n\r\n const workspaceRoot = await this.createWorkspace();\r\n const logger = await this.createStreamLogger(request).catch(() => undefined);\r\n try {\r\n const promptContent = buildPromptDocument(request, inputFiles);\r\n const promptFile = path.join(workspaceRoot, PROMPT_FILENAME);\r\n await writeFile(promptFile, promptContent, \"utf8\");\r\n\r\n const args = this.buildCodexArgs();\r\n const cwd = this.resolveCwd(workspaceRoot);\r\n\r\n const result = await this.executeCodex(args, cwd, promptContent, request.signal, logger);\r\n\r\n if (result.timedOut) {\r\n throw new Error(\r\n `Codex CLI timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\r\n );\r\n }\r\n\r\n if (result.exitCode !== 0) {\r\n const detail = pickDetail(result.stderr, result.stdout);\r\n const prefix = `Codex CLI exited with code ${result.exitCode}`;\r\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\r\n }\r\n\r\n const parsed = parseCodexJson(result.stdout);\r\n const assistantText = extractAssistantText(parsed);\r\n\r\n return {\r\n text: assistantText,\r\n raw: {\r\n response: parsed,\r\n stdout: result.stdout,\r\n stderr: result.stderr,\r\n exitCode: result.exitCode,\r\n args,\r\n executable: this.resolvedExecutable ?? this.config.executable,\r\n promptFile,\r\n workspace: workspaceRoot,\r\n inputFiles,\r\n logFile: logger?.filePath,\r\n },\r\n };\r\n } finally {\r\n await logger?.close();\r\n await this.cleanupWorkspace(workspaceRoot);\r\n }\r\n }\r\n\r\n private async ensureEnvironmentReady(): Promise<void> {\r\n if (!this.environmentCheck) {\r\n this.environmentCheck = this.validateEnvironment();\r\n }\r\n await this.environmentCheck;\r\n }\r\n\r\n private async validateEnvironment(): Promise<void> {\r\n this.resolvedExecutable = await locateExecutable(this.config.executable);\r\n }\r\n\r\n private resolveCwd(workspaceRoot: string): string {\r\n if (!this.config.cwd) {\r\n return workspaceRoot;\r\n }\r\n return path.resolve(this.config.cwd);\r\n }\r\n\r\n private buildCodexArgs(): string[] {\r\n // Global flags must come before 'exec' subcommand\r\n const args = [\"--ask-for-approval\", \"never\", \"exec\", \"--json\", \"--color\", \"never\", \"--skip-git-repo-check\"];\r\n if (this.config.args && this.config.args.length > 0) {\r\n args.push(...this.config.args);\r\n }\r\n args.push(\"-\");\r\n return args;\r\n }\r\n\r\n private async executeCodex(\r\n args: readonly string[],\r\n cwd: string,\r\n promptContent: string,\r\n signal: AbortSignal | undefined,\r\n logger: CodexStreamLogger | undefined,\r\n ): Promise<CodexRunResult> {\r\n try {\r\n return await this.runCodex({\r\n executable: this.resolvedExecutable ?? this.config.executable,\r\n args,\r\n cwd,\r\n prompt: promptContent,\r\n timeoutMs: this.config.timeoutMs,\r\n env: process.env,\r\n signal,\r\n onStdoutChunk: logger ? (chunk) => logger.handleStdoutChunk(chunk) : undefined,\r\n onStderrChunk: logger ? (chunk) => logger.handleStderrChunk(chunk) : undefined,\r\n });\r\n } catch (error) {\r\n const err = error as NodeJS.ErrnoException;\r\n if (err.code === \"ENOENT\") {\r\n throw new Error(\r\n `Codex executable '${this.config.executable}' was not found. Update the target settings.executable or add it to PATH.`,\r\n );\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n private async createWorkspace(): Promise<string> {\r\n return await mkdtemp(path.join(tmpdir(), WORKSPACE_PREFIX));\r\n }\r\n\r\n private async cleanupWorkspace(workspaceRoot: string): Promise<void> {\r\n try {\r\n await rm(workspaceRoot, { recursive: true, force: true });\r\n } catch {\r\n // Best-effort cleanup\r\n }\r\n }\r\n\r\n private resolveLogDirectory(): string | undefined {\r\n const disabled = isCodexLogStreamingDisabled();\r\n if (disabled) {\r\n return undefined;\r\n }\r\n if (this.config.logDir) {\r\n return path.resolve(this.config.logDir);\r\n }\r\n return path.join(process.cwd(), \".agentv\", \"logs\", \"codex\");\r\n }\r\n\r\n private async createStreamLogger(request: ProviderRequest): Promise<CodexStreamLogger | undefined> {\r\n const logDir = this.resolveLogDirectory();\r\n if (!logDir) {\r\n return undefined;\r\n }\r\n try {\r\n await mkdir(logDir, { recursive: true });\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n console.warn(`Skipping Codex stream logging (could not create ${logDir}): ${message}`);\r\n return undefined;\r\n }\r\n\r\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\r\n\r\n try {\r\n const logger = await CodexStreamLogger.create({\r\n filePath,\r\n targetName: this.targetName,\r\n evalCaseId: request.evalCaseId,\r\n attempt: request.attempt,\r\n format: this.config.logFormat ?? \"summary\",\r\n });\r\n recordCodexLogEntry({\r\n filePath,\r\n targetName: this.targetName,\r\n evalCaseId: request.evalCaseId,\r\n attempt: request.attempt,\r\n });\r\n return logger;\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n console.warn(`Skipping Codex stream logging for ${filePath}: ${message}`);\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\nclass CodexStreamLogger {\r\n readonly filePath: string;\r\n private readonly stream: WriteStream;\r\n private readonly startedAt = Date.now();\r\n private stdoutBuffer = \"\";\r\n private stderrBuffer = \"\";\r\n private readonly format: \"summary\" | \"json\";\r\n\r\n private constructor(filePath: string, format: \"summary\" | \"json\") {\r\n this.filePath = filePath;\r\n this.format = format;\r\n this.stream = createWriteStream(filePath, { flags: \"a\" });\r\n }\r\n\r\n static async create(options: {\r\n readonly filePath: string;\r\n readonly targetName: string;\r\n readonly evalCaseId?: string;\r\n readonly attempt?: number;\r\n readonly format: \"summary\" | \"json\";\r\n }): Promise<CodexStreamLogger> {\r\n const logger = new CodexStreamLogger(options.filePath, options.format);\r\n const header = [\r\n \"# Codex CLI stream log\",\r\n `# target: ${options.targetName}`,\r\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\r\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\r\n `# started: ${new Date().toISOString()}`,\r\n \"\",\r\n ].filter((line): line is string => Boolean(line));\r\n logger.writeLines(header);\r\n return logger;\r\n }\r\n\r\n handleStdoutChunk(chunk: string): void {\r\n this.stdoutBuffer += chunk;\r\n this.flushBuffer(\"stdout\");\r\n }\r\n\r\n handleStderrChunk(chunk: string): void {\r\n this.stderrBuffer += chunk;\r\n this.flushBuffer(\"stderr\");\r\n }\r\n\r\n async close(): Promise<void> {\r\n this.flushBuffer(\"stdout\");\r\n this.flushBuffer(\"stderr\");\r\n this.flushRemainder();\r\n await new Promise<void>((resolve, reject) => {\r\n this.stream.once(\"error\", reject);\r\n this.stream.end(() => resolve());\r\n });\r\n }\r\n\r\n private writeLines(lines: readonly string[]): void {\r\n for (const line of lines) {\r\n this.stream.write(`${line}\\n`);\r\n }\r\n }\r\n\r\n private flushBuffer(source: \"stdout\" | \"stderr\"): void {\r\n const buffer = source === \"stdout\" ? this.stdoutBuffer : this.stderrBuffer;\r\n const lines = buffer.split(/\\r?\\n/);\r\n const remainder = lines.pop() ?? \"\";\r\n if (source === \"stdout\") {\r\n this.stdoutBuffer = remainder;\r\n } else {\r\n this.stderrBuffer = remainder;\r\n }\r\n for (const line of lines) {\r\n const formatted = this.formatLine(line, source);\r\n if (formatted) {\r\n this.stream.write(formatted);\r\n this.stream.write(\"\\n\");\r\n }\r\n }\r\n }\r\n\r\n private formatLine(rawLine: string, source: \"stdout\" | \"stderr\"): string | undefined {\r\n const trimmed = rawLine.trim();\r\n if (trimmed.length === 0) {\r\n return undefined;\r\n }\r\n const message =\r\n this.format === \"json\"\r\n ? formatCodexJsonLog(trimmed)\r\n : formatCodexLogMessage(trimmed, source);\r\n return `[+${formatElapsed(this.startedAt)}] [${source}] ${message}`;\r\n }\r\n\r\n private flushRemainder(): void {\r\n const stdoutRemainder = this.stdoutBuffer.trim();\r\n if (stdoutRemainder.length > 0) {\r\n const formatted = this.formatLine(stdoutRemainder, \"stdout\");\r\n if (formatted) {\r\n this.stream.write(formatted);\r\n this.stream.write(\"\\n\");\r\n }\r\n }\r\n const stderrRemainder = this.stderrBuffer.trim();\r\n if (stderrRemainder.length > 0) {\r\n const formatted = this.formatLine(stderrRemainder, \"stderr\");\r\n if (formatted) {\r\n this.stream.write(formatted);\r\n this.stream.write(\"\\n\");\r\n }\r\n }\r\n this.stdoutBuffer = \"\";\r\n this.stderrBuffer = \"\";\r\n }\r\n}\r\n\r\nfunction isCodexLogStreamingDisabled(): boolean {\r\n const envValue = process.env.AGENTV_CODEX_STREAM_LOGS;\r\n if (!envValue) {\r\n return false;\r\n }\r\n const normalized = envValue.trim().toLowerCase();\r\n return normalized === \"false\" || normalized === \"0\" || normalized === \"off\";\r\n}\r\n\r\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\r\n const evalId = sanitizeForFilename(request.evalCaseId ?? \"codex\");\r\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : \"\";\r\n const target = sanitizeForFilename(targetName);\r\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\r\n}\r\n\r\nfunction sanitizeForFilename(value: string): string {\r\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, \"_\");\r\n return sanitized.length > 0 ? sanitized : \"codex\";\r\n}\r\n\r\nfunction formatElapsed(startedAt: number): string {\r\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\r\n const hours = Math.floor(elapsedSeconds / 3600);\r\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\r\n const seconds = elapsedSeconds % 60;\r\n if (hours > 0) {\r\n return `${hours.toString().padStart(2, \"0\")}:${minutes.toString().padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}`;\r\n }\r\n return `${minutes.toString().padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}`;\r\n}\r\n\r\nfunction formatCodexLogMessage(rawLine: string, source: \"stdout\" | \"stderr\"): string {\r\n const parsed = tryParseJsonValue(rawLine);\r\n if (parsed) {\r\n const summary = summarizeCodexEvent(parsed);\r\n if (summary) {\r\n return summary;\r\n }\r\n }\r\n if (source === \"stderr\") {\r\n return `stderr: ${rawLine}`;\r\n }\r\n return rawLine;\r\n}\r\n\r\nfunction formatCodexJsonLog(rawLine: string): string {\r\n const parsed = tryParseJsonValue(rawLine);\r\n if (!parsed) {\r\n return rawLine;\r\n }\r\n try {\r\n return JSON.stringify(parsed, null, 2);\r\n } catch {\r\n return rawLine;\r\n }\r\n}\r\n\r\nfunction summarizeCodexEvent(event: unknown): string | undefined {\r\n if (!event || typeof event !== \"object\") {\r\n return undefined;\r\n }\r\n const record = event as Record<string, unknown>;\r\n const type = typeof record.type === \"string\" ? record.type : undefined;\r\n let message = extractFromEvent(event) ?? extractFromItem(record.item) ?? flattenContent(record.output ?? record.content);\r\n if (!message && type === JSONL_TYPE_ITEM_COMPLETED) {\r\n const item = record.item;\r\n if (item && typeof item === \"object\") {\r\n const candidate = flattenContent(\r\n (item as Record<string, unknown>).text ??\r\n (item as Record<string, unknown>).content ??\r\n (item as Record<string, unknown>).output,\r\n );\r\n if (candidate) {\r\n message = candidate;\r\n }\r\n }\r\n }\r\n if (!message) {\r\n const itemType =\r\n typeof (record.item as Record<string, unknown> | undefined)?.type === \"string\"\r\n ? (record.item as Record<string, unknown>).type\r\n : undefined;\r\n if (type && itemType) {\r\n return `${type}:${itemType}`;\r\n }\r\n if (type) {\r\n return type;\r\n }\r\n }\r\n if (type && message) {\r\n return `${type}: ${message}`;\r\n }\r\n if (message) {\r\n return message;\r\n }\r\n return type;\r\n}\r\n\r\nfunction tryParseJsonValue(rawLine: string): unknown | undefined {\r\n try {\r\n return JSON.parse(rawLine);\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nasync function locateExecutable(candidate: string): Promise<string> {\r\n const includesPathSeparator = candidate.includes(\"/\") || candidate.includes(\"\\\\\");\r\n if (includesPathSeparator) {\r\n const resolved = path.isAbsolute(candidate) ? candidate : path.resolve(candidate);\r\n const executablePath = await ensureWindowsExecutableVariant(resolved);\r\n await access(executablePath, constants.F_OK);\r\n return executablePath;\r\n }\r\n\r\n const locator = process.platform === \"win32\" ? \"where\" : \"which\";\r\n try {\r\n const { stdout } = await execAsync(`${locator} ${candidate}`);\r\n const lines = stdout\r\n .split(/\\r?\\n/)\r\n .map((line) => line.trim())\r\n .filter((line) => line.length > 0);\r\n const preferred = selectExecutableCandidate(lines);\r\n if (preferred) {\r\n const executablePath = await ensureWindowsExecutableVariant(preferred);\r\n await access(executablePath, constants.F_OK);\r\n return executablePath;\r\n }\r\n } catch {\r\n // ignore and fall back to error below\r\n }\r\n\r\n throw new Error(`Codex executable '${candidate}' was not found on PATH`);\r\n}\r\n\r\nfunction selectExecutableCandidate(candidates: readonly string[]): string | undefined {\r\n if (candidates.length === 0) {\r\n return undefined;\r\n }\r\n if (process.platform !== \"win32\") {\r\n return candidates[0];\r\n }\r\n const extensions = getWindowsExecutableExtensions();\r\n for (const ext of extensions) {\r\n const match = candidates.find((candidate) => candidate.toLowerCase().endsWith(ext));\r\n if (match) {\r\n return match;\r\n }\r\n }\r\n return candidates[0];\r\n}\r\n\r\nasync function ensureWindowsExecutableVariant(candidate: string): Promise<string> {\r\n if (process.platform !== \"win32\") {\r\n return candidate;\r\n }\r\n if (hasExecutableExtension(candidate)) {\r\n return candidate;\r\n }\r\n\r\n const extensions = getWindowsExecutableExtensions();\r\n for (const ext of extensions) {\r\n const withExtension = `${candidate}${ext}`;\r\n try {\r\n await access(withExtension, constants.F_OK);\r\n return withExtension;\r\n } catch {\r\n // keep searching\r\n }\r\n }\r\n return candidate;\r\n}\r\n\r\nfunction hasExecutableExtension(candidate: string): boolean {\r\n const lower = candidate.toLowerCase();\r\n return getWindowsExecutableExtensions().some((ext) => lower.endsWith(ext));\r\n}\r\n\r\nconst DEFAULT_WINDOWS_EXTENSIONS = [\".com\", \".exe\", \".bat\", \".cmd\", \".ps1\"] as const;\r\n\r\nfunction getWindowsExecutableExtensions(): readonly string[] {\r\n if (process.platform !== \"win32\") {\r\n return [];\r\n }\r\n const fromEnv = process.env.PATHEXT?.split(\";\")\r\n .map((ext) => ext.trim().toLowerCase())\r\n .filter((ext) => ext.length > 0);\r\n return fromEnv && fromEnv.length > 0 ? fromEnv : DEFAULT_WINDOWS_EXTENSIONS;\r\n}\r\n\r\nfunction parseCodexJson(output: string): unknown {\r\n const trimmed = output.trim();\r\n if (trimmed.length === 0) {\r\n throw new Error(\"Codex CLI produced no output in --json mode\");\r\n }\r\n try {\r\n return JSON.parse(trimmed);\r\n } catch {\r\n const lineObjects = parseJsonLines(trimmed);\r\n if (lineObjects) {\r\n return lineObjects;\r\n }\r\n const lastBrace = trimmed.lastIndexOf(\"{\");\r\n if (lastBrace >= 0) {\r\n const candidate = trimmed.slice(lastBrace);\r\n try {\r\n return JSON.parse(candidate);\r\n } catch {\r\n // fallthrough\r\n }\r\n }\r\n const preview = trimmed.slice(0, 200);\r\n throw new Error(`Codex CLI emitted invalid JSON: ${preview}${trimmed.length > 200 ? \"…\" : \"\"}`);\r\n }\r\n}\r\n\r\nfunction extractAssistantText(parsed: unknown): string {\r\n if (Array.isArray(parsed)) {\r\n const text = extractFromEventStream(parsed);\r\n if (text) {\r\n return text;\r\n }\r\n }\r\n\r\n if (!parsed || typeof parsed !== \"object\") {\r\n throw new Error(\"Codex CLI JSON response did not include an assistant message\");\r\n }\r\n\r\n const record = parsed as Record<string, unknown>;\r\n const eventText = extractFromEvent(record);\r\n if (eventText) {\r\n return eventText;\r\n }\r\n\r\n const messages = Array.isArray(record.messages) ? record.messages : undefined;\r\n if (messages) {\r\n for (let index = messages.length - 1; index >= 0; index -= 1) {\r\n const entry = messages[index];\r\n if (!entry || typeof entry !== \"object\") {\r\n continue;\r\n }\r\n const role = (entry as Record<string, unknown>).role;\r\n if (role !== \"assistant\") {\r\n continue;\r\n }\r\n const content = (entry as Record<string, unknown>).content;\r\n const flattened = flattenContent(content);\r\n if (flattened) {\r\n return flattened;\r\n }\r\n }\r\n }\r\n\r\n const response = record.response;\r\n if (response && typeof response === \"object\") {\r\n const content = (response as Record<string, unknown>).content;\r\n const flattened = flattenContent(content);\r\n if (flattened) {\r\n return flattened;\r\n }\r\n }\r\n\r\n const output = record.output;\r\n const flattenedOutput = flattenContent(output);\r\n if (flattenedOutput) {\r\n return flattenedOutput;\r\n }\r\n\r\n throw new Error(\"Codex CLI JSON response did not include an assistant message\");\r\n}\r\n\r\nfunction extractFromEventStream(events: readonly unknown[]): string | undefined {\r\n for (let index = events.length - 1; index >= 0; index -= 1) {\r\n const candidate = events[index];\r\n const text = extractFromEvent(candidate);\r\n if (text) {\r\n return text;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction extractFromEvent(event: unknown): string | undefined {\r\n if (!event || typeof event !== \"object\") {\r\n return undefined;\r\n }\r\n const record = event as Record<string, unknown>;\r\n const type = typeof record.type === \"string\" ? record.type : undefined;\r\n if (type === JSONL_TYPE_ITEM_COMPLETED) {\r\n const item = record.item;\r\n const text = extractFromItem(item);\r\n if (text) {\r\n return text;\r\n }\r\n }\r\n const output = record.output ?? record.content;\r\n const flattened = flattenContent(output);\r\n if (flattened) {\r\n return flattened;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction extractFromItem(item: unknown): string | undefined {\r\n if (!item || typeof item !== \"object\") {\r\n return undefined;\r\n }\r\n const record = item as Record<string, unknown>;\r\n const itemType = typeof record.type === \"string\" ? record.type : undefined;\r\n if (itemType === \"agent_message\" || itemType === \"response\" || itemType === \"output\") {\r\n const text = flattenContent(record.text ?? record.content ?? record.output);\r\n if (text) {\r\n return text;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction flattenContent(value: unknown): string | undefined {\r\n if (typeof value === \"string\") {\r\n return value;\r\n }\r\n if (Array.isArray(value)) {\r\n const parts = value\r\n .map((segment) => {\r\n if (typeof segment === \"string\") {\r\n return segment;\r\n }\r\n if (segment && typeof segment === \"object\" && \"text\" in segment) {\r\n const text = (segment as Record<string, unknown>).text;\r\n return typeof text === \"string\" ? text : undefined;\r\n }\r\n return undefined;\r\n })\r\n .filter((part): part is string => typeof part === \"string\" && part.length > 0);\r\n return parts.length > 0 ? parts.join(\" \\n\") : undefined;\r\n }\r\n if (value && typeof value === \"object\" && \"text\" in value) {\r\n const text = (value as Record<string, unknown>).text;\r\n return typeof text === \"string\" ? text : undefined;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction parseJsonLines(output: string): unknown[] | undefined {\r\n const lines = output\r\n .split(/\\r?\\n/)\r\n .map((line) => line.trim())\r\n .filter((line) => line.length > 0);\r\n if (lines.length <= 1) {\r\n return undefined;\r\n }\r\n const parsed: unknown[] = [];\r\n for (const line of lines) {\r\n try {\r\n parsed.push(JSON.parse(line));\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n return parsed;\r\n}\r\n\r\nfunction pickDetail(stderr: string, stdout: string): string | undefined {\r\n const errorText = stderr.trim();\r\n if (errorText.length > 0) {\r\n return errorText;\r\n }\r\n const stdoutText = stdout.trim();\r\n return stdoutText.length > 0 ? stdoutText : undefined;\r\n}\r\n\r\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\r\n if (!timeoutMs || timeoutMs <= 0) {\r\n return \"\";\r\n }\r\n const seconds = Math.ceil(timeoutMs / 1000);\r\n return ` after ${seconds}s`;\r\n}\r\n\r\nasync function defaultCodexRunner(options: CodexRunOptions): Promise<CodexRunResult> {\r\n return await new Promise<CodexRunResult>((resolve, reject) => {\r\n const child = spawn(options.executable, options.args, {\r\n cwd: options.cwd,\r\n env: options.env,\r\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\r\n shell: shouldShellExecute(options.executable),\r\n });\r\n\r\n let stdout = \"\";\r\n let stderr = \"\";\r\n let timedOut = false;\r\n\r\n const onAbort = (): void => {\r\n child.kill(\"SIGTERM\");\r\n };\r\n\r\n if (options.signal) {\r\n if (options.signal.aborted) {\r\n onAbort();\r\n } else {\r\n options.signal.addEventListener(\"abort\", onAbort, { once: true });\r\n }\r\n }\r\n\r\n let timeoutHandle: NodeJS.Timeout | undefined;\r\n if (options.timeoutMs && options.timeoutMs > 0) {\r\n timeoutHandle = setTimeout(() => {\r\n timedOut = true;\r\n child.kill(\"SIGTERM\");\r\n }, options.timeoutMs);\r\n timeoutHandle.unref?.();\r\n }\r\n\r\n child.stdout.setEncoding(\"utf8\");\r\n child.stdout.on(\"data\", (chunk) => {\r\n stdout += chunk;\r\n options.onStdoutChunk?.(chunk);\r\n });\r\n\r\n child.stderr.setEncoding(\"utf8\");\r\n child.stderr.on(\"data\", (chunk) => {\r\n stderr += chunk;\r\n options.onStderrChunk?.(chunk);\r\n });\r\n\r\n child.stdin.end(options.prompt);\r\n\r\n const cleanup = (): void => {\r\n if (timeoutHandle) {\r\n clearTimeout(timeoutHandle);\r\n }\r\n if (options.signal) {\r\n options.signal.removeEventListener(\"abort\", onAbort);\r\n }\r\n };\r\n\r\n child.on(\"error\", (error) => {\r\n cleanup();\r\n reject(error);\r\n });\r\n\r\n child.on(\"close\", (code) => {\r\n cleanup();\r\n resolve({\r\n stdout,\r\n stderr,\r\n exitCode: typeof code === \"number\" ? code : -1,\r\n timedOut,\r\n });\r\n });\r\n });\r\n}\r\n\r\nfunction shouldShellExecute(executable: string): boolean {\r\n if (process.platform !== \"win32\") {\r\n return false;\r\n }\r\n const lower = executable.toLowerCase();\r\n return lower.endsWith(\".cmd\") || lower.endsWith(\".bat\") || lower.endsWith(\".ps1\");\r\n}\r\n","export type CodexLogEntry = {\r\n readonly filePath: string;\r\n readonly evalCaseId?: string;\r\n readonly targetName: string;\r\n readonly attempt?: number;\r\n};\r\n\r\nconst GLOBAL_LOGS_KEY = Symbol.for(\"agentv.codexLogs\");\r\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for(\"agentv.codexLogSubscribers\");\r\n\r\ntype CodexLogListener = (entry: CodexLogEntry) => void;\r\n\r\ntype GlobalWithCodexLogs = typeof globalThis & {\r\n [GLOBAL_LOGS_KEY]?: CodexLogEntry[];\r\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<CodexLogListener>;\r\n};\r\n\r\nfunction getCodexLogStore(): CodexLogEntry[] {\r\n const globalObject = globalThis as GlobalWithCodexLogs;\r\n const existing = globalObject[GLOBAL_LOGS_KEY];\r\n if (existing) {\r\n return existing;\r\n }\r\n const created: CodexLogEntry[] = [];\r\n globalObject[GLOBAL_LOGS_KEY] = created;\r\n return created;\r\n}\r\n\r\nfunction getSubscriberStore(): Set<CodexLogListener> {\r\n const globalObject = globalThis as GlobalWithCodexLogs;\r\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\r\n if (existing) {\r\n return existing;\r\n }\r\n const created = new Set<CodexLogListener>();\r\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\r\n return created;\r\n}\r\n\r\nfunction notifySubscribers(entry: CodexLogEntry): void {\r\n const subscribers = Array.from(getSubscriberStore());\r\n for (const listener of subscribers) {\r\n try {\r\n listener(entry);\r\n } catch (error) {\r\n // Avoid surfacing subscriber errors to providers; log for visibility.\r\n const message = error instanceof Error ? error.message : String(error);\r\n console.warn(`Codex log subscriber failed: ${message}`);\r\n }\r\n }\r\n}\r\n\r\nexport function recordCodexLogEntry(entry: CodexLogEntry): void {\r\n getCodexLogStore().push(entry);\r\n notifySubscribers(entry);\r\n}\r\n\r\nexport function consumeCodexLogEntries(): CodexLogEntry[] {\r\n const store = getCodexLogStore();\r\n if (store.length === 0) {\r\n return [];\r\n }\r\n return store.splice(0, store.length);\r\n}\r\n\r\nexport function subscribeToCodexLogEntries(listener: CodexLogListener): () => void {\r\n const store = getSubscriberStore();\r\n store.add(listener);\r\n return () => {\r\n store.delete(listener);\r\n };\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport type { ProviderRequest } from \"./types.js\";\r\nimport { isGuidelineFile } from \"../yaml-parser.js\";\r\n\r\nexport interface PromptDocumentOptions {\r\n readonly guidelinePatterns?: readonly string[];\r\n readonly guidelineOverrides?: ReadonlySet<string>;\r\n}\r\n\r\nexport function buildPromptDocument(\r\n request: ProviderRequest,\r\n inputFiles: readonly string[] | undefined,\r\n options?: PromptDocumentOptions,\r\n): string {\r\n const parts: string[] = [];\r\n\r\n const guidelineFiles = collectGuidelineFiles(\r\n inputFiles,\r\n options?.guidelinePatterns ?? request.guideline_patterns,\r\n options?.guidelineOverrides,\r\n );\r\n const inputFilesList = collectInputFiles(inputFiles);\r\n\r\n const nonGuidelineInputFiles = inputFilesList.filter(\r\n (file) => !guidelineFiles.includes(file),\r\n );\r\n\r\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineInputFiles);\r\n if (prereadBlock.length > 0) {\r\n parts.push(\"\\n\", prereadBlock);\r\n }\r\n\r\n parts.push(\"\\n[[ ## user_query ## ]]\\n\", request.question.trim());\r\n\r\n return parts.join(\"\\n\").trim();\r\n}\r\n\r\nexport function normalizeInputFiles(inputFiles: readonly string[] | undefined): string[] | undefined {\r\n if (!inputFiles || inputFiles.length === 0) {\r\n return undefined;\r\n }\r\n const deduped = new Map<string, string>();\r\n for (const inputFile of inputFiles) {\r\n const absolutePath = path.resolve(inputFile);\r\n if (!deduped.has(absolutePath)) {\r\n deduped.set(absolutePath, absolutePath);\r\n }\r\n }\r\n return Array.from(deduped.values());\r\n}\r\n\r\nexport function collectGuidelineFiles(\r\n inputFiles: readonly string[] | undefined,\r\n guidelinePatterns: readonly string[] | undefined,\r\n overrides?: ReadonlySet<string>,\r\n): string[] {\r\n if (!inputFiles || inputFiles.length === 0) {\r\n return [];\r\n }\r\n\r\n const unique = new Map<string, string>();\r\n for (const inputFile of inputFiles) {\r\n const absolutePath = path.resolve(inputFile);\r\n if (overrides?.has(absolutePath)) {\r\n if (!unique.has(absolutePath)) {\r\n unique.set(absolutePath, absolutePath);\r\n }\r\n continue;\r\n }\r\n\r\n const normalized = absolutePath.split(path.sep).join(\"/\");\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 collectInputFiles(inputFiles: readonly string[] | undefined): string[] {\r\n if (!inputFiles || inputFiles.length === 0) {\r\n return [];\r\n }\r\n const unique = new Map<string, string>();\r\n for (const inputFile of inputFiles) {\r\n const absolutePath = path.resolve(inputFile);\r\n if (!unique.has(absolutePath)) {\r\n unique.set(absolutePath, absolutePath);\r\n }\r\n }\r\n return Array.from(unique.values());\r\n}\r\n\r\nfunction buildMandatoryPrereadBlock(\r\n guidelineFiles: readonly string[],\r\n inputFiles: readonly string[],\r\n): string {\r\n if (guidelineFiles.length === 0 && inputFiles.length === 0) {\r\n return \"\";\r\n }\r\n\r\n const buildList = (files: readonly string[]): string[] =>\r\n files.map((absolutePath) => {\r\n const fileName = path.basename(absolutePath);\r\n const fileUri = pathToFileUri(absolutePath);\r\n return `* [${fileName}](${fileUri})`;\r\n });\r\n\r\n const sections: string[] = [];\r\n if (guidelineFiles.length > 0) {\r\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join(\"\\n\")}.`);\r\n }\r\n\r\n if (inputFiles.length > 0) {\r\n sections.push(`Read all input files:\\n${buildList(inputFiles).join(\"\\n\")}.`);\r\n }\r\n\r\n sections.push(\r\n \"If any file is missing, fail with ERROR: missing-file <filename> and stop.\",\r\n \"Then apply system_instructions on the user query below.\",\r\n );\r\n\r\n return sections.join(\"\\n\");\r\n}\r\n\r\nfunction pathToFileUri(filePath: string): string {\r\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\r\n const normalizedPath = absolutePath.replace(/\\\\/g, \"/\");\r\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\r\n return `file:///${normalizedPath}`;\r\n }\r\n return `file://${normalizedPath}`;\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 question: request.question,\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 const CLI_PLACEHOLDERS = new Set([\"PROMPT\", \"GUIDELINES\", \"EVAL_ID\", \"ATTEMPT\", \"FILES\", \"OUTPUT_FILE\"]);\r\n\r\nexport interface RetryConfig {\r\n readonly maxRetries?: number;\r\n readonly initialDelayMs?: number;\r\n readonly maxDelayMs?: number;\r\n readonly backoffFactor?: number;\r\n readonly retryableStatusCodes?: readonly number[];\r\n}\r\n\r\nexport interface AzureResolvedConfig {\r\n readonly resourceName: string;\r\n readonly deploymentName: string;\r\n readonly apiKey: string;\r\n readonly version?: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly retry?: RetryConfig;\r\n}\r\n\r\nexport interface AnthropicResolvedConfig {\r\n readonly apiKey: string;\r\n readonly model: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly thinkingBudget?: number;\r\n readonly retry?: RetryConfig;\r\n}\r\n\r\nexport interface GeminiResolvedConfig {\r\n readonly apiKey: string;\r\n readonly model: string;\r\n readonly temperature?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly retry?: RetryConfig;\r\n}\r\n\r\nexport interface CodexResolvedConfig {\r\n readonly executable: string;\r\n readonly args?: readonly string[];\r\n readonly cwd?: string;\r\n readonly timeoutMs?: number;\r\n readonly logDir?: string;\r\n readonly logFormat?: \"summary\" | \"json\";\r\n}\r\n\r\nexport interface MockResolvedConfig {\r\n readonly response?: string;\r\n readonly delayMs?: number;\r\n readonly delayMinMs?: number;\r\n readonly delayMaxMs?: number;\r\n}\r\n\r\nexport interface VSCodeResolvedConfig {\r\n readonly command: string;\r\n readonly waitForResponse: boolean;\r\n readonly dryRun: boolean;\r\n readonly subagentRoot?: string;\r\n readonly workspaceTemplate?: string;\r\n}\r\n\r\nexport type CliHealthcheck =\r\n | {\r\n readonly type: \"http\";\r\n readonly url: string;\r\n readonly timeoutMs?: number;\r\n }\r\n | {\r\n readonly type: \"command\";\r\n readonly commandTemplate: string;\r\n readonly timeoutMs?: number;\r\n readonly cwd?: string;\r\n };\r\n\r\nexport interface CliResolvedConfig {\r\n readonly commandTemplate: string;\r\n readonly filesFormat?: string;\r\n readonly cwd?: string;\r\n readonly timeoutMs?: number;\r\n readonly healthcheck?: CliHealthcheck;\r\n}\r\n\r\nexport type ResolvedTarget =\r\n | {\r\n readonly kind: \"azure\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: AzureResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"anthropic\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: AnthropicResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"gemini\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: GeminiResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"codex\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: CodexResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"mock\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: MockResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"vscode\" | \"vscode-insiders\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: VSCodeResolvedConfig;\r\n }\r\n | {\r\n readonly kind: \"cli\";\r\n readonly name: string;\r\n readonly judgeTarget?: string;\r\n readonly workers?: number;\r\n readonly providerBatching?: boolean;\r\n readonly config: CliResolvedConfig;\r\n };\r\n\r\nconst BASE_TARGET_SCHEMA = z.object({\r\n name: z.string().min(1, \"target name is required\"),\r\n provider: z.string().min(1, \"provider is required\"),\r\n judge_target: z.string().optional(),\r\n workers: z.number().int().min(1).optional(),\r\n}).passthrough();\r\n\r\nconst DEFAULT_AZURE_API_VERSION = \"2024-10-01-preview\";\r\n\r\nfunction normalizeAzureApiVersion(value: string | undefined): string {\r\n if (!value) {\r\n return DEFAULT_AZURE_API_VERSION;\r\n }\r\n\r\n const trimmed = value.trim();\r\n if (trimmed.length === 0) {\r\n return DEFAULT_AZURE_API_VERSION;\r\n }\r\n\r\n const withoutPrefix = trimmed.replace(/^api[-_]?version\\s*=\\s*/i, \"\").trim();\r\n return withoutPrefix.length > 0 ? withoutPrefix : DEFAULT_AZURE_API_VERSION;\r\n}\r\n\r\nfunction resolveRetryConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): RetryConfig | undefined {\r\n const maxRetries = resolveOptionalNumber(\r\n target.max_retries ?? target.maxRetries,\r\n `${target.name} max retries`,\r\n );\r\n const initialDelayMs = resolveOptionalNumber(\r\n target.retry_initial_delay_ms ?? target.retryInitialDelayMs,\r\n `${target.name} retry initial delay`,\r\n );\r\n const maxDelayMs = resolveOptionalNumber(\r\n target.retry_max_delay_ms ?? target.retryMaxDelayMs,\r\n `${target.name} retry max delay`,\r\n );\r\n const backoffFactor = resolveOptionalNumber(\r\n target.retry_backoff_factor ?? target.retryBackoffFactor,\r\n `${target.name} retry backoff factor`,\r\n );\r\n const retryableStatusCodes = resolveOptionalNumberArray(\r\n target.retry_status_codes ?? target.retryStatusCodes,\r\n `${target.name} retry status codes`,\r\n );\r\n\r\n // Only return retry config if at least one field is set\r\n if (\r\n maxRetries === undefined &&\r\n initialDelayMs === undefined &&\r\n maxDelayMs === undefined &&\r\n backoffFactor === undefined &&\r\n retryableStatusCodes === undefined\r\n ) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n maxRetries,\r\n initialDelayMs,\r\n maxDelayMs,\r\n backoffFactor,\r\n retryableStatusCodes,\r\n };\r\n}\r\n\r\nexport function resolveTargetDefinition(\r\n definition: TargetDefinition,\r\n env: EnvLookup = process.env,\r\n): ResolvedTarget {\r\n const parsed = BASE_TARGET_SCHEMA.parse(definition);\r\n const provider = parsed.provider.toLowerCase();\r\n const providerBatching = resolveOptionalBoolean(\r\n parsed.provider_batching ?? parsed.providerBatching,\r\n );\r\n\r\n switch (provider) {\r\n case \"azure\":\r\n case \"azure-openai\":\r\n return {\r\n kind: \"azure\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveAzureConfig(parsed, env),\r\n };\r\n case \"anthropic\":\r\n return {\r\n kind: \"anthropic\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveAnthropicConfig(parsed, env),\r\n };\r\n case \"gemini\":\r\n case \"google\":\r\n case \"google-gemini\":\r\n return {\r\n kind: \"gemini\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveGeminiConfig(parsed, env),\r\n };\r\n case \"codex\":\r\n case \"codex-cli\":\r\n return {\r\n kind: \"codex\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveCodexConfig(parsed, env),\r\n };\r\n case \"mock\":\r\n return {\r\n kind: \"mock\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveMockConfig(parsed),\r\n };\r\n case \"vscode\":\r\n case \"vscode-insiders\":\r\n return {\r\n kind: provider as \"vscode\" | \"vscode-insiders\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveVSCodeConfig(parsed, env, provider === \"vscode-insiders\"),\r\n };\r\n case \"cli\":\r\n return {\r\n kind: \"cli\",\r\n name: parsed.name,\r\n judgeTarget: parsed.judge_target,\r\n workers: parsed.workers,\r\n providerBatching,\r\n config: resolveCliConfig(parsed, env),\r\n };\r\n default:\r\n throw new Error(`Unsupported provider '${parsed.provider}' in target '${parsed.name}'`);\r\n }\r\n}\r\n\r\nfunction resolveAzureConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): AzureResolvedConfig {\r\n const endpointSource = target.endpoint ?? target.resource ?? target.resourceName;\r\n const apiKeySource = target.api_key ?? target.apiKey;\r\n const deploymentSource = target.deployment ?? target.deploymentName ?? target.model;\r\n const versionSource = target.version ?? target.api_version;\r\n const temperatureSource = target.temperature;\r\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\r\n\r\n const resourceName = resolveString(endpointSource, env, `${target.name} endpoint`);\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} api key`);\r\n const deploymentName = resolveString(deploymentSource, env, `${target.name} deployment`);\r\n const version = normalizeAzureApiVersion(\r\n resolveOptionalString(versionSource, env, `${target.name} api version`),\r\n );\r\n const temperature = resolveOptionalNumber(temperatureSource, `${target.name} temperature`);\r\n const maxOutputTokens = resolveOptionalNumber(\r\n maxTokensSource,\r\n `${target.name} max output tokens`,\r\n );\r\n const retry = resolveRetryConfig(target);\r\n\r\n return {\r\n resourceName,\r\n deploymentName,\r\n apiKey,\r\n version,\r\n temperature,\r\n maxOutputTokens,\r\n retry,\r\n };\r\n}\r\n\r\nfunction resolveAnthropicConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): AnthropicResolvedConfig {\r\n const apiKeySource = target.api_key ?? target.apiKey;\r\n const modelSource = target.model ?? target.deployment ?? target.variant;\r\n const temperatureSource = target.temperature;\r\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\r\n const thinkingBudgetSource = target.thinking_budget ?? target.thinkingBudget;\r\n\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} Anthropic api key`);\r\n const model = resolveString(modelSource, env, `${target.name} Anthropic model`);\r\n const retry = resolveRetryConfig(target);\r\n\r\n return {\r\n apiKey,\r\n model,\r\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\r\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\r\n thinkingBudget: resolveOptionalNumber(thinkingBudgetSource, `${target.name} thinking budget`),\r\n retry,\r\n };\r\n}\r\n\r\nfunction resolveGeminiConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): GeminiResolvedConfig {\r\n const apiKeySource = target.api_key ?? target.apiKey;\r\n const modelSource = target.model ?? target.deployment ?? target.variant;\r\n const temperatureSource = target.temperature;\r\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\r\n\r\n const apiKey = resolveString(apiKeySource, env, `${target.name} Google API key`);\r\n const model =\r\n resolveOptionalString(modelSource, env, `${target.name} Gemini model`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n }) ?? \"gemini-2.5-flash\";\r\n const retry = resolveRetryConfig(target);\r\n\r\n return {\r\n apiKey,\r\n model,\r\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\r\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\r\n retry,\r\n };\r\n}\r\n\r\nfunction resolveCodexConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): CodexResolvedConfig {\r\n const executableSource = target.executable ?? target.command ?? target.binary;\r\n const argsSource = target.args ?? target.arguments;\r\n const cwdSource = target.cwd;\r\n const timeoutSource = target.timeout_seconds ?? target.timeoutSeconds;\r\n const logDirSource = target.log_dir ?? target.logDir ?? target.log_directory ?? target.logDirectory;\r\n const logFormatSource =\r\n target.log_format ??\r\n target.logFormat ??\r\n target.log_output_format ??\r\n target.logOutputFormat ??\r\n env.AGENTV_CODEX_LOG_FORMAT;\r\n\r\n const executable =\r\n resolveOptionalString(executableSource, env, `${target.name} codex executable`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n }) ?? \"codex\";\r\n\r\n const args = resolveOptionalStringArray(argsSource, env, `${target.name} codex args`);\r\n\r\n const cwd = resolveOptionalString(cwdSource, env, `${target.name} codex cwd`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n });\r\n const timeoutMs = resolveTimeoutMs(timeoutSource, `${target.name} codex timeout`);\r\n const logDir = resolveOptionalString(logDirSource, env, `${target.name} codex log directory`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n });\r\n const logFormat = normalizeCodexLogFormat(logFormatSource);\r\n\r\n return {\r\n executable,\r\n args,\r\n cwd,\r\n timeoutMs,\r\n logDir,\r\n logFormat,\r\n };\r\n}\r\n\r\nfunction normalizeCodexLogFormat(value: unknown): \"summary\" | \"json\" | undefined {\r\n if (value === undefined || value === null) {\r\n return undefined;\r\n }\r\n if (typeof value !== \"string\") {\r\n throw new Error(\"codex log format must be 'summary' or 'json'\");\r\n }\r\n const normalized = value.trim().toLowerCase();\r\n if (normalized === \"json\" || normalized === \"summary\") {\r\n return normalized;\r\n }\r\n throw new Error(\"codex log format must be 'summary' or 'json'\");\r\n}\r\n\r\nfunction resolveMockConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): MockResolvedConfig {\r\n const response = typeof target.response === \"string\" ? target.response : undefined;\r\n return { response };\r\n}\r\n\r\nfunction resolveVSCodeConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n insiders: boolean,\r\n): VSCodeResolvedConfig {\r\n const workspaceTemplateEnvVar = resolveOptionalLiteralString(target.workspace_template ?? target.workspaceTemplate);\r\n const workspaceTemplate = workspaceTemplateEnvVar\r\n ? resolveOptionalString(workspaceTemplateEnvVar, env, `${target.name} workspace template path`, {\r\n allowLiteral: false,\r\n optionalEnv: true,\r\n })\r\n : undefined;\r\n\r\n const commandSource = target.vscode_cmd ?? target.command;\r\n const waitSource = target.wait;\r\n const dryRunSource = target.dry_run ?? target.dryRun;\r\n const subagentRootSource = target.subagent_root ?? target.subagentRoot;\r\n\r\n const defaultCommand = insiders ? \"code-insiders\" : \"code\";\r\n const command = resolveOptionalLiteralString(commandSource) ?? defaultCommand;\r\n\r\n return {\r\n command,\r\n waitForResponse: resolveOptionalBoolean(waitSource) ?? true,\r\n dryRun: resolveOptionalBoolean(dryRunSource) ?? false,\r\n subagentRoot: resolveOptionalString(subagentRootSource, env, `${target.name} subagent root`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n }),\r\n workspaceTemplate,\r\n };\r\n}\r\n\r\nfunction resolveCliConfig(\r\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\r\n env: EnvLookup,\r\n): CliResolvedConfig {\r\n const commandTemplateSource = target.command_template ?? target.commandTemplate;\r\n const filesFormat = resolveOptionalLiteralString(\r\n target.files_format ??\r\n target.filesFormat ??\r\n target.attachments_format ??\r\n target.attachmentsFormat,\r\n );\r\n const cwd = resolveOptionalString(target.cwd, env, `${target.name} working directory`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n });\r\n const timeoutMs = resolveTimeoutMs(target.timeout_seconds ?? target.timeoutSeconds, `${target.name} timeout`);\r\n const healthcheck = resolveCliHealthcheck(target.healthcheck, env, target.name);\r\n\r\n const commandTemplate = resolveString(\r\n commandTemplateSource,\r\n env,\r\n `${target.name} CLI command template`,\r\n true,\r\n );\r\n assertSupportedCliPlaceholders(commandTemplate, `${target.name} CLI command template`);\r\n\r\n return {\r\n commandTemplate,\r\n filesFormat,\r\n cwd,\r\n timeoutMs,\r\n healthcheck,\r\n };\r\n}\r\n\r\nfunction resolveTimeoutMs(source: unknown, description: string): number | undefined {\r\n const seconds = resolveOptionalNumber(source, `${description} (seconds)`);\r\n if (seconds === undefined) {\r\n return undefined;\r\n }\r\n if (seconds <= 0) {\r\n throw new Error(`${description} must be greater than zero seconds`);\r\n }\r\n return Math.floor(seconds * 1000);\r\n}\r\n\r\nfunction resolveCliHealthcheck(\r\n source: unknown,\r\n env: EnvLookup,\r\n targetName: string,\r\n): CliHealthcheck | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (typeof source !== \"object\" || Array.isArray(source)) {\r\n throw new Error(`${targetName} healthcheck must be an object`);\r\n }\r\n\r\n const candidate = source as Record<string, unknown>;\r\n const type = candidate.type;\r\n const timeoutMs = resolveTimeoutMs(\r\n candidate.timeout_seconds ?? candidate.timeoutSeconds,\r\n `${targetName} healthcheck timeout`,\r\n );\r\n\r\n if (type === \"http\") {\r\n const url = resolveString(candidate.url, env, `${targetName} healthcheck URL`);\r\n return {\r\n type: \"http\",\r\n url,\r\n timeoutMs,\r\n };\r\n }\r\n\r\n if (type === \"command\") {\r\n const commandTemplate = resolveString(\r\n candidate.command_template ?? candidate.commandTemplate,\r\n env,\r\n `${targetName} healthcheck command template`,\r\n true,\r\n );\r\n assertSupportedCliPlaceholders(commandTemplate, `${targetName} healthcheck command template`);\r\n const cwd = resolveOptionalString(candidate.cwd, env, `${targetName} healthcheck cwd`, {\r\n allowLiteral: true,\r\n optionalEnv: true,\r\n });\r\n return {\r\n type: \"command\",\r\n commandTemplate,\r\n timeoutMs,\r\n cwd,\r\n };\r\n }\r\n\r\n throw new Error(`${targetName} healthcheck type must be 'http' or 'command'`);\r\n}\r\n\r\nfunction assertSupportedCliPlaceholders(template: string, description: string): void {\r\n const placeholders = extractCliPlaceholders(template);\r\n for (const placeholder of placeholders) {\r\n if (!CLI_PLACEHOLDERS.has(placeholder)) {\r\n throw new Error(\r\n `${description} includes unsupported placeholder '{${placeholder}}'. Supported placeholders: ${Array.from(CLI_PLACEHOLDERS).join(\", \")}`,\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction extractCliPlaceholders(template: string): string[] {\r\n const matches = template.matchAll(/\\{([A-Z_]+)\\}/g);\r\n const results: string[] = [];\r\n for (const match of matches) {\r\n if (match[1]) {\r\n results.push(match[1]);\r\n }\r\n }\r\n return results;\r\n}\r\n\r\nfunction resolveString(\r\n source: unknown,\r\n env: EnvLookup,\r\n description: string,\r\n allowLiteral = false,\r\n): string {\r\n const value = resolveOptionalString(source, env, description, {\r\n allowLiteral,\r\n optionalEnv: false,\r\n });\r\n if (value === undefined) {\r\n throw new Error(`${description} is required`);\r\n }\r\n return value;\r\n}\r\n\r\nfunction resolveOptionalString(\r\n source: unknown,\r\n env: EnvLookup,\r\n description: string,\r\n options?: { allowLiteral?: boolean; optionalEnv?: boolean },\r\n): string | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (typeof source !== \"string\") {\r\n throw new Error(`${description} must be a string`);\r\n }\r\n const trimmed = source.trim();\r\n if (trimmed.length === 0) {\r\n return undefined;\r\n }\r\n\r\n // Check for ${{ variable }} syntax\r\n const envVarMatch = trimmed.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\r\n if (envVarMatch) {\r\n const varName = envVarMatch[1];\r\n const envValue = env[varName];\r\n if (envValue !== undefined) {\r\n if (envValue.trim().length === 0) {\r\n throw new Error(`Environment variable '${varName}' for ${description} is empty`);\r\n }\r\n return envValue;\r\n }\r\n const optionalEnv = options?.optionalEnv ?? false;\r\n if (optionalEnv) {\r\n return undefined;\r\n }\r\n throw new Error(`Environment variable '${varName}' required for ${description} is not set`);\r\n }\r\n\r\n // Return as literal value\r\n const allowLiteral = options?.allowLiteral ?? false;\r\n if (!allowLiteral) {\r\n throw new Error(`${description} must use \\${{ VARIABLE_NAME }} syntax for environment variables or be marked as allowing literals`);\r\n }\r\n return trimmed;\r\n}\r\n\r\nfunction resolveOptionalLiteralString(source: unknown): string | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (typeof source !== \"string\") {\r\n throw new Error(\"expected string value\");\r\n }\r\n const trimmed = source.trim();\r\n return trimmed.length > 0 ? trimmed : undefined;\r\n}\r\n\r\nfunction resolveOptionalNumber(source: unknown, description: string): number | undefined {\r\n if (source === undefined || source === null || source === \"\") {\r\n return undefined;\r\n }\r\n if (typeof source === \"number\") {\r\n return Number.isFinite(source) ? source : undefined;\r\n }\r\n if (typeof source === \"string\") {\r\n const numeric = Number(source);\r\n if (Number.isFinite(numeric)) {\r\n return numeric;\r\n }\r\n }\r\n throw new Error(`${description} must be a number`);\r\n}\r\n\r\nfunction resolveOptionalBoolean(source: unknown): boolean | undefined {\r\n if (source === undefined || source === null || source === \"\") {\r\n return undefined;\r\n }\r\n if (typeof source === \"boolean\") {\r\n return source;\r\n }\r\n if (typeof source === \"string\") {\r\n const lowered = source.trim().toLowerCase();\r\n if (lowered === \"true\" || lowered === \"1\") {\r\n return true;\r\n }\r\n if (lowered === \"false\" || lowered === \"0\") {\r\n return false;\r\n }\r\n }\r\n throw new Error(\"expected boolean value\");\r\n}\r\n\r\nfunction resolveOptionalStringArray(\r\n source: unknown,\r\n env: EnvLookup,\r\n description: string,\r\n): readonly string[] | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (!Array.isArray(source)) {\r\n throw new Error(`${description} must be an array of strings`);\r\n }\r\n if (source.length === 0) {\r\n return undefined;\r\n }\r\n const resolved: string[] = [];\r\n for (let i = 0; i < source.length; i++) {\r\n const item = source[i];\r\n if (typeof item !== \"string\") {\r\n throw new Error(`${description}[${i}] must be a string`);\r\n }\r\n const trimmed = item.trim();\r\n if (trimmed.length === 0) {\r\n throw new Error(`${description}[${i}] cannot be empty`);\r\n }\r\n\r\n // Check for ${{ variable }} syntax\r\n const envVarMatch = trimmed.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\r\n if (envVarMatch) {\r\n const varName = envVarMatch[1];\r\n const envValue = env[varName];\r\n if (envValue !== undefined) {\r\n if (envValue.trim().length === 0) {\r\n throw new Error(`Environment variable '${varName}' for ${description}[${i}] is empty`);\r\n }\r\n resolved.push(envValue);\r\n continue;\r\n }\r\n throw new Error(`Environment variable '${varName}' for ${description}[${i}] is not set`);\r\n }\r\n\r\n // Treat as literal value\r\n resolved.push(trimmed);\r\n }\r\n return resolved.length > 0 ? resolved : undefined;\r\n}\r\n\r\nfunction resolveOptionalNumberArray(\r\n source: unknown,\r\n description: string,\r\n): readonly number[] | undefined {\r\n if (source === undefined || source === null) {\r\n return undefined;\r\n }\r\n if (!Array.isArray(source)) {\r\n throw new Error(`${description} must be an array of numbers`);\r\n }\r\n if (source.length === 0) {\r\n return undefined;\r\n }\r\n const resolved: number[] = [];\r\n for (let i = 0; i < source.length; i++) {\r\n const item = source[i];\r\n if (typeof item !== \"number\" || !Number.isFinite(item)) {\r\n throw new Error(`${description}[${i}] must be a number`);\r\n }\r\n resolved.push(item);\r\n }\r\n return resolved.length > 0 ? resolved : undefined;\r\n}\r\n","import path from \"node:path\";\r\nimport { dispatchAgentSession, dispatchBatchAgent, getSubagentRoot, provisionSubagents } from \"subagent\";\r\n\r\nimport type { VSCodeResolvedConfig } from \"./targets.js\";\r\nimport type { Provider, ProviderRequest, ProviderResponse } from \"./types.js\";\r\nimport { readTextFile } from \"../file-utils.js\";\r\nimport { isGuidelineFile } from \"../yaml-parser.js\";\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 readonly supportsBatch = true;\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 inputFiles = normalizeAttachments(request.inputFiles);\r\n const promptContent = buildPromptDocument(request, inputFiles, request.guideline_patterns);\r\n\r\n const session = await dispatchAgentSession({\r\n userQuery: promptContent,\r\n extraAttachments: inputFiles,\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 inputFiles,\r\n },\r\n };\r\n }\r\n\r\n const responseText = await readTextFile(session.responseFile);\r\n\r\n return {\r\n text: responseText,\r\n raw: {\r\n session,\r\n inputFiles,\r\n },\r\n };\r\n }\r\n\r\n async invokeBatch(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]> {\r\n if (requests.length === 0) {\r\n return [];\r\n }\r\n\r\n const normalizedRequests = requests.map((req) => ({\r\n request: req,\r\n inputFiles: normalizeAttachments(req.inputFiles),\r\n }));\r\n\r\n const combinedInputFiles = mergeAttachments(\r\n normalizedRequests.map(({ inputFiles }) => inputFiles),\r\n );\r\n const userQueries = normalizedRequests.map(({ request, inputFiles }) =>\r\n buildPromptDocument(request, inputFiles, request.guideline_patterns),\r\n );\r\n\r\n const session = await dispatchBatchAgent({\r\n userQueries,\r\n extraAttachments: combinedInputFiles,\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.responseFiles) {\r\n const failure = session.error ?? \"VS Code subagent did not produce batch responses\";\r\n throw new Error(failure);\r\n }\r\n\r\n if (this.config.dryRun) {\r\n return normalizedRequests.map(({ inputFiles }) => ({\r\n text: \"\",\r\n raw: {\r\n session,\r\n inputFiles,\r\n allInputFiles: combinedInputFiles,\r\n },\r\n }));\r\n }\r\n\r\n if (session.responseFiles.length !== requests.length) {\r\n throw new Error(\r\n `VS Code batch returned ${session.responseFiles.length} responses for ${requests.length} requests`,\r\n );\r\n }\r\n\r\n const responses: ProviderResponse[] = [];\r\n for (const [index, responseFile] of session.responseFiles.entries()) {\r\n const responseText = await readTextFile(responseFile);\r\n responses.push({\r\n text: responseText,\r\n raw: {\r\n session,\r\n inputFiles: normalizedRequests[index]?.inputFiles,\r\n allInputFiles: combinedInputFiles,\r\n responseFile,\r\n },\r\n });\r\n }\r\n\r\n return responses;\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 // Agent providers incorporate systemPrompt into the question\r\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\r\n parts.push(request.systemPrompt.trim());\r\n }\r\n\r\n const guidelineFiles = collectGuidelineFiles(attachments, guidelinePatterns);\r\n const attachmentFiles = collectAttachmentFiles(attachments);\r\n\r\n const nonGuidelineAttachments = attachmentFiles.filter(\r\n (file) => !guidelineFiles.includes(file),\r\n );\r\n\r\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineAttachments);\r\n if (prereadBlock.length > 0) {\r\n parts.push(\"\\n\", prereadBlock);\r\n }\r\n\r\n parts.push(\"\\n[[ ## user_query ## ]]\\n\", request.question.trim());\r\n\r\n return parts.join(\"\\n\").trim();\r\n}\r\n\r\nfunction buildMandatoryPrereadBlock(\r\n guidelineFiles: readonly string[],\r\n attachmentFiles: readonly string[],\r\n): string {\r\n if (guidelineFiles.length === 0 && attachmentFiles.length === 0) {\r\n return \"\";\r\n }\r\n\r\n const buildList = (files: readonly string[]): string[] =>\r\n files.map((absolutePath) => {\r\n const fileName = path.basename(absolutePath);\r\n const fileUri = pathToFileUri(absolutePath);\r\n return `* [${fileName}](${fileUri})`;\r\n });\r\n\r\n const sections: string[] = [];\r\n if (guidelineFiles.length > 0) {\r\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join(\"\\n\")}.`);\r\n }\r\n\r\n if (attachmentFiles.length > 0) {\r\n sections.push(`Read all attachment files:\\n${buildList(attachmentFiles).join(\"\\n\")}.`);\r\n }\r\n\r\n sections.push(\r\n \"If any file is missing, fail with ERROR: missing-file <filename> and stop.\",\r\n \"Then apply system_instructions on the user query below.\",\r\n );\r\n\r\n return sections.join(\"\\n\");\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 collectAttachmentFiles(\r\n attachments: readonly string[] | undefined,\r\n): string[] {\r\n if (!attachments || attachments.length === 0) {\r\n return [];\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 if (!unique.has(absolutePath)) {\r\n unique.set(absolutePath, absolutePath);\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.question.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\nfunction mergeAttachments(all: readonly (readonly string[] | undefined)[]): string[] | undefined {\r\n const deduped = new Set<string>();\r\n for (const list of all) {\r\n if (!list) continue;\r\n for (const inputFile of list) {\r\n deduped.add(path.resolve(inputFile));\r\n }\r\n }\r\n return deduped.size > 0 ? Array.from(deduped) : undefined;\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}\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\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 // Pass through all properties from the YAML to support the flattened schema\r\n // This includes all provider-specific settings at the top level\r\n return value as unknown as 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 type { AxChatRequest, AxAI } from \"@ax-llm/ax\";\r\n\r\nimport type { JsonObject } from \"../types.js\";\r\n\r\nexport type ChatPrompt = AxChatRequest[\"chatPrompt\"];\r\n\r\nexport type ProviderKind =\r\n | \"azure\"\r\n | \"anthropic\"\r\n | \"gemini\"\r\n | \"codex\"\r\n | \"cli\"\r\n | \"mock\"\r\n | \"vscode\"\r\n | \"vscode-insiders\";\r\n\r\n/**\r\n * Agent providers that have filesystem access and don't need unwrapped guidelines.\r\n * These providers read files directly from the filesystem using file:// URIs.\r\n */\r\nexport const AGENT_PROVIDER_KINDS: readonly ProviderKind[] = [\r\n \"codex\",\r\n \"vscode\",\r\n \"vscode-insiders\",\r\n] as const;\r\n\r\n/**\r\n * List of all supported provider kinds.\r\n * This is the source of truth for provider validation.\r\n */\r\nexport const KNOWN_PROVIDERS: readonly ProviderKind[] = [\r\n \"azure\",\r\n \"anthropic\",\r\n \"gemini\",\r\n \"codex\",\r\n \"cli\",\r\n \"mock\",\r\n \"vscode\",\r\n \"vscode-insiders\",\r\n] as const;\r\n\r\n/**\r\n * Provider aliases that are accepted in target definitions.\r\n * These map to the canonical ProviderKind values.\r\n */\r\nexport const PROVIDER_ALIASES: readonly string[] = [\r\n \"azure-openai\", // alias for \"azure\"\r\n \"google\", // alias for \"gemini\"\r\n \"google-gemini\", // alias for \"gemini\"\r\n \"codex-cli\", // alias for \"codex\"\r\n \"openai\", // legacy/future support\r\n \"bedrock\", // legacy/future support\r\n \"vertex\", // legacy/future support\r\n] as const;\r\n\r\n/**\r\n * Schema identifier for targets.yaml files (version 2).\r\n */\r\nexport const TARGETS_SCHEMA_V2 = \"agentv-targets-v2.2\";\r\n\r\nexport interface ProviderRequest {\r\n readonly question: string;\r\n readonly systemPrompt?: string;\r\n readonly guidelines?: string;\r\n readonly guideline_patterns?: readonly string[];\r\n readonly chatPrompt?: ChatPrompt;\r\n readonly inputFiles?: readonly string[];\r\n readonly evalCaseId?: string;\r\n readonly attempt?: number;\r\n readonly maxOutputTokens?: number;\r\n readonly temperature?: number;\r\n readonly metadata?: JsonObject;\r\n readonly signal?: AbortSignal;\r\n}\r\n\r\nexport interface ProviderResponse {\r\n readonly text: string;\r\n readonly reasoning?: string;\r\n readonly raw?: unknown;\r\n readonly usage?: JsonObject;\r\n}\r\n\r\n/**\r\n * Type guard to check if a provider is an agent provider with filesystem access.\r\n * Agent providers read files directly and don't need unwrapped guideline content.\r\n */\r\nexport function isAgentProvider(provider: Provider | undefined): boolean {\r\n return provider ? AGENT_PROVIDER_KINDS.includes(provider.kind) : false;\r\n}\r\n\r\nexport interface Provider {\r\n readonly id: string;\r\n readonly kind: ProviderKind;\r\n readonly targetName: string;\r\n invoke(request: ProviderRequest): Promise<ProviderResponse>;\r\n /**\r\n * Optional capability marker for provider-managed batching (single session handling multiple requests).\r\n */\r\n readonly supportsBatch?: boolean;\r\n /**\r\n * Optional batch invocation hook. When defined alongside supportsBatch=true,\r\n * the orchestrator may send multiple requests in a single provider session.\r\n */\r\n invokeBatch?(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]>;\r\n /**\r\n * Optional access to the underlying AxAI instance.\r\n * This enables using advanced Ax features like structured output signatures.\r\n */\r\n getAxAI?(): AxAI;\r\n}\r\n\r\nexport type EnvLookup = Readonly<Record<string, string | undefined>>;\r\n\r\nexport interface TargetDefinition {\r\n readonly name: string;\r\n readonly provider: ProviderKind | string;\r\n readonly judge_target?: string | undefined;\r\n readonly workers?: number | undefined;\r\n // Provider batching\r\n readonly provider_batching?: boolean | undefined;\r\n readonly providerBatching?: boolean | undefined;\r\n // Azure fields\r\n readonly endpoint?: string | unknown | undefined;\r\n readonly resource?: string | unknown | undefined;\r\n readonly resourceName?: string | unknown | undefined;\r\n readonly api_key?: string | unknown | undefined;\r\n readonly apiKey?: string | unknown | undefined;\r\n readonly deployment?: string | unknown | undefined;\r\n readonly deploymentName?: string | unknown | undefined;\r\n readonly model?: string | unknown | undefined;\r\n readonly version?: string | unknown | undefined;\r\n readonly api_version?: string | unknown | undefined;\r\n // Anthropic fields\r\n readonly variant?: string | unknown | undefined;\r\n readonly thinking_budget?: number | unknown | undefined;\r\n readonly thinkingBudget?: number | unknown | undefined;\r\n // Common fields\r\n readonly temperature?: number | unknown | undefined;\r\n readonly max_output_tokens?: number | unknown | undefined;\r\n readonly maxTokens?: number | unknown | undefined;\r\n // Codex fields\r\n readonly executable?: string | unknown | undefined;\r\n readonly command?: string | unknown | undefined;\r\n readonly binary?: string | unknown | undefined;\r\n readonly args?: unknown | undefined;\r\n readonly arguments?: unknown | undefined;\r\n readonly cwd?: string | unknown | undefined;\r\n readonly timeout_seconds?: number | unknown | undefined;\r\n readonly timeoutSeconds?: number | unknown | undefined;\r\n readonly log_dir?: string | unknown | undefined;\r\n readonly logDir?: string | unknown | undefined;\r\n readonly log_directory?: string | unknown | undefined;\r\n readonly logDirectory?: string | unknown | undefined;\r\n readonly log_format?: string | unknown | undefined;\r\n readonly logFormat?: string | unknown | undefined;\r\n readonly log_output_format?: string | unknown | undefined;\r\n readonly logOutputFormat?: string | unknown | undefined;\r\n // Mock fields\r\n readonly response?: string | unknown | undefined;\r\n readonly delayMs?: number | unknown | undefined;\r\n readonly delayMinMs?: number | unknown | undefined;\r\n readonly delayMaxMs?: number | unknown | undefined;\r\n // VSCode fields\r\n readonly vscode_cmd?: string | unknown | undefined;\r\n readonly wait?: boolean | unknown | undefined;\r\n readonly dry_run?: boolean | unknown | undefined;\r\n readonly dryRun?: boolean | unknown | undefined;\r\n readonly subagent_root?: string | unknown | undefined;\r\n readonly subagentRoot?: string | unknown | undefined;\r\n readonly workspace_template?: string | unknown | undefined;\r\n readonly workspaceTemplate?: string | unknown | undefined;\r\n // CLI fields\r\n readonly command_template?: string | unknown | undefined;\r\n readonly commandTemplate?: string | unknown | undefined;\r\n readonly files_format?: string | unknown | undefined;\r\n readonly filesFormat?: string | unknown | undefined;\r\n readonly attachments_format?: string | unknown | undefined;\r\n readonly attachmentsFormat?: string | unknown | undefined;\r\n readonly env?: unknown | undefined;\r\n readonly healthcheck?: unknown | undefined;\r\n // Retry configuration fields\r\n readonly max_retries?: number | unknown | undefined;\r\n readonly maxRetries?: number | unknown | undefined;\r\n readonly retry_initial_delay_ms?: number | unknown | undefined;\r\n readonly retryInitialDelayMs?: number | unknown | undefined;\r\n readonly retry_max_delay_ms?: number | unknown | undefined;\r\n readonly retryMaxDelayMs?: number | unknown | undefined;\r\n readonly retry_backoff_factor?: number | unknown | undefined;\r\n readonly retryBackoffFactor?: number | unknown | undefined;\r\n readonly retry_status_codes?: unknown | undefined;\r\n readonly retryStatusCodes?: unknown | undefined;\r\n}\r\n","import { AnthropicProvider, AzureProvider, GeminiProvider } from \"./ax.js\";\r\nimport { CliProvider } from \"./cli.js\";\r\nimport { CodexProvider } from \"./codex.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 CliResolvedConfig,\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\nexport { consumeCodexLogEntries, subscribeToCodexLogEntries } from \"./codex-log-tracker.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 \"cli\":\r\n return new CliProvider(target.name, target.config);\r\n case \"codex\":\r\n return new CodexProvider(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","import { randomUUID } from \"node:crypto\";\r\n\r\nimport type { ResolvedTarget } from \"./providers/targets.js\";\r\nimport type { Provider, ProviderResponse, ChatPrompt } from \"./providers/types.js\";\r\nimport type { EvaluatorConfig, JsonObject, EvalCase } from \"./types.js\";\r\n\r\n/**\r\n * Default evaluator template for the user prompt (variables will be substituted).\r\n * Custom evaluators can override this via evaluatorTemplate option.\r\n */\r\nconst DEFAULT_EVALUATOR_TEMPLATE = `You are an expert evaluator. Your goal is to grade the candidate_answer based on how well it achieves the expected_outcome for the original task.\r\n\r\nUse the reference_answer as a gold standard for a high-quality response (if provided). The candidate_answer does not need to match it verbatim, but should capture the key points and follow the same spirit.\r\n\r\nBe concise and focused in your evaluation. Provide succinct, specific feedback rather than verbose explanations.\r\n\r\n[[ ## expected_outcome ## ]]\r\n{{expected_outcome}}\r\n\r\n[[ ## question ## ]]\r\n{{question}}\r\n\r\n[[ ## reference_answer ## ]]\r\n{{reference_answer}}\r\n\r\n[[ ## candidate_answer ## ]]\r\n{{candidate_answer}}`;\r\n\r\nexport interface EvaluationContext {\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 question: string;\r\n readonly guidelines: string;\r\n readonly systemMessage?: string;\r\n readonly chatPrompt?: ChatPrompt;\r\n };\r\n readonly now: Date;\r\n readonly judgeProvider?: Provider;\r\n readonly evaluatorTemplateOverride?: string;\r\n readonly evaluator?: EvaluatorConfig;\r\n}\r\n\r\nexport interface EvaluationScore {\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 evaluatorRawRequest?: JsonObject;\r\n}\r\n\r\nexport interface Evaluator {\r\n readonly kind: string;\r\n evaluate(context: EvaluationContext): Promise<EvaluationScore> | EvaluationScore;\r\n}\r\n\r\ntype JudgeProviderResolver = (context: EvaluationContext) => Promise<Provider | undefined>;\r\n\r\nexport interface LlmJudgeEvaluatorOptions {\r\n readonly resolveJudgeProvider: JudgeProviderResolver;\r\n readonly maxOutputTokens?: number;\r\n readonly temperature?: number;\r\n readonly evaluatorTemplate?: string;\r\n}\r\n\r\nexport class LlmJudgeEvaluator implements Evaluator {\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 private readonly evaluatorTemplate?: string;\r\n\r\n constructor(options: LlmJudgeEvaluatorOptions) {\r\n this.resolveJudgeProvider = options.resolveJudgeProvider;\r\n this.maxOutputTokens = options.maxOutputTokens;\r\n this.temperature = options.temperature;\r\n this.evaluatorTemplate = options.evaluatorTemplate;\r\n }\r\n\r\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\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 return this.evaluateWithPrompt(context, judgeProvider);\r\n }\r\n\r\n private async evaluateWithPrompt(\r\n context: EvaluationContext,\r\n judgeProvider: Provider,\r\n ): Promise<EvaluationScore> {\r\n const formattedQuestion =\r\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\r\n ? context.promptInputs.question\r\n : context.evalCase.question;\r\n\r\n // Prepare template variables for substitution\r\n const variables = {\r\n input_messages: JSON.stringify(context.evalCase.input_segments, null, 2),\r\n output_messages: JSON.stringify(context.evalCase.output_segments, null, 2),\r\n candidate_answer: context.candidate.trim(),\r\n reference_answer: (context.evalCase.reference_answer ?? \"\").trim(),\r\n expected_outcome: context.evalCase.expected_outcome.trim(),\r\n question: formattedQuestion.trim(),\r\n };\r\n \r\n // Build system prompt (only the mandatory output schema)\r\n const systemPrompt = buildOutputSchema();\r\n \r\n // Build user prompt based on custom template or default template\r\n const evaluatorTemplate = context.evaluatorTemplateOverride ?? this.evaluatorTemplate ?? DEFAULT_EVALUATOR_TEMPLATE;\r\n const userPrompt = substituteVariables(evaluatorTemplate, variables);\r\n\r\n const response = await judgeProvider.invoke({\r\n question: userPrompt,\r\n systemPrompt,\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 const reasoning = parsed.reasoning ?? response.reasoning;\r\n const expectedAspectCount = Math.max(hits.length + misses.length, 1);\r\n\r\n const evaluatorRawRequest: JsonObject = {\r\n userPrompt,\r\n systemPrompt,\r\n target: judgeProvider.targetName,\r\n };\r\n\r\n return {\r\n score,\r\n hits,\r\n misses,\r\n expectedAspectCount,\r\n reasoning,\r\n evaluatorRawRequest,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Build the mandatory output schema that all evaluators must follow.\r\n * This schema is always appended to the evaluator template.\r\n */\r\nfunction buildOutputSchema(): string {\r\n return [\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\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\r\n// Code Evaluator\r\n\r\nexport interface CodeEvaluatorOptions {\r\n readonly script: string;\r\n readonly cwd?: string;\r\n readonly agentTimeoutMs?: number;\r\n}\r\n\r\nexport class CodeEvaluator implements Evaluator {\r\n readonly kind = \"code\";\r\n\r\n private readonly script: string;\r\n private readonly cwd?: string;\r\n private readonly agentTimeoutMs?: number;\r\n\r\n constructor(options: CodeEvaluatorOptions) {\r\n this.script = options.script;\r\n this.cwd = options.cwd;\r\n this.agentTimeoutMs = options.agentTimeoutMs;\r\n }\r\n\r\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\r\n const inputPayload = JSON.stringify(\r\n {\r\n question: context.evalCase.question,\r\n expected_outcome: context.evalCase.expected_outcome,\r\n reference_answer: context.evalCase.reference_answer,\r\n candidate_answer: context.candidate,\r\n guideline_paths: context.evalCase.guideline_paths,\r\n input_files: context.evalCase.file_paths,\r\n input_segments: context.evalCase.input_segments,\r\n },\r\n null,\r\n 2,\r\n );\r\n\r\n try {\r\n const stdout = await executeScript(this.script, inputPayload, this.agentTimeoutMs, this.cwd);\r\n const parsed = parseJsonSafe(stdout);\r\n const score = clampScore(typeof parsed?.score === \"number\" ? parsed.score : 0);\r\n const hits = Array.isArray(parsed?.hits) ? parsed.hits.filter(isNonEmptyString) : [];\r\n const misses = Array.isArray(parsed?.misses) ? parsed.misses.filter(isNonEmptyString) : [];\r\n const reasoning = typeof parsed?.reasoning === \"string\" ? parsed.reasoning : undefined;\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 evaluatorRawRequest: {\r\n script: this.script,\r\n ...(this.cwd ? { cwd: this.cwd } : {}),\r\n },\r\n };\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n return {\r\n score: 0,\r\n hits: [],\r\n misses: [`Code evaluator failed: ${message}`],\r\n expectedAspectCount: 1,\r\n reasoning: message,\r\n evaluatorRawRequest: {\r\n script: this.script,\r\n ...(this.cwd ? { cwd: this.cwd } : {}),\r\n error: message,\r\n },\r\n };\r\n }\r\n }\r\n}\r\n\r\n// Helper functions for CodeEvaluator\r\n\r\nasync function executeScript(\r\n scriptPath: string,\r\n input: string,\r\n agentTimeoutMs?: number,\r\n cwd?: string,\r\n): Promise<string> {\r\n const { spawn } = await import(\"node:child_process\");\r\n \r\n return await new Promise<string>((resolve, reject) => {\r\n const child = spawn(scriptPath, {\r\n shell: true,\r\n cwd,\r\n });\r\n\r\n let stdout = \"\";\r\n let stderr = \"\";\r\n\r\n const timeout = agentTimeoutMs\r\n ? setTimeout(() => {\r\n child.kill();\r\n reject(new Error(`Code evaluator timed out after ${agentTimeoutMs}ms`));\r\n }, agentTimeoutMs)\r\n : undefined;\r\n\r\n child.stdout?.on(\"data\", (data) => {\r\n stdout += data.toString();\r\n });\r\n child.stderr?.on(\"data\", (data) => {\r\n stderr += data.toString();\r\n });\r\n child.on(\"error\", (error) => {\r\n if (timeout !== undefined) {\r\n clearTimeout(timeout);\r\n }\r\n reject(error);\r\n });\r\n child.on(\"exit\", (code) => {\r\n if (timeout !== undefined) {\r\n clearTimeout(timeout);\r\n }\r\n if (code && code !== 0 && stderr.length > 0) {\r\n reject(new Error(`Code evaluator exited with code ${code}: ${stderr.trim()}`));\r\n return;\r\n }\r\n resolve(stdout.trim());\r\n });\r\n\r\n child.stdin?.write(input);\r\n child.stdin?.end();\r\n });\r\n}\r\n\r\nfunction parseJsonSafe(payload: string): Record<string, unknown> | undefined {\r\n try {\r\n return JSON.parse(payload) as Record<string, unknown>;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction substituteVariables(template: string, variables: Record<string, string>): string {\r\n return template.replace(/\\{\\{([a-zA-Z0-9_]+)\\}\\}/g, (match, varName) => {\r\n return variables[varName] ?? match;\r\n });\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 { LlmJudgeEvaluator, CodeEvaluator, type EvaluationScore, type Evaluator } from \"./evaluators.js\";\r\nimport { readTextFile } from \"./file-utils.js\";\r\nimport { createProvider } from \"./providers/index.js\";\r\nimport { resolveTargetDefinition, type ResolvedTarget } from \"./providers/targets.js\";\r\nimport type {\r\n EnvLookup,\r\n Provider,\r\n ProviderRequest,\r\n ProviderResponse,\r\n TargetDefinition,\r\n} from \"./providers/types.js\";\r\nimport { isAgentProvider } from \"./providers/types.js\";\r\nimport type { EvalCase, EvaluationResult, EvaluatorConfig, EvaluatorResult, JsonObject, JsonValue } from \"./types.js\";\r\nimport { buildPromptInputs, loadEvalCases, type PromptInputs } 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 evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\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 evaluators?: Partial<Record<string, Evaluator>>;\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: evalFilePath,\r\n repoRoot,\r\n target,\r\n targets,\r\n env,\r\n providerFactory,\r\n evaluators,\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(evalFilePath, repoRoot, { verbose, evalId });\r\n\r\n const filteredEvalCases = filterEvalCases(evalCases, evalId);\r\n if (filteredEvalCases.length === 0) {\r\n if (evalId) {\r\n throw new Error(`Eval case with id '${evalId}' not found in ${evalFilePath}`);\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 evaluatorRegistry = buildEvaluatorRegistry(evaluators, resolveJudgeProvider);\r\n\r\n const primaryProvider = getOrCreateProvider(target);\r\n const providerSupportsBatch =\r\n target.providerBatching === true &&\r\n primaryProvider.supportsBatch === true &&\r\n typeof primaryProvider.invokeBatch === \"function\";\r\n if (target.providerBatching && !providerSupportsBatch && verbose) {\r\n console.warn(\r\n `Provider batching requested for target '${target.name}', but provider does not advertise batch support. Using per-case dispatch.`,\r\n );\r\n }\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 if (providerSupportsBatch) {\r\n try {\r\n return await runBatchEvaluation({\r\n evalCases: filteredEvalCases,\r\n provider: primaryProvider,\r\n target,\r\n evaluatorRegistry,\r\n promptDumpDir,\r\n nowFn: now ?? (() => new Date()),\r\n onProgress,\r\n onResult,\r\n verbose,\r\n resolveJudgeProvider,\r\n agentTimeoutMs,\r\n });\r\n } catch (error) {\r\n if (verbose) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n console.warn(`Provider batch execution failed, falling back to per-case dispatch: ${message}`);\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 evaluators: evaluatorRegistry,\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: result.error ? \"failed\" : \"completed\",\r\n startedAt: 0, // Not used for completed status\r\n completedAt: Date.now(),\r\n error: result.error,\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 primaryProvider,\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\nasync function runBatchEvaluation(options: {\r\n readonly evalCases: readonly EvalCase[];\r\n readonly provider: Provider;\r\n readonly target: ResolvedTarget;\r\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\r\n readonly promptDumpDir?: string;\r\n readonly nowFn: () => Date;\r\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\r\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\r\n readonly verbose?: boolean;\r\n readonly resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>;\r\n readonly agentTimeoutMs?: number;\r\n}): Promise<readonly EvaluationResult[]> {\r\n const {\r\n evalCases,\r\n provider,\r\n target,\r\n evaluatorRegistry,\r\n promptDumpDir,\r\n nowFn,\r\n onProgress,\r\n onResult,\r\n resolveJudgeProvider,\r\n agentTimeoutMs,\r\n } = options;\r\n\r\n // Prepare prompt inputs up front so we can reuse them for grading.\r\n const promptInputsList: PromptInputs[] = [];\r\n for (const evalCase of evalCases) {\r\n const promptInputs = await buildPromptInputs(evalCase);\r\n if (promptDumpDir) {\r\n await dumpPrompt(promptDumpDir, evalCase, promptInputs);\r\n }\r\n promptInputsList.push(promptInputs);\r\n }\r\n\r\n const batchRequests: ProviderRequest[] = evalCases.map((evalCase, index) => {\r\n const promptInputs = promptInputsList[index];\r\n return {\r\n question: promptInputs.question,\r\n guidelines: promptInputs.guidelines,\r\n guideline_patterns: evalCase.guideline_patterns,\r\n inputFiles: evalCase.file_paths,\r\n evalCaseId: evalCase.id,\r\n metadata: {\r\n systemPrompt: promptInputs.systemMessage ?? \"\",\r\n },\r\n };\r\n });\r\n\r\n const batchResponse = await provider.invokeBatch?.(batchRequests);\r\n if (!Array.isArray(batchResponse)) {\r\n throw new Error(\"Provider batching failed: invokeBatch did not return an array\");\r\n }\r\n if (batchResponse.length !== evalCases.length) {\r\n throw new Error(\r\n `Provider batching failed: expected ${evalCases.length} responses, received ${batchResponse.length}`,\r\n );\r\n }\r\n\r\n if (onProgress) {\r\n const startedAt = Date.now();\r\n for (let i = 0; i < evalCases.length; i++) {\r\n await onProgress({\r\n workerId: 1,\r\n evalId: evalCases[i].id,\r\n status: \"running\",\r\n startedAt,\r\n });\r\n }\r\n }\r\n\r\n const results: EvaluationResult[] = [];\r\n for (let i = 0; i < evalCases.length; i++) {\r\n const evalCase = evalCases[i];\r\n const promptInputs = promptInputsList[i];\r\n const providerResponse = batchResponse[i];\r\n let result: EvaluationResult;\r\n try {\r\n result = await evaluateCandidate({\r\n evalCase,\r\n candidate: providerResponse.text ?? \"\",\r\n target,\r\n provider,\r\n evaluators: evaluatorRegistry,\r\n promptInputs,\r\n nowFn,\r\n attempt: 0,\r\n judgeProvider: await resolveJudgeProvider(target),\r\n agentTimeoutMs,\r\n });\r\n } catch (error) {\r\n const errorResult = buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs, provider);\r\n results.push(errorResult);\r\n if (onResult) {\r\n await onResult(errorResult);\r\n }\r\n if (onProgress) {\r\n await onProgress({\r\n workerId: 1,\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 continue;\r\n }\r\n\r\n results.push(result);\r\n if (onResult) {\r\n await onResult(result);\r\n }\r\n\r\n if (onProgress) {\r\n await onProgress({\r\n workerId: 1,\r\n evalId: evalCase.id,\r\n status: \"completed\",\r\n startedAt: 0,\r\n completedAt: Date.now(),\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 evaluators,\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, provider);\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 provider,\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 try {\r\n return await evaluateCandidate({\r\n evalCase,\r\n candidate: providerResponse.text ?? \"\",\r\n target,\r\n provider,\r\n evaluators,\r\n promptInputs,\r\n nowFn,\r\n attempt,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n });\r\n } catch (error) {\r\n return buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs, provider);\r\n }\r\n}\r\n\r\nasync function evaluateCandidate(options: {\r\n readonly evalCase: EvalCase;\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\r\n readonly promptInputs: PromptInputs;\r\n readonly nowFn: () => Date;\r\n readonly attempt: number;\r\n readonly judgeProvider?: Provider;\r\n readonly agentTimeoutMs?: number;\r\n}): Promise<EvaluationResult> {\r\n const {\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n evaluators,\r\n promptInputs,\r\n nowFn,\r\n attempt,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n } = options;\r\n\r\n const gradeTimestamp = nowFn();\r\n const { score, evaluatorResults } = await runEvaluatorsForCase({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n evaluators,\r\n attempt,\r\n promptInputs,\r\n now: gradeTimestamp,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n });\r\n\r\n const completedAt = nowFn();\r\n \r\n let agentProviderRequest: JsonObject | undefined;\r\n let lmProviderRequest: JsonObject | undefined;\r\n\r\n if (isAgentProvider(provider)) {\r\n agentProviderRequest = {\r\n question: promptInputs.question,\r\n guideline_paths: evalCase.guideline_paths,\r\n } as JsonObject;\r\n } else {\r\n if (promptInputs.chatPrompt) {\r\n lmProviderRequest = {\r\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\r\n guideline_paths: evalCase.guideline_paths,\r\n } as JsonObject;\r\n } else {\r\n lmProviderRequest = {\r\n question: promptInputs.question,\r\n guidelines: promptInputs.guidelines,\r\n guideline_paths: evalCase.guideline_paths,\r\n } as JsonObject;\r\n }\r\n }\r\n\r\n return {\r\n timestamp: completedAt.toISOString(),\r\n eval_id: evalCase.id,\r\n dataset: evalCase.dataset,\r\n conversation_id: evalCase.conversation_id,\r\n score: score.score,\r\n hits: score.hits,\r\n misses: score.misses,\r\n candidate_answer: candidate,\r\n target: target.name,\r\n reasoning: score.reasoning,\r\n raw_aspects: score.rawAspects,\r\n agent_provider_request: agentProviderRequest,\r\n lm_provider_request: lmProviderRequest,\r\n evaluator_provider_request: evaluatorResults ? undefined : score.evaluatorRawRequest,\r\n evaluator_results: evaluatorResults,\r\n };\r\n}\r\n\r\nasync function runEvaluatorsForCase(options: {\r\n readonly evalCase: EvalCase;\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\r\n readonly attempt: number;\r\n readonly promptInputs: PromptInputs;\r\n readonly now: Date;\r\n readonly judgeProvider?: Provider;\r\n readonly agentTimeoutMs?: number;\r\n}): Promise<{ score: EvaluationScore; evaluatorResults?: EvaluatorResult[] }> {\r\n const { evalCase, candidate, target, provider, evaluators, attempt, promptInputs, now, judgeProvider, agentTimeoutMs } =\r\n options;\r\n\r\n if (evalCase.evaluators && evalCase.evaluators.length > 0) {\r\n return runEvaluatorList({\r\n evalCase,\r\n evaluators: evalCase.evaluators,\r\n candidate,\r\n target,\r\n provider,\r\n evaluatorRegistry: evaluators,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n });\r\n }\r\n\r\n const evaluatorKind = evalCase.evaluator ?? \"llm_judge\";\r\n const activeEvaluator = evaluators[evaluatorKind] ?? evaluators.llm_judge;\r\n if (!activeEvaluator) {\r\n throw new Error(`No evaluator registered for kind '${evaluatorKind}'`);\r\n }\r\n\r\n const score = await activeEvaluator.evaluate({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n });\r\n\r\n return { score };\r\n}\r\n\r\nasync function runEvaluatorList(options: {\r\n readonly evalCase: EvalCase;\r\n readonly evaluators: readonly EvaluatorConfig[];\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\r\n readonly attempt: number;\r\n readonly promptInputs: PromptInputs;\r\n readonly now: Date;\r\n readonly judgeProvider?: Provider;\r\n readonly agentTimeoutMs?: number;\r\n}): Promise<{ score: EvaluationScore; evaluatorResults: EvaluatorResult[] }> {\r\n const {\r\n evalCase,\r\n evaluators,\r\n candidate,\r\n target,\r\n provider,\r\n evaluatorRegistry,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n agentTimeoutMs,\r\n } = options;\r\n\r\n const scored: Array<{ readonly score: EvaluationScore; readonly name: string; readonly type: string }> = [];\r\n const evaluatorResults: EvaluatorResult[] = [];\r\n\r\n for (const evaluator of evaluators ?? []) {\r\n try {\r\n if (evaluator.type === \"llm_judge\") {\r\n const score = await runLlmJudgeEvaluator({\r\n config: evaluator,\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n evaluatorRegistry,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n });\r\n scored.push({ score, name: evaluator.name, type: evaluator.type });\r\n evaluatorResults.push({\r\n name: evaluator.name,\r\n type: evaluator.type,\r\n score: score.score,\r\n hits: score.hits,\r\n misses: score.misses,\r\n reasoning: score.reasoning,\r\n evaluator_provider_request: score.evaluatorRawRequest,\r\n });\r\n continue;\r\n }\r\n\r\n if (evaluator.type === \"code\") {\r\n const codeEvaluator = new CodeEvaluator({\r\n script: evaluator.script,\r\n cwd: evaluator.resolvedCwd ?? evaluator.cwd,\r\n agentTimeoutMs,\r\n });\r\n const score = await codeEvaluator.evaluate({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n attempt,\r\n promptInputs,\r\n now,\r\n });\r\n scored.push({ score, name: evaluator.name, type: evaluator.type });\r\n evaluatorResults.push({\r\n name: evaluator.name,\r\n type: evaluator.type,\r\n score: score.score,\r\n hits: score.hits,\r\n misses: score.misses,\r\n reasoning: score.reasoning,\r\n evaluator_provider_request: score.evaluatorRawRequest,\r\n });\r\n continue;\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const fallbackScore: EvaluationScore = {\r\n score: 0,\r\n hits: [],\r\n misses: [`Evaluator '${evaluator.name}' failed: ${message}`],\r\n expectedAspectCount: 1,\r\n reasoning: message,\r\n };\r\n scored.push({ score: fallbackScore, name: evaluator.name ?? \"unknown\", type: evaluator.type ?? \"unknown\" });\r\n evaluatorResults.push({\r\n name: evaluator.name ?? \"unknown\",\r\n type: evaluator.type ?? \"unknown\",\r\n score: 0,\r\n hits: [],\r\n misses: [`Evaluator '${evaluator.name ?? \"unknown\"}' failed: ${message}`],\r\n reasoning: message,\r\n });\r\n }\r\n }\r\n\r\n const aggregateScore =\r\n scored.length > 0 ? scored.reduce((total, entry) => total + entry.score.score, 0) / scored.length : 0;\r\n const hits = scored.flatMap((entry) => entry.score.hits);\r\n const misses = scored.flatMap((entry) => entry.score.misses);\r\n const expectedAspectCount = scored.reduce((total, entry) => total + (entry.score.expectedAspectCount ?? 0), 0);\r\n const rawAspects = scored.flatMap((entry) => entry.score.rawAspects ?? []);\r\n const reasoningParts = scored\r\n .map((entry) => (entry.score.reasoning ? `${entry.name}: ${entry.score.reasoning}` : undefined))\r\n .filter(isNonEmptyString);\r\n const reasoning = reasoningParts.length > 0 ? reasoningParts.join(\" | \") : undefined;\r\n\r\n const score: EvaluationScore = {\r\n score: aggregateScore,\r\n hits,\r\n misses,\r\n expectedAspectCount,\r\n reasoning,\r\n rawAspects: rawAspects.length > 0 ? rawAspects : undefined,\r\n };\r\n\r\n return { score, evaluatorResults };\r\n}\r\n\r\nasync function runLlmJudgeEvaluator(options: {\r\n readonly config: Exclude<NonNullable<EvalCase[\"evaluators\"]>[number], { type: \"code\" }>;\r\n readonly evalCase: EvalCase;\r\n readonly candidate: string;\r\n readonly target: ResolvedTarget;\r\n readonly provider: Provider;\r\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\r\n readonly attempt: number;\r\n readonly promptInputs: PromptInputs;\r\n readonly now: Date;\r\n readonly judgeProvider?: Provider;\r\n}): Promise<EvaluationScore> {\r\n const { config, evalCase, candidate, target, provider, evaluatorRegistry, attempt, promptInputs, now, judgeProvider } =\r\n options;\r\n const customPrompt = await resolveCustomPrompt(config);\r\n\r\n return evaluatorRegistry.llm_judge.evaluate({\r\n evalCase,\r\n candidate,\r\n target,\r\n provider,\r\n attempt,\r\n promptInputs,\r\n now,\r\n judgeProvider,\r\n evaluatorTemplateOverride: customPrompt,\r\n evaluator: config,\r\n });\r\n}\r\n\r\nasync function resolveCustomPrompt(config: { readonly prompt?: string; readonly promptPath?: string }): Promise<string | undefined> {\r\n if (config.promptPath) {\r\n try {\r\n return await readTextFile(config.promptPath);\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n console.warn(`Could not read custom prompt at ${config.promptPath}: ${message}`);\r\n }\r\n }\r\n return config.prompt;\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\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 buildEvaluatorRegistry(\r\n overrides: Partial<Record<string, Evaluator>> | undefined,\r\n resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>,\r\n): Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator } {\r\n const llmJudge =\r\n overrides?.llm_judge ??\r\n new LlmJudgeEvaluator({\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 llm_judge: llmJudge,\r\n };\r\n}\r\n\r\nasync function dumpPrompt(\r\n directory: string,\r\n evalCase: EvalCase,\r\n promptInputs: PromptInputs,\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 question: promptInputs.question,\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: PromptInputs;\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, 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 question: promptInputs.question,\r\n guidelines: promptInputs.guidelines,\r\n guideline_patterns: evalCase.guideline_patterns,\r\n chatPrompt: promptInputs.chatPrompt,\r\n inputFiles: 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: PromptInputs,\r\n provider?: Provider,\r\n): EvaluationResult {\r\n const message = error instanceof Error ? error.message : String(error);\r\n\r\n let agentProviderRequest: JsonObject | undefined;\r\n let lmProviderRequest: JsonObject | undefined;\r\n\r\n if (isAgentProvider(provider)) {\r\n agentProviderRequest = {\r\n question: promptInputs.question,\r\n guideline_paths: evalCase.guideline_paths,\r\n error: message,\r\n } as JsonObject;\r\n } else {\r\n if (promptInputs.chatPrompt) {\r\n lmProviderRequest = {\r\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\r\n guideline_paths: evalCase.guideline_paths,\r\n error: message,\r\n } as JsonObject;\r\n } else {\r\n lmProviderRequest = {\r\n question: promptInputs.question,\r\n guidelines: promptInputs.guidelines,\r\n guideline_paths: evalCase.guideline_paths,\r\n error: message,\r\n } as JsonObject;\r\n }\r\n }\r\n\r\n return {\r\n timestamp: timestamp.toISOString(),\r\n eval_id: evalCase.id,\r\n dataset: evalCase.dataset,\r\n conversation_id: evalCase.conversation_id,\r\n score: 0,\r\n hits: [],\r\n misses: [`Error: ${message}`],\r\n candidate_answer: `Error occurred: ${message}`,\r\n target: targetName,\r\n raw_aspects: [],\r\n agent_provider_request: agentProviderRequest,\r\n lm_provider_request: lmProviderRequest,\r\n error: message,\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: PromptInputs,\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.question);\r\n hash.update(promptInputs.guidelines);\r\n hash.update(promptInputs.systemMessage ?? \"\");\r\n if (promptInputs.chatPrompt) {\r\n hash.update(JSON.stringify(promptInputs.chatPrompt));\r\n }\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAAA;AAAA,EAAA;AAAA,0BAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACiBA,IAAM,2BAA2B,CAAC,UAAU,QAAQ,aAAa,MAAM;AAKhE,IAAM,qBAAqB;AAOlC,IAAM,wBAA6C,IAAI,IAAI,wBAAwB;AAmD5E,SAAS,kBAAkB,OAA0C;AAC1E,SAAO,OAAO,UAAU,YAAY,sBAAsB,IAAI,KAAK;AACrE;AAKO,SAAS,aAAa,OAAqC;AAChE,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,WAAO;AAAA,EACT;AACA,SAAO,OAAO,OAAO,KAAgC,EAAE,MAAM,WAAW;AAC1E;AAKO,SAAS,YAAY,OAAoC;AAC9D,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,MAAM,WAAW;AAAA,EAChC;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,aAAa,KAAK;AAAA,EAC3B;AACA,SAAO;AACT;AAKO,SAAS,cAAc,OAAsC;AAClE,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,YAAY;AAClB,MAAI,CAAC,kBAAkB,UAAU,IAAI,GAAG;AACtC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,UAAU;AACzC,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,QAAQ,UAAU,OAAO,GAAG;AACrC,WAAO;AAAA,EACT;AACA,SAAO,UAAU,QAAQ,MAAM,YAAY;AAC7C;AAIA,IAAM,wBAAwB,CAAC,QAAQ,WAAW;AAIlD,IAAM,qBAA0C,IAAI,IAAI,qBAAqB;AAEtE,SAAS,gBAAgB,OAAwC;AACtE,SAAO,OAAO,UAAU,YAAY,mBAAmB,IAAI,KAAK;AAClE;AA6EO,SAAS,YAAY,QAAgD;AAC1E,SAAO,OAAO,KAAK;AACrB;;;AChOA,IAAAC,mBAAyB;AACzB,IAAAC,oBAAiB;AACjB,IAAAC,eAAsB;;;ACGf,SAAS,kBAAkB,UAAoD;AACpF,QAAM,qBAAqB;AAC3B,QAAM,aAAuB,CAAC;AAC9B,aAAW,WAAW,UAAU;AAC9B,UAAM,YAAY,QAAQ,MAAM;AAChC,QAAI,OAAO,cAAc,YAAY,cAAc,QAAQ;AACzD;AAAA,IACF;AACA,UAAM,YAAY,QAAQ,OAAO;AACjC,QAAI,OAAO,cAAc,UAAU;AACjC;AAAA,IACF;AACA,UAAM,UAAU,UAAU,MAAM,kBAAkB;AAClD,QAAI,SAAS;AACX,iBAAW,KAAK,GAAG,OAAO;AAAA,IAC5B;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,mBACd,OACQ;AACR,QAAM,YAAY,MAAM,OAAO,OAAK,EAAE,MAAM,EAAE;AAG9C,MAAI,YAAY,GAAG;AACjB,WAAO,MACJ,IAAI,UAAQ;AACX,UAAI,KAAK,UAAU,KAAK,aAAa;AACnC,eAAO,eAAe,KAAK,WAAW;AAAA,EAAO,KAAK,OAAO;AAAA;AAAA,MAC3D;AACA,aAAO,KAAK;AAAA,IACd,CAAC,EACA,KAAK,MAAM;AAAA,EAChB;AAGA,SAAO,MAAM,IAAI,OAAK,EAAE,OAAO,EAAE,KAAK,GAAG;AAC3C;AAMO,SAAS,cAAc,SAAyC;AACrE,QAAM,OAAO,SAAS,QAAQ,IAAI;AAElC,MAAI,SAAS,QAAQ;AACnB,WAAO,SAAS,QAAQ,KAAK;AAAA,EAC/B;AAEA,MAAI,SAAS,iBAAiB;AAC5B,UAAM,UAAU,SAAS,QAAQ,IAAI;AACrC,WAAO,UAAU,cAAc,OAAO,MAAM;AAAA,EAC9C;AAEA,MAAI,SAAS,QAAQ;AACnB,UAAM,OAAO,SAAS,QAAQ,IAAI;AAClC,UAAM,WAAW,SAAS,QAAQ,IAAI;AACtC,QAAI,QAAQ,UAAU;AAEpB,aAAO,mBAAmB,CAAC,EAAE,SAAS,KAAK,KAAK,GAAG,QAAQ,MAAM,aAAa,SAAS,CAAC,CAAC;AAAA,IAC3F;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,kBAAkB,UAA0C;AAC1E,SAAO,SAAS,KAAK,CAAC,YAAY;AAChC,UAAM,OAAO,SAAS,QAAQ,IAAI;AAElC,QAAI,SAAS,QAAQ;AACnB,YAAM,QAAQ,SAAS,QAAQ,KAAK;AACpC,aAAO,UAAU,UAAa,MAAM,KAAK,EAAE,SAAS;AAAA,IACtD;AAEA,QAAI,SAAS,iBAAiB;AAC5B,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,QAAQ;AACnB,YAAM,OAAO,SAAS,QAAQ,IAAI;AAClC,aAAO,SAAS,UAAa,KAAK,KAAK,EAAE,SAAS;AAAA,IACpD;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,SAAS,OAAoC;AACpD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;;;ACxGA,wBAAuB;AACvB,IAAAC,mBAAyB;AACzB,IAAAC,oBAAiB;AACjB,kBAAsB;;;ACHtB,qBAA0B;AAC1B,sBAAuB;AACvB,uBAAiB;AAKjB,eAAsB,WAAW,cAAwC;AACvE,MAAI;AACF,cAAM,wBAAO,cAAc,yBAAU,IAAI;AACzC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,sBAAsB,WAAiC;AACrE,MAAI,qBAAqB,KAAK;AAC5B,WAAO,IAAI,IAAI,SAAS,EAAE;AAAA,EAC5B;AACA,MAAI,OAAO,cAAc,UAAU;AACjC,QAAI,UAAU,WAAW,SAAS,GAAG;AACnC,aAAO,IAAI,IAAI,SAAS,EAAE;AAAA,IAC5B;AACA,WAAO,iBAAAC,QAAK,QAAQ,SAAS;AAAA,EAC/B;AACA,QAAM,IAAI,UAAU,qDAAqD;AAC3E;AAMO,SAAS,oBAAoB,UAAkB,UAAqC;AACzF,QAAM,cAAwB,CAAC;AAC/B,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,WAAW,iBAAAA,QAAK,QAAQ,QAAQ;AACtC,MAAI,UAA8B,iBAAAA,QAAK,QAAQ,iBAAAA,QAAK,QAAQ,QAAQ,CAAC;AAErE,SAAO,YAAY,QAAW;AAC5B,QAAI,CAAC,KAAK,IAAI,OAAO,GAAG;AACtB,kBAAY,KAAK,OAAO;AACxB,WAAK,IAAI,OAAO;AAAA,IAClB;AACA,QAAI,YAAY,UAAU;AACxB;AAAA,IACF;AACA,UAAM,SAAS,iBAAAA,QAAK,QAAQ,OAAO;AACnC,QAAI,WAAW,SAAS;AACtB;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,CAAC,KAAK,IAAI,QAAQ,GAAG;AACvB,gBAAY,KAAK,QAAQ;AAAA,EAC3B;AAEA,SAAO;AACT;AAMO,SAAS,iBAAiB,UAAkB,UAAqC;AACtF,QAAM,cAAwB,CAAC;AAC/B,QAAM,UAAU,CAAC,SAAuB;AACtC,UAAM,aAAa,iBAAAA,QAAK,QAAQ,IAAI;AACpC,QAAI,CAAC,YAAY,SAAS,UAAU,GAAG;AACrC,kBAAY,KAAK,UAAU;AAAA,IAC7B;AAAA,EACF;AAEA,MAAI,aAAa,iBAAAA,QAAK,QAAQ,QAAQ;AACtC,MAAI,kBAAkB;AACtB,SAAO,CAAC,iBAAiB;AACvB,YAAQ,UAAU;AAClB,UAAM,YAAY,iBAAAA,QAAK,QAAQ,UAAU;AACzC,QAAI,eAAe,YAAY,cAAc,YAAY;AACvD,wBAAkB;AAAA,IACpB,OAAO;AACL,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,UAAQ,QAAQ;AAChB,UAAQ,QAAQ,IAAI,CAAC;AACrB,SAAO;AACT;AAKA,SAAS,sBAAsB,OAAuB;AACpD,QAAM,UAAU,MAAM,QAAQ,WAAW,EAAE;AAC3C,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAKA,eAAsB,qBACpB,UACA,aAKC;AACD,QAAM,cAAc,sBAAsB,QAAQ;AAClD,QAAM,iBAA2B,CAAC;AAElC,MAAI,iBAAAA,QAAK,WAAW,QAAQ,GAAG;AAC7B,mBAAe,KAAK,iBAAAA,QAAK,UAAU,QAAQ,CAAC;AAAA,EAC9C;AAEA,aAAW,QAAQ,aAAa;AAC9B,mBAAe,KAAK,iBAAAA,QAAK,QAAQ,MAAM,WAAW,CAAC;AAAA,EACrD;AAEA,QAAM,YAAsB,CAAC;AAC7B,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,aAAa,gBAAgB;AACtC,UAAM,oBAAoB,iBAAAA,QAAK,QAAQ,SAAS;AAChD,QAAI,KAAK,IAAI,iBAAiB,GAAG;AAC/B;AAAA,IACF;AACA,SAAK,IAAI,iBAAiB;AAC1B,cAAU,KAAK,iBAAiB;AAChC,QAAI,MAAM,WAAW,iBAAiB,GAAG;AACvC,aAAO,EAAE,aAAa,cAAc,mBAAmB,UAAU;AAAA,IACnE;AAAA,EACF;AAEA,SAAO,EAAE,aAAa,UAAU;AAClC;;;ADlIA,IAAM,mBAAmB;AACzB,IAAM,cAAc;AACpB,IAAM,aAAa;AAWnB,eAAsB,WAAW,cAAsB,UAAgD;AACrG,QAAM,cAAc,oBAAoB,cAAc,QAAQ;AAE9D,aAAW,aAAa,aAAa;AACnC,UAAM,aAAa,kBAAAC,QAAK,KAAK,WAAW,WAAW,aAAa;AAEhE,QAAI,CAAE,MAAM,WAAW,UAAU,GAAI;AACnC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,YAAY,UAAM,2BAAS,YAAY,MAAM;AACnD,YAAM,aAAS,mBAAM,SAAS;AAE9B,UAAI,CAAC,aAAa,MAAM,GAAG;AACzB,mBAAW,yCAAyC,UAAU,EAAE;AAChE;AAAA,MACF;AAEA,YAAM,SAAS;AAGf,YAAM,SAAS,OAAO;AAEtB,UAAI,WAAW,kBAAkB;AAC/B,cAAM,UAAU,OAAO,WAAW,WAC9B,0BAA0B,MAAM,QAAQ,UAAU,eAAe,gBAAgB,MACjF,uCAAuC,UAAU;AAAA,uBAA2B,gBAAgB;AAChG,mBAAW,OAAO;AAClB;AAAA,MACF;AAEA,YAAM,oBAAoB,OAAO;AACjC,UAAI,sBAAsB,UAAa,CAAC,MAAM,QAAQ,iBAAiB,GAAG;AACxE,mBAAW,iCAAiC,UAAU,kBAAkB;AACxE;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,iBAAiB,KAAK,CAAC,kBAAkB,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ,GAAG;AAC9F,mBAAW,iCAAiC,UAAU,+BAA+B;AACrF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,oBAAoB;AAAA,MACtB;AAAA,IACF,SAAS,OAAO;AACd,iBAAW,yCAAyC,UAAU,KAAM,MAAgB,OAAO,EAAE;AAC7F;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,gBAAgB,UAAkB,UAAuC;AACvF,QAAM,aAAa,SAAS,MAAM,IAAI,EAAE,KAAK,GAAG;AAChD,QAAM,gBAAgB,YAAY,CAAC;AAEnC,SAAO,kBAAAC,QAAW,QAAQ,YAAY,aAAyB;AACjE;AAKO,SAAS,uBAAuB,OAAuC;AAE5E,QAAM,YAAY,MAAM;AACxB,MAAI,aAAa,OAAO,cAAc,YAAY,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC3E,UAAM,kBAAmB,UAAsC;AAC/D,QAAI,OAAO,oBAAoB,YAAY,gBAAgB,KAAK,EAAE,SAAS,GAAG;AAC5E,aAAO,gBAAgB,KAAK;AAAA,IAC9B;AAAA,EACF;AAGA,QAAM,cAAc,MAAM;AAC1B,MAAI,OAAO,gBAAgB,YAAY,YAAY,KAAK,EAAE,SAAS,GAAG;AACpE,WAAO,YAAY,KAAK;AAAA,EAC1B;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,SAAuB;AACzC,UAAQ,KAAK,GAAG,WAAW,YAAY,OAAO,GAAG,UAAU,EAAE;AAC/D;;;AE/GA,IAAAC,oBAAiB;AAMjB,IAAMC,eAAc;AACpB,IAAMC,cAAa;AAKnB,eAAsB,gBACpB,aAIA,iBACA,aACA,QACiD;AACjD,QAAM,YAAY,YAAY;AAE9B,QAAM,sBAAsBC,cAAa,SAAS,IAC9C,UAAU,cAAc,YAAY,aACpC,YAAY,cAAc,iBAAiB;AAC/C,MAAI,wBAAwB,QAAW;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,QAAQ,mBAAmB,GAAG;AACvC,IAAAC,YAAW,4BAA4B,MAAM,mBAAmB;AAChE,WAAO;AAAA,EACT;AAEA,QAAM,aAAgC,CAAC;AAEvC,aAAW,gBAAgB,qBAAqB;AAC9C,QAAI,CAACD,cAAa,YAAY,GAAG;AAC/B,MAAAC,YAAW,yCAAyC,MAAM,qBAAqB;AAC/E;AAAA,IACF;AAEA,UAAM,OAAOC,UAAS,aAAa,IAAI;AACvC,UAAM,YAAY,aAAa;AAE/B,QAAI,CAAC,QAAQ,CAAC,gBAAgB,SAAS,GAAG;AACxC,MAAAD,YAAW,iDAAiD,MAAM,GAAG;AACrE;AAAA,IACF;AAEA,QAAI,cAAc,QAAQ;AACxB,YAAM,SAASC,UAAS,aAAa,MAAM;AAC3C,UAAI,CAAC,QAAQ;AACX,QAAAD,YAAW,4BAA4B,IAAI,SAAS,MAAM,mBAAmB;AAC7E;AAAA,MACF;AAEA,YAAM,MAAMC,UAAS,aAAa,GAAG;AACrC,UAAI;AAGJ,UAAI,KAAK;AACP,cAAM,WAAW,MAAM,qBAAqB,KAAK,WAAW;AAC5D,YAAI,SAAS,cAAc;AACzB,wBAAc,kBAAAC,QAAK,QAAQ,SAAS,YAAY;AAAA,QAClD,OAAO;AACL,UAAAF;AAAA,YACE,mBAAmB,IAAI,SAAS,MAAM,qBAAqB,SAAS,WAAW;AAAA,YAC/E,SAAS,UAAU,SAAS,IAAI,SAAS,UAAU,IAAI,CAAC,YAAY,YAAY,OAAO,EAAE,IAAI;AAAA,UAC/F;AAAA,QACF;AAAA,MACF,OAAO;AAEL,sBAAc,YAAY,CAAC;AAAA,MAC7B;AAEA,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAASC,UAAS,aAAa,MAAM;AAC3C,QAAI;AACJ,QAAI,QAAQ;AACV,YAAM,WAAW,MAAM,qBAAqB,QAAQ,WAAW;AAC/D,UAAI,SAAS,cAAc;AACzB,qBAAa,kBAAAC,QAAK,QAAQ,SAAS,YAAY;AAAA,MACjD,OAAO;AACL,QAAAF;AAAA,UACE,qCAAqC,IAAI,SAAS,MAAM,sBAAsB,SAAS,WAAW;AAAA,UAClG,SAAS,UAAU,SAAS,IAAI,SAAS,UAAU,IAAI,CAAC,YAAY,YAAY,OAAO,EAAE,IAAI;AAAA,QAC/F;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAASC,UAAS,aAAa,KAAK;AAE1C,eAAW,KAAK;AAAA,MACd;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AAKO,SAAS,gBAAgB,WAAkC,WAA8C;AAC9G,MAAI,OAAO,cAAc,UAAU;AACjC,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,EAAAD,YAAW,sBAAsB,SAAS,QAAQ,SAAS,2BAA2B;AACtF,SAAO;AACT;AAEA,SAASC,UAAS,OAAoC;AACpD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAASF,cAAa,OAAqC;AACzD,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAASC,YAAW,SAAiB,SAAmC;AACtE,MAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,UAAM,cAAc,QAAQ,KAAK,IAAI;AACrC,YAAQ,KAAK,GAAGH,YAAW,YAAY,OAAO;AAAA,EAAK,WAAW,GAAGC,WAAU,EAAE;AAAA,EAC/E,OAAO;AACL,YAAQ,KAAK,GAAGD,YAAW,YAAY,OAAO,GAAGC,WAAU,EAAE;AAAA,EAC/D;AACF;;;AC/IA,IAAAK,mBAAyB;AACzB,IAAAC,oBAAiB;AAQjB,IAAMC,eAAc;AACpB,IAAMC,cAAa;AAgBnB,eAAsB,gBAAgB,SAAwD;AAC5F,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,WAAyB,CAAC;AAEhC,aAAW,WAAW,UAAU;AAC9B,UAAM,UAAU,QAAQ;AACxB,QAAI,OAAO,YAAY,UAAU;AAC/B,eAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,QAAQ,CAAC;AAC9C,UAAI,WAAW;AACb,kBAAU,KAAK,OAAO;AAAA,MACxB;AACA;AAAA,IACF;AAEA,eAAW,cAAc,SAAS;AAChC,UAAI,CAAC,aAAa,UAAU,GAAG;AAC7B;AAAA,MACF;AAEA,YAAM,cAAcC,UAAS,WAAW,IAAI;AAC5C,UAAI,gBAAgB,QAAQ;AAC1B,cAAM,WAAWA,UAAS,WAAW,KAAK;AAC1C,YAAI,CAAC,UAAU;AACb;AAAA,QACF;AAEA,cAAM,EAAE,aAAa,cAAc,UAAU,IAAI,MAAM;AAAA,UACrD;AAAA,UACA;AAAA,QACF;AAEA,YAAI,CAAC,cAAc;AACjB,gBAAM,WAAW,UAAU,SACvB,CAAC,YAAY,GAAG,UAAU,IAAI,CAAC,cAAc,OAAO,SAAS,EAAE,CAAC,IAChE;AACJ,gBAAM,UAAU,gBAAgB,UAAU,KAAK;AAC/C,UAAAC,YAAW,iBAAiB,OAAO,KAAK,WAAW,IAAI,QAAQ;AAC/D;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,eAAe,UAAM,2BAAS,cAAc,MAAM,GAAG,QAAQ,SAAS,IAAI;AAGhF,cAAI,gBAAgB,WAAW,qBAAqB,gBAAgB;AAClE,kBAAM,iBAAiB,kBAAAC,QAAK,SAAS,cAAc,YAAY;AAE/D,gBAAI,gBAAgB,gBAAgB,iBAAiB,GAAG;AACtD,6BAAe,KAAK,kBAAAA,QAAK,QAAQ,YAAY,CAAC;AAC9C,kBAAI,SAAS;AACX,wBAAQ,IAAI,wBAAwB,WAAW,EAAE;AACjD,wBAAQ,IAAI,oBAAoB,YAAY,EAAE;AAAA,cAChD;AACA;AAAA,YACF;AAAA,UACF;AAEA,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,YACN,cAAc,kBAAAA,QAAK,QAAQ,YAAY;AAAA,UACzC,CAAC;AAED,cAAI,SAAS;AACX,kBAAM,QAAQ,gBAAgB,UAAU,WAAW;AACnD,oBAAQ,IAAI,KAAK,KAAK,WAAW,WAAW,EAAE;AAC9C,oBAAQ,IAAI,oBAAoB,YAAY,EAAE;AAAA,UAChD;AAAA,QACF,SAAS,OAAO;AACd,gBAAM,UAAU,gBAAgB,UAAU,KAAK;AAC/C,UAAAD,YAAW,iBAAiB,OAAO,SAAS,YAAY,KAAM,MAAgB,OAAO,EAAE;AAAA,QACzF;AACA;AAAA,MACF;AAEA,YAAM,gBAAgB,gBAAgB,UAAU;AAChD,eAAS,KAAK,aAAa;AAC3B,YAAM,cAAc,cAAc;AAClC,UAAI,OAAO,gBAAgB,YAAY,WAAW;AAChD,kBAAU,KAAK,WAAW;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMA,eAAsB,wBACpB,SACA,aACA,SACiB;AACjB,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAGA,QAAM,QAA2E,CAAC;AAElF,aAAW,SAAS,SAAS;AAC3B,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,KAAK,EAAE,SAAS,OAAO,QAAQ,MAAM,CAAC;AAC5C;AAAA,IACF;AAEA,QAAI,CAAC,aAAa,KAAK,GAAG;AACxB;AAAA,IACF;AAEA,UAAM,cAAcD,UAAS,MAAM,IAAI;AAGvC,QAAI,gBAAgB,QAAQ;AAC1B,YAAM,WAAWA,UAAS,MAAM,KAAK;AACrC,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,YAAM,EAAE,aAAa,cAAc,UAAU,IAAI,MAAM;AAAA,QACrD;AAAA,QACA;AAAA,MACF;AAEA,UAAI,CAAC,cAAc;AACjB,cAAM,WAAW,UAAU,SACvB,CAAC,YAAY,GAAG,UAAU,IAAI,CAAC,cAAc,OAAO,SAAS,EAAE,CAAC,IAChE;AACJ,QAAAC,YAAW,wCAAwC,WAAW,IAAI,QAAQ;AAC1E;AAAA,MACF;AAEA,UAAI;AACF,cAAM,eAAe,UAAM,2BAAS,cAAc,MAAM,GAAG,QAAQ,SAAS,IAAI,EAAE,KAAK;AACvF,cAAM,KAAK,EAAE,SAAS,aAAa,QAAQ,MAAM,YAAY,CAAC;AAC9D,YAAI,SAAS;AACX,kBAAQ,IAAI,sCAAsC,WAAW,EAAE;AAC/D,kBAAQ,IAAI,oBAAoB,YAAY,EAAE;AAAA,QAChD;AAAA,MACF,SAAS,OAAO;AACd,QAAAA,YAAW,uBAAuB,YAAY,KAAM,MAAgB,OAAO,EAAE;AAAA,MAC/E;AACA;AAAA,IACF;AAGA,UAAM,YAAYD,UAAS,MAAM,IAAI;AACrC,QAAI,OAAO,cAAc,UAAU;AACjC,YAAM,KAAK,EAAE,SAAS,WAAW,QAAQ,MAAM,CAAC;AAChD;AAAA,IACF;AAEA,UAAM,aAAaA,UAAS,MAAM,KAAK;AACvC,QAAI,OAAO,eAAe,UAAU;AAClC,YAAM,KAAK,EAAE,SAAS,YAAY,QAAQ,MAAM,CAAC;AACjD;AAAA,IACF;AAEA,UAAM,KAAK,EAAE,SAAS,KAAK,UAAU,KAAK,GAAG,QAAQ,MAAM,CAAC;AAAA,EAC9D;AAEA,SAAO,mBAAmB,KAAK;AACjC;AAEA,SAASA,UAAS,OAAoC;AACpD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,gBAAgB,QAAgC;AACvD,QAAM,UAAU,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,eAAe,KAAK,CAAC,CAAC;AACzF,SAAO,OAAO,YAAY,OAAO;AACnC;AAEA,SAAS,eAAe,OAAyB;AAC/C,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AACxF,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,eAAe,IAAI,CAAC;AAAA,EACjD;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,gBAAgB,KAAmB;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAASC,YAAW,SAAiB,SAAmC;AACtE,MAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,UAAM,cAAc,QAAQ,KAAK,IAAI;AACrC,YAAQ,KAAK,GAAGH,YAAW,YAAY,OAAO;AAAA,EAAK,WAAW,GAAGC,WAAU,EAAE;AAAA,EAC/E,OAAO;AACL,YAAQ,KAAK,GAAGD,YAAW,YAAY,OAAO,GAAGC,WAAU,EAAE;AAAA,EAC/D;AACF;;;AC/OA,IAAAI,mBAAyB;AACzB,IAAAC,oBAAiB;AASjB,IAAMC,eAAc;AACpB,IAAMC,cAAa;AAYnB,eAAsB,kBAAkB,UAA2C;AACjF,QAAM,iBAAoF,CAAC;AAC3F,aAAW,WAAW,SAAS,iBAAiB;AAC9C,UAAM,eAAe,kBAAAC,QAAK,QAAQ,OAAO;AACzC,QAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,MAAAC,YAAW,iCAAiC,YAAY,uBAAuB;AAC/E;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,UAAM,2BAAS,cAAc,MAAM,GAAG,QAAQ,SAAS,IAAI,EAAE,KAAK;AACnF,qBAAe,KAAK;AAAA,QAClB;AAAA,QACA,QAAQ;AAAA,QACR,aAAa,kBAAAD,QAAK,SAAS,YAAY;AAAA,MACzC,CAAC;AAAA,IACH,SAAS,OAAO;AACd,MAAAC,YAAW,iCAAiC,YAAY,KAAM,MAAgB,OAAO,EAAE;AAAA,IACzF;AAAA,EACF;AAEA,QAAM,aAAa,mBAAmB,cAAc;AAGpD,QAAM,oBAAoC,CAAC;AAC3C,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,aAAW,WAAW,SAAS,gBAAgB;AAC7C,QAAI,QAAQ,SAAS,UAAU,OAAO,QAAQ,SAAS,YAAY,OAAO,QAAQ,SAAS,UAAU;AACnG,yBAAmB,IAAI,QAAQ,MAAM,QAAQ,IAAI;AAAA,IACnD;AAAA,EACF;AAEA,aAAW,WAAW,SAAS,gBAAgB;AAC7C,UAAM,kBAAgC,CAAC;AAEvC,QAAI,OAAO,QAAQ,YAAY,UAAU;AACvC,UAAI,QAAQ,QAAQ,KAAK,EAAE,SAAS,GAAG;AACrC,wBAAgB,KAAK,EAAE,MAAM,QAAQ,OAAO,QAAQ,QAAQ,CAAC;AAAA,MAC/D;AAAA,IACF,WAAW,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACzC,iBAAW,WAAW,QAAQ,SAAS;AACrC,YAAI,OAAO,YAAY,UAAU;AAC/B,cAAI,QAAQ,KAAK,EAAE,SAAS,GAAG;AAC7B,4BAAgB,KAAK,EAAE,MAAM,QAAQ,OAAO,QAAQ,CAAC;AAAA,UACvD;AAAA,QACF,WAAW,aAAa,OAAO,GAAG;AAChC,gBAAM,OAAOC,UAAS,QAAQ,IAAI;AAElC,cAAI,SAAS,QAAQ;AACnB,kBAAM,QAAQA,UAAS,QAAQ,KAAK;AACpC,gBAAI,CAAC,MAAO;AAGZ,gBAAI,SAAS,sBAAsB,gBAAgB,OAAO,SAAS,kBAAkB,GAAG;AAEtF,8BAAgB,KAAK,EAAE,MAAM,iBAAiB,MAAM,MAAM,CAAC;AAC3D;AAAA,YACF;AAGA,kBAAM,WAAW,mBAAmB,IAAI,KAAK;AAE7C,gBAAI,aAAa,QAAW;AAC1B,8BAAgB,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,MAAM,MAAM,CAAC;AAAA,YACpE;AAAA,UACF,WAAW,SAAS,QAAQ;AAC1B,kBAAM,YAAYA,UAAS,QAAQ,KAAK;AACxC,gBAAI,aAAa,UAAU,KAAK,EAAE,SAAS,GAAG;AAC5C,8BAAgB,KAAK,EAAE,MAAM,QAAQ,OAAO,UAAU,CAAC;AAAA,YACzD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,sBAAkB,KAAK,eAAe;AAAA,EACxC;AAGA,QAAM,iBAAiB,iBAAiB,SAAS,gBAAgB,iBAAiB;AAElF,MAAI;AAEJ,MAAI,gBAAgB;AAElB,UAAM,eAAyB,CAAC;AAEhC,aAAS,IAAI,GAAG,IAAI,SAAS,eAAe,QAAQ,KAAK;AACvD,YAAM,UAAU,SAAS,eAAe,CAAC;AACzC,YAAM,WAAW,kBAAkB,CAAC;AAEpC,UAAI,CAAC,kBAAkB,QAAQ,GAAG;AAChC;AAAA,MACF;AAEA,YAAM,YAAY,QAAQ,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,QAAQ,KAAK,MAAM,CAAC;AAC7E,YAAM,eAAyB,CAAC;AAEhC,iBAAW,WAAW,UAAU;AAC9B,cAAM,mBAAmB,cAAc,OAAO;AAC9C,YAAI,kBAAkB;AACpB,uBAAa,KAAK,gBAAgB;AAAA,QACpC;AAAA,MACF;AAEA,UAAI,aAAa,SAAS,GAAG;AAC3B,cAAM,iBAAiB,aAAa,KAAK,IAAI;AAC7C,qBAAa,KAAK,KAAK,SAAS;AAAA,EAAO,cAAc,EAAE;AAAA,MACzD;AAAA,IACF;AAEA,eAAW,aAAa,KAAK,MAAM;AAAA,EACrC,OAAO;AAEL,UAAM,gBAA0B,CAAC;AACjC,eAAW,WAAW,SAAS,gBAAgB;AAC7C,YAAM,mBAAmB,cAAc,OAAO;AAC9C,UAAI,kBAAkB;AACpB,sBAAc,KAAK,gBAAgB;AAAA,MACrC;AAAA,IACF;AAEA,QAAI,SAAS,cAAc,SAAS,GAAG;AACrC,oBAAc,KAAK,SAAS,cAAc,KAAK,IAAI,CAAC;AAAA,IACtD;AAEA,eAAW,cACR,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAChC,KAAK,MAAM;AAAA,EAChB;AAEA,QAAM,aAAa,iBACf,4BAA4B;AAAA,IAC1B,UAAU,SAAS;AAAA,IACnB;AAAA,IACA,mBAAmB,SAAS;AAAA,IAC5B,kBAAkB;AAAA,EACpB,CAAC,IACD;AAEJ,SAAO,EAAE,UAAU,YAAY,WAAW;AAC5C;AASA,SAAS,iBACP,UACA,4BACS;AAET,MAAI,SAAS,KAAK,CAAC,QAAQ,IAAI,SAAS,eAAe,IAAI,SAAS,MAAM,GAAG;AAC3E,WAAO;AAAA,EACT;AAGA,MAAI,sBAAsB;AAE1B,aAAW,YAAY,4BAA4B;AACjD,QAAI,kBAAkB,QAAQ,GAAG;AAC/B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,sBAAsB;AAC/B;AAEA,SAAS,4BAA4B,SAMV;AACzB,QAAM,EAAE,UAAU,mBAAmB,mBAAmB,kBAAkB,aAAa,IAAI;AAE3F,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,iBAA2B,CAAC;AAElC,MAAI,gBAAgB,aAAa,KAAK,EAAE,SAAS,GAAG;AAClD,mBAAe,KAAK,aAAa,KAAK,CAAC;AAAA,EACzC;AAEA,MAAI,oBAAoB,iBAAiB,KAAK,EAAE,SAAS,GAAG;AAC1D,mBAAe,KAAK;AAAA;AAAA,EAA6B,iBAAiB,KAAK,CAAC,EAAE;AAAA,EAC5E;AAEA,MAAI,aAAa;AACjB,SAAO,aAAa,SAAS,UAAU,SAAS,UAAU,EAAE,SAAS,UAAU;AAC7E,UAAM,WAAW,kBAAkB,UAAU;AAC7C,UAAM,eAAyB,CAAC;AAEhC,eAAW,WAAW,UAAU;AAC9B,YAAM,YAAY,cAAc,OAAO;AACvC,UAAI,WAAW;AACb,qBAAa,KAAK,SAAS;AAAA,MAC7B;AAAA,IACF;AAEA,QAAI,aAAa,SAAS,GAAG;AAC3B,qBAAe,KAAK,aAAa,KAAK,IAAI,CAAC;AAAA,IAC7C;AAEA,kBAAc;AAAA,EAChB;AAEA,QAAM,aAAyB,CAAC;AAEhC,MAAI,eAAe,SAAS,GAAG;AAC7B,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,SAAS,eAAe,KAAK,MAAM;AAAA,IACrC,CAAC;AAAA,EACH;AAEA,WAAS,IAAI,YAAY,IAAI,SAAS,QAAQ,KAAK;AACjD,UAAM,UAAU,SAAS,CAAC;AAC1B,UAAM,WAAW,kBAAkB,CAAC;AACpC,UAAM,eAAyB,CAAC;AAEhC,QAAI,OAAe,QAAQ;AAC3B,QAAI;AAEJ,QAAI,SAAS,UAAU;AACrB,aAAO;AACP,mBAAa,KAAK,YAAY;AAAA,IAChC,WAAW,SAAS,QAAQ;AAE1B,aAAO;AACP,aAAO;AAAA,IACT;AAEA,eAAW,WAAW,UAAU;AAC9B,UAAI,QAAQ,SAAS,iBAAiB;AACpC;AAAA,MACF;AACA,YAAM,YAAY,cAAc,OAAO;AACvC,UAAI,WAAW;AACb,cAAM,iBACJ,QAAQ,SAAS,UACjB,OAAO,QAAQ,SAAS,YACxB,qBACA,gBAAgB,QAAQ,MAAM,iBAAiB;AAEjD,YAAI,gBAAgB;AAClB;AAAA,QACF;AAEA,qBAAa,KAAK,SAAS;AAAA,MAC7B;AAAA,IACF;AAEA,QAAI,aAAa,WAAW,GAAG;AAC7B;AAAA,IACF;AAEA,eAAW,KAAK;AAAA,MACd;AAAA,MACA,SAAS,aAAa,KAAK,IAAI;AAAA,MAC/B,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACzB,CAAkC;AAAA,EACpC;AAEA,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AAEA,SAASA,UAAS,OAAoC;AACpD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAASD,YAAW,SAAuB;AACzC,UAAQ,KAAK,GAAGH,YAAW,YAAY,OAAO,GAAGC,WAAU,EAAE;AAC/D;;;ANzRA,IAAMI,eAAc;AACpB,IAAMC,cAAa;AACnB,IAAM,iBAAiB;AA6BvB,eAAsB,sBAAsB,cAAoD;AAC9F,MAAI;AACF,UAAM,eAAe,kBAAAC,QAAK,QAAQ,YAAY;AAC9C,UAAM,UAAU,UAAM,2BAAS,cAAc,MAAM;AACnD,UAAM,aAAS,oBAAM,OAAO;AAE5B,QAAI,CAAC,aAAa,MAAM,GAAG;AACzB,aAAO,CAAC;AAAA,IACV;AAEA,WAAO,EAAE,QAAQ,uBAAuB,MAAM,EAAE;AAAA,EAClD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAKA,eAAsB,cACpB,cACA,UACA,SAC8B;AAC9B,QAAM,UAAU,SAAS,WAAW;AACpC,QAAM,eAAe,SAAS;AAC9B,QAAM,mBAAmB,kBAAAA,QAAK,QAAQ,YAAY;AAElD,QAAM,eAAe,sBAAsB,QAAQ;AACnD,QAAM,cAAc,iBAAiB,kBAAkB,YAAY;AAGnE,QAAM,SAAS,MAAM,WAAW,kBAAkB,YAAY;AAC9D,QAAM,oBAAoB,QAAQ;AAElC,QAAM,UAAU,UAAM,2BAAS,kBAAkB,MAAM;AACvD,QAAM,aAAS,oBAAM,OAAO;AAC5B,MAAI,CAAC,aAAa,MAAM,GAAG;AACzB,UAAM,IAAI,MAAM,6BAA6B,YAAY,EAAE;AAAA,EAC7D;AAEA,QAAM,QAAQ;AACd,QAAM,uBAAuBC,UAAS,MAAM,OAAO,GAAG,KAAK;AAC3D,QAAM,kBAAkB,kBAAAD,QAAK,SAAS,gBAAgB,EAAE,QAAQ,aAAa,EAAE,KAAK;AACpF,QAAM,cACJ,wBAAwB,qBAAqB,SAAS,IAAI,uBAAuB;AAGnF,QAAM,SAAS,MAAM;AAErB,MAAI,WAAW,gBAAgB;AAC7B,UAAM,UAAU,OAAO,WAAW,WAC9B,0BAA0B,MAAM,QAAQ,YAAY,eAAe,cAAc,MACjF,uCAAuC,YAAY;AAAA,uBAA2B,cAAc;AAChG,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AAGA,QAAM,eAAe,MAAM;AAC3B,MAAI,CAAC,MAAM,QAAQ,YAAY,GAAG;AAChC,UAAM,IAAI,MAAM,6BAA6B,YAAY,8BAA8B;AAAA,EACzF;AAEA,QAAM,kBAAkB,gBAAgB,MAAM,WAAW,QAAQ,KAAK;AAGtE,QAAM,kBAAkB,aAAa,MAAM,SAAS,IAAI,MAAM,YAAY;AAC1E,QAAM,gBAAgBC,UAAS,iBAAiB,MAAM,KAAKA,UAAS,MAAM,MAAM;AAEhF,QAAM,UAAsB,CAAC;AAE7B,aAAW,eAAe,cAAc;AACtC,QAAI,CAAC,aAAa,WAAW,GAAG;AAC9B,MAAAC,YAAW,oDAAoD;AAC/D;AAAA,IACF;AAEA,UAAM,WAAW;AACjB,UAAM,KAAKD,UAAS,SAAS,EAAE;AAG/B,QAAI,gBAAgB,OAAO,cAAc;AACvC;AAAA,IACF;AAEA,UAAM,iBAAiBA,UAAS,SAAS,eAAe;AACxD,UAAM,UAAUA,UAAS,SAAS,OAAO;AAEzC,UAAM,qBAAqB,SAAS;AACpC,UAAM,wBAAwB,SAAS;AAEvC,QAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,QAAQ,kBAAkB,GAAG;AACzD,MAAAC,YAAW,kCAAkC,MAAM,SAAS,EAAE;AAC9D;AAAA,IACF;AAGA,UAAM,sBAAsB,MAAM,QAAQ,qBAAqB,KAAK,sBAAsB,SAAS;AAGnG,UAAM,gBAAgB,mBAAmB,OAAO,CAAC,QAA4B,cAAc,GAAG,CAAC;AAC/F,UAAM,mBAAmB,sBACrB,sBAAsB,OAAO,CAAC,QAA4B,cAAc,GAAG,CAAC,IAC5E,CAAC;AAEL,QAAI,uBAAuB,iBAAiB,WAAW,GAAG;AACxD,MAAAA,YAAW,kDAAkD,EAAE,EAAE;AACjE;AAAA,IACF;AAEA,QAAI,iBAAiB,SAAS,GAAG;AAC/B,MAAAA,YAAW,mDAAmD,EAAE,eAAe;AAAA,IACjF;AAEA,UAAM,iBAA2B,CAAC;AAClC,UAAM,iBAA2B,CAAC;AAGlC,UAAM,gBAAgB,MAAM,gBAAgB;AAAA,MAC1C,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,aAAa;AAAA,MACb;AAAA,IACF,CAAC;AAGD,UAAM,iBAAiB,sBACnB,MAAM,gBAAgB;AAAA,MACpB,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF,CAAC,IACD,CAAC;AAEL,UAAM,eAAe,kBAAkB,aAAa;AACpD,UAAM,kBAAkB,iBAAiB,CAAC,GAAG;AAC7C,UAAM,kBAAkB,kBACpB,MAAM,wBAAwB,iBAAiB,aAAa,OAAO,IACnE;AACJ,UAAM,WAAW,eACd,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAChC,KAAK,GAAG;AAEX,UAAM,wBAAwB,gBAAgB,SAAS,WAAW,EAAE,KAAK;AACzE,UAAM,aAAa,MAAM,gBAAgB,UAAU,iBAAiB,aAAa,MAAM,SAAS;AAGhG,UAAM,gBAA0B,CAAC;AACjC,eAAW,WAAW,eAAe;AACnC,UAAI,QAAQ,SAAS,UAAU,OAAO,QAAQ,iBAAiB,UAAU;AACvE,sBAAc,KAAK,QAAQ,YAAY;AAAA,MACzC;AAAA,IACF;AAGA,UAAM,eAAe;AAAA,MACnB,GAAG,eAAe,IAAI,CAAC,kBAAkB,kBAAAF,QAAK,QAAQ,aAAa,CAAC;AAAA,MACpE,GAAG;AAAA,IACL;AAEA,UAAM,WAAqB;AAAA,MACzB;AAAA,MACA,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB;AAAA,MACA,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,iBAAiB,eAAe,IAAI,CAAC,kBAAkB,kBAAAA,QAAK,QAAQ,aAAa,CAAC;AAAA,MAClF,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,kBAAkB;AAAA,MAClB,WAAW;AAAA,MACX;AAAA,IACF;AAEA,QAAI,SAAS;AACX,cAAQ,IAAI;AAAA,cAAiB,EAAE,GAAG;AAClC,UAAI,SAAS,gBAAgB,SAAS,GAAG;AACvC,gBAAQ,IAAI,sBAAsB,SAAS,gBAAgB,MAAM,EAAE;AACnE,mBAAW,iBAAiB,SAAS,iBAAiB;AACpD,kBAAQ,IAAI,SAAS,aAAa,EAAE;AAAA,QACtC;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,uBAAuB;AAAA,MACrC;AAAA,IACF;AAEA,YAAQ,KAAK,QAAQ;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,SAASC,UAAS,OAAoC;AACpD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAASC,YAAW,SAAiB,SAAmC;AACtE,MAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,UAAM,cAAc,QAAQ,KAAK,IAAI;AACrC,YAAQ,KAAK,GAAGJ,YAAW,YAAY,OAAO;AAAA,EAAK,WAAW,GAAGC,WAAU,EAAE;AAAA,EAC/E,OAAO;AACL,YAAQ,KAAK,GAAGD,YAAW,YAAY,OAAO,GAAGC,WAAU,EAAE;AAAA,EAC/D;AACF;;;AO5QA,IAAAI,kBAA0B;AAC1B,IAAAC,mBAAiC;AACjC,IAAAC,oBAAiB;AAEjB,eAAsBC,YAAW,UAAoC;AACnE,MAAI;AACF,cAAM,yBAAO,UAAU,0BAAU,IAAI;AACrC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMO,SAAS,qBAAqB,SAAyB;AAC5D,SAAO,QAAQ,QAAQ,SAAS,IAAI;AACtC;AAMA,eAAsB,aAAa,UAAmC;AACpE,QAAM,UAAU,UAAM,2BAAS,UAAU,MAAM;AAC/C,SAAO,qBAAqB,OAAO;AACrC;AAKA,eAAsB,YAAY,WAA2C;AAC3E,MAAI,aAAa,kBAAAC,QAAK,QAAQ,kBAAAA,QAAK,QAAQ,SAAS,CAAC;AACrD,QAAM,OAAO,kBAAAA,QAAK,MAAM,UAAU,EAAE;AAEpC,SAAO,eAAe,MAAM;AAC1B,UAAM,UAAU,kBAAAA,QAAK,KAAK,YAAY,MAAM;AAC5C,QAAI,MAAMD,YAAW,OAAO,GAAG;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,kBAAAC,QAAK,QAAQ,UAAU;AACzC,QAAI,cAAc,YAAY;AAC5B;AAAA,IACF;AACA,iBAAa;AAAA,EACf;AAEA,SAAO;AACT;AAMO,SAASC,qBAAoB,UAAkB,UAAqC;AACzF,QAAM,cAAwB,CAAC;AAC/B,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,WAAW,kBAAAD,QAAK,QAAQ,QAAQ;AACtC,MAAI,UAA8B,kBAAAA,QAAK,QAAQ,kBAAAA,QAAK,QAAQ,QAAQ,CAAC;AAErE,SAAO,YAAY,QAAW;AAC5B,QAAI,CAAC,KAAK,IAAI,OAAO,GAAG;AACtB,kBAAY,KAAK,OAAO;AACxB,WAAK,IAAI,OAAO;AAAA,IAClB;AACA,QAAI,YAAY,UAAU;AACxB;AAAA,IACF;AACA,UAAM,SAAS,kBAAAA,QAAK,QAAQ,OAAO;AACnC,QAAI,WAAW,SAAS;AACtB;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AAEA,MAAI,CAAC,KAAK,IAAI,QAAQ,GAAG;AACvB,gBAAY,KAAK,QAAQ;AAAA,EAC3B;AAEA,SAAO;AACT;AAMO,SAASE,kBAAiB,UAAkB,UAAqC;AACtF,QAAM,cAAwB,CAAC;AAC/B,QAAM,UAAU,CAAC,SAAuB;AACtC,UAAM,aAAa,kBAAAF,QAAK,QAAQ,IAAI;AACpC,QAAI,CAAC,YAAY,SAAS,UAAU,GAAG;AACrC,kBAAY,KAAK,UAAU;AAAA,IAC7B;AAAA,EACF;AAEA,MAAI,aAAa,kBAAAA,QAAK,QAAQ,QAAQ;AACtC,MAAI,kBAAkB;AACtB,SAAO,CAAC,iBAAiB;AACvB,YAAQ,UAAU;AAClB,UAAM,YAAY,kBAAAA,QAAK,QAAQ,UAAU;AACzC,QAAI,eAAe,YAAY,cAAc,YAAY;AACvD,wBAAkB;AAAA,IACpB,OAAO;AACL,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,UAAQ,QAAQ;AAChB,UAAQ,QAAQ,IAAI,CAAC;AACrB,SAAO;AACT;AAKA,SAASG,uBAAsB,OAAuB;AACpD,QAAM,UAAU,MAAM,QAAQ,WAAW,EAAE;AAC3C,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAKA,eAAsBC,sBACpB,UACA,aAKC;AACD,QAAM,cAAcD,uBAAsB,QAAQ;AAClD,QAAM,iBAA2B,CAAC;AAElC,MAAI,kBAAAH,QAAK,WAAW,QAAQ,GAAG;AAC7B,mBAAe,KAAK,kBAAAA,QAAK,UAAU,QAAQ,CAAC;AAAA,EAC9C;AAEA,aAAW,QAAQ,aAAa;AAC9B,mBAAe,KAAK,kBAAAA,QAAK,QAAQ,MAAM,WAAW,CAAC;AAAA,EACrD;AAEA,QAAM,YAAsB,CAAC;AAC7B,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,aAAa,gBAAgB;AACtC,UAAM,oBAAoB,kBAAAA,QAAK,QAAQ,SAAS;AAChD,QAAI,KAAK,IAAI,iBAAiB,GAAG;AAC/B;AAAA,IACF;AACA,SAAK,IAAI,iBAAiB;AAC1B,cAAU,KAAK,iBAAiB;AAChC,QAAI,MAAMD,YAAW,iBAAiB,GAAG;AACvC,aAAO,EAAE,aAAa,cAAc,mBAAmB,UAAU;AAAA,IACnE;AAAA,EACF;AAEA,SAAO,EAAE,aAAa,UAAU;AAClC;;;AChKA,gBAAqB;AAYrB,IAAM,wBACJ;AAMF,SAAS,gBAAgB,SAAsC;AAC7D,MAAI,QAAQ,YAAY;AACtB,UAAM,mBAAmB,QAAQ,WAAW,KAAK,CAAC,YAAY,QAAQ,SAAS,QAAQ;AACvF,QAAI,kBAAkB;AACpB,aAAO,QAAQ;AAAA,IACjB;AAEA,UAAMM,iBAAgB,qBAAqB,OAAO;AAClD,WAAO,CAAC,EAAE,MAAM,UAAU,SAASA,eAAc,GAAG,GAAG,QAAQ,UAAU;AAAA,EAC3E;AAEA,QAAM,gBAAgB,qBAAqB,OAAO;AAClD,QAAM,cAAc,QAAQ,SAAS,KAAK;AAE1C,QAAM,SAAqB;AAAA,IACzB;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAkC;AAC9D,QAAM,iBAA2B,CAAC;AAElC,MAAI,QAAQ,gBAAgB,QAAQ,aAAa,KAAK,EAAE,SAAS,GAAG;AAClE,mBAAe,KAAK,QAAQ,aAAa,KAAK,CAAC;AAAA,EACjD,OAAO;AACL,mBAAe,KAAK,qBAAqB;AAAA,EAC3C;AAEA,MAAI,QAAQ,cAAc,QAAQ,WAAW,KAAK,EAAE,SAAS,GAAG;AAC9D,mBAAe,KAAK;AAAA;AAAA,EAA6B,QAAQ,WAAW,KAAK,CAAC,EAAE;AAAA,EAC9E;AAEA,SAAO,eAAe,KAAK,MAAM;AACnC;AAEA,SAAS,mBACP,SACA,UAC2B;AAC3B,QAAM,cAAc,QAAQ,eAAe,SAAS;AACpD,QAAM,YAAY,QAAQ,mBAAmB,SAAS;AACtD,QAAM,SAAwB,CAAC;AAC/B,MAAI,gBAAgB,QAAW;AAC7B,WAAO,cAAc;AAAA,EACvB;AACA,MAAI,cAAc,QAAW;AAC3B,WAAO,YAAY;AAAA,EACrB;AACA,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;AAEA,SAAS,YAAY,UAA4C;AAC/D,QAAM,UAAU,SAAS,QAAQ,CAAC;AAClC,QAAM,OAAO,OAAO,SAAS,YAAY,WAAW,QAAQ,UAAU;AACtE,QAAM,YAAY,SAAS,WAAW,SAAS,cAAc;AAC7D,QAAM,QAAQ,aAAa,SAAS,UAAU;AAE9C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAwC;AAC5D,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,QAAiC;AAC3D,MAAI,OAAO,mBAAmB,eAAe,kBAAkB,gBAAgB;AAC7E,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,EAAE,aAAa,SAAS;AACnE,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAgB,sBAAkD;AAC1F,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAGA,MAAI,YAAY,SAAS,OAAO,MAAM,WAAW,UAAU;AACzD,WAAO,qBAAqB,SAAS,MAAM,MAAM;AAAA,EACnD;AAGA,MAAI,aAAa,SAAS,OAAO,MAAM,YAAY,UAAU;AAC3D,UAAM,QAAQ,MAAM,QAAQ,MAAM,cAAc;AAChD,QAAI,OAAO;AACT,YAAM,SAAS,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE;AAC3C,aAAO,qBAAqB,SAAS,MAAM;AAAA,IAC7C;AAAA,EACF;AAGA,MAAI,UAAU,SAAS,MAAM,SAAS,2BAA2B;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,SAAiB,QAAuC;AACnF,QAAM,QAAQ,KAAK;AAAA,IACjB,OAAO;AAAA,IACP,OAAO,iBAAiB,OAAO,iBAAiB;AAAA,EAClD;AAEA,SAAO,SAAS,OAAO,KAAK,OAAO,IAAI;AACzC;AAEA,eAAe,MAAM,IAA2B;AAC9C,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,eAAe,UACb,IACA,aACA,QACY;AAEZ,QAAM,SAAgC;AAAA,IACpC,YAAY,aAAa,cAAc;AAAA,IACvC,gBAAgB,aAAa,kBAAkB;AAAA,IAC/C,YAAY,aAAa,cAAc;AAAA,IACvC,eAAe,aAAa,iBAAiB;AAAA,IAC7C,sBAAsB,aAAa,wBAAwB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAC1F;AAEA,MAAI;AAEJ,WAAS,UAAU,GAAG,WAAW,OAAO,YAAY,WAAW;AAE7D,QAAI,QAAQ,SAAS;AACnB,YAAM,IAAI,MAAM,oBAAoB,OAAO,UAAU,gBAAgB,EAAE;AAAA,IACzE;AAEA,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,SAAS,OAAO;AACd,kBAAY;AAGZ,UAAI,WAAW,OAAO,YAAY;AAChC;AAAA,MACF;AAGA,UAAI,CAAC,iBAAiB,OAAO,OAAO,oBAAoB,GAAG;AACzD,cAAM;AAAA,MACR;AAGA,YAAM,QAAQ,oBAAoB,SAAS,MAAM;AACjD,YAAM,MAAM,KAAK;AAGjB,UAAI,QAAQ,SAAS;AACnB,cAAM,IAAI,MAAM,oBAAoB,OAAO,UAAU,gBAAgB,EAAE;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAGA,QAAM;AACR;AAEO,IAAM,gBAAN,MAAwC;AAAA,EAS7C,YACE,YACiB,QACjB;AADiB;AAEjB,SAAK,KAAK,SAAS,UAAU;AAC7B,SAAK,aAAa;AAClB,SAAK,WAAW;AAAA,MACd,aAAa,OAAO;AAAA,MACpB,iBAAiB,OAAO;AAAA,IAC1B;AACA,SAAK,cAAc,OAAO;AAE1B,SAAK,KAAK,eAAK,OAAO;AAAA,MACpB,MAAM;AAAA,MACN,QAAQ,OAAO;AAAA,MACf,cAAc,OAAO;AAAA,MACrB,gBAAgB,OAAO;AAAA,MACvB,SAAS,OAAO;AAAA,MAChB,QAAQ;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EA9BS;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EAEQ;AAAA,EACA;AAAA,EACA;AAAA,EA0BjB,MAAM,OAAO,SAAqD;AAChE,UAAM,aAAa,gBAAgB,OAAO;AAC1C,UAAM,cAAc,mBAAmB,SAAS,KAAK,QAAQ;AAE7D,UAAM,WAAW,MAAM;AAAA,MACrB,YACE,MAAM,KAAK,GAAG;AAAA,QACZ;AAAA,UACE;AAAA,UACA,OAAO,KAAK,OAAO;AAAA,UACnB,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,QACvC;AAAA,QACA,QAAQ,SAAS,EAAE,aAAa,QAAQ,OAAO,IAAI;AAAA,MACrD;AAAA,MACF,KAAK;AAAA,MACL,QAAQ;AAAA,IACV;AAEA,WAAO,YAAY,mBAAmB,QAAQ,CAAC;AAAA,EACjD;AAAA,EAEA,UAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AACF;AAEO,IAAM,oBAAN,MAA4C;AAAA,EAajD,YACE,YACiB,QACjB;AADiB;AAEjB,SAAK,KAAK,aAAa,UAAU;AACjC,SAAK,aAAa;AAClB,SAAK,WAAW;AAAA,MACd,aAAa,OAAO;AAAA,MACpB,iBAAiB,OAAO;AAAA,MACxB,gBAAgB,OAAO;AAAA,IACzB;AACA,SAAK,cAAc,OAAO;AAE1B,SAAK,KAAK,eAAK,OAAO;AAAA,MACpB,MAAM;AAAA,MACN,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EA7BS;AAAA,EACA,OAAO;AAAA,EAEP;AAAA,EACQ;AAAA,EACA;AAAA,EAKA;AAAA,EAqBjB,MAAM,OAAO,SAAqD;AAChE,UAAM,aAAa,gBAAgB,OAAO;AAC1C,UAAM,cAAc,mBAAmB,SAAS,KAAK,QAAQ;AAE7D,UAAM,WAAW,MAAM;AAAA,MACrB,YACE,MAAM,KAAK,GAAG;AAAA,QACZ;AAAA,UACE;AAAA,UACA,OAAO,KAAK,OAAO;AAAA,UACnB,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,QACvC;AAAA,QACA,QAAQ,SAAS,EAAE,aAAa,QAAQ,OAAO,IAAI;AAAA,MACrD;AAAA,MACF,KAAK;AAAA,MACL,QAAQ;AAAA,IACV;AAEA,WAAO,YAAY,mBAAmB,QAAQ,CAAC;AAAA,EACjD;AAAA,EAEA,UAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AACF;AAEO,IAAM,iBAAN,MAAyC;AAAA,EAY9C,YACE,YACiB,QACjB;AADiB;AAEjB,SAAK,KAAK,UAAU,UAAU;AAC9B,SAAK,aAAa;AAClB,SAAK,WAAW;AAAA,MACd,aAAa,OAAO;AAAA,MACpB,iBAAiB,OAAO;AAAA,IAC1B;AACA,SAAK,cAAc,OAAO;AAE1B,SAAK,KAAK,eAAK,OAAO;AAAA,MACpB,MAAM;AAAA,MACN,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EA3BS;AAAA,EACA,OAAO;AAAA,EAEP;AAAA,EACQ;AAAA,EACA;AAAA,EAIA;AAAA,EAoBjB,MAAM,OAAO,SAAqD;AAChE,UAAM,aAAa,gBAAgB,OAAO;AAC1C,UAAM,cAAc,mBAAmB,SAAS,KAAK,QAAQ;AAE7D,UAAM,WAAW,MAAM;AAAA,MACrB,YACE,MAAM,KAAK,GAAG;AAAA,QACZ;AAAA,UACE;AAAA,UACA,OAAO,KAAK,OAAO;AAAA,UACnB,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,QACvC;AAAA,QACA,QAAQ,SAAS,EAAE,aAAa,QAAQ,OAAO,IAAI;AAAA,MACrD;AAAA,MACF,KAAK;AAAA,MACL,QAAQ;AAAA,IACV;AAEA,WAAO,YAAY,mBAAmB,QAAQ,CAAC;AAAA,EACjD;AAAA,EAEA,UAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AACF;;;ACzXA,gCAA+E;AAC/E,IAAAC,mBAAe;AACf,qBAAe;AACf,IAAAC,oBAAiB;AACjB,uBAA0B;AAM1B,IAAM,gBAAY,4BAAU,0BAAAC,IAAgB;AAC5C,IAAM,qBAAqB,KAAK,OAAO;AAoBvC,eAAe,qBACb,SACA,SAC2B;AAC3B,QAAM,cAA2B;AAAA,IAC/B,KAAK,QAAQ;AAAA,IACb,KAAK,QAAQ;AAAA,IACb,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,WAAW;AAAA,IACX,OAAO,QAAQ,aAAa,UAAU,mBAAmB;AAAA,EAC3D;AAEA,MAAI;AACF,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,UAAU,SAAS,WAAW;AAE/D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF,SAAS,OAAO;AACd,UAAM,YAAY;AAOlB,WAAO;AAAA,MACL,QAAQ,UAAU,UAAU;AAAA,MAC5B,QAAQ,UAAU,UAAU;AAAA,MAC5B,UAAU,OAAO,UAAU,SAAS,WAAW,UAAU,OAAO;AAAA,MAChE,QAAQ;AAAA,MACR,UAAU,UAAU,aAAa,QAAQ,UAAU,WAAW;AAAA,MAC9D,QAAQ,UAAU,UAAU;AAAA,IAC9B;AAAA,EACF;AACF;AAEO,IAAM,cAAN,MAAsC;AAAA,EAClC;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,gBAAgB;AAAA,EAER;AAAA,EACA;AAAA,EACT;AAAA,EAER,YAAY,YAAoB,QAA2B,SAAwB,sBAAsB;AACvG,SAAK,aAAa;AAClB,SAAK,KAAK,OAAO,UAAU;AAC3B,SAAK,SAAS;AACd,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,OAAO,SAAqD;AAChE,QAAI,QAAQ,QAAQ,SAAS;AAC3B,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAEA,UAAM,KAAK,cAAc,QAAQ,MAAM;AAEvC,UAAM,iBAAiB,uBAAuB,QAAQ,UAAU;AAChE,UAAM,iBAAiB,oBAAoB,SAAS,KAAK,QAAQ,cAAc;AAC/E,UAAM,kBAAkB,eAAe,KAAK,OAAO,iBAAiB,cAAc;AAElF,UAAM,SAAS,MAAM,KAAK,WAAW,iBAAiB;AAAA,MACpD,KAAK,KAAK,OAAO;AAAA,MACjB,KAAK,QAAQ;AAAA,MACb,WAAW,KAAK,OAAO;AAAA,MACvB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,QAAI,OAAO,WAAW,OAAO,YAAY,OAAO,GAAG;AACjD,UAAI,QAAQ,QAAQ,SAAS;AAC3B,cAAM,IAAI,MAAM,kCAAkC;AAAA,MACpD;AACA,UAAI,OAAO,UAAU;AACnB,cAAM,IAAI;AAAA,UACR,yBAAyB,oBAAoB,KAAK,OAAO,aAAa,MAAS,CAAC;AAAA,QAClF;AAAA,MACF;AACA,YAAM,WAAW,OAAO,aAAa,OAAO,OAAO,WAAW;AAC9D,YAAM,SAAS,OAAO,OAAO,KAAK,KAAK,OAAO,OAAO,KAAK;AAC1D,YAAM,UAAU,SAAS,GAAG,MAAM,eAAe,QAAQ,MAAM,wBAAwB,QAAQ;AAC/F,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AAGA,UAAM,eAAe,MAAM,KAAK,yBAAyB,cAAc;AAEvE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,QACH,SAAS;AAAA,QACT,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO,YAAY;AAAA,QAC7B,KAAK,KAAK,OAAO;AAAA,QACjB,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,yBAAyB,UAAmC;AACxE,QAAI;AACF,YAAM,UAAU,MAAM,aAAa,QAAQ;AAC3C,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACtE,YAAM,IAAI,MAAM,+BAA+B,QAAQ,MAAM,QAAQ,EAAE;AAAA,IACzE,UAAE;AAEA,YAAM,iBAAAC,QAAG,OAAO,QAAQ,EAAE,MAAM,MAAM;AAAA,MAA4B,CAAC;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,QAAqC;AAC/D,QAAI,CAAC,KAAK,OAAO,aAAa;AAC5B;AAAA,IACF;AACA,QAAI,CAAC,KAAK,oBAAoB;AAC5B,WAAK,qBAAqB,KAAK,eAAe,KAAK,OAAO,aAAa,MAAM;AAAA,IAC/E;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,eACZ,aACA,QACe;AACf,QAAI,CAAC,aAAa;AAChB;AAAA,IACF;AAEA,UAAM,YAAY,YAAY,aAAa,KAAK,OAAO;AAEvD,QAAI,YAAY,SAAS,QAAQ;AAC/B,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,QAAQ,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS,IAAI;AAC5E,cAAQ,iBAAiB,SAAS,MAAM,WAAW,MAAM,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1E,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,YAAY,KAAK,EAAE,QAAQ,OAAO,QAAQ,WAAW,OAAO,CAAC;AAC1F,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MAAM,QAAQ,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,QAClE;AAAA,MACF,SAAS,OAAO;AACd,cAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACpE,cAAM,IAAI,MAAM,+BAA+B,KAAK,UAAU,MAAM,MAAM,EAAE;AAAA,MAC9E,UAAE;AACA,YAAI,UAAU,QAAW;AACvB,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,kBAAkB;AAAA,MACtB,YAAY;AAAA,MACZ;AAAA,QACE;AAAA,UACE,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,YAAY,CAAC;AAAA,UACb,YAAY;AAAA,UACZ,SAAS;AAAA,QACX;AAAA,QACA,KAAK;AAAA,QACL,uBAAuB,aAAa;AAAA,MACtC;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,KAAK,WAAW,iBAAiB;AAAA,MACpD,KAAK,YAAY,OAAO,KAAK,OAAO;AAAA,MACpC,KAAK,QAAQ;AAAA,MACb;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,OAAO,WAAW,OAAO,YAAY,OAAO,GAAG;AACjD,YAAM,WAAW,OAAO,aAAa,OAAO,OAAO,WAAW;AAC9D,YAAM,SAAS,OAAO,OAAO,KAAK,KAAK,OAAO,OAAO,KAAK;AAC1D,YAAM,UAAU,SACZ,GAAG,MAAM,eAAe,QAAQ,MAChC,4CAA4C,QAAQ;AACxD,YAAM,IAAI,MAAM,+BAA+B,KAAK,UAAU,MAAM,OAAO,EAAE;AAAA,IAC/E;AAAA,EACF;AACF;AAEA,SAAS,oBACP,SAIA,QACA,gBACwB;AACxB,QAAM,aAAa,oBAAoB,QAAQ,UAAU;AACzD,SAAO;AAAA,IACL,QAAQ,YAAY,QAAQ,YAAY,EAAE;AAAA,IAC1C,YAAY,YAAY,QAAQ,cAAc,EAAE;AAAA,IAChD,SAAS,YAAY,QAAQ,cAAc,EAAE;AAAA,IAC7C,SAAS,YAAY,OAAO,QAAQ,WAAW,CAAC,CAAC;AAAA,IACjD,OAAO,eAAe,YAAY,OAAO,WAAW;AAAA,IACpD,aAAa,YAAY,cAAc;AAAA,EACzC;AACF;AAEA,SAAS,oBACP,YAC+B;AAC/B,MAAI,CAAC,cAAc,WAAW,WAAW,GAAG;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,aAAa,YAAY;AAClC,UAAM,eAAe,kBAAAC,QAAK,QAAQ,SAAS;AAC3C,QAAI,CAAC,OAAO,IAAI,YAAY,GAAG;AAC7B,aAAO,IAAI,cAAc,YAAY;AAAA,IACvC;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,OAAO,OAAO,CAAC;AACnC;AAEA,SAAS,eACP,OACA,UACQ;AACR,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,YAAY;AAC9B,SAAO,MACJ,IAAI,CAAC,aAAa;AACjB,UAAM,cAAc,YAAY,QAAQ;AACxC,UAAM,cAAc,YAAY,kBAAAA,QAAK,SAAS,QAAQ,CAAC;AACvD,WAAO,UAAU,WAAW,UAAU,WAAW,EAAE,WAAW,cAAc,WAAW;AAAA,EACzF,CAAC,EACA,KAAK,GAAG;AACb;AAEA,SAAS,eAAe,UAAkB,QAAwC;AAChF,SAAO,SAAS,QAAQ,kBAAkB,CAAC,OAAO,QAAQ;AACxD,UAAM,cAAc,OAAO,GAAG;AAC9B,WAAO,gBAAgB,SAAY,cAAc;AAAA,EACnD,CAAC;AACH;AAEA,SAAS,YAAY,OAAuB;AAC1C,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,aAAa,SAAS;AAIhC,UAAM,UAAU,MAAM,QAAQ,MAAM,IAAI;AACxC,WAAO,IAAI,OAAO;AAAA,EACpB;AAEA,SAAO,IAAI,MAAM,QAAQ,MAAM,OAAS,CAAC;AAC3C;AAEA,SAAS,uBAAuB,YAA6B;AAC3D,QAAM,aAAa,cAAc;AACjC,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AACxD,SAAO,kBAAAA,QAAK,KAAK,eAAAC,QAAG,OAAO,GAAG,UAAU,UAAU,IAAI,SAAS,IAAI,MAAM,OAAO;AAClF;AAEA,SAAS,oBAAoB,WAAuC;AAClE,MAAI,CAAC,aAAa,aAAa,GAAG;AAChC,WAAO;AAAA,EACT;AACA,QAAM,UAAU,KAAK,KAAK,YAAY,GAAI;AAC1C,SAAO,UAAU,OAAO;AAC1B;;;AC7TA,IAAAC,6BAA4C;AAC5C,yBAA2B;AAC3B,IAAAC,kBAA6C;AAE7C,IAAAC,mBAAsD;AACtD,IAAAC,kBAAuB;AACvB,IAAAC,qBAAiB;AACjB,IAAAC,oBAA0B;;;ACA1B,IAAM,kBAAkB,OAAO,IAAI,kBAAkB;AACrD,IAAM,yBAAyB,OAAO,IAAI,4BAA4B;AAStE,SAAS,mBAAoC;AAC3C,QAAM,eAAe;AACrB,QAAM,WAAW,aAAa,eAAe;AAC7C,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,QAAM,UAA2B,CAAC;AAClC,eAAa,eAAe,IAAI;AAChC,SAAO;AACT;AAEA,SAAS,qBAA4C;AACnD,QAAM,eAAe;AACrB,QAAM,WAAW,aAAa,sBAAsB;AACpD,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,QAAM,UAAU,oBAAI,IAAsB;AAC1C,eAAa,sBAAsB,IAAI;AACvC,SAAO;AACT;AAEA,SAAS,kBAAkB,OAA4B;AACrD,QAAM,cAAc,MAAM,KAAK,mBAAmB,CAAC;AACnD,aAAW,YAAY,aAAa;AAClC,QAAI;AACF,eAAS,KAAK;AAAA,IAChB,SAAS,OAAO;AAEd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,KAAK,gCAAgC,OAAO,EAAE;AAAA,IACxD;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,OAA4B;AAC9D,mBAAiB,EAAE,KAAK,KAAK;AAC7B,oBAAkB,KAAK;AACzB;AAEO,SAAS,yBAA0C;AACxD,QAAM,QAAQ,iBAAiB;AAC/B,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,MAAM,OAAO,GAAG,MAAM,MAAM;AACrC;AAEO,SAAS,2BAA2B,UAAwC;AACjF,QAAM,QAAQ,mBAAmB;AACjC,QAAM,IAAI,QAAQ;AAClB,SAAO,MAAM;AACX,UAAM,OAAO,QAAQ;AAAA,EACvB;AACF;;;ACvEA,IAAAC,oBAAiB;AAUV,SAAS,oBACd,SACA,YACA,SACQ;AACR,QAAM,QAAkB,CAAC;AAEzB,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA,SAAS,qBAAqB,QAAQ;AAAA,IACtC,SAAS;AAAA,EACX;AACA,QAAM,iBAAiB,kBAAkB,UAAU;AAEnD,QAAM,yBAAyB,eAAe;AAAA,IAC5C,CAAC,SAAS,CAAC,eAAe,SAAS,IAAI;AAAA,EACzC;AAEA,QAAM,eAAe,2BAA2B,gBAAgB,sBAAsB;AACtF,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAM,KAAK,MAAM,YAAY;AAAA,EAC/B;AAEA,QAAM,KAAK,8BAA8B,QAAQ,SAAS,KAAK,CAAC;AAEhE,SAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAC/B;AAEO,SAASC,qBAAoB,YAAiE;AACnG,MAAI,CAAC,cAAc,WAAW,WAAW,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,QAAM,UAAU,oBAAI,IAAoB;AACxC,aAAW,aAAa,YAAY;AAClC,UAAM,eAAe,kBAAAC,QAAK,QAAQ,SAAS;AAC3C,QAAI,CAAC,QAAQ,IAAI,YAAY,GAAG;AAC9B,cAAQ,IAAI,cAAc,YAAY;AAAA,IACxC;AAAA,EACF;AACA,SAAO,MAAM,KAAK,QAAQ,OAAO,CAAC;AACpC;AAEO,SAAS,sBACd,YACA,mBACA,WACU;AACV,MAAI,CAAC,cAAc,WAAW,WAAW,GAAG;AAC1C,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,aAAa,YAAY;AAClC,UAAM,eAAe,kBAAAA,QAAK,QAAQ,SAAS;AAC3C,QAAI,WAAW,IAAI,YAAY,GAAG;AAChC,UAAI,CAAC,OAAO,IAAI,YAAY,GAAG;AAC7B,eAAO,IAAI,cAAc,YAAY;AAAA,MACvC;AACA;AAAA,IACF;AAEA,UAAM,aAAa,aAAa,MAAM,kBAAAA,QAAK,GAAG,EAAE,KAAK,GAAG;AACxD,QAAI,gBAAgB,YAAY,iBAAiB,GAAG;AAClD,UAAI,CAAC,OAAO,IAAI,YAAY,GAAG;AAC7B,eAAO,IAAI,cAAc,YAAY;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,OAAO,OAAO,CAAC;AACnC;AAEA,SAAS,kBAAkB,YAAqD;AAC9E,MAAI,CAAC,cAAc,WAAW,WAAW,GAAG;AAC1C,WAAO,CAAC;AAAA,EACV;AACA,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,aAAa,YAAY;AAClC,UAAM,eAAe,kBAAAA,QAAK,QAAQ,SAAS;AAC3C,QAAI,CAAC,OAAO,IAAI,YAAY,GAAG;AAC7B,aAAO,IAAI,cAAc,YAAY;AAAA,IACvC;AAAA,EACF;AACA,SAAO,MAAM,KAAK,OAAO,OAAO,CAAC;AACnC;AAEA,SAAS,2BACP,gBACA,YACQ;AACR,MAAI,eAAe,WAAW,KAAK,WAAW,WAAW,GAAG;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,CAAC,UACjB,MAAM,IAAI,CAAC,iBAAiB;AAC1B,UAAM,WAAW,kBAAAA,QAAK,SAAS,YAAY;AAC3C,UAAM,UAAU,cAAc,YAAY;AAC1C,WAAO,MAAM,QAAQ,KAAK,OAAO;AAAA,EACnC,CAAC;AAEH,QAAM,WAAqB,CAAC;AAC5B,MAAI,eAAe,SAAS,GAAG;AAC7B,aAAS,KAAK;AAAA,EAA8B,UAAU,cAAc,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,EACrF;AAEA,MAAI,WAAW,SAAS,GAAG;AACzB,aAAS,KAAK;AAAA,EAA0B,UAAU,UAAU,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,EAC7E;AAEA,WAAS;AAAA,IACP;AAAA,IACA;AAAA,EACF;AAEA,SAAO,SAAS,KAAK,IAAI;AAC3B;AAEA,SAAS,cAAc,UAA0B;AAC/C,QAAM,eAAe,kBAAAA,QAAK,WAAW,QAAQ,IAAI,WAAW,kBAAAA,QAAK,QAAQ,QAAQ;AACjF,QAAM,iBAAiB,aAAa,QAAQ,OAAO,GAAG;AACtD,MAAI,eAAe,KAAK,cAAc,GAAG;AACvC,WAAO,WAAW,cAAc;AAAA,EAClC;AACA,SAAO,UAAU,cAAc;AACjC;;;AFzHA,IAAMC,iBAAY,6BAAU,2BAAAC,IAAY;AACxC,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,4BAA4B;AAuB3B,IAAM,gBAAN,MAAwC;AAAA,EACpC;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,gBAAgB;AAAA,EAER;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EAER,YAAY,YAAoB,QAA6B,SAAsB,oBAAoB;AACrG,SAAK,KAAK,SAAS,UAAU;AAC7B,SAAK,aAAa;AAClB,SAAK,SAAS;AACd,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,OAAO,SAAqD;AAChE,QAAI,QAAQ,QAAQ,SAAS;AAC3B,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAEA,UAAM,KAAK,uBAAuB;AAElC,UAAM,aAAaC,qBAAoB,QAAQ,UAAU;AAEzD,UAAM,gBAAgB,MAAM,KAAK,gBAAgB;AACjD,UAAM,SAAS,MAAM,KAAK,mBAAmB,OAAO,EAAE,MAAM,MAAM,MAAS;AAC3E,QAAI;AACF,YAAM,gBAAgB,oBAAoB,SAAS,UAAU;AAC7D,YAAM,aAAa,mBAAAC,QAAK,KAAK,eAAe,eAAe;AAC3D,gBAAM,4BAAU,YAAY,eAAe,MAAM;AAEjD,YAAM,OAAO,KAAK,eAAe;AACjC,YAAM,MAAM,KAAK,WAAW,aAAa;AAEzC,YAAM,SAAS,MAAM,KAAK,aAAa,MAAM,KAAK,eAAe,QAAQ,QAAQ,MAAM;AAEvF,UAAI,OAAO,UAAU;AACnB,cAAM,IAAI;AAAA,UACR,sBAAsBC,qBAAoB,KAAK,OAAO,aAAa,MAAS,CAAC;AAAA,QAC/E;AAAA,MACF;AAEA,UAAI,OAAO,aAAa,GAAG;AACzB,cAAM,SAAS,WAAW,OAAO,QAAQ,OAAO,MAAM;AACtD,cAAM,SAAS,8BAA8B,OAAO,QAAQ;AAC5D,cAAM,IAAI,MAAM,SAAS,GAAG,MAAM,KAAK,MAAM,KAAK,MAAM;AAAA,MAC1D;AAEA,YAAM,SAAS,eAAe,OAAO,MAAM;AAC3C,YAAM,gBAAgB,qBAAqB,MAAM;AAEjD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK;AAAA,UACH,UAAU;AAAA,UACV,QAAQ,OAAO;AAAA,UACf,QAAQ,OAAO;AAAA,UACf,UAAU,OAAO;AAAA,UACjB;AAAA,UACA,YAAY,KAAK,sBAAsB,KAAK,OAAO;AAAA,UACnD;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA,SAAS,QAAQ;AAAA,QACnB;AAAA,MACF;AAAA,IACF,UAAE;AACA,YAAM,QAAQ,MAAM;AACpB,YAAM,KAAK,iBAAiB,aAAa;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,MAAc,yBAAwC;AACpD,QAAI,CAAC,KAAK,kBAAkB;AAC1B,WAAK,mBAAmB,KAAK,oBAAoB;AAAA,IACnD;AACA,UAAM,KAAK;AAAA,EACb;AAAA,EAEA,MAAc,sBAAqC;AACjD,SAAK,qBAAqB,MAAM,iBAAiB,KAAK,OAAO,UAAU;AAAA,EACzE;AAAA,EAEQ,WAAW,eAA+B;AAChD,QAAI,CAAC,KAAK,OAAO,KAAK;AACpB,aAAO;AAAA,IACT;AACA,WAAO,mBAAAD,QAAK,QAAQ,KAAK,OAAO,GAAG;AAAA,EACrC;AAAA,EAEQ,iBAA2B;AAEjC,UAAM,OAAO,CAAC,sBAAsB,SAAS,QAAQ,UAAU,WAAW,SAAS,uBAAuB;AAC1G,QAAI,KAAK,OAAO,QAAQ,KAAK,OAAO,KAAK,SAAS,GAAG;AACnD,WAAK,KAAK,GAAG,KAAK,OAAO,IAAI;AAAA,IAC/B;AACA,SAAK,KAAK,GAAG;AACb,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,aACZ,MACA,KACA,eACA,QACA,QACyB;AACzB,QAAI;AACF,aAAO,MAAM,KAAK,SAAS;AAAA,QACzB,YAAY,KAAK,sBAAsB,KAAK,OAAO;AAAA,QACnD;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,WAAW,KAAK,OAAO;AAAA,QACvB,KAAK,QAAQ;AAAA,QACb;AAAA,QACA,eAAe,SAAS,CAAC,UAAU,OAAO,kBAAkB,KAAK,IAAI;AAAA,QACrE,eAAe,SAAS,CAAC,UAAU,OAAO,kBAAkB,KAAK,IAAI;AAAA,MACvE,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,MAAM;AACZ,UAAI,IAAI,SAAS,UAAU;AACzB,cAAM,IAAI;AAAA,UACR,qBAAqB,KAAK,OAAO,UAAU;AAAA,QAC7C;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,kBAAmC;AAC/C,WAAO,UAAM,0BAAQ,mBAAAA,QAAK,SAAK,wBAAO,GAAG,gBAAgB,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAc,iBAAiB,eAAsC;AACnE,QAAI;AACF,gBAAM,qBAAG,eAAe,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAC1D,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,sBAA0C;AAChD,UAAM,WAAW,4BAA4B;AAC7C,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AACA,QAAI,KAAK,OAAO,QAAQ;AACtB,aAAO,mBAAAA,QAAK,QAAQ,KAAK,OAAO,MAAM;AAAA,IACxC;AACA,WAAO,mBAAAA,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,QAAQ,OAAO;AAAA,EAC5D;AAAA,EAEA,MAAc,mBAAmB,SAAkE;AACjG,UAAM,SAAS,KAAK,oBAAoB;AACxC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,QAAI;AACF,gBAAM,wBAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,IACzC,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,KAAK,mDAAmD,MAAM,MAAM,OAAO,EAAE;AACrF,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,mBAAAA,QAAK,KAAK,QAAQ,iBAAiB,SAAS,KAAK,UAAU,CAAC;AAE7E,QAAI;AACF,YAAM,SAAS,MAAM,kBAAkB,OAAO;AAAA,QAC5C;AAAA,QACA,YAAY,KAAK;AAAA,QACjB,YAAY,QAAQ;AAAA,QACpB,SAAS,QAAQ;AAAA,QACjB,QAAQ,KAAK,OAAO,aAAa;AAAA,MACnC,CAAC;AACD,0BAAoB;AAAA,QAClB;AAAA,QACA,YAAY,KAAK;AAAA,QACjB,YAAY,QAAQ;AAAA,QACpB,SAAS,QAAQ;AAAA,MACnB,CAAC;AACD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,KAAK,qCAAqC,QAAQ,KAAK,OAAO,EAAE;AACxE,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EACb;AAAA,EACQ;AAAA,EACA,YAAY,KAAK,IAAI;AAAA,EAC9B,eAAe;AAAA,EACf,eAAe;AAAA,EACN;AAAA,EAET,YAAY,UAAkB,QAA4B;AAChE,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,aAAS,mCAAkB,UAAU,EAAE,OAAO,IAAI,CAAC;AAAA,EAC1D;AAAA,EAEA,aAAa,OAAO,SAMW;AAC7B,UAAM,SAAS,IAAI,mBAAkB,QAAQ,UAAU,QAAQ,MAAM;AACrE,UAAM,SAAS;AAAA,MACb;AAAA,MACA,aAAa,QAAQ,UAAU;AAAA,MAC/B,QAAQ,aAAa,WAAW,QAAQ,UAAU,KAAK;AAAA,MACvD,QAAQ,YAAY,SAAY,cAAc,QAAQ,UAAU,CAAC,KAAK;AAAA,MACtE,eAAc,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,MACtC;AAAA,IACF,EAAE,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AAChD,WAAO,WAAW,MAAM;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,kBAAkB,OAAqB;AACrC,SAAK,gBAAgB;AACrB,SAAK,YAAY,QAAQ;AAAA,EAC3B;AAAA,EAEA,kBAAkB,OAAqB;AACrC,SAAK,gBAAgB;AACrB,SAAK,YAAY,QAAQ;AAAA,EAC3B;AAAA,EAEA,MAAM,QAAuB;AAC3B,SAAK,YAAY,QAAQ;AACzB,SAAK,YAAY,QAAQ;AACzB,SAAK,eAAe;AACpB,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,WAAK,OAAO,KAAK,SAAS,MAAM;AAChC,WAAK,OAAO,IAAI,MAAM,QAAQ,CAAC;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEQ,WAAW,OAAgC;AACjD,eAAW,QAAQ,OAAO;AACxB,WAAK,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,YAAY,QAAmC;AACrD,UAAM,SAAS,WAAW,WAAW,KAAK,eAAe,KAAK;AAC9D,UAAM,QAAQ,OAAO,MAAM,OAAO;AAClC,UAAM,YAAY,MAAM,IAAI,KAAK;AACjC,QAAI,WAAW,UAAU;AACvB,WAAK,eAAe;AAAA,IACtB,OAAO;AACL,WAAK,eAAe;AAAA,IACtB;AACA,eAAW,QAAQ,OAAO;AACxB,YAAM,YAAY,KAAK,WAAW,MAAM,MAAM;AAC9C,UAAI,WAAW;AACb,aAAK,OAAO,MAAM,SAAS;AAC3B,aAAK,OAAO,MAAM,IAAI;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAW,SAAiB,QAAiD;AACnF,UAAM,UAAU,QAAQ,KAAK;AAC7B,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AACA,UAAM,UACJ,KAAK,WAAW,SACZ,mBAAmB,OAAO,IAC1B,sBAAsB,SAAS,MAAM;AAC3C,WAAO,KAAK,cAAc,KAAK,SAAS,CAAC,MAAM,MAAM,KAAK,OAAO;AAAA,EACnE;AAAA,EAEQ,iBAAuB;AAC7B,UAAM,kBAAkB,KAAK,aAAa,KAAK;AAC/C,QAAI,gBAAgB,SAAS,GAAG;AAC9B,YAAM,YAAY,KAAK,WAAW,iBAAiB,QAAQ;AAC3D,UAAI,WAAW;AACb,aAAK,OAAO,MAAM,SAAS;AAC3B,aAAK,OAAO,MAAM,IAAI;AAAA,MACxB;AAAA,IACF;AACA,UAAM,kBAAkB,KAAK,aAAa,KAAK;AAC/C,QAAI,gBAAgB,SAAS,GAAG;AAC9B,YAAM,YAAY,KAAK,WAAW,iBAAiB,QAAQ;AAC3D,UAAI,WAAW;AACb,aAAK,OAAO,MAAM,SAAS;AAC3B,aAAK,OAAO,MAAM,IAAI;AAAA,MACxB;AAAA,IACF;AACA,SAAK,eAAe;AACpB,SAAK,eAAe;AAAA,EACtB;AACF;AAEA,SAAS,8BAAuC;AAC9C,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,QAAM,aAAa,SAAS,KAAK,EAAE,YAAY;AAC/C,SAAO,eAAe,WAAW,eAAe,OAAO,eAAe;AACxE;AAEA,SAAS,iBAAiB,SAA0B,YAA4B;AAC9E,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,SAAS,oBAAoB,QAAQ,cAAc,OAAO;AAChE,QAAM,gBAAgB,QAAQ,YAAY,SAAY,YAAY,QAAQ,UAAU,CAAC,KAAK;AAC1F,QAAM,SAAS,oBAAoB,UAAU;AAC7C,SAAO,GAAG,SAAS,IAAI,MAAM,IAAI,MAAM,GAAG,aAAa,QAAI,+BAAW,EAAE,MAAM,GAAG,CAAC,CAAC;AACrF;AAEA,SAAS,oBAAoB,OAAuB;AAClD,QAAM,YAAY,MAAM,QAAQ,qBAAqB,GAAG;AACxD,SAAO,UAAU,SAAS,IAAI,YAAY;AAC5C;AAEA,SAAS,cAAc,WAA2B;AAChD,QAAM,iBAAiB,KAAK,OAAO,KAAK,IAAI,IAAI,aAAa,GAAI;AACjE,QAAM,QAAQ,KAAK,MAAM,iBAAiB,IAAI;AAC9C,QAAM,UAAU,KAAK,MAAO,iBAAiB,OAAQ,EAAE;AACvD,QAAM,UAAU,iBAAiB;AACjC,MAAI,QAAQ,GAAG;AACb,WAAO,GAAG,MAAM,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,EAC3H;AACA,SAAO,GAAG,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AACtF;AAEA,SAAS,sBAAsB,SAAiB,QAAqC;AACnF,QAAM,SAAS,kBAAkB,OAAO;AACxC,MAAI,QAAQ;AACV,UAAM,UAAU,oBAAoB,MAAM;AAC1C,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,WAAW,UAAU;AACvB,WAAO,WAAW,OAAO;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAyB;AACnD,QAAM,SAAS,kBAAkB,OAAO;AACxC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAAoB,OAAoC;AAC/D,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,QAAM,SAAS;AACf,QAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAC7D,MAAI,UAAU,iBAAiB,KAAK,KAAK,gBAAgB,OAAO,IAAI,KAAK,eAAe,OAAO,UAAU,OAAO,OAAO;AACvH,MAAI,CAAC,WAAW,SAAS,2BAA2B;AAClD,UAAM,OAAO,OAAO;AACpB,QAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,YAAM,YAAY;AAAA,QACf,KAAiC,QAC/B,KAAiC,WACjC,KAAiC;AAAA,MACtC;AACA,UAAI,WAAW;AACb,kBAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,SAAS;AACZ,UAAM,WACJ,OAAQ,OAAO,MAA8C,SAAS,WACjE,OAAO,KAAiC,OACzC;AACN,QAAI,QAAQ,UAAU;AACpB,aAAO,GAAG,IAAI,IAAI,QAAQ;AAAA,IAC5B;AACA,QAAI,MAAM;AACR,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,QAAQ,SAAS;AACnB,WAAO,GAAG,IAAI,KAAK,OAAO;AAAA,EAC5B;AACA,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,SAAsC;AAC/D,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,iBAAiB,WAAoC;AAClE,QAAM,wBAAwB,UAAU,SAAS,GAAG,KAAK,UAAU,SAAS,IAAI;AAChF,MAAI,uBAAuB;AACzB,UAAM,WAAW,mBAAAA,QAAK,WAAW,SAAS,IAAI,YAAY,mBAAAA,QAAK,QAAQ,SAAS;AAChF,UAAM,iBAAiB,MAAM,+BAA+B,QAAQ;AACpE,cAAM,yBAAO,gBAAgB,0BAAU,IAAI;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,aAAa,UAAU,UAAU;AACzD,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAMH,WAAU,GAAG,OAAO,IAAI,SAAS,EAAE;AAC5D,UAAM,QAAQ,OACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACnC,UAAM,YAAY,0BAA0B,KAAK;AACjD,QAAI,WAAW;AACb,YAAM,iBAAiB,MAAM,+BAA+B,SAAS;AACrE,gBAAM,yBAAO,gBAAgB,0BAAU,IAAI;AAC3C,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,IAAI,MAAM,qBAAqB,SAAS,yBAAyB;AACzE;AAEA,SAAS,0BAA0B,YAAmD;AACpF,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,aAAa,SAAS;AAChC,WAAO,WAAW,CAAC;AAAA,EACrB;AACA,QAAM,aAAa,+BAA+B;AAClD,aAAW,OAAO,YAAY;AAC5B,UAAM,QAAQ,WAAW,KAAK,CAAC,cAAc,UAAU,YAAY,EAAE,SAAS,GAAG,CAAC;AAClF,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,WAAW,CAAC;AACrB;AAEA,eAAe,+BAA+B,WAAoC;AAChF,MAAI,QAAQ,aAAa,SAAS;AAChC,WAAO;AAAA,EACT;AACA,MAAI,uBAAuB,SAAS,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,+BAA+B;AAClD,aAAW,OAAO,YAAY;AAC5B,UAAM,gBAAgB,GAAG,SAAS,GAAG,GAAG;AACxC,QAAI;AACF,gBAAM,yBAAO,eAAe,0BAAU,IAAI;AAC1C,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,WAA4B;AAC1D,QAAM,QAAQ,UAAU,YAAY;AACpC,SAAO,+BAA+B,EAAE,KAAK,CAAC,QAAQ,MAAM,SAAS,GAAG,CAAC;AAC3E;AAEA,IAAM,6BAA6B,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;AAE1E,SAAS,iCAAoD;AAC3D,MAAI,QAAQ,aAAa,SAAS;AAChC,WAAO,CAAC;AAAA,EACV;AACA,QAAM,UAAU,QAAQ,IAAI,SAAS,MAAM,GAAG,EAC3C,IAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,YAAY,CAAC,EACrC,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC;AACjC,SAAO,WAAW,QAAQ,SAAS,IAAI,UAAU;AACnD;AAEA,SAAS,eAAe,QAAyB;AAC/C,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,UAAM,cAAc,eAAe,OAAO;AAC1C,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AACA,UAAM,YAAY,QAAQ,YAAY,GAAG;AACzC,QAAI,aAAa,GAAG;AAClB,YAAM,YAAY,QAAQ,MAAM,SAAS;AACzC,UAAI;AACF,eAAO,KAAK,MAAM,SAAS;AAAA,MAC7B,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,UAAU,QAAQ,MAAM,GAAG,GAAG;AACpC,UAAM,IAAI,MAAM,mCAAmC,OAAO,GAAG,QAAQ,SAAS,MAAM,WAAM,EAAE,EAAE;AAAA,EAChG;AACF;AAEA,SAAS,qBAAqB,QAAyB;AACrD,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,UAAM,OAAO,uBAAuB,MAAM;AAC1C,QAAI,MAAM;AACR,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AAEA,QAAM,SAAS;AACf,QAAM,YAAY,iBAAiB,MAAM;AACzC,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW;AACpE,MAAI,UAAU;AACZ,aAAS,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC5D,YAAM,QAAQ,SAAS,KAAK;AAC5B,UAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC;AAAA,MACF;AACA,YAAM,OAAQ,MAAkC;AAChD,UAAI,SAAS,aAAa;AACxB;AAAA,MACF;AACA,YAAM,UAAW,MAAkC;AACnD,YAAM,YAAY,eAAe,OAAO;AACxC,UAAI,WAAW;AACb,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,OAAO;AACxB,MAAI,YAAY,OAAO,aAAa,UAAU;AAC5C,UAAM,UAAW,SAAqC;AACtD,UAAM,YAAY,eAAe,OAAO;AACxC,QAAI,WAAW;AACb,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,SAAS,OAAO;AACtB,QAAM,kBAAkB,eAAe,MAAM;AAC7C,MAAI,iBAAiB;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,8DAA8D;AAChF;AAEA,SAAS,uBAAuB,QAAgD;AAC9E,WAAS,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC1D,UAAM,YAAY,OAAO,KAAK;AAC9B,UAAM,OAAO,iBAAiB,SAAS;AACvC,QAAI,MAAM;AACR,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAoC;AAC5D,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,QAAM,SAAS;AACf,QAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAC7D,MAAI,SAAS,2BAA2B;AACtC,UAAM,OAAO,OAAO;AACpB,UAAM,OAAO,gBAAgB,IAAI;AACjC,QAAI,MAAM;AACR,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,SAAS,OAAO,UAAU,OAAO;AACvC,QAAM,YAAY,eAAe,MAAM;AACvC,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAmC;AAC1D,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,EACT;AACA,QAAM,SAAS;AACf,QAAM,WAAW,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AACjE,MAAI,aAAa,mBAAmB,aAAa,cAAc,aAAa,UAAU;AACpF,UAAM,OAAO,eAAe,OAAO,QAAQ,OAAO,WAAW,OAAO,MAAM;AAC1E,QAAI,MAAM;AACR,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAoC;AAC1D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,QAAQ,MACX,IAAI,CAAC,YAAY;AAChB,UAAI,OAAO,YAAY,UAAU;AAC/B,eAAO;AAAA,MACT;AACA,UAAI,WAAW,OAAO,YAAY,YAAY,UAAU,SAAS;AAC/D,cAAM,OAAQ,QAAoC;AAClD,eAAO,OAAO,SAAS,WAAW,OAAO;AAAA,MAC3C;AACA,aAAO;AAAA,IACT,CAAC,EACA,OAAO,CAAC,SAAyB,OAAO,SAAS,YAAY,KAAK,SAAS,CAAC;AAC/E,WAAO,MAAM,SAAS,IAAI,MAAM,KAAK,KAAK,IAAI;AAAA,EAChD;AACA,MAAI,SAAS,OAAO,UAAU,YAAY,UAAU,OAAO;AACzD,UAAM,OAAQ,MAAkC;AAChD,WAAO,OAAO,SAAS,WAAW,OAAO;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,SAAS,eAAe,QAAuC;AAC7D,QAAM,QAAQ,OACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACnC,MAAI,MAAM,UAAU,GAAG;AACrB,WAAO;AAAA,EACT;AACA,QAAM,SAAoB,CAAC;AAC3B,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,aAAO,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,IAC9B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,QAAgB,QAAoC;AACtE,QAAM,YAAY,OAAO,KAAK;AAC9B,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO;AAAA,EACT;AACA,QAAM,aAAa,OAAO,KAAK;AAC/B,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AAEA,SAASI,qBAAoB,WAAuC;AAClE,MAAI,CAAC,aAAa,aAAa,GAAG;AAChC,WAAO;AAAA,EACT;AACA,QAAM,UAAU,KAAK,KAAK,YAAY,GAAI;AAC1C,SAAO,UAAU,OAAO;AAC1B;AAEA,eAAe,mBAAmB,SAAmD;AACnF,SAAO,MAAM,IAAI,QAAwB,CAAC,SAAS,WAAW;AAC5D,UAAM,YAAQ,kCAAM,QAAQ,YAAY,QAAQ,MAAM;AAAA,MACpD,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,MACb,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,OAAO,mBAAmB,QAAQ,UAAU;AAAA,IAC9C,CAAC;AAED,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,WAAW;AAEf,UAAM,UAAU,MAAY;AAC1B,YAAM,KAAK,SAAS;AAAA,IACtB;AAEA,QAAI,QAAQ,QAAQ;AAClB,UAAI,QAAQ,OAAO,SAAS;AAC1B,gBAAQ;AAAA,MACV,OAAO;AACL,gBAAQ,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,MAClE;AAAA,IACF;AAEA,QAAI;AACJ,QAAI,QAAQ,aAAa,QAAQ,YAAY,GAAG;AAC9C,sBAAgB,WAAW,MAAM;AAC/B,mBAAW;AACX,cAAM,KAAK,SAAS;AAAA,MACtB,GAAG,QAAQ,SAAS;AACpB,oBAAc,QAAQ;AAAA,IACxB;AAEA,UAAM,OAAO,YAAY,MAAM;AAC/B,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,gBAAU;AACV,cAAQ,gBAAgB,KAAK;AAAA,IAC/B,CAAC;AAED,UAAM,OAAO,YAAY,MAAM;AAC/B,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,gBAAU;AACV,cAAQ,gBAAgB,KAAK;AAAA,IAC/B,CAAC;AAED,UAAM,MAAM,IAAI,QAAQ,MAAM;AAE9B,UAAM,UAAU,MAAY;AAC1B,UAAI,eAAe;AACjB,qBAAa,aAAa;AAAA,MAC5B;AACA,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,OAAO,oBAAoB,SAAS,OAAO;AAAA,MACrD;AAAA,IACF;AAEA,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,cAAQ;AACR,aAAO,KAAK;AAAA,IACd,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,cAAQ;AACR,cAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA,UAAU,OAAO,SAAS,WAAW,OAAO;AAAA,QAC5C;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,mBAAmB,YAA6B;AACvD,MAAI,QAAQ,aAAa,SAAS;AAChC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,WAAW,YAAY;AACrC,SAAO,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,MAAM;AAClF;;;AGryBA,IAAM,wBACJ;AAEK,IAAM,eAAN,MAAuC;AAAA,EACnC;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EAEQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,YAAoB,QAA4B;AAC1D,SAAK,KAAK,QAAQ,UAAU;AAC5B,SAAK,aAAa;AAClB,SAAK,iBAAiB,OAAO,YAAY;AACzC,SAAK,UAAU,OAAO,WAAW;AACjC,SAAK,aAAa,OAAO,cAAc;AACvC,SAAK,aAAa,OAAO,cAAc;AAAA,EACzC;AAAA,EAEA,MAAM,OAAO,SAAqD;AAChE,UAAM,QAAQ,KAAK,eAAe;AAClC,QAAI,QAAQ,GAAG;AACb,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,KAAK,CAAC;AAAA,IAC3D;AAEA,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,KAAK;AAAA,QACH,UAAU,QAAQ;AAAA,QAClB,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAAyB;AAE/B,QAAI,KAAK,aAAa,KAAK,KAAK,aAAa,GAAG;AAC9C,YAAM,MAAM,KAAK,IAAI,GAAG,KAAK,UAAU;AACvC,YAAM,MAAM,KAAK,IAAI,KAAK,KAAK,UAAU;AACzC,aAAO,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM,MAAM,EAAE,IAAI;AAAA,IACvD;AAEA,WAAO,KAAK;AAAA,EACd;AACF;;;AClDA,iBAAkB;AAIX,IAAM,mBAAmB,oBAAI,IAAI,CAAC,UAAU,cAAc,WAAW,WAAW,SAAS,aAAa,CAAC;AA4I9G,IAAM,qBAAqB,aAAE,OAAO;AAAA,EAClC,MAAM,aAAE,OAAO,EAAE,IAAI,GAAG,yBAAyB;AAAA,EACjD,UAAU,aAAE,OAAO,EAAE,IAAI,GAAG,sBAAsB;AAAA,EAClD,cAAc,aAAE,OAAO,EAAE,SAAS;AAAA,EAClC,SAAS,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAC5C,CAAC,EAAE,YAAY;AAEf,IAAM,4BAA4B;AAElC,SAAS,yBAAyB,OAAmC;AACnE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,QAAQ,QAAQ,4BAA4B,EAAE,EAAE,KAAK;AAC3E,SAAO,cAAc,SAAS,IAAI,gBAAgB;AACpD;AAEA,SAAS,mBAAmB,QAAqE;AAC/F,QAAM,aAAa;AAAA,IACjB,OAAO,eAAe,OAAO;AAAA,IAC7B,GAAG,OAAO,IAAI;AAAA,EAChB;AACA,QAAM,iBAAiB;AAAA,IACrB,OAAO,0BAA0B,OAAO;AAAA,IACxC,GAAG,OAAO,IAAI;AAAA,EAChB;AACA,QAAM,aAAa;AAAA,IACjB,OAAO,sBAAsB,OAAO;AAAA,IACpC,GAAG,OAAO,IAAI;AAAA,EAChB;AACA,QAAM,gBAAgB;AAAA,IACpB,OAAO,wBAAwB,OAAO;AAAA,IACtC,GAAG,OAAO,IAAI;AAAA,EAChB;AACA,QAAM,uBAAuB;AAAA,IAC3B,OAAO,sBAAsB,OAAO;AAAA,IACpC,GAAG,OAAO,IAAI;AAAA,EAChB;AAGA,MACE,eAAe,UACf,mBAAmB,UACnB,eAAe,UACf,kBAAkB,UAClB,yBAAyB,QACzB;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,wBACd,YACA,MAAiB,QAAQ,KACT;AAChB,QAAM,SAAS,mBAAmB,MAAM,UAAU;AAClD,QAAM,WAAW,OAAO,SAAS,YAAY;AAC7C,QAAM,mBAAmB;AAAA,IACvB,OAAO,qBAAqB,OAAO;AAAA,EACrC;AAEA,UAAQ,UAAU;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,OAAO;AAAA,QACb,aAAa,OAAO;AAAA,QACpB,SAAS,OAAO;AAAA,QAChB;AAAA,QACA,QAAQ,mBAAmB,QAAQ,GAAG;AAAA,MACxC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,OAAO;AAAA,QACb,aAAa,OAAO;AAAA,QACpB,SAAS,OAAO;AAAA,QAChB;AAAA,QACA,QAAQ,uBAAuB,QAAQ,GAAG;AAAA,MAC5C;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,OAAO;AAAA,QACb,aAAa,OAAO;AAAA,QACpB,SAAS,OAAO;AAAA,QAChB;AAAA,QACA,QAAQ,oBAAoB,QAAQ,GAAG;AAAA,MACzC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,OAAO;AAAA,QACb,aAAa,OAAO;AAAA,QACpB,SAAS,OAAO;AAAA,QAChB;AAAA,QACA,QAAQ,mBAAmB,QAAQ,GAAG;AAAA,MACxC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,OAAO;AAAA,QACb,aAAa,OAAO;AAAA,QACpB,SAAS,OAAO;AAAA,QAChB;AAAA,QACA,QAAQ,kBAAkB,MAAM;AAAA,MAClC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,OAAO;AAAA,QACb,aAAa,OAAO;AAAA,QACpB,SAAS,OAAO;AAAA,QAChB;AAAA,QACA,QAAQ,oBAAoB,QAAQ,KAAK,aAAa,iBAAiB;AAAA,MACzE;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,OAAO;AAAA,QACb,aAAa,OAAO;AAAA,QACpB,SAAS,OAAO;AAAA,QAChB;AAAA,QACA,QAAQ,iBAAiB,QAAQ,GAAG;AAAA,MACtC;AAAA,IACF;AACE,YAAM,IAAI,MAAM,yBAAyB,OAAO,QAAQ,gBAAgB,OAAO,IAAI,GAAG;AAAA,EAC1F;AACF;AAEA,SAAS,mBACP,QACA,KACqB;AACrB,QAAM,iBAAiB,OAAO,YAAY,OAAO,YAAY,OAAO;AACpE,QAAM,eAAe,OAAO,WAAW,OAAO;AAC9C,QAAM,mBAAmB,OAAO,cAAc,OAAO,kBAAkB,OAAO;AAC9E,QAAM,gBAAgB,OAAO,WAAW,OAAO;AAC/C,QAAM,oBAAoB,OAAO;AACjC,QAAM,kBAAkB,OAAO,qBAAqB,OAAO;AAE3D,QAAM,eAAe,cAAc,gBAAgB,KAAK,GAAG,OAAO,IAAI,WAAW;AACjF,QAAM,SAAS,cAAc,cAAc,KAAK,GAAG,OAAO,IAAI,UAAU;AACxE,QAAM,iBAAiB,cAAc,kBAAkB,KAAK,GAAG,OAAO,IAAI,aAAa;AACvF,QAAM,UAAU;AAAA,IACd,sBAAsB,eAAe,KAAK,GAAG,OAAO,IAAI,cAAc;AAAA,EACxE;AACA,QAAM,cAAc,sBAAsB,mBAAmB,GAAG,OAAO,IAAI,cAAc;AACzF,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,GAAG,OAAO,IAAI;AAAA,EAChB;AACA,QAAM,QAAQ,mBAAmB,MAAM;AAEvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,uBACP,QACA,KACyB;AACzB,QAAM,eAAe,OAAO,WAAW,OAAO;AAC9C,QAAM,cAAc,OAAO,SAAS,OAAO,cAAc,OAAO;AAChE,QAAM,oBAAoB,OAAO;AACjC,QAAM,kBAAkB,OAAO,qBAAqB,OAAO;AAC3D,QAAM,uBAAuB,OAAO,mBAAmB,OAAO;AAE9D,QAAM,SAAS,cAAc,cAAc,KAAK,GAAG,OAAO,IAAI,oBAAoB;AAClF,QAAM,QAAQ,cAAc,aAAa,KAAK,GAAG,OAAO,IAAI,kBAAkB;AAC9E,QAAM,QAAQ,mBAAmB,MAAM;AAEvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,sBAAsB,mBAAmB,GAAG,OAAO,IAAI,cAAc;AAAA,IAClF,iBAAiB,sBAAsB,iBAAiB,GAAG,OAAO,IAAI,oBAAoB;AAAA,IAC1F,gBAAgB,sBAAsB,sBAAsB,GAAG,OAAO,IAAI,kBAAkB;AAAA,IAC5F;AAAA,EACF;AACF;AAEA,SAAS,oBACP,QACA,KACsB;AACtB,QAAM,eAAe,OAAO,WAAW,OAAO;AAC9C,QAAM,cAAc,OAAO,SAAS,OAAO,cAAc,OAAO;AAChE,QAAM,oBAAoB,OAAO;AACjC,QAAM,kBAAkB,OAAO,qBAAqB,OAAO;AAE3D,QAAM,SAAS,cAAc,cAAc,KAAK,GAAG,OAAO,IAAI,iBAAiB;AAC/E,QAAM,QACJ,sBAAsB,aAAa,KAAK,GAAG,OAAO,IAAI,iBAAiB;AAAA,IACrE,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC,KAAK;AACR,QAAM,QAAQ,mBAAmB,MAAM;AAEvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,sBAAsB,mBAAmB,GAAG,OAAO,IAAI,cAAc;AAAA,IAClF,iBAAiB,sBAAsB,iBAAiB,GAAG,OAAO,IAAI,oBAAoB;AAAA,IAC1F;AAAA,EACF;AACF;AAEA,SAAS,mBACP,QACA,KACqB;AACrB,QAAM,mBAAmB,OAAO,cAAc,OAAO,WAAW,OAAO;AACvE,QAAM,aAAa,OAAO,QAAQ,OAAO;AACzC,QAAM,YAAY,OAAO;AACzB,QAAM,gBAAgB,OAAO,mBAAmB,OAAO;AACvD,QAAM,eAAe,OAAO,WAAW,OAAO,UAAU,OAAO,iBAAiB,OAAO;AACvF,QAAM,kBACJ,OAAO,cACP,OAAO,aACP,OAAO,qBACP,OAAO,mBACP,IAAI;AAEN,QAAM,aACJ,sBAAsB,kBAAkB,KAAK,GAAG,OAAO,IAAI,qBAAqB;AAAA,IAC9E,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC,KAAK;AAER,QAAM,OAAO,2BAA2B,YAAY,KAAK,GAAG,OAAO,IAAI,aAAa;AAEpF,QAAM,MAAM,sBAAsB,WAAW,KAAK,GAAG,OAAO,IAAI,cAAc;AAAA,IAC5E,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AACD,QAAM,YAAY,iBAAiB,eAAe,GAAG,OAAO,IAAI,gBAAgB;AAChF,QAAM,SAAS,sBAAsB,cAAc,KAAK,GAAG,OAAO,IAAI,wBAAwB;AAAA,IAC5F,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AACD,QAAM,YAAY,wBAAwB,eAAe;AAEzD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,OAAgD;AAC/E,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,MAAI,eAAe,UAAU,eAAe,WAAW;AACrD,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,8CAA8C;AAChE;AAEA,SAAS,kBAAkB,QAAgE;AACzF,QAAM,WAAW,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW;AACzE,SAAO,EAAE,SAAS;AACpB;AAEA,SAAS,oBACP,QACA,KACA,UACsB;AACtB,QAAM,0BAA0B,6BAA6B,OAAO,sBAAsB,OAAO,iBAAiB;AAClH,QAAM,oBAAoB,0BACtB,sBAAsB,yBAAyB,KAAK,GAAG,OAAO,IAAI,4BAA4B;AAAA,IAC5F,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC,IACD;AAEJ,QAAM,gBAAgB,OAAO,cAAc,OAAO;AAClD,QAAM,aAAa,OAAO;AAC1B,QAAM,eAAe,OAAO,WAAW,OAAO;AAC9C,QAAM,qBAAqB,OAAO,iBAAiB,OAAO;AAE1D,QAAM,iBAAiB,WAAW,kBAAkB;AACpD,QAAM,UAAU,6BAA6B,aAAa,KAAK;AAE/D,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB,uBAAuB,UAAU,KAAK;AAAA,IACvD,QAAQ,uBAAuB,YAAY,KAAK;AAAA,IAChD,cAAc,sBAAsB,oBAAoB,KAAK,GAAG,OAAO,IAAI,kBAAkB;AAAA,MAC3F,cAAc;AAAA,MACd,aAAa;AAAA,IACf,CAAC;AAAA,IACD;AAAA,EACF;AACF;AAEA,SAAS,iBACP,QACA,KACmB;AACnB,QAAM,wBAAwB,OAAO,oBAAoB,OAAO;AAChE,QAAM,cAAc;AAAA,IAClB,OAAO,gBACL,OAAO,eACP,OAAO,sBACP,OAAO;AAAA,EACX;AACA,QAAM,MAAM,sBAAsB,OAAO,KAAK,KAAK,GAAG,OAAO,IAAI,sBAAsB;AAAA,IACrF,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AACD,QAAM,YAAY,iBAAiB,OAAO,mBAAmB,OAAO,gBAAgB,GAAG,OAAO,IAAI,UAAU;AAC5G,QAAM,cAAc,sBAAsB,OAAO,aAAa,KAAK,OAAO,IAAI;AAE9E,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,GAAG,OAAO,IAAI;AAAA,IACd;AAAA,EACF;AACA,iCAA+B,iBAAiB,GAAG,OAAO,IAAI,uBAAuB;AAErF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,QAAiB,aAAyC;AAClF,QAAM,UAAU,sBAAsB,QAAQ,GAAG,WAAW,YAAY;AACxE,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AACA,MAAI,WAAW,GAAG;AAChB,UAAM,IAAI,MAAM,GAAG,WAAW,oCAAoC;AAAA,EACpE;AACA,SAAO,KAAK,MAAM,UAAU,GAAI;AAClC;AAEA,SAAS,sBACP,QACA,KACA,YAC4B;AAC5B,MAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AACvD,UAAM,IAAI,MAAM,GAAG,UAAU,gCAAgC;AAAA,EAC/D;AAEA,QAAM,YAAY;AAClB,QAAM,OAAO,UAAU;AACvB,QAAM,YAAY;AAAA,IAChB,UAAU,mBAAmB,UAAU;AAAA,IACvC,GAAG,UAAU;AAAA,EACf;AAEA,MAAI,SAAS,QAAQ;AACnB,UAAM,MAAM,cAAc,UAAU,KAAK,KAAK,GAAG,UAAU,kBAAkB;AAC7E,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,WAAW;AACtB,UAAM,kBAAkB;AAAA,MACtB,UAAU,oBAAoB,UAAU;AAAA,MACxC;AAAA,MACA,GAAG,UAAU;AAAA,MACb;AAAA,IACF;AACA,mCAA+B,iBAAiB,GAAG,UAAU,+BAA+B;AAC5F,UAAM,MAAM,sBAAsB,UAAU,KAAK,KAAK,GAAG,UAAU,oBAAoB;AAAA,MACrF,cAAc;AAAA,MACd,aAAa;AAAA,IACf,CAAC;AACD,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,GAAG,UAAU,+CAA+C;AAC9E;AAEA,SAAS,+BAA+B,UAAkB,aAA2B;AACnF,QAAM,eAAe,uBAAuB,QAAQ;AACpD,aAAW,eAAe,cAAc;AACtC,QAAI,CAAC,iBAAiB,IAAI,WAAW,GAAG;AACtC,YAAM,IAAI;AAAA,QACR,GAAG,WAAW,uCAAuC,WAAW,+BAA+B,MAAM,KAAK,gBAAgB,EAAE,KAAK,IAAI,CAAC;AAAA,MACxI;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,UAA4B;AAC1D,QAAM,UAAU,SAAS,SAAS,gBAAgB;AAClD,QAAM,UAAoB,CAAC;AAC3B,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,CAAC,GAAG;AACZ,cAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,IACvB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cACP,QACA,KACA,aACA,eAAe,OACP;AACR,QAAM,QAAQ,sBAAsB,QAAQ,KAAK,aAAa;AAAA,IAC5D;AAAA,IACA,aAAa;AAAA,EACf,CAAC;AACD,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,MAAM,GAAG,WAAW,cAAc;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,SAAS,sBACP,QACA,KACA,aACA,SACoB;AACpB,MAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI,MAAM,GAAG,WAAW,mBAAmB;AAAA,EACnD;AACA,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,cAAc,QAAQ,MAAM,iCAAiC;AACnE,MAAI,aAAa;AACf,UAAM,UAAU,YAAY,CAAC;AAC7B,UAAM,WAAW,IAAI,OAAO;AAC5B,QAAI,aAAa,QAAW;AAC1B,UAAI,SAAS,KAAK,EAAE,WAAW,GAAG;AAChC,cAAM,IAAI,MAAM,yBAAyB,OAAO,SAAS,WAAW,WAAW;AAAA,MACjF;AACA,aAAO;AAAA,IACT;AACA,UAAM,cAAc,SAAS,eAAe;AAC5C,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AACA,UAAM,IAAI,MAAM,yBAAyB,OAAO,kBAAkB,WAAW,aAAa;AAAA,EAC5F;AAGA,QAAM,eAAe,SAAS,gBAAgB;AAC9C,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,MAAM,GAAG,WAAW,oGAAoG;AAAA,EACpI;AACA,SAAO;AACT;AAEA,SAAS,6BAA6B,QAAqC;AACzE,MAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACA,QAAM,UAAU,OAAO,KAAK;AAC5B,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEA,SAAS,sBAAsB,QAAiB,aAAyC;AACvF,MAAI,WAAW,UAAa,WAAW,QAAQ,WAAW,IAAI;AAC5D,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAAA,EAC5C;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,UAAU,OAAO,MAAM;AAC7B,QAAI,OAAO,SAAS,OAAO,GAAG;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,IAAI,MAAM,GAAG,WAAW,mBAAmB;AACnD;AAEA,SAAS,uBAAuB,QAAsC;AACpE,MAAI,WAAW,UAAa,WAAW,QAAQ,WAAW,IAAI;AAC5D,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,WAAW;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,UAAU,OAAO,KAAK,EAAE,YAAY;AAC1C,QAAI,YAAY,UAAU,YAAY,KAAK;AACzC,aAAO;AAAA,IACT;AACA,QAAI,YAAY,WAAW,YAAY,KAAK;AAC1C,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,IAAI,MAAM,wBAAwB;AAC1C;AAEA,SAAS,2BACP,QACA,KACA,aAC+B;AAC/B,MAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAM,IAAI,MAAM,GAAG,WAAW,8BAA8B;AAAA,EAC9D;AACA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AACA,QAAM,WAAqB,CAAC;AAC5B,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,CAAC;AACrB,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,IAAI,MAAM,GAAG,WAAW,IAAI,CAAC,oBAAoB;AAAA,IACzD;AACA,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,IAAI,MAAM,GAAG,WAAW,IAAI,CAAC,mBAAmB;AAAA,IACxD;AAGA,UAAM,cAAc,QAAQ,MAAM,iCAAiC;AACnE,QAAI,aAAa;AACf,YAAM,UAAU,YAAY,CAAC;AAC7B,YAAM,WAAW,IAAI,OAAO;AAC5B,UAAI,aAAa,QAAW;AAC1B,YAAI,SAAS,KAAK,EAAE,WAAW,GAAG;AAChC,gBAAM,IAAI,MAAM,yBAAyB,OAAO,SAAS,WAAW,IAAI,CAAC,YAAY;AAAA,QACvF;AACA,iBAAS,KAAK,QAAQ;AACtB;AAAA,MACF;AACA,YAAM,IAAI,MAAM,yBAAyB,OAAO,SAAS,WAAW,IAAI,CAAC,cAAc;AAAA,IACzF;AAGA,aAAS,KAAK,OAAO;AAAA,EACvB;AACA,SAAO,SAAS,SAAS,IAAI,WAAW;AAC1C;AAEA,SAAS,2BACP,QACA,aAC+B;AAC/B,MAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAM,IAAI,MAAM,GAAG,WAAW,8BAA8B;AAAA,EAC9D;AACA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AACA,QAAM,WAAqB,CAAC;AAC5B,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,CAAC;AACrB,QAAI,OAAO,SAAS,YAAY,CAAC,OAAO,SAAS,IAAI,GAAG;AACtD,YAAM,IAAI,MAAM,GAAG,WAAW,IAAI,CAAC,oBAAoB;AAAA,IACzD;AACA,aAAS,KAAK,IAAI;AAAA,EACpB;AACA,SAAO,SAAS,SAAS,IAAI,WAAW;AAC1C;;;AC/vBA,IAAAC,qBAAiB;AACjB,sBAA8F;AAOvF,IAAM,iBAAN,MAAyC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAER;AAAA,EAEjB,YACE,YACA,QACA,MACA;AACA,SAAK,KAAK,GAAG,IAAI,IAAI,UAAU;AAC/B,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,OAAO,SAAqD;AAChE,QAAI,QAAQ,QAAQ,SAAS;AAC3B,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAEA,UAAM,aAAa,qBAAqB,QAAQ,UAAU;AAC1D,UAAM,gBAAgBC,qBAAoB,SAAS,YAAY,QAAQ,kBAAkB;AAEzF,UAAM,UAAU,UAAM,sCAAqB;AAAA,MACzC,WAAW;AAAA,MACX,kBAAkB;AAAA,MAClB,MAAM,KAAK,OAAO;AAAA,MAClB,QAAQ,KAAK,OAAO;AAAA,MACpB,WAAW,KAAK,OAAO;AAAA,MACvB,cAAc,KAAK,OAAO;AAAA,MAC1B,mBAAmB,KAAK,OAAO;AAAA,MAC/B,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,QAAQ,aAAa,KAAK,CAAC,QAAQ,cAAc;AACnD,YAAM,UAAU,QAAQ,SAAS;AACjC,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AAEA,QAAI,KAAK,OAAO,QAAQ;AACtB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK;AAAA,UACH;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,aAAa,QAAQ,YAAY;AAE5D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK;AAAA,QACH;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,UAA4E;AAC5F,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,qBAAqB,SAAS,IAAI,CAAC,SAAS;AAAA,MAChD,SAAS;AAAA,MACT,YAAY,qBAAqB,IAAI,UAAU;AAAA,IACjD,EAAE;AAEF,UAAM,qBAAqB;AAAA,MACzB,mBAAmB,IAAI,CAAC,EAAE,WAAW,MAAM,UAAU;AAAA,IACvD;AACA,UAAM,cAAc,mBAAmB;AAAA,MAAI,CAAC,EAAE,SAAS,WAAW,MAChEA,qBAAoB,SAAS,YAAY,QAAQ,kBAAkB;AAAA,IACrE;AAEA,UAAM,UAAU,UAAM,oCAAmB;AAAA,MACvC;AAAA,MACA,kBAAkB;AAAA,MAClB,MAAM,KAAK,OAAO;AAAA,MAClB,QAAQ,KAAK,OAAO;AAAA,MACpB,WAAW,KAAK,OAAO;AAAA,MACvB,cAAc,KAAK,OAAO;AAAA,MAC1B,mBAAmB,KAAK,OAAO;AAAA,MAC/B,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,QAAQ,aAAa,KAAK,CAAC,QAAQ,eAAe;AACpD,YAAM,UAAU,QAAQ,SAAS;AACjC,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AAEA,QAAI,KAAK,OAAO,QAAQ;AACtB,aAAO,mBAAmB,IAAI,CAAC,EAAE,WAAW,OAAO;AAAA,QACjD,MAAM;AAAA,QACN,KAAK;AAAA,UACH;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AAAA,MACF,EAAE;AAAA,IACJ;AAEA,QAAI,QAAQ,cAAc,WAAW,SAAS,QAAQ;AACpD,YAAM,IAAI;AAAA,QACR,0BAA0B,QAAQ,cAAc,MAAM,kBAAkB,SAAS,MAAM;AAAA,MACzF;AAAA,IACF;AAEA,UAAM,YAAgC,CAAC;AACvC,eAAW,CAAC,OAAO,YAAY,KAAK,QAAQ,cAAc,QAAQ,GAAG;AACnE,YAAM,eAAe,MAAM,aAAa,YAAY;AACpD,gBAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,KAAK;AAAA,UACH;AAAA,UACA,YAAY,mBAAmB,KAAK,GAAG;AAAA,UACvC,eAAe;AAAA,UACf;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;AAEA,SAASA,qBACP,SACA,aACA,mBACQ;AACR,QAAM,QAAkB,CAAC;AAGzB,MAAI,QAAQ,gBAAgB,QAAQ,aAAa,KAAK,EAAE,SAAS,GAAG;AAClE,UAAM,KAAK,QAAQ,aAAa,KAAK,CAAC;AAAA,EACxC;AAEA,QAAM,iBAAiBC,uBAAsB,aAAa,iBAAiB;AAC3E,QAAM,kBAAkB,uBAAuB,WAAW;AAE1D,QAAM,0BAA0B,gBAAgB;AAAA,IAC9C,CAAC,SAAS,CAAC,eAAe,SAAS,IAAI;AAAA,EACzC;AAEA,QAAM,eAAeC,4BAA2B,gBAAgB,uBAAuB;AACvF,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAM,KAAK,MAAM,YAAY;AAAA,EAC/B;AAEA,QAAM,KAAK,8BAA8B,QAAQ,SAAS,KAAK,CAAC;AAEhE,SAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAC/B;AAEA,SAASA,4BACP,gBACA,iBACQ;AACR,MAAI,eAAe,WAAW,KAAK,gBAAgB,WAAW,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,CAAC,UACjB,MAAM,IAAI,CAAC,iBAAiB;AAC1B,UAAM,WAAW,mBAAAC,QAAK,SAAS,YAAY;AAC3C,UAAM,UAAUC,eAAc,YAAY;AAC1C,WAAO,MAAM,QAAQ,KAAK,OAAO;AAAA,EACnC,CAAC;AAEH,QAAM,WAAqB,CAAC;AAC5B,MAAI,eAAe,SAAS,GAAG;AAC7B,aAAS,KAAK;AAAA,EAA8B,UAAU,cAAc,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,EACrF;AAEA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,aAAS,KAAK;AAAA,EAA+B,UAAU,eAAe,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,EACvF;AAEA,WAAS;AAAA,IACP;AAAA,IACA;AAAA,EACF;AAEA,SAAO,SAAS,KAAK,IAAI;AAC3B;AAEA,SAASH,uBACP,aACA,mBACU;AACV,MAAI,CAAC,eAAe,YAAY,WAAW,GAAG;AAC5C,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,cAAc,aAAa;AACpC,UAAM,eAAe,mBAAAE,QAAK,QAAQ,UAAU;AAC5C,UAAM,aAAa,aAAa,MAAM,mBAAAA,QAAK,GAAG,EAAE,KAAK,GAAG;AAExD,QAAI,gBAAgB,YAAY,iBAAiB,GAAG;AAClD,UAAI,CAAC,OAAO,IAAI,YAAY,GAAG;AAC7B,eAAO,IAAI,cAAc,YAAY;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,OAAO,OAAO,CAAC;AACnC;AAEA,SAAS,uBACP,aACU;AACV,MAAI,CAAC,eAAe,YAAY,WAAW,GAAG;AAC5C,WAAO,CAAC;AAAA,EACV;AACA,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,cAAc,aAAa;AACpC,UAAM,eAAe,mBAAAA,QAAK,QAAQ,UAAU;AAC5C,QAAI,CAAC,OAAO,IAAI,YAAY,GAAG;AAC7B,aAAO,IAAI,cAAc,YAAY;AAAA,IACvC;AAAA,EACF;AACA,SAAO,MAAM,KAAK,OAAO,OAAO,CAAC;AACnC;AAEA,SAASC,eAAc,UAA0B;AAE/C,QAAM,eAAe,mBAAAD,QAAK,WAAW,QAAQ,IAAI,WAAW,mBAAAA,QAAK,QAAQ,QAAQ;AAGjF,QAAM,iBAAiB,aAAa,QAAQ,OAAO,GAAG;AAGtD,MAAI,eAAe,KAAK,cAAc,GAAG;AACvC,WAAO,WAAW,cAAc;AAAA,EAClC;AAGA,SAAO,UAAU,cAAc;AACjC;AAQA,SAAS,qBAAqB,aAAkE;AAC9F,MAAI,CAAC,eAAe,YAAY,WAAW,GAAG;AAC5C,WAAO;AAAA,EACT;AACA,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,cAAc,aAAa;AACpC,YAAQ,IAAI,mBAAAE,QAAK,QAAQ,UAAU,CAAC;AAAA,EACtC;AACA,SAAO,MAAM,KAAK,OAAO;AAC3B;AAEA,SAAS,iBAAiB,KAAuE;AAC/F,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,QAAQ,KAAK;AACtB,QAAI,CAAC,KAAM;AACX,eAAW,aAAa,MAAM;AAC5B,cAAQ,IAAI,mBAAAA,QAAK,QAAQ,SAAS,CAAC;AAAA,IACrC;AAAA,EACF;AACA,SAAO,QAAQ,OAAO,IAAI,MAAM,KAAK,OAAO,IAAI;AAClD;AAoBA,eAAsB,sBACpB,SACgC;AAChC,QAAM,EAAE,MAAM,OAAO,UAAU,MAAM,IAAI;AACzC,QAAM,YAAY,SAAS,oBAAoB,kBAAkB;AACjE,QAAM,mBAAe,iCAAgB,SAAS;AAE9C,MAAI;AACF,QAAI,SAAS;AACX,cAAQ,IAAI,gBAAgB,KAAK,8BAA8B,SAAS,YAAY;AAAA,IACtF;AAEA,UAAM,SAAS,UAAM,oCAAmB;AAAA,MACtC,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,SAAS;AACX,UAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,gBAAQ,IAAI,WAAW,OAAO,QAAQ,MAAM,kBAAkB;AAAA,MAChE;AACA,UAAI,OAAO,gBAAgB,SAAS,GAAG;AACrC,gBAAQ,IAAI,WAAW,OAAO,gBAAgB,MAAM,gCAAgC;AAAA,MACtF;AACA,cAAQ,IAAI;AAAA,sCAAyC,OAAO,QAAQ,SAAS,OAAO,gBAAgB,MAAM,EAAE;AAAA,IAC9G;AAEA,WAAO;AAAA,MACL,aAAa;AAAA,MACb,SAAS,eAAe,KAAK,iBAAiB,OAAO,QAAQ,MAAM,aAAa,OAAO,gBAAgB,MAAM;AAAA,IAC/G;AAAA,EACF,SAAS,OAAO;AACd,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAG1E,QAAI,SAAS;AACX,cAAQ,KAAK,4CAA4C,YAAY,EAAE;AAAA,IACzE;AAEA,WAAO;AAAA,MACL,aAAa;AAAA,MACb,SAAS,wBAAwB,YAAY;AAAA,IAC/C;AAAA,EACF;AAEF;;;AC5VA,IAAAC,kBAA0B;AAC1B,IAAAC,mBAAiC;AACjC,IAAAC,qBAAiB;AACjB,IAAAC,eAAsB;;;ACiBf,IAAM,uBAAgD;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AACF;AAkCO,IAAM,oBAAoB;AA4B1B,SAAS,gBAAgB,UAAyC;AACvE,SAAO,WAAW,qBAAqB,SAAS,SAAS,IAAI,IAAI;AACnE;;;ADhFA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,YAAY,QAAiC,cAA4B;AAChF,QAAM,SAAS,OAAO;AAEtB,MAAI,WAAW,QAAW;AACxB,UAAM,IAAI;AAAA,MACR,4CAA4C,YAAY;AAAA,uBAChC,iBAAiB;AAAA,IAC3C;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI;AAAA,MACR,4CAA4C,YAAY;AAAA,2BAC5B,iBAAiB;AAAA,IAC/C;AAAA,EACF;AAEA,MAAI,WAAW,mBAAmB;AAChC,UAAM,IAAI;AAAA,MACR,oBAAoB,MAAM,wBAAwB,YAAY;AAAA,YACjD,iBAAiB;AAAA,IAChC;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,QAAiC,cAAiC;AAC7F,QAAM,UAAU,OAAO;AACvB,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,UAAM,IAAI,MAAM,mBAAmB,YAAY,8BAA8B;AAAA,EAC/E;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAgB,OAAe,UAAoC;AACjG,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,UAAM,IAAI,MAAM,+BAA+B,KAAK,OAAO,QAAQ,oBAAoB;AAAA,EACzF;AAEA,QAAM,OAAO,MAAM;AACnB,QAAM,WAAW,MAAM;AAEvB,MAAI,OAAO,SAAS,YAAY,KAAK,KAAK,EAAE,WAAW,GAAG;AACxD,UAAM,IAAI,MAAM,+BAA+B,KAAK,OAAO,QAAQ,4BAA4B;AAAA,EACjG;AAEA,MAAI,OAAO,aAAa,YAAY,SAAS,KAAK,EAAE,WAAW,GAAG;AAChE,UAAM,IAAI,MAAM,uBAAuB,IAAI,QAAQ,QAAQ,gCAAgC;AAAA,EAC7F;AAIA,SAAO;AACT;AAEA,eAAeC,YAAW,UAAoC;AAC5D,MAAI;AACF,cAAM,yBAAO,UAAU,0BAAU,IAAI;AACrC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,sBAAsB,UAAwD;AAClG,QAAM,eAAe,mBAAAC,QAAK,QAAQ,QAAQ;AAC1C,MAAI,CAAE,MAAMD,YAAW,YAAY,GAAI;AACrC,UAAM,IAAI,MAAM,6BAA6B,YAAY,EAAE;AAAA,EAC7D;AAEA,QAAM,MAAM,UAAM,2BAAS,cAAc,MAAM;AAC/C,QAAM,aAAS,oBAAM,GAAG;AAExB,MAAI,CAAC,SAAS,MAAM,GAAG;AACrB,UAAM,IAAI,MAAM,mBAAmB,YAAY,4DAA4D;AAAA,EAC7G;AAEA,cAAY,QAAQ,YAAY;AAEhC,QAAM,UAAU,oBAAoB,QAAQ,YAAY;AACxD,QAAM,cAAc,QAAQ,IAAI,CAAC,OAAO,UAAU,uBAAuB,OAAO,OAAO,YAAY,CAAC;AACpG,SAAO;AACT;AAEO,SAAS,gBAAgB,aAA6D;AAC3F,SAAO,YAAY,IAAI,CAAC,eAAe,WAAW,IAAI;AACxD;;;AEhEO,SAAS,eAAe,QAAkC;AAC/D,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,IAAI,cAAc,OAAO,MAAM,OAAO,MAAM;AAAA,IACrD,KAAK;AACH,aAAO,IAAI,kBAAkB,OAAO,MAAM,OAAO,MAAM;AAAA,IACzD,KAAK;AACH,aAAO,IAAI,eAAe,OAAO,MAAM,OAAO,MAAM;AAAA,IACtD,KAAK;AACH,aAAO,IAAI,YAAY,OAAO,MAAM,OAAO,MAAM;AAAA,IACnD,KAAK;AACH,aAAO,IAAI,cAAc,OAAO,MAAM,OAAO,MAAM;AAAA,IACrD,KAAK;AACH,aAAO,IAAI,aAAa,OAAO,MAAM,OAAO,MAAM;AAAA,IACpD,KAAK;AAAA,IACL,KAAK;AACH,aAAO,IAAI,eAAe,OAAO,MAAM,OAAO,QAAQ,OAAO,IAAI;AAAA,IACnE,SAAS;AAEP,YAAM,cAAqB;AAC3B,YAAM,IAAI,MAAM,6BAA8B,YAAiC,IAAI,EAAE;AAAA,IACvF;AAAA,EACF;AACF;AAEO,SAAS,yBACd,YACA,MAAiB,QAAQ,KACf;AACV,QAAM,WAAW,wBAAwB,YAAY,GAAG;AACxD,SAAO,eAAe,QAAQ;AAChC;;;ACtDA,IAAM,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4D5B,IAAM,oBAAN,MAA6C;AAAA,EACzC,OAAO;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAmC;AAC7C,SAAK,uBAAuB,QAAQ;AACpC,SAAK,kBAAkB,QAAQ;AAC/B,SAAK,cAAc,QAAQ;AAC3B,SAAK,oBAAoB,QAAQ;AAAA,EACnC;AAAA,EAEA,MAAM,SAAS,SAAsD;AACnE,UAAM,gBAAgB,MAAM,KAAK,qBAAqB,OAAO;AAC7D,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,6CAA6C;AAAA,IAC/D;AAEA,WAAO,KAAK,mBAAmB,SAAS,aAAa;AAAA,EACvD;AAAA,EAEA,MAAc,mBACZ,SACA,eAC0B;AAC1B,UAAM,oBACJ,QAAQ,aAAa,YAAY,QAAQ,aAAa,SAAS,KAAK,EAAE,SAAS,IAC3E,QAAQ,aAAa,WACrB,QAAQ,SAAS;AAGvB,UAAM,YAAY;AAAA,MAChB,gBAAgB,KAAK,UAAU,QAAQ,SAAS,gBAAgB,MAAM,CAAC;AAAA,MACvE,iBAAiB,KAAK,UAAU,QAAQ,SAAS,iBAAiB,MAAM,CAAC;AAAA,MACzE,kBAAkB,QAAQ,UAAU,KAAK;AAAA,MACzC,mBAAmB,QAAQ,SAAS,oBAAoB,IAAI,KAAK;AAAA,MACjE,kBAAkB,QAAQ,SAAS,iBAAiB,KAAK;AAAA,MACzD,UAAU,kBAAkB,KAAK;AAAA,IACnC;AAGA,UAAM,eAAe,kBAAkB;AAGvC,UAAM,oBAAoB,QAAQ,6BAA6B,KAAK,qBAAqB;AACzF,UAAM,aAAa,oBAAoB,mBAAmB,SAAS;AAEnE,UAAM,WAAW,MAAM,cAAc,OAAO;AAAA,MAC1C,UAAU;AAAA,MACV;AAAA,MACA,YAAY,QAAQ,SAAS;AAAA,MAC7B,SAAS,QAAQ;AAAA,MACjB,iBAAiB,KAAK;AAAA,MACtB,aAAa,KAAK;AAAA,IACpB,CAAC;AAED,UAAM,SAAS,qBAAqB,QAAQ;AAC5C,UAAM,QAAQ,WAAW,OAAO,SAAS,CAAC;AAC1C,UAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,IAClC,OAAO,KAAK,OAAO,gBAAgB,EAAE,MAAM,GAAG,CAAC,IAC/C,CAAC;AACL,UAAM,SAAS,MAAM,QAAQ,OAAO,MAAM,IACtC,OAAO,OAAO,OAAO,gBAAgB,EAAE,MAAM,GAAG,CAAC,IACjD,CAAC;AACL,UAAM,YAAY,OAAO,aAAa,SAAS;AAC/C,UAAM,sBAAsB,KAAK,IAAI,KAAK,SAAS,OAAO,QAAQ,CAAC;AAEnE,UAAM,sBAAkC;AAAA,MACtC;AAAA,MACA;AAAA,MACA,QAAQ,cAAc;AAAA,IACxB;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,oBAA4B;AACnC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAIA,SAAS,WAAW,OAAuB;AACzC,MAAI,OAAO,MAAM,KAAK,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AAClD,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,UAK5B;AACA,QAAM,OAAO,OAAO,SAAS,SAAS,WAAW,SAAS,KAAK,KAAK,IAAI;AACxE,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,CAAC;AAAA,EACV;AAGA,QAAM,SAAS,iBAAiB,IAAI;AACpC,MAAI,UAAU,oBAAoB,MAAM,GAAG;AACzC,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,gBAAgB,IAAI;AACtC,MAAI,WAAW;AACb,UAAM,SAAS,iBAAiB,SAAS;AACzC,QAAI,UAAU,oBAAoB,MAAM,GAAG;AACzC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,iBAAiB,MAOZ;AACZ,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,UAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAChE,UAAM,OAAO,OAAO;AACpB,UAAM,SAAS,OAAO;AACtB,UAAM,YAAY,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AAC5E,WAAO,EAAE,OAAO,MAAM,QAAQ,UAAU;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAAoB,QAKjB;AAEV,MAAI,OAAO,OAAO,UAAU,UAAU;AACpC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,MAAM,OAAO,KAAK,KAAK,CAAC,OAAO,SAAS,OAAO,KAAK,GAAG;AAChE,WAAO;AAAA,EACT;AACA,MAAI,OAAO,QAAQ,KAAK,OAAO,QAAQ,GAAG;AACxC,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,SAAS,QAAW;AAC7B,QAAI,CAAC,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC/B,aAAO;AAAA,IACT;AACA,QAAI,CAAC,OAAO,KAAK,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,GAAG;AAC1D,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,OAAO,WAAW,QAAW;AAC/B,QAAI,CAAC,MAAM,QAAQ,OAAO,MAAM,GAAG;AACjC,aAAO;AAAA,IACT;AACA,QAAI,CAAC,OAAO,OAAO,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,GAAG;AAC5D,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,OAAO,cAAc,UAAa,OAAO,OAAO,cAAc,UAAU;AAC1E,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAkC;AACzD,QAAM,QAAQ,KAAK,MAAM,aAAa;AACtC,SAAO,QAAQ,CAAC;AAClB;AAEA,SAAS,iBAAiB,OAAiC;AACzD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAC5D;AAUO,IAAM,gBAAN,MAAyC;AAAA,EACrC,OAAO;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAA+B;AACzC,SAAK,SAAS,QAAQ;AACtB,SAAK,MAAM,QAAQ;AACnB,SAAK,iBAAiB,QAAQ;AAAA,EAChC;AAAA,EAEA,MAAM,SAAS,SAAsD;AACnE,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,QACE,UAAU,QAAQ,SAAS;AAAA,QAC3B,kBAAkB,QAAQ,SAAS;AAAA,QACnC,kBAAkB,QAAQ,SAAS;AAAA,QACnC,kBAAkB,QAAQ;AAAA,QAC1B,iBAAiB,QAAQ,SAAS;AAAA,QAClC,aAAa,QAAQ,SAAS;AAAA,QAC9B,gBAAgB,QAAQ,SAAS;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,KAAK,QAAQ,cAAc,KAAK,gBAAgB,KAAK,GAAG;AAC3F,YAAM,SAAS,cAAc,MAAM;AACnC,YAAM,QAAQ,WAAW,OAAO,QAAQ,UAAU,WAAW,OAAO,QAAQ,CAAC;AAC7E,YAAM,OAAO,MAAM,QAAQ,QAAQ,IAAI,IAAI,OAAO,KAAK,OAAO,gBAAgB,IAAI,CAAC;AACnF,YAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,IAAI,OAAO,OAAO,OAAO,gBAAgB,IAAI,CAAC;AACzF,YAAM,YAAY,OAAO,QAAQ,cAAc,WAAW,OAAO,YAAY;AAE7E,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,qBAAqB,KAAK,SAAS,OAAO,UAAU;AAAA,QACpD;AAAA,QACA,qBAAqB;AAAA,UACnB,QAAQ,KAAK;AAAA,UACb,GAAI,KAAK,MAAM,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC;AAAA,QACtC;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,aAAO;AAAA,QACL,OAAO;AAAA,QACP,MAAM,CAAC;AAAA,QACP,QAAQ,CAAC,0BAA0B,OAAO,EAAE;AAAA,QAC5C,qBAAqB;AAAA,QACrB,WAAW;AAAA,QACX,qBAAqB;AAAA,UACnB,QAAQ,KAAK;AAAA,UACb,GAAI,KAAK,MAAM,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC;AAAA,UACpC,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAIA,eAAe,cACb,YACA,OACA,gBACA,KACiB;AACjB,QAAM,EAAE,OAAAE,OAAM,IAAI,MAAM,OAAO,eAAoB;AAEnD,SAAO,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AACpD,UAAM,QAAQA,OAAM,YAAY;AAAA,MAC9B,OAAO;AAAA,MACP;AAAA,IACF,CAAC;AAED,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,UAAM,UAAU,iBACZ,WAAW,MAAM;AACf,YAAM,KAAK;AACX,aAAO,IAAI,MAAM,kCAAkC,cAAc,IAAI,CAAC;AAAA,IACxE,GAAG,cAAc,IACjB;AAEJ,UAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS;AACjC,gBAAU,KAAK,SAAS;AAAA,IAC1B,CAAC;AACD,UAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS;AACjC,gBAAU,KAAK,SAAS;AAAA,IAC1B,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,UAAI,YAAY,QAAW;AACzB,qBAAa,OAAO;AAAA,MACtB;AACA,aAAO,KAAK;AAAA,IACd,CAAC;AACD,UAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,UAAI,YAAY,QAAW;AACzB,qBAAa,OAAO;AAAA,MACtB;AACA,UAAI,QAAQ,SAAS,KAAK,OAAO,SAAS,GAAG;AAC3C,eAAO,IAAI,MAAM,mCAAmC,IAAI,KAAK,OAAO,KAAK,CAAC,EAAE,CAAC;AAC7E;AAAA,MACF;AACA,cAAQ,OAAO,KAAK,CAAC;AAAA,IACvB,CAAC;AAED,UAAM,OAAO,MAAM,KAAK;AACxB,UAAM,OAAO,IAAI;AAAA,EACnB,CAAC;AACH;AAEA,SAAS,cAAc,SAAsD;AAC3E,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAAoB,UAAkB,WAA2C;AACxF,SAAO,SAAS,QAAQ,4BAA4B,CAAC,OAAO,YAAY;AACtE,WAAO,UAAU,OAAO,KAAK;AAAA,EAC/B,CAAC;AACH;;;AC/aA,IAAAC,sBAAuC;AACvC,IAAAC,oBAAiC;AACjC,IAAAC,qBAAiB;;;ACGjB,IAAM,OAAN,MAAW;AAAA,EACV;AAAA,EACA;AAAA,EAEA,YAAY,OAAO;AAClB,SAAK,QAAQ;AAAA,EACd;AACD;AAEA,IAAqB,QAArB,MAA2B;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EAEA,cAAc;AACb,SAAK,MAAM;AAAA,EACZ;AAAA,EAEA,QAAQ,OAAO;AACd,UAAM,OAAO,IAAI,KAAK,KAAK;AAE3B,QAAI,KAAK,OAAO;AACf,WAAK,MAAM,OAAO;AAClB,WAAK,QAAQ;AAAA,IACd,OAAO;AACN,WAAK,QAAQ;AACb,WAAK,QAAQ;AAAA,IACd;AAEA,SAAK;AAAA,EACN;AAAA,EAEA,UAAU;AACT,UAAM,UAAU,KAAK;AACrB,QAAI,CAAC,SAAS;AACb;AAAA,IACD;AAEA,SAAK,QAAQ,KAAK,MAAM;AACxB,SAAK;AACL,WAAO,QAAQ;AAAA,EAChB;AAAA,EAEA,OAAO;AACN,QAAI,CAAC,KAAK,OAAO;AAChB;AAAA,IACD;AAEA,WAAO,KAAK,MAAM;AAAA,EAInB;AAAA,EAEA,QAAQ;AACP,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,QAAQ;AAAA,EACd;AAAA,EAEA,IAAI,OAAO;AACV,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,EAAG,OAAO,QAAQ,IAAI;AACrB,QAAI,UAAU,KAAK;AAEnB,WAAO,SAAS;AACf,YAAM,QAAQ;AACd,gBAAU,QAAQ;AAAA,IACnB;AAAA,EACD;AAAA,EAEA,CAAE,QAAQ;AACT,WAAO,KAAK,OAAO;AAClB,YAAM,KAAK,QAAQ;AAAA,IACpB;AAAA,EACD;AACD;;;ACjFe,SAAR,OAAwB,aAAa;AAC3C,sBAAoB,WAAW;AAE/B,QAAM,QAAQ,IAAI,MAAM;AACxB,MAAI,cAAc;AAElB,QAAM,aAAa,MAAM;AACxB,QAAI,cAAc,eAAe,MAAM,OAAO,GAAG;AAChD,YAAM,QAAQ,EAAE;AAEhB;AAAA,IACD;AAAA,EACD;AAEA,QAAM,OAAO,MAAM;AAClB;AAEA,eAAW;AAAA,EACZ;AAEA,QAAM,MAAM,OAAO,WAAW,SAAS,eAAe;AACrD,UAAM,UAAU,YAAY,UAAU,GAAG,UAAU,GAAG;AAEtD,YAAQ,MAAM;AAEd,QAAI;AACH,YAAM;AAAA,IACP,QAAQ;AAAA,IAAC;AAET,SAAK;AAAA,EACN;AAEA,QAAM,UAAU,CAAC,WAAW,SAAS,eAAe;AAGnD,QAAI,QAAQ,qBAAmB;AAC9B,YAAM,QAAQ,eAAe;AAAA,IAC9B,CAAC,EAAE;AAAA,MACF,IAAI,KAAK,QAAW,WAAW,SAAS,UAAU;AAAA,IACnD;AAEA,KAAC,YAAY;AAKZ,YAAM,QAAQ,QAAQ;AAEtB,UAAI,cAAc,aAAa;AAC9B,mBAAW;AAAA,MACZ;AAAA,IACD,GAAG;AAAA,EACJ;AAEA,QAAM,YAAY,CAAC,cAAc,eAAe,IAAI,QAAQ,aAAW;AACtE,YAAQ,WAAW,SAAS,UAAU;AAAA,EACvC,CAAC;AAED,SAAO,iBAAiB,WAAW;AAAA,IAClC,aAAa;AAAA,MACZ,KAAK,MAAM;AAAA,IACZ;AAAA,IACA,cAAc;AAAA,MACb,KAAK,MAAM,MAAM;AAAA,IAClB;AAAA,IACA,YAAY;AAAA,MACX,QAAQ;AACP,cAAM,MAAM;AAAA,MACb;AAAA,IACD;AAAA,IACA,aAAa;AAAA,MACZ,KAAK,MAAM;AAAA,MAEX,IAAI,gBAAgB;AACnB,4BAAoB,cAAc;AAClC,sBAAc;AAEd,uBAAe,MAAM;AAEpB,iBAAO,cAAc,eAAe,MAAM,OAAO,GAAG;AACnD,uBAAW;AAAA,UACZ;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD;AAAA,EACD,CAAC;AAED,SAAO;AACR;AASA,SAAS,oBAAoB,aAAa;AACzC,MAAI,GAAG,OAAO,UAAU,WAAW,KAAK,gBAAgB,OAAO,sBAAsB,cAAc,IAAI;AACtG,UAAM,IAAI,UAAU,qDAAqD;AAAA,EAC1E;AACD;;;AF/BA,eAAsB,cAAc,SAAqE;AACvG,QAAM;AAAA,IACJ,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,OAAO;AACb,QAAM,YAAY,MAAM,KAAK,cAAc,UAAU,EAAE,SAAS,OAAO,CAAC;AAExE,QAAM,oBAAoB,gBAAgB,WAAW,MAAM;AAC3D,MAAI,kBAAkB,WAAW,GAAG;AAClC,QAAI,QAAQ;AACV,YAAM,IAAI,MAAM,sBAAsB,MAAM,kBAAkB,YAAY,EAAE;AAAA,IAC9E;AACA,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,wBAAwB,oBAAI,IAA4B;AAC9D,wBAAsB,IAAI,OAAO,MAAM,MAAM;AAE7C,QAAM,oBAAoB,oBAAI,IAA8B;AAC5D,aAAW,cAAc,WAAW,CAAC,GAAG;AACtC,sBAAkB,IAAI,WAAW,MAAM,UAAU;AAAA,EACnD;AAEA,QAAM,YAAuB,OAAO,QAAQ;AAC5C,QAAM,gBAAgB,oBAAI,IAAsB;AAEhD,QAAM,sBAAsB,CAAC,aAAuC;AAClE,UAAM,WAAW,cAAc,IAAI,SAAS,IAAI;AAChD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AACA,UAAM,UAAU,mBAAmB;AACnC,UAAM,WAAW,QAAQ,QAAQ;AACjC,kBAAc,IAAI,SAAS,MAAM,QAAQ;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,sBAAsB,CAAC,SAA6C;AACxE,QAAI,sBAAsB,IAAI,IAAI,GAAG;AACnC,aAAO,sBAAsB,IAAI,IAAI;AAAA,IACvC;AACA,UAAM,aAAa,kBAAkB,IAAI,IAAI;AAC7C,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AACA,UAAM,WAAW,wBAAwB,YAAY,SAAS;AAC9D,0BAAsB,IAAI,MAAM,QAAQ;AACxC,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,OAAO,kBAAiE;AACnG,UAAM,YAAY,cAAc,eAAe,cAAc;AAC7D,UAAM,gBAAgB,oBAAoB,SAAS;AACnD,QAAI,CAAC,eAAe;AAClB,aAAO,oBAAoB,aAAa;AAAA,IAC1C;AACA,WAAO,oBAAoB,aAAa;AAAA,EAC1C;AAEA,QAAM,oBAAoB,uBAAuB,YAAY,oBAAoB;AAEjF,QAAM,kBAAkB,oBAAoB,MAAM;AAClD,QAAM,wBACJ,OAAO,qBAAqB,QAC5B,gBAAgB,kBAAkB,QAClC,OAAO,gBAAgB,gBAAgB;AACzC,MAAI,OAAO,oBAAoB,CAAC,yBAAyB,SAAS;AAChE,YAAQ;AAAA,MACN,2CAA2C,OAAO,IAAI;AAAA,IACxD;AAAA,EACF;AAGA,MAAI,cAAc,kBAAkB,SAAS,GAAG;AAE9C,aAAS,IAAI,GAAG,IAAI,kBAAkB,QAAQ,KAAK;AACjD,YAAM,WAAW;AAAA,QACf,UAAU,IAAI;AAAA,QACd,QAAQ,kBAAkB,CAAC,EAAE;AAAA,QAC7B,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,uBAAuB;AACzB,QAAI;AACF,aAAO,MAAM,mBAAmB;AAAA,QAC9B,WAAW;AAAA,QACX,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,QAAQ,MAAM,oBAAI,KAAK;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,SAAS;AACX,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,gBAAQ,KAAK,uEAAuE,OAAO,EAAE;AAAA,MAC/F;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAAU,QAAQ,kBAAkB,OAAO,WAAW;AAC5D,QAAM,QAAQ,OAAO,OAAO;AAG5B,MAAI,eAAe;AACnB,QAAM,mBAAmB,oBAAI,IAAoB;AAGjD,QAAM,WAAW,kBAAkB;AAAA,IAAI,CAAC,aACtC,MAAM,YAAY;AAEhB,YAAM,WAAW;AACjB,uBAAiB,IAAI,SAAS,IAAI,QAAQ;AAE1C,UAAI,YAAY;AACd,cAAM,WAAW;AAAA,UACf;AAAA,UACA,QAAQ,SAAS;AAAA,UACjB,QAAQ;AAAA,UACR,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AAAA,MACH;AAEA,UAAI;AACF,cAAM,gBAAgB,MAAM,qBAAqB,MAAM;AACvD,cAAM,SAAS,MAAM,YAAY;AAAA,UAC/B;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,YAAY;AACd,gBAAM,WAAW;AAAA,YACf;AAAA,YACA,QAAQ,SAAS;AAAA,YACjB,QAAQ,OAAO,QAAQ,WAAW;AAAA,YAClC,WAAW;AAAA;AAAA,YACX,aAAa,KAAK,IAAI;AAAA,YACtB,OAAO,OAAO;AAAA,UAChB,CAAC;AAAA,QACH;AAEA,YAAI,UAAU;AACZ,gBAAM,SAAS,MAAM;AAAA,QACvB;AACA,eAAO;AAAA,MACT,SAAS,OAAO;AACd,YAAI,YAAY;AACd,gBAAM,WAAW;AAAA,YACf;AAAA,YACA,QAAQ,SAAS;AAAA,YACjB,QAAQ;AAAA,YACR,aAAa,KAAK,IAAI;AAAA,YACtB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,CAAC;AAAA,QACH;AACA,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,UAAU,MAAM,QAAQ,WAAW,QAAQ;AAGjD,QAAM,UAA8B,CAAC;AACrC,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,UAAU,QAAQ,CAAC;AACzB,QAAI,QAAQ,WAAW,aAAa;AAClC,cAAQ,KAAK,QAAQ,KAAK;AAAA,IAC5B,OAAO;AAEL,YAAM,WAAW,kBAAkB,CAAC;AACpC,YAAM,eAAe,MAAM,kBAAkB,QAAQ;AACrD,YAAM,cAAc;AAAA,QAClB;AAAA,QACA,OAAO;AAAA,SACN,QAAQ,MAAM,oBAAI,KAAK,IAAI;AAAA,QAC5B,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF;AACA,cAAQ,KAAK,WAAW;AACxB,UAAI,UAAU;AACZ,cAAM,SAAS,WAAW;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,mBAAmB,SAYO;AACvC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAGJ,QAAM,mBAAmC,CAAC;AAC1C,aAAW,YAAY,WAAW;AAChC,UAAM,eAAe,MAAM,kBAAkB,QAAQ;AACrD,QAAI,eAAe;AACjB,YAAM,WAAW,eAAe,UAAU,YAAY;AAAA,IACxD;AACA,qBAAiB,KAAK,YAAY;AAAA,EACpC;AAEA,QAAM,gBAAmC,UAAU,IAAI,CAAC,UAAU,UAAU;AAC1E,UAAM,eAAe,iBAAiB,KAAK;AAC3C,WAAO;AAAA,MACL,UAAU,aAAa;AAAA,MACvB,YAAY,aAAa;AAAA,MACzB,oBAAoB,SAAS;AAAA,MAC7B,YAAY,SAAS;AAAA,MACrB,YAAY,SAAS;AAAA,MACrB,UAAU;AAAA,QACR,cAAc,aAAa,iBAAiB;AAAA,MAC9C;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,MAAM,SAAS,cAAc,aAAa;AAChE,MAAI,CAAC,MAAM,QAAQ,aAAa,GAAG;AACjC,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF;AACA,MAAI,cAAc,WAAW,UAAU,QAAQ;AAC7C,UAAM,IAAI;AAAA,MACR,sCAAsC,UAAU,MAAM,wBAAwB,cAAc,MAAM;AAAA,IACpG;AAAA,EACF;AAEA,MAAI,YAAY;AACd,UAAM,YAAY,KAAK,IAAI;AAC3B,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAM,WAAW;AAAA,QACf,UAAU;AAAA,QACV,QAAQ,UAAU,CAAC,EAAE;AAAA,QACrB,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,UAA8B,CAAC;AACrC,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAM,WAAW,UAAU,CAAC;AAC5B,UAAM,eAAe,iBAAiB,CAAC;AACvC,UAAM,mBAAmB,cAAc,CAAC;AACxC,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,kBAAkB;AAAA,QAC/B;AAAA,QACA,WAAW,iBAAiB,QAAQ;AAAA,QACpC;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,eAAe,MAAM,qBAAqB,MAAM;AAAA,QAChD;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,cAAc,iBAAiB,UAAU,OAAO,MAAM,MAAM,GAAG,OAAO,cAAc,QAAQ;AAClG,cAAQ,KAAK,WAAW;AACxB,UAAI,UAAU;AACZ,cAAM,SAAS,WAAW;AAAA,MAC5B;AACA,UAAI,YAAY;AACd,cAAM,WAAW;AAAA,UACf,UAAU;AAAA,UACV,QAAQ,SAAS;AAAA,UACjB,QAAQ;AAAA,UACR,aAAa,KAAK,IAAI;AAAA,UACtB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,YAAQ,KAAK,MAAM;AACnB,QAAI,UAAU;AACZ,YAAM,SAAS,MAAM;AAAA,IACvB;AAEA,QAAI,YAAY;AACd,YAAM,WAAW;AAAA,QACf,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,QACjB,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,aAAa,KAAK,IAAI;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,YAAY,SAAwD;AACxF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,eAAe,MAAM,kBAAkB,QAAQ;AACrD,MAAI,eAAe;AACjB,UAAM,WAAW,eAAe,UAAU,YAAY;AAAA,EACxD;AAEA,QAAM,WAAW,WAAW,eAAe,UAAU,QAAQ,UAAU,YAAY,IAAI;AACvF,MAAI;AACJ,MAAI,YAAY,OAAO;AACrB,qBAAiB,MAAM,MAAM,IAAI,QAAQ;AAAA,EAC3C;AAEA,QAAM,QAAQ,QAAQ,MAAM,oBAAI,KAAK;AAErC,QAAM,iBAAiB,cAAc,KAAK;AAC1C,MAAI,UAAU;AACd,MAAI,mBAAiD;AACrD,MAAI;AAEJ,SAAO,CAAC,oBAAoB,UAAU,eAAe;AACnD,QAAI;AACF,yBAAmB,MAAM,eAAe,UAAU;AAAA,QAChD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,kBAAY;AACZ,UAAI,cAAc,KAAK,KAAK,UAAU,IAAI,eAAe;AACvD,mBAAW;AACX;AAAA,MACF;AACA,aAAO,iBAAiB,UAAU,OAAO,MAAM,MAAM,GAAG,OAAO,cAAc,QAAQ;AAAA,IACvF;AAAA,EACF;AAEA,MAAI,CAAC,kBAAkB;AACrB,WAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa,IAAI,MAAM,oCAAoC;AAAA,MAC3D;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY,SAAS,CAAC,gBAAgB;AACxC,UAAM,MAAM,IAAI,UAAU,gBAAgB;AAAA,EAC5C;AAEA,MAAI;AACF,WAAO,MAAM,kBAAkB;AAAA,MAC7B;AAAA,MACA,WAAW,iBAAiB,QAAQ;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,WAAO,iBAAiB,UAAU,OAAO,MAAM,MAAM,GAAG,OAAO,cAAc,QAAQ;AAAA,EACvF;AACF;AAEA,eAAe,kBAAkB,SAWH;AAC5B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,iBAAiB,MAAM;AAC7B,QAAM,EAAE,OAAO,iBAAiB,IAAI,MAAM,qBAAqB;AAAA,IAC7D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,cAAc,MAAM;AAE1B,MAAI;AACJ,MAAI;AAEJ,MAAI,gBAAgB,QAAQ,GAAG;AAC7B,2BAAuB;AAAA,MACrB,UAAU,aAAa;AAAA,MACvB,iBAAiB,SAAS;AAAA,IAC5B;AAAA,EACF,OAAO;AACL,QAAI,aAAa,YAAY;AAC3B,0BAAoB;AAAA,QAClB,aAAa,aAAa;AAAA,QAC1B,iBAAiB,SAAS;AAAA,MAC5B;AAAA,IACF,OAAO;AACL,0BAAoB;AAAA,QAClB,UAAU,aAAa;AAAA,QACvB,YAAY,aAAa;AAAA,QACzB,iBAAiB,SAAS;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW,YAAY,YAAY;AAAA,IACnC,SAAS,SAAS;AAAA,IAClB,SAAS,SAAS;AAAA,IAClB,iBAAiB,SAAS;AAAA,IAC1B,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM;AAAA,IACd,kBAAkB;AAAA,IAClB,QAAQ,OAAO;AAAA,IACf,WAAW,MAAM;AAAA,IACjB,aAAa,MAAM;AAAA,IACnB,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,4BAA4B,mBAAmB,SAAY,MAAM;AAAA,IACjE,mBAAmB;AAAA,EACrB;AACF;AAEA,eAAe,qBAAqB,SAW0C;AAC5E,QAAM,EAAE,UAAU,WAAW,QAAQ,UAAU,YAAY,SAAS,cAAc,KAAK,eAAe,eAAe,IACnH;AAEF,MAAI,SAAS,cAAc,SAAS,WAAW,SAAS,GAAG;AACzD,WAAO,iBAAiB;AAAA,MACtB;AAAA,MACA,YAAY,SAAS;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA,mBAAmB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,SAAS,aAAa;AAC5C,QAAM,kBAAkB,WAAW,aAAa,KAAK,WAAW;AAChE,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI,MAAM,qCAAqC,aAAa,GAAG;AAAA,EACvE;AAEA,QAAM,QAAQ,MAAM,gBAAgB,SAAS;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,EAAE,MAAM;AACjB;AAEA,eAAe,iBAAiB,SAY6C;AAC3E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,SAAmG,CAAC;AAC1G,QAAM,mBAAsC,CAAC;AAE7C,aAAW,aAAa,cAAc,CAAC,GAAG;AACxC,QAAI;AACF,UAAI,UAAU,SAAS,aAAa;AAClC,cAAMC,SAAQ,MAAM,qBAAqB;AAAA,UACvC,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,eAAO,KAAK,EAAE,OAAAA,QAAO,MAAM,UAAU,MAAM,MAAM,UAAU,KAAK,CAAC;AACjE,yBAAiB,KAAK;AAAA,UACpB,MAAM,UAAU;AAAA,UAChB,MAAM,UAAU;AAAA,UAChB,OAAOA,OAAM;AAAA,UACb,MAAMA,OAAM;AAAA,UACZ,QAAQA,OAAM;AAAA,UACd,WAAWA,OAAM;AAAA,UACjB,4BAA4BA,OAAM;AAAA,QACpC,CAAC;AACD;AAAA,MACF;AAEA,UAAI,UAAU,SAAS,QAAQ;AAC7B,cAAM,gBAAgB,IAAI,cAAc;AAAA,UACtC,QAAQ,UAAU;AAAA,UAClB,KAAK,UAAU,eAAe,UAAU;AAAA,UACxC;AAAA,QACF,CAAC;AACD,cAAMA,SAAQ,MAAM,cAAc,SAAS;AAAA,UACzC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,eAAO,KAAK,EAAE,OAAAA,QAAO,MAAM,UAAU,MAAM,MAAM,UAAU,KAAK,CAAC;AACjE,yBAAiB,KAAK;AAAA,UACpB,MAAM,UAAU;AAAA,UAChB,MAAM,UAAU;AAAA,UAChB,OAAOA,OAAM;AAAA,UACb,MAAMA,OAAM;AAAA,UACZ,QAAQA,OAAM;AAAA,UACd,WAAWA,OAAM;AAAA,UACjB,4BAA4BA,OAAM;AAAA,QACpC,CAAC;AACD;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAM,gBAAiC;AAAA,QACrC,OAAO;AAAA,QACP,MAAM,CAAC;AAAA,QACP,QAAQ,CAAC,cAAc,UAAU,IAAI,aAAa,OAAO,EAAE;AAAA,QAC3D,qBAAqB;AAAA,QACrB,WAAW;AAAA,MACb;AACA,aAAO,KAAK,EAAE,OAAO,eAAe,MAAM,UAAU,QAAQ,WAAW,MAAM,UAAU,QAAQ,UAAU,CAAC;AAC1G,uBAAiB,KAAK;AAAA,QACpB,MAAM,UAAU,QAAQ;AAAA,QACxB,MAAM,UAAU,QAAQ;AAAA,QACxB,OAAO;AAAA,QACP,MAAM,CAAC;AAAA,QACP,QAAQ,CAAC,cAAc,UAAU,QAAQ,SAAS,aAAa,OAAO,EAAE;AAAA,QACxE,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,iBACJ,OAAO,SAAS,IAAI,OAAO,OAAO,CAAC,OAAO,UAAU,QAAQ,MAAM,MAAM,OAAO,CAAC,IAAI,OAAO,SAAS;AACtG,QAAM,OAAO,OAAO,QAAQ,CAAC,UAAU,MAAM,MAAM,IAAI;AACvD,QAAM,SAAS,OAAO,QAAQ,CAAC,UAAU,MAAM,MAAM,MAAM;AAC3D,QAAM,sBAAsB,OAAO,OAAO,CAAC,OAAO,UAAU,SAAS,MAAM,MAAM,uBAAuB,IAAI,CAAC;AAC7G,QAAM,aAAa,OAAO,QAAQ,CAAC,UAAU,MAAM,MAAM,cAAc,CAAC,CAAC;AACzE,QAAM,iBAAiB,OACpB,IAAI,CAAC,UAAW,MAAM,MAAM,YAAY,GAAG,MAAM,IAAI,KAAK,MAAM,MAAM,SAAS,KAAK,MAAU,EAC9F,OAAOC,iBAAgB;AAC1B,QAAM,YAAY,eAAe,SAAS,IAAI,eAAe,KAAK,KAAK,IAAI;AAE3E,QAAM,QAAyB;AAAA,IAC7B,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,WAAW,SAAS,IAAI,aAAa;AAAA,EACnD;AAEA,SAAO,EAAE,OAAO,iBAAiB;AACnC;AAEA,eAAe,qBAAqB,SAWP;AAC3B,QAAM,EAAE,QAAQ,UAAU,WAAW,QAAQ,UAAU,mBAAmB,SAAS,cAAc,KAAK,cAAc,IAClH;AACF,QAAM,eAAe,MAAM,oBAAoB,MAAM;AAErD,SAAO,kBAAkB,UAAU,SAAS;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,2BAA2B;AAAA,IAC3B,WAAW;AAAA,EACb,CAAC;AACH;AAEA,eAAe,oBAAoB,QAAiG;AAClI,MAAI,OAAO,YAAY;AACrB,QAAI;AACF,aAAO,MAAM,aAAa,OAAO,UAAU;AAAA,IAC7C,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,KAAK,mCAAmC,OAAO,UAAU,KAAK,OAAO,EAAE;AAAA,IACjF;AAAA,EACF;AACA,SAAO,OAAO;AAChB;AAEA,SAASA,kBAAiB,OAAiC;AACzD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAC5D;AAEA,SAAS,gBAAgB,WAAgC,QAAsC;AAC7F,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,SAAO,UAAU,OAAO,CAAC,aAAa,SAAS,OAAO,MAAM;AAC9D;AAEA,SAAS,uBACP,WACA,sBACwE;AACxE,QAAM,WACJ,WAAW,aACX,IAAI,kBAAkB;AAAA,IACpB,sBAAsB,OAAO,YAAY;AACvC,UAAI,QAAQ,eAAe;AACzB,eAAO,QAAQ;AAAA,MACjB;AACA,aAAO,qBAAqB,QAAQ,MAAM;AAAA,IAC5C;AAAA,EACF,CAAC;AAEH,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,EACb;AACF;AAEA,eAAe,WACb,WACA,UACA,cACe;AACf,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,WAAW,GAAG,SAAS,IAAI,iBAAiB,SAAS,EAAE,CAAC;AAC9D,QAAM,WAAW,mBAAAC,QAAK,QAAQ,WAAW,QAAQ;AAEjD,YAAM,yBAAM,mBAAAA,QAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,QAAM,UAAU;AAAA,IACd,SAAS,SAAS;AAAA,IAClB,UAAU,aAAa;AAAA,IACvB,YAAY,aAAa;AAAA,IACzB,iBAAiB,SAAS;AAAA,EAC5B;AAEA,YAAM,6BAAU,UAAU,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG,MAAM;AACpE;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,YAAY,MAAM,QAAQ,qBAAqB,GAAG;AACxD,SAAO,UAAU,SAAS,IAAI,gBAAY,gCAAW;AACvD;AAEA,eAAe,eACb,UACA,SAQ2B;AAC3B,QAAM,EAAE,UAAU,cAAc,SAAS,gBAAgB,OAAO,IAAI;AAEpE,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,iBACZ,WAAW,MAAM,WAAW,MAAM,GAAG,cAAc,IACnD;AAEJ,MAAI,QAAQ;AACV,WAAO,iBAAiB,SAAS,MAAM,WAAW,MAAM,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,EAC3E;AAEA,MAAI;AACF,WAAO,MAAM,SAAS,OAAO;AAAA,MAC3B,UAAU,aAAa;AAAA,MACvB,YAAY,aAAa;AAAA,MACzB,oBAAoB,SAAS;AAAA,MAC7B,YAAY,aAAa;AAAA,MACzB,YAAY,SAAS;AAAA,MACrB,YAAY,SAAS;AAAA,MACrB;AAAA,MACA,UAAU;AAAA,QACR,cAAc,aAAa,iBAAiB;AAAA,MAC9C;AAAA,MACA,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH,UAAE;AACA,QAAI,YAAY,QAAW;AACzB,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF;AACF;AAEA,SAAS,iBACP,UACA,YACA,WACA,OACA,cACA,UACkB;AAClB,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAErE,MAAI;AACJ,MAAI;AAEJ,MAAI,gBAAgB,QAAQ,GAAG;AAC7B,2BAAuB;AAAA,MACrB,UAAU,aAAa;AAAA,MACvB,iBAAiB,SAAS;AAAA,MAC1B,OAAO;AAAA,IACT;AAAA,EACF,OAAO;AACL,QAAI,aAAa,YAAY;AAC3B,0BAAoB;AAAA,QAClB,aAAa,aAAa;AAAA,QAC1B,iBAAiB,SAAS;AAAA,QAC1B,OAAO;AAAA,MACT;AAAA,IACF,OAAO;AACL,0BAAoB;AAAA,QAClB,UAAU,aAAa;AAAA,QACvB,YAAY,aAAa;AAAA,QACzB,iBAAiB,SAAS;AAAA,QAC1B,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW,UAAU,YAAY;AAAA,IACjC,SAAS,SAAS;AAAA,IAClB,SAAS,SAAS;AAAA,IAClB,iBAAiB,SAAS;AAAA,IAC1B,OAAO;AAAA,IACP,MAAM,CAAC;AAAA,IACP,QAAQ,CAAC,UAAU,OAAO,EAAE;AAAA,IAC5B,kBAAkB,mBAAmB,OAAO;AAAA,IAC5C,QAAQ;AAAA,IACR,aAAa,CAAC;AAAA,IACd,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,IACrB,OAAO;AAAA,EACT;AACF;AAEA,SAAS,eACP,UACA,QACA,UACA,cACQ;AACR,QAAM,WAAO,gCAAW,QAAQ;AAChC,OAAK,OAAO,SAAS,EAAE;AACvB,OAAK,OAAO,OAAO,IAAI;AACvB,OAAK,OAAO,SAAS,EAAE;AACvB,OAAK,OAAO,aAAa,QAAQ;AACjC,OAAK,OAAO,aAAa,UAAU;AACnC,OAAK,OAAO,aAAa,iBAAiB,EAAE;AAC5C,MAAI,aAAa,YAAY;AAC3B,SAAK,OAAO,KAAK,UAAU,aAAa,UAAU,CAAC;AAAA,EACrD;AACA,SAAO,KAAK,OAAO,KAAK;AAC1B;AAEA,SAAS,cAAc,OAAyB;AAC9C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,MAAI,OAAO,iBAAiB,eAAe,iBAAiB,gBAAgB,MAAM,SAAS,cAAc;AACvG,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,OAAO;AAC1B,UAAM,OAAO,MAAM,MAAM,YAAY;AACrC,UAAM,UAAU,MAAM,SAAS,YAAY;AAC3C,WAAO,KAAK,SAAS,SAAS,KAAK,QAAQ,SAAS,SAAS;AAAA,EAC/D;AACA,QAAM,QAAQ,OAAO,KAAK,EAAE,YAAY;AACxC,SAAO,MAAM,SAAS,SAAS;AACjC;;;AtBn+BO,SAAS,oBAAiC;AAC/C,SAAO,EAAE,QAAQ,OAAO;AAC1B;","names":["buildDirectoryChain","buildSearchRoots","fileExists","resolveFileReference","import_promises","import_node_path","import_yaml","import_promises","import_node_path","path","path","micromatch","import_node_path","ANSI_YELLOW","ANSI_RESET","isJsonObject","logWarning","asString","path","import_promises","import_node_path","ANSI_YELLOW","ANSI_RESET","asString","logWarning","path","import_promises","import_node_path","ANSI_YELLOW","ANSI_RESET","path","logWarning","asString","ANSI_YELLOW","ANSI_RESET","path","asString","logWarning","import_node_fs","import_promises","import_node_path","fileExists","path","buildDirectoryChain","buildSearchRoots","trimLeadingSeparators","resolveFileReference","systemContent","import_promises","import_node_path","execWithCallback","fs","path","os","import_node_child_process","import_node_fs","import_promises","import_node_os","import_node_path","import_node_util","import_node_path","normalizeInputFiles","path","execAsync","execCallback","normalizeInputFiles","path","formatTimeoutSuffix","import_node_path","buildPromptDocument","collectGuidelineFiles","buildMandatoryPrereadBlock","path","pathToFileUri","path","import_node_fs","import_promises","import_node_path","import_yaml","fileExists","path","spawn","import_node_crypto","import_promises","import_node_path","score","isNonEmptyString","path"]}