@agentv/core 1.5.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -77
- package/dist/{chunk-E2VSU4WZ.js → chunk-KDEP4I7G.js} +116 -1
- package/dist/chunk-KDEP4I7G.js.map +1 -0
- package/dist/evaluation/validation/index.cjs +2 -0
- package/dist/evaluation/validation/index.cjs.map +1 -1
- package/dist/evaluation/validation/index.js +1 -1
- package/dist/index.cjs +2715 -675
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +207 -10
- package/dist/index.d.ts +207 -10
- package/dist/index.js +2491 -570
- package/dist/index.js.map +1 -1
- package/package.json +8 -2
- package/dist/chunk-E2VSU4WZ.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/evaluation/types.ts","../src/evaluation/trace.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/validation/prompt-validator.ts","../src/evaluation/template-variables.ts","../src/evaluation/loaders/message-processor.ts","../src/evaluation/formatting/prompt-builder.ts","../src/evaluation/file-utils.ts","../src/evaluation/providers/ai-sdk.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/pi-coding-agent.ts","../src/evaluation/providers/pi-log-tracker.ts","../src/evaluation/providers/targets.ts","../src/evaluation/providers/vscode.ts","../src/evaluation/providers/vscode-templates.ts","../src/evaluation/providers/targets-file.ts","../src/evaluation/providers/index.ts","../src/evaluation/evaluators.ts","../src/runtime/exec.ts","../src/evaluation/providers/types.ts","../src/evaluation/orchestrator.ts","../../../node_modules/.bun/yocto-queue@1.2.2/node_modules/yocto-queue/index.js","../../../node_modules/.bun/p-limit@6.2.0/node_modules/p-limit/index.js","../src/evaluation/generators/rubric-generator.ts"],"sourcesContent":["export * from './evaluation/types.js';\nexport * from './evaluation/trace.js';\nexport * from './evaluation/yaml-parser.js';\nexport * from './evaluation/file-utils.js';\nexport * from './evaluation/providers/index.js';\nexport * from './evaluation/evaluators.js';\nexport * from './evaluation/orchestrator.js';\nexport * from './evaluation/generators/index.js';\n\nexport type AgentKernel = {\n status: string;\n};\n\nexport function createAgentKernel(): AgentKernel {\n return { status: 'stub' };\n}\n","import type { ToolTrajectoryEvaluatorConfig, TraceSummary } from './trace.js';\n\n/**\n * JSON primitive values appearing in AgentV payloads.\n */\nexport type JsonPrimitive = string | number | boolean | null;\n\n/**\n * Immutable JSON object representation for test fixtures.\n */\nexport interface JsonObject {\n readonly [key: string]: JsonValue;\n}\n\n/**\n * Recursive JSON value supporting nested structures.\n */\nexport type JsonValue = JsonPrimitive | JsonObject | readonly JsonValue[];\n\nconst TEST_MESSAGE_ROLE_VALUES = ['system', 'user', 'assistant', 'tool'] as const;\n\n/**\n * Immutable list of supported message roles.\n */\nexport const TEST_MESSAGE_ROLES = TEST_MESSAGE_ROLE_VALUES;\n\n/**\n * Role literals used by test messages.\n */\nexport type TestMessageRole = (typeof TEST_MESSAGE_ROLE_VALUES)[number];\n\nconst TEST_MESSAGE_ROLE_SET: ReadonlySet<string> = new Set(TEST_MESSAGE_ROLE_VALUES);\n\n/**\n * Text or structured payload attached to a message.\n */\nexport type TestMessageContent = string | JsonObject | readonly JsonObject[];\n\n/**\n * System-authored instruction message.\n */\nexport type SystemTestMessage = {\n readonly role: 'system';\n readonly content: TestMessageContent;\n};\n\n/**\n * User-authored prompt message.\n */\nexport type UserTestMessage = {\n readonly role: 'user';\n readonly content: TestMessageContent;\n};\n\n/**\n * Assistant response message.\n */\nexport type AssistantTestMessage = {\n readonly role: 'assistant';\n readonly content: TestMessageContent;\n};\n\n/**\n * Tool invocation message.\n */\nexport type ToolTestMessage = {\n readonly role: 'tool';\n readonly content: TestMessageContent;\n};\n\n/**\n * Conversation message union with role discrimination.\n */\nexport type TestMessage =\n | SystemTestMessage\n | UserTestMessage\n | AssistantTestMessage\n | ToolTestMessage;\n\n/**\n * Guard validating supported message roles.\n */\nexport function isTestMessageRole(value: unknown): value is TestMessageRole {\n return typeof value === 'string' && TEST_MESSAGE_ROLE_SET.has(value);\n}\n\n/**\n * Guard matching AgentV JSON objects.\n */\nexport function isJsonObject(value: unknown): value is JsonObject {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n return Object.values(value as Record<string, unknown>).every(isJsonValue);\n}\n\n/**\n * Guard matching AgentV JSON values.\n */\nexport function isJsonValue(value: unknown): value is JsonValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n if (typeof value === 'object') {\n return isJsonObject(value);\n }\n return false;\n}\n\n/**\n * Guard validating raw test messages.\n * A valid test message has:\n * - A valid role (system, user, assistant, tool)\n * - Either content (string or array of objects) OR tool_calls (for assistant messages)\n */\nexport function isTestMessage(value: unknown): value is TestMessage {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const candidate = value as { role?: unknown; content?: unknown; tool_calls?: unknown };\n if (!isTestMessageRole(candidate.role)) {\n return false;\n }\n // Check for valid content\n if (typeof candidate.content === 'string') {\n return true;\n }\n if (Array.isArray(candidate.content) && candidate.content.every(isJsonObject)) {\n return true;\n }\n // Allow messages with tool_calls but no content (for expected_messages format)\n if (Array.isArray(candidate.tool_calls) && candidate.tool_calls.length > 0) {\n return true;\n }\n // Allow messages with structured content object (e.g., { recommendation: ..., summary: ... })\n if (isJsonObject(candidate.content)) {\n return true;\n }\n return false;\n}\n\nconst EVALUATOR_KIND_VALUES = [\n 'code_judge',\n 'llm_judge',\n 'rubric',\n 'composite',\n 'tool_trajectory',\n] as const;\n\nexport type EvaluatorKind = (typeof EVALUATOR_KIND_VALUES)[number];\n\nconst EVALUATOR_KIND_SET: ReadonlySet<string> = new Set(EVALUATOR_KIND_VALUES);\n\nexport function isEvaluatorKind(value: unknown): value is EvaluatorKind {\n return typeof value === 'string' && EVALUATOR_KIND_SET.has(value);\n}\n\nexport type CodeEvaluatorConfig = {\n readonly name: string;\n readonly type: 'code';\n readonly script: string;\n readonly resolvedScriptPath?: string;\n readonly cwd?: string;\n readonly resolvedCwd?: string;\n readonly weight?: number;\n};\n\nexport type LlmJudgeEvaluatorConfig = {\n readonly name: string;\n readonly type: 'llm_judge';\n readonly prompt?: string;\n readonly promptPath?: string;\n readonly rubrics?: readonly RubricItem[];\n readonly weight?: number;\n};\n\nexport type RubricItem = {\n readonly id: string;\n readonly description: string;\n readonly weight: number;\n readonly required: boolean;\n};\n\nexport type CompositeAggregatorConfig =\n | { readonly type: 'weighted_average'; readonly weights?: Record<string, number> }\n | { readonly type: 'code_judge'; readonly path: string; readonly cwd?: string }\n | {\n readonly type: 'llm_judge';\n readonly prompt?: string;\n readonly promptPath?: string;\n readonly model?: string;\n };\n\nexport type CompositeEvaluatorConfig = {\n readonly name: string;\n readonly type: 'composite';\n readonly evaluators: readonly EvaluatorConfig[];\n readonly aggregator: CompositeAggregatorConfig;\n readonly weight?: number;\n};\n\nexport type EvaluatorConfig =\n | CodeEvaluatorConfig\n | LlmJudgeEvaluatorConfig\n | CompositeEvaluatorConfig\n | ToolTrajectoryEvaluatorConfig;\n\n/**\n * Eval case definition sourced from AgentV specs.\n */\nexport interface EvalCase {\n readonly id: string;\n readonly dataset?: string;\n readonly conversation_id?: string;\n readonly question: string;\n readonly input_messages: readonly TestMessage[];\n readonly input_segments: readonly JsonObject[];\n readonly expected_messages: readonly JsonObject[];\n readonly reference_answer?: string;\n readonly guideline_paths: readonly string[];\n readonly guideline_patterns?: readonly string[];\n readonly file_paths: readonly string[];\n readonly code_snippets: readonly string[];\n readonly expected_outcome: string;\n readonly evaluator?: EvaluatorKind;\n readonly evaluators?: readonly EvaluatorConfig[];\n}\n\n/**\n * Evaluator scorecard for a single eval case run.\n */\nexport interface EvaluationResult {\n readonly timestamp: string;\n readonly evalId: string;\n readonly dataset?: string;\n readonly conversationId?: string;\n readonly score: number;\n readonly hits: readonly string[];\n readonly misses: readonly string[];\n readonly candidateAnswer: string;\n readonly target: string;\n readonly reasoning?: string;\n readonly rawAspects?: readonly string[];\n readonly agentProviderRequest?: JsonObject;\n readonly lmProviderRequest?: JsonObject;\n readonly evaluatorProviderRequest?: JsonObject;\n readonly evaluatorResults?: readonly EvaluatorResult[];\n readonly error?: string;\n /** Lightweight summary of the execution trace (always included when available) */\n readonly traceSummary?: TraceSummary;\n}\n\nexport type EvaluationVerdict = 'pass' | 'fail' | 'borderline';\n\nexport interface EvaluatorResult {\n readonly name: string;\n readonly type: EvaluatorKind;\n readonly score: number;\n readonly weight?: number;\n readonly verdict?: EvaluationVerdict;\n readonly hits: readonly string[];\n readonly misses: readonly string[];\n readonly reasoning?: string;\n readonly rawRequest?: JsonObject;\n readonly evaluatorProviderRequest?: JsonObject;\n readonly evaluatorResults?: readonly EvaluatorResult[];\n}\n\n/**\n * Convenience accessor matching the Python hit_count property.\n */\nexport function getHitCount(result: Pick<EvaluationResult, 'hits'>): number {\n return result.hits.length;\n}\n","/**\n * Trace event types for capturing agent execution traces.\n * Provides a normalized, provider-agnostic model for tool-call trajectories.\n */\n\n/**\n * Token usage metrics from provider execution.\n */\nexport interface TokenUsage {\n /** Input/prompt tokens consumed */\n readonly input: number;\n /** Output/completion tokens generated */\n readonly output: number;\n /** Cached tokens (optional, provider-specific) */\n readonly cached?: number;\n}\n\n/**\n * Compact summary of a trace for lightweight persistence.\n * Included in results by default to avoid payload bloat.\n */\nexport interface TraceSummary {\n /** Total number of events in trace */\n readonly eventCount: number;\n /** Unique tool names, sorted alphabetically */\n readonly toolNames: readonly string[];\n /** Map of tool name to call count */\n readonly toolCallsByName: Readonly<Record<string, number>>;\n /** Number of error events */\n readonly errorCount: number;\n /** Token usage metrics (optional, from provider) */\n readonly tokenUsage?: TokenUsage;\n /** Total cost in USD (optional, from provider) */\n readonly costUsd?: number;\n /** Total execution duration in milliseconds (optional) */\n readonly durationMs?: number;\n /** Per-tool duration arrays in milliseconds (optional) */\n readonly toolDurations?: Readonly<Record<string, readonly number[]>>;\n}\n\n/**\n * Configuration for tool_trajectory evaluator.\n */\nexport interface ToolTrajectoryEvaluatorConfig {\n readonly name: string;\n readonly type: 'tool_trajectory';\n /** Matching mode */\n readonly mode: 'any_order' | 'in_order' | 'exact';\n /** Minimum call counts per tool (for any_order mode) */\n readonly minimums?: Readonly<Record<string, number>>;\n /** Expected tool sequence (for in_order/exact modes) */\n readonly expected?: readonly ToolTrajectoryExpectedItem[];\n /** Optional weight for top-level aggregation (defaults to 1.0) */\n readonly weight?: number;\n}\n\n/**\n * Expected tool call item in a trajectory sequence.\n */\nexport interface ToolTrajectoryExpectedItem {\n readonly tool: string;\n /** Optional argument matching: 'any' skips validation, object performs partial deep equality */\n readonly args?: 'any' | Record<string, unknown>;\n}\n\n/**\n * Simplified input type for computeTraceSummary.\n * Matches OutputMessage structure without requiring full provider/types import.\n */\ninterface OutputMessageLike {\n readonly toolCalls?: readonly {\n readonly tool: string;\n }[];\n}\n\n/**\n * Compute a lightweight summary from output messages.\n * Used for default result persistence without payload bloat.\n */\nexport function computeTraceSummary(messages: readonly OutputMessageLike[]): TraceSummary {\n const toolCallCounts: Record<string, number> = {};\n let totalToolCalls = 0;\n\n for (const message of messages) {\n if (!message.toolCalls) continue;\n\n for (const toolCall of message.toolCalls) {\n toolCallCounts[toolCall.tool] = (toolCallCounts[toolCall.tool] ?? 0) + 1;\n totalToolCalls++;\n }\n }\n\n const toolNames = Object.keys(toolCallCounts).sort();\n\n return {\n eventCount: totalToolCalls,\n toolNames,\n toolCallsByName: toolCallCounts,\n errorCount: 0,\n };\n}\n\n/**\n * Default tool names considered as exploration/read-only operations.\n * Can be overridden per-evaluation via config.\n */\nexport const DEFAULT_EXPLORATION_TOOLS = [\n 'read',\n 'grep',\n 'glob',\n 'search',\n 'list',\n 'Read',\n 'Grep',\n 'Glob',\n 'WebSearch',\n 'WebFetch',\n] as const;\n\n/**\n * Ratio of exploration tool calls to total tool calls.\n * Returns undefined if there are no tool calls.\n *\n * @param summary - Trace summary with tool call counts\n * @param explorationTools - Tool names considered exploration (defaults to DEFAULT_EXPLORATION_TOOLS)\n * @returns Ratio between 0 and 1, or undefined if no tool calls\n */\nexport function explorationRatio(\n summary: TraceSummary,\n explorationTools: readonly string[] = DEFAULT_EXPLORATION_TOOLS,\n): number | undefined {\n if (summary.eventCount === 0) return undefined;\n\n const explorationCalls = explorationTools.reduce(\n (sum, tool) => sum + (summary.toolCallsByName[tool] ?? 0),\n 0,\n );\n\n return explorationCalls / summary.eventCount;\n}\n\n/**\n * Average tokens consumed per tool call.\n * Returns undefined if tokenUsage is not available or no tool calls.\n *\n * @param summary - Trace summary with optional token usage\n * @returns Average tokens per tool call, or undefined\n */\nexport function tokensPerTool(summary: TraceSummary): number | undefined {\n if (!summary.tokenUsage || summary.eventCount === 0) return undefined;\n\n const totalTokens = summary.tokenUsage.input + summary.tokenUsage.output;\n return totalTokens / summary.eventCount;\n}\n\n/**\n * Average tool duration across all tool calls.\n * Returns undefined if toolDurations is not available or empty.\n *\n * @param summary - Trace summary with optional tool durations\n * @returns Average duration in milliseconds, or undefined\n */\nexport function avgToolDurationMs(summary: TraceSummary): number | undefined {\n if (!summary.toolDurations) return undefined;\n\n let totalDuration = 0;\n let totalCalls = 0;\n\n for (const durations of Object.values(summary.toolDurations)) {\n for (const duration of durations) {\n totalDuration += duration;\n totalCalls++;\n }\n }\n\n if (totalCalls === 0) return undefined;\n return totalDuration / totalCalls;\n}\n\n/**\n * Execution metrics from provider response.\n */\nexport interface ExecutionMetrics {\n readonly tokenUsage?: TokenUsage;\n readonly costUsd?: number;\n readonly durationMs?: number;\n}\n\n/**\n * Merge execution metrics from provider response into a trace summary.\n * Returns a new TraceSummary with metrics fields populated.\n *\n * @param summary - Base trace summary from computeTraceSummary\n * @param metrics - Optional execution metrics from provider\n * @returns TraceSummary with merged metrics\n */\nexport function mergeExecutionMetrics(\n summary: TraceSummary,\n metrics?: ExecutionMetrics,\n): TraceSummary {\n if (!metrics) return summary;\n\n return {\n ...summary,\n tokenUsage: metrics.tokenUsage,\n costUsd: metrics.costUsd,\n durationMs: metrics.durationMs,\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { extractCodeBlocks } from './formatting/segment-formatter.js';\nimport { extractTargetFromSuite, loadConfig } from './loaders/config-loader.js';\nimport { coerceEvaluator, parseEvaluators } from './loaders/evaluator-parser.js';\nimport { buildSearchRoots, resolveToAbsolutePath } from './loaders/file-resolver.js';\nimport { processExpectedMessages, processMessages } from './loaders/message-processor.js';\nimport type { EvalCase, JsonObject, JsonValue, TestMessage } from './types.js';\nimport { isJsonObject, isTestMessage } from './types.js';\n\n// Re-export public APIs from modules\nexport { buildPromptInputs, type PromptInputs } from './formatting/prompt-builder.js';\nexport { extractCodeBlocks } from './formatting/segment-formatter.js';\nexport { isGuidelineFile } from './loaders/config-loader.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RED = '\\u001b[31m';\nconst ANSI_RESET = '\\u001b[0m';\n\ntype LoadOptions = {\n readonly verbose?: boolean;\n readonly evalId?: string;\n};\n\ntype RawTestSuite = JsonObject & {\n readonly evalcases?: JsonValue;\n readonly target?: JsonValue;\n readonly execution?: JsonValue;\n readonly dataset?: JsonValue;\n};\n\ntype RawEvalCase = JsonObject & {\n readonly id?: JsonValue;\n readonly conversation_id?: JsonValue;\n readonly outcome?: JsonValue;\n readonly expected_outcome?: JsonValue;\n readonly input_messages?: JsonValue;\n readonly expected_messages?: JsonValue;\n readonly execution?: JsonValue;\n readonly evaluators?: JsonValue;\n readonly rubrics?: JsonValue;\n};\n\n/**\n * Read metadata from a test suite file (like target name).\n * This is a convenience function for CLI tools that need metadata without loading all eval cases.\n */\nexport async function readTestSuiteMetadata(testFilePath: string): Promise<{ target?: string }> {\n try {\n const absolutePath = path.resolve(testFilePath);\n const content = await readFile(absolutePath, 'utf8');\n const parsed = parse(content) as unknown;\n\n if (!isJsonObject(parsed)) {\n return {};\n }\n\n return { target: extractTargetFromSuite(parsed) };\n } catch {\n return {};\n }\n}\n\n/**\n * Load eval cases from a AgentV YAML specification file.\n */\nexport async function loadEvalCases(\n evalFilePath: string,\n repoRoot: URL | string,\n options?: LoadOptions,\n): Promise<readonly EvalCase[]> {\n const verbose = options?.verbose ?? false;\n const evalIdFilter = options?.evalId;\n const absoluteTestPath = path.resolve(evalFilePath);\n\n const repoRootPath = resolveToAbsolutePath(repoRoot);\n const searchRoots = buildSearchRoots(absoluteTestPath, repoRootPath);\n\n // Load configuration (walks up directory tree to repo root)\n const config = await loadConfig(absoluteTestPath, repoRootPath);\n const guidelinePatterns = config?.guideline_patterns;\n\n const rawFile = await readFile(absoluteTestPath, 'utf8');\n const parsed = parse(rawFile) as unknown;\n if (!isJsonObject(parsed)) {\n throw new Error(`Invalid test file format: ${evalFilePath}`);\n }\n\n const suite = parsed as RawTestSuite;\n const datasetNameFromSuite = asString(suite.dataset)?.trim();\n const fallbackDataset = path.basename(absoluteTestPath).replace(/\\.ya?ml$/i, '') || 'eval';\n const datasetName =\n datasetNameFromSuite && datasetNameFromSuite.length > 0\n ? datasetNameFromSuite\n : fallbackDataset;\n\n const rawTestcases = suite.evalcases;\n if (!Array.isArray(rawTestcases)) {\n throw new Error(`Invalid test file format: ${evalFilePath} - missing 'evalcases' field`);\n }\n\n const globalEvaluator = coerceEvaluator(suite.evaluator, 'global') ?? 'llm_judge';\n\n // Extract global target from execution.target (or legacy root-level target)\n const globalExecution = isJsonObject(suite.execution) ? suite.execution : undefined;\n const _globalTarget = asString(globalExecution?.target) ?? asString(suite.target);\n\n const results: EvalCase[] = [];\n\n for (const rawEvalcase of rawTestcases) {\n if (!isJsonObject(rawEvalcase)) {\n logWarning('Skipping invalid eval case entry (expected object)');\n continue;\n }\n\n const evalcase = rawEvalcase as RawEvalCase;\n const id = asString(evalcase.id);\n\n // Skip eval cases that don't match the filter\n if (evalIdFilter && id !== evalIdFilter) {\n continue;\n }\n\n const conversationId = asString(evalcase.conversation_id);\n // Support both expected_outcome and outcome (backward compatibility)\n const outcome = asString(evalcase.expected_outcome) ?? asString(evalcase.outcome);\n\n const inputMessagesValue = evalcase.input_messages;\n const expectedMessagesValue = evalcase.expected_messages;\n\n if (!id || !outcome || !Array.isArray(inputMessagesValue)) {\n logError(\n `Skipping incomplete eval case: ${id ?? 'unknown'}. Missing required fields: id, outcome, and/or input_messages`,\n );\n continue;\n }\n\n // expected_messages is optional - for outcome-only evaluation\n const hasExpectedMessages =\n Array.isArray(expectedMessagesValue) && expectedMessagesValue.length > 0;\n\n // V2 format: input_messages vs expected_messages\n const inputMessages = inputMessagesValue.filter((msg): msg is TestMessage =>\n isTestMessage(msg),\n );\n const expectedMessages = hasExpectedMessages\n ? expectedMessagesValue.filter((msg): msg is TestMessage => isTestMessage(msg))\n : [];\n\n if (hasExpectedMessages && expectedMessages.length === 0) {\n logError(`No valid expected message found for eval case: ${id}`);\n continue;\n }\n\n const guidelinePaths: string[] = [];\n const inputTextParts: string[] = [];\n\n // Process all input messages to extract files and guidelines\n const inputSegments = await processMessages({\n messages: inputMessages,\n searchRoots,\n repoRootPath,\n guidelinePatterns,\n guidelinePaths,\n textParts: inputTextParts,\n messageType: 'input',\n verbose,\n });\n\n // Process expected_messages into segments (only if provided)\n // Preserve full message structure including role and tool_calls for expected_messages evaluator\n const outputSegments = hasExpectedMessages\n ? await processExpectedMessages({\n messages: expectedMessages,\n searchRoots,\n repoRootPath,\n verbose,\n })\n : [];\n\n const codeSnippets = extractCodeBlocks(inputSegments);\n\n // Build reference_answer:\n // Extract the content from the last message in expected_messages (similar to candidate_answer)\n let referenceAnswer = '';\n if (outputSegments.length > 0) {\n // Get the last message\n const lastMessage = outputSegments[outputSegments.length - 1];\n const content = lastMessage.content;\n const toolCalls = lastMessage.tool_calls;\n\n if (typeof content === 'string') {\n referenceAnswer = content;\n } else if (content !== undefined && content !== null) {\n // Serialize just the content, not the entire message\n referenceAnswer = JSON.stringify(content, null, 2);\n } else if (toolCalls !== undefined && toolCalls !== null) {\n // Message with only tool_calls - serialize just the tool_calls\n referenceAnswer = JSON.stringify(toolCalls, null, 2);\n }\n }\n const question = inputTextParts\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .join(' ');\n\n const evalCaseEvaluatorKind = coerceEvaluator(evalcase.evaluator, id) ?? globalEvaluator;\n let evaluators: Awaited<ReturnType<typeof parseEvaluators>>;\n try {\n evaluators = await parseEvaluators(evalcase, globalExecution, searchRoots, id ?? 'unknown');\n } catch (error) {\n // Skip entire eval case if evaluator validation fails\n const message = error instanceof Error ? error.message : String(error);\n logError(`Skipping eval case '${id}': ${message}`);\n continue;\n }\n\n // Handle inline rubrics field (syntactic sugar)\n const inlineRubrics = evalcase.rubrics;\n if (inlineRubrics !== undefined && Array.isArray(inlineRubrics)) {\n const rubricItems = inlineRubrics\n .filter((r): r is JsonObject | string => isJsonObject(r) || typeof r === 'string')\n .map((rubric, index) => {\n if (typeof rubric === 'string') {\n return {\n id: `rubric-${index + 1}`,\n description: rubric,\n weight: 1.0,\n required: true,\n };\n }\n return {\n id: asString(rubric.id) ?? `rubric-${index + 1}`,\n description: asString(rubric.description) ?? '',\n weight: typeof rubric.weight === 'number' ? rubric.weight : 1.0,\n required: typeof rubric.required === 'boolean' ? rubric.required : true,\n };\n })\n .filter((r) => r.description.length > 0);\n\n if (rubricItems.length > 0) {\n const rubricEvaluator: import('./types.js').LlmJudgeEvaluatorConfig = {\n name: 'rubric',\n type: 'llm_judge',\n rubrics: rubricItems,\n };\n // Prepend rubric evaluator to existing evaluators\n evaluators = evaluators ? [rubricEvaluator, ...evaluators] : [rubricEvaluator];\n }\n }\n\n // Extract file paths from all input segments (non-guideline files)\n const userFilePaths: string[] = [];\n for (const segment of inputSegments) {\n if (segment.type === 'file' && typeof segment.resolvedPath === 'string') {\n userFilePaths.push(segment.resolvedPath);\n }\n }\n\n // Combine all file paths (guidelines + regular files)\n const allFilePaths = [\n ...guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\n ...userFilePaths,\n ];\n\n const testCase: EvalCase = {\n id,\n dataset: datasetName,\n conversation_id: conversationId,\n question: question,\n input_messages: inputMessages,\n input_segments: inputSegments,\n expected_messages: outputSegments,\n reference_answer: referenceAnswer,\n guideline_paths: guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\n guideline_patterns: guidelinePatterns,\n file_paths: allFilePaths,\n code_snippets: codeSnippets,\n expected_outcome: outcome,\n evaluator: evalCaseEvaluatorKind,\n evaluators,\n };\n\n if (verbose) {\n console.log(`\\n[Eval Case: ${id}]`);\n if (testCase.guideline_paths.length > 0) {\n console.log(` Guidelines used: ${testCase.guideline_paths.length}`);\n for (const guidelinePath of testCase.guideline_paths) {\n console.log(` - ${guidelinePath}`);\n }\n } else {\n console.log(' No guidelines found');\n }\n }\n\n results.push(testCase);\n }\n\n return results;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\nfunction logError(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.error(`${ANSI_RED}Error: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.error(`${ANSI_RED}Error: ${message}${ANSI_RESET}`);\n }\n}\n","import type { JsonObject } from '../types.js';\n\n/**\n * Formatting mode for segment content.\n * - 'agent': File references only (for providers with filesystem access)\n * - 'lm': Embedded file content with XML tags (for language model providers)\n */\nexport type FormattingMode = 'agent' | 'lm';\n\n/**\n * Extract fenced code blocks from AgentV user segments.\n */\nexport function extractCodeBlocks(segments: readonly JsonObject[]): readonly string[] {\n const CODE_BLOCK_PATTERN = /```[\\s\\S]*?```/g;\n const codeBlocks: string[] = [];\n for (const segment of segments) {\n const typeValue = segment.type;\n if (typeof typeValue !== 'string' || typeValue !== 'text') {\n continue;\n }\n const textValue = segment.value;\n if (typeof textValue !== 'string') {\n continue;\n }\n const matches = textValue.match(CODE_BLOCK_PATTERN);\n if (matches) {\n codeBlocks.push(...matches);\n }\n }\n return codeBlocks;\n}\n\n/**\n * Format file contents with XML tags for all files.\n */\nexport function formatFileContents(\n parts: Array<{ content: string; isFile: boolean; displayPath?: string }>,\n): string {\n const fileCount = parts.filter((p) => p.isFile).length;\n\n // Use XML tags if any files are present\n if (fileCount > 0) {\n return parts\n .map((part) => {\n if (part.isFile && part.displayPath) {\n return `<file path=\"${part.displayPath}\">\\n${part.content}\\n</file>`;\n }\n return part.content;\n })\n .join('\\n\\n');\n }\n\n // Otherwise, join normally\n return parts.map((p) => p.content).join(' ');\n}\n\n/**\n * Format a segment into its display string.\n * Text segments return their value; file segments return formatted file content with header.\n *\n * @param segment - The segment to format\n * @param mode - Formatting mode: 'agent' for file references, 'lm' for embedded content\n */\nexport function formatSegment(\n segment: JsonObject,\n mode: FormattingMode = 'lm',\n): string | undefined {\n const type = asString(segment.type);\n\n if (type === 'text') {\n return asString(segment.value);\n }\n\n if (type === 'guideline_ref') {\n const refPath = asString(segment.path);\n return refPath ? `<Attached: ${refPath}>` : undefined;\n }\n\n if (type === 'file') {\n const filePath = asString(segment.path);\n if (!filePath) {\n return undefined;\n }\n\n // Agent mode: return file reference only\n if (mode === 'agent') {\n return `<file: path=\"${filePath}\">`;\n }\n\n // LM mode: return embedded content with XML tags\n const text = asString(segment.text);\n if (text && filePath) {\n // Use formatFileContents for consistent XML formatting\n return formatFileContents([{ content: text.trim(), isFile: true, displayPath: filePath }]);\n }\n }\n\n return undefined;\n}\n\n/**\n * Check if processed segments contain visible content (text or file attachments).\n */\nexport function hasVisibleContent(segments: readonly JsonObject[]): boolean {\n return segments.some((segment) => {\n const type = asString(segment.type);\n\n if (type === 'text') {\n const value = asString(segment.value);\n return value !== undefined && value.trim().length > 0;\n }\n\n if (type === 'guideline_ref') {\n return false;\n }\n\n if (type === 'file') {\n const text = asString(segment.text);\n return text !== undefined && text.trim().length > 0;\n }\n\n return false;\n });\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\nimport { parse } from 'yaml';\n\nimport type { JsonObject, JsonValue } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport { buildDirectoryChain, fileExists } from './file-resolver.js';\n\nconst SCHEMA_CONFIG_V2 = 'agentv-config-v2';\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\nexport type AgentVConfig = {\n readonly $schema?: JsonValue;\n readonly guideline_patterns?: readonly string[];\n};\n\n/**\n * Load optional .agentv/config.yaml configuration file.\n * Searches from eval file directory up to repo root.\n */\nexport async function loadConfig(\n evalFilePath: string,\n repoRoot: string,\n): Promise<AgentVConfig | null> {\n const directories = buildDirectoryChain(evalFilePath, repoRoot);\n\n for (const directory of directories) {\n const configPath = path.join(directory, '.agentv', 'config.yaml');\n\n if (!(await fileExists(configPath))) {\n continue;\n }\n\n try {\n const rawConfig = await readFile(configPath, 'utf8');\n const parsed = parse(rawConfig) as unknown;\n\n if (!isJsonObject(parsed)) {\n logWarning(`Invalid .agentv/config.yaml format at ${configPath}`);\n continue;\n }\n\n const config = parsed as AgentVConfig;\n\n // Check $schema field to ensure V2 format\n const schema = config.$schema;\n\n if (schema !== SCHEMA_CONFIG_V2) {\n const message =\n typeof schema === 'string'\n ? `Invalid $schema value '${schema}' in ${configPath}. Expected '${SCHEMA_CONFIG_V2}'`\n : `Missing required field '$schema' in ${configPath}.\\nPlease add '$schema: ${SCHEMA_CONFIG_V2}' at the top of the file.`;\n logWarning(message);\n continue;\n }\n\n const guidelinePatterns = config.guideline_patterns;\n if (guidelinePatterns !== undefined && !Array.isArray(guidelinePatterns)) {\n logWarning(`Invalid guideline_patterns in ${configPath}, expected array`);\n continue;\n }\n\n if (\n Array.isArray(guidelinePatterns) &&\n !guidelinePatterns.every((p) => typeof p === 'string')\n ) {\n logWarning(`Invalid guideline_patterns in ${configPath}, all entries must be strings`);\n continue;\n }\n\n return {\n guideline_patterns: guidelinePatterns as readonly string[] | undefined,\n };\n } catch (error) {\n logWarning(\n `Could not read .agentv/config.yaml at ${configPath}: ${(error as Error).message}`,\n );\n }\n }\n\n return null;\n}\n\n/**\n * Determine whether a path references guideline content (instructions or prompts).\n */\nexport function isGuidelineFile(filePath: string, patterns?: readonly string[]): boolean {\n const normalized = filePath.split('\\\\').join('/');\n const patternsToUse = patterns ?? [];\n\n return micromatch.isMatch(normalized, patternsToUse as string[]);\n}\n\n/**\n * Extract target name from parsed eval suite (checks execution.target then falls back to root-level target).\n */\nexport function extractTargetFromSuite(suite: JsonObject): string | undefined {\n // Check execution.target first (new location), fallback to root-level target (legacy)\n const execution = suite.execution;\n if (execution && typeof execution === 'object' && !Array.isArray(execution)) {\n const executionTarget = (execution as Record<string, unknown>).target;\n if (typeof executionTarget === 'string' && executionTarget.trim().length > 0) {\n return executionTarget.trim();\n }\n }\n\n // Fallback to legacy root-level target\n const targetValue = suite.target;\n if (typeof targetValue === 'string' && targetValue.trim().length > 0) {\n return targetValue.trim();\n }\n\n return undefined;\n}\n\nfunction logWarning(message: string): void {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n}\n","import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport path from 'node:path';\n\n/**\n * Check if a file exists on disk.\n */\nexport async function fileExists(absolutePath: string): Promise<boolean> {\n try {\n await access(absolutePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Convert URL or string to absolute file path.\n */\nexport function resolveToAbsolutePath(candidate: URL | string): string {\n if (candidate instanceof URL) {\n return new URL(candidate).pathname;\n }\n if (typeof candidate === 'string') {\n if (candidate.startsWith('file://')) {\n return new URL(candidate).pathname;\n }\n return path.resolve(candidate);\n }\n throw new TypeError('Unsupported repoRoot value. Expected string or URL.');\n}\n\n/**\n * Build a chain of directories walking from a file's location up to repo root.\n * Used for discovering configuration files.\n */\nexport function buildDirectoryChain(filePath: string, repoRoot: string): readonly string[] {\n const directories: string[] = [];\n const seen = new Set<string>();\n const boundary = path.resolve(repoRoot);\n let current: string | undefined = path.resolve(path.dirname(filePath));\n\n while (current !== undefined) {\n if (!seen.has(current)) {\n directories.push(current);\n seen.add(current);\n }\n if (current === boundary) {\n break;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n if (!seen.has(boundary)) {\n directories.push(boundary);\n }\n\n return directories;\n}\n\n/**\n * Build search roots for file resolution.\n * Searches from eval file directory up to repo root.\n */\nexport function buildSearchRoots(evalPath: string, repoRoot: string): readonly string[] {\n const uniqueRoots: string[] = [];\n const addRoot = (root: string): void => {\n const normalized = path.resolve(root);\n if (!uniqueRoots.includes(normalized)) {\n uniqueRoots.push(normalized);\n }\n };\n\n let currentDir = path.dirname(evalPath);\n let reachedBoundary = false;\n while (!reachedBoundary) {\n addRoot(currentDir);\n const parentDir = path.dirname(currentDir);\n if (currentDir === repoRoot || parentDir === currentDir) {\n reachedBoundary = true;\n } else {\n currentDir = parentDir;\n }\n }\n\n addRoot(repoRoot);\n addRoot(process.cwd());\n return uniqueRoots;\n}\n\n/**\n * Trim leading path separators for display.\n */\nfunction trimLeadingSeparators(value: string): string {\n const trimmed = value.replace(/^[/\\\\]+/, '');\n return trimmed.length > 0 ? trimmed : value;\n}\n\n/**\n * Resolve a file reference using search roots.\n */\nexport async function resolveFileReference(\n rawValue: string,\n searchRoots: readonly string[],\n): Promise<{\n readonly displayPath: string;\n readonly resolvedPath?: string;\n readonly attempted: readonly string[];\n}> {\n const displayPath = trimLeadingSeparators(rawValue);\n const potentialPaths: string[] = [];\n\n if (path.isAbsolute(rawValue)) {\n potentialPaths.push(path.normalize(rawValue));\n }\n\n for (const base of searchRoots) {\n potentialPaths.push(path.resolve(base, displayPath));\n }\n\n const attempted: string[] = [];\n const seen = new Set<string>();\n for (const candidate of potentialPaths) {\n const absoluteCandidate = path.resolve(candidate);\n if (seen.has(absoluteCandidate)) {\n continue;\n }\n seen.add(absoluteCandidate);\n attempted.push(absoluteCandidate);\n if (await fileExists(absoluteCandidate)) {\n return { displayPath, resolvedPath: absoluteCandidate, attempted };\n }\n }\n\n return { displayPath, attempted };\n}\n","import path from 'node:path';\n\nimport type { ToolTrajectoryEvaluatorConfig, ToolTrajectoryExpectedItem } from '../trace.js';\nimport type { EvaluatorConfig, EvaluatorKind, JsonObject, JsonValue } from '../types.js';\nimport { isEvaluatorKind } from '../types.js';\nimport { validateCustomPromptContent } from '../validation/prompt-validator.js';\nimport { resolveFileReference } from './file-resolver.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Parse evaluators from eval case configuration.\n */\nexport async function parseEvaluators(\n rawEvalCase: JsonObject & {\n readonly execution?: JsonValue;\n readonly evaluators?: JsonValue;\n },\n globalExecution: JsonObject | undefined,\n searchRoots: readonly string[],\n evalId: string,\n): Promise<readonly EvaluatorConfig[] | undefined> {\n const execution = rawEvalCase.execution;\n // Priority: case-level execution.evaluators > case-level evaluators > global execution.evaluators\n const candidateEvaluators = isJsonObject(execution)\n ? (execution.evaluators ?? rawEvalCase.evaluators)\n : (rawEvalCase.evaluators ?? globalExecution?.evaluators);\n if (candidateEvaluators === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(candidateEvaluators)) {\n logWarning(`Skipping evaluators for '${evalId}': expected array`);\n return undefined;\n }\n\n const evaluators: EvaluatorConfig[] = [];\n\n for (const rawEvaluator of candidateEvaluators) {\n if (!isJsonObject(rawEvaluator)) {\n logWarning(`Skipping invalid evaluator entry for '${evalId}' (expected object)`);\n continue;\n }\n\n const name = asString(rawEvaluator.name);\n const typeValue = rawEvaluator.type;\n\n if (!name || !isEvaluatorKind(typeValue)) {\n logWarning(`Skipping evaluator with invalid name/type in '${evalId}'`);\n continue;\n }\n\n if (typeValue === 'code_judge') {\n const script = asString(rawEvaluator.script);\n if (!script) {\n logWarning(`Skipping code_judge evaluator '${name}' in '${evalId}': missing script`);\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n const cwd = asString(rawEvaluator.cwd);\n let resolvedCwd: string | undefined;\n\n if (cwd) {\n const resolved = await resolveFileReference(cwd, searchRoots);\n if (resolved.resolvedPath) {\n resolvedCwd = path.resolve(resolved.resolvedPath);\n } else {\n logWarning(\n `Code_judge evaluator '${name}' in '${evalId}': cwd not found (${resolved.displayPath})`,\n resolved.attempted.length > 0\n ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`)\n : undefined,\n );\n }\n } else {\n resolvedCwd = searchRoots[0];\n }\n\n evaluators.push({\n name,\n type: 'code',\n script,\n cwd,\n resolvedCwd,\n ...(weight !== undefined ? { weight } : {}),\n });\n continue;\n }\n\n if (typeValue === 'composite') {\n const rawMembers = rawEvaluator.evaluators;\n if (!Array.isArray(rawMembers)) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': missing evaluators array`,\n );\n continue;\n }\n\n const rawAggregator = rawEvaluator.aggregator;\n if (!isJsonObject(rawAggregator)) {\n logWarning(`Skipping composite evaluator '${name}' in '${evalId}': missing aggregator`);\n continue;\n }\n\n const aggregatorType = asString(rawAggregator.type);\n if (\n aggregatorType !== 'weighted_average' &&\n aggregatorType !== 'code_judge' &&\n aggregatorType !== 'llm_judge'\n ) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': invalid aggregator type '${aggregatorType}'`,\n );\n continue;\n }\n\n // Recursively parse member evaluators\n const memberEvaluators: EvaluatorConfig[] = [];\n for (const rawMember of rawMembers) {\n if (!isJsonObject(rawMember)) {\n logWarning(`Skipping invalid member evaluator in composite '${name}' (expected object)`);\n continue;\n }\n\n const memberName = asString(rawMember.name);\n const memberType = rawMember.type;\n\n if (!memberName || !isEvaluatorKind(memberType)) {\n logWarning(`Skipping member evaluator with invalid name/type in composite '${name}'`);\n continue;\n }\n\n // Parse member evaluator (reuse existing logic for code, llm_judge, code_judge)\n const memberConfigs = await parseEvaluators(\n { evaluators: [rawMember] },\n undefined,\n searchRoots,\n `${evalId}:${name}:${memberName}`,\n );\n\n if (memberConfigs && memberConfigs.length > 0) {\n memberEvaluators.push(memberConfigs[0]);\n }\n }\n\n if (memberEvaluators.length === 0) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': no valid member evaluators`,\n );\n continue;\n }\n\n // Parse aggregator config\n let aggregator: import('../types.js').CompositeAggregatorConfig;\n\n if (aggregatorType === 'weighted_average') {\n const weights = isJsonObject(rawAggregator.weights)\n ? (rawAggregator.weights as Record<string, unknown>)\n : undefined;\n const parsedWeights: Record<string, number> = {};\n if (weights) {\n for (const [key, value] of Object.entries(weights)) {\n if (typeof value === 'number') {\n parsedWeights[key] = value;\n }\n }\n }\n aggregator = {\n type: 'weighted_average',\n ...(Object.keys(parsedWeights).length > 0 ? { weights: parsedWeights } : {}),\n };\n } else if (aggregatorType === 'code_judge') {\n const aggregatorPath = asString(rawAggregator.path);\n if (!aggregatorPath) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': code_judge aggregator missing path`,\n );\n continue;\n }\n\n // Don't try to resolve if path contains a command (e.g., \"node script.js\", \"uv run script.py\")\n // This matches the behavior of code evaluators which accept full commands\n // Set cwd to eval file directory (first search root)\n aggregator = {\n type: 'code_judge',\n path: aggregatorPath,\n cwd: searchRoots[0],\n };\n } else {\n // llm_judge aggregator\n const aggregatorPrompt = asString(rawAggregator.prompt);\n let promptPath: string | undefined;\n\n if (aggregatorPrompt) {\n const resolved = await resolveFileReference(aggregatorPrompt, searchRoots);\n if (resolved.resolvedPath) {\n promptPath = path.resolve(resolved.resolvedPath);\n }\n }\n\n aggregator = {\n type: 'llm_judge',\n ...(aggregatorPrompt ? { prompt: aggregatorPrompt } : {}),\n ...(promptPath ? { promptPath } : {}),\n };\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n evaluators.push({\n name,\n type: 'composite',\n evaluators: memberEvaluators,\n aggregator,\n ...(weight !== undefined ? { weight } : {}),\n });\n continue;\n }\n\n if (typeValue === 'tool_trajectory') {\n const mode = asString(rawEvaluator.mode);\n if (mode !== 'any_order' && mode !== 'in_order' && mode !== 'exact') {\n logWarning(\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': invalid mode '${mode}' (must be any_order, in_order, or exact)`,\n );\n continue;\n }\n\n const rawMinimums = rawEvaluator.minimums;\n let minimums: Record<string, number> | undefined;\n if (rawMinimums !== undefined) {\n if (!isJsonObject(rawMinimums)) {\n logWarning(\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': minimums must be an object`,\n );\n continue;\n }\n minimums = {};\n for (const [toolName, count] of Object.entries(rawMinimums)) {\n if (typeof count === 'number' && count >= 0) {\n minimums[toolName] = count;\n }\n }\n }\n\n const rawExpected = rawEvaluator.expected;\n let expected: ToolTrajectoryExpectedItem[] | undefined;\n if (rawExpected !== undefined) {\n if (!Array.isArray(rawExpected)) {\n logWarning(\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': expected must be an array`,\n );\n continue;\n }\n expected = [];\n for (const item of rawExpected) {\n if (isJsonObject(item) && typeof item.tool === 'string') {\n // Parse optional args field: 'any' or Record<string, unknown>\n let args: ToolTrajectoryExpectedItem['args'];\n if (item.args === 'any') {\n args = 'any';\n } else if (isJsonObject(item.args)) {\n args = item.args as Record<string, unknown>;\n }\n expected.push({ tool: item.tool, ...(args !== undefined ? { args } : {}) });\n }\n }\n }\n\n // Validate config completeness based on mode\n if (mode === 'any_order' && !minimums) {\n logWarning(\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': any_order mode requires minimums`,\n );\n continue;\n }\n\n if ((mode === 'in_order' || mode === 'exact') && !expected) {\n logWarning(\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': ${mode} mode requires expected`,\n );\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n const config: ToolTrajectoryEvaluatorConfig = {\n name,\n type: 'tool_trajectory',\n mode,\n ...(minimums ? { minimums } : {}),\n ...(expected ? { expected } : {}),\n ...(weight !== undefined ? { weight } : {}),\n };\n\n evaluators.push(config);\n continue;\n }\n\n const prompt = asString(rawEvaluator.prompt);\n let promptPath: string | undefined;\n if (prompt) {\n const resolved = await resolveFileReference(prompt, searchRoots);\n if (resolved.resolvedPath) {\n promptPath = path.resolve(resolved.resolvedPath);\n // Validate custom prompt content upfront - throws error if validation fails\n try {\n await validateCustomPromptContent(promptPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n // Add context and re-throw for the caller to handle\n throw new Error(`Evaluator '${name}' template (${promptPath}): ${message}`);\n }\n } else {\n logWarning(\n `Inline prompt used for evaluator '${name}' in '${evalId}' (file not found: ${resolved.displayPath})`,\n resolved.attempted.length > 0\n ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`)\n : undefined,\n );\n }\n }\n\n const _model = asString(rawEvaluator.model);\n\n const rawRubrics = rawEvaluator.rubrics;\n const parsedRubrics = Array.isArray(rawRubrics)\n ? rawRubrics\n .filter((r): r is JsonObject => isJsonObject(r))\n .map((rubric, index) => ({\n id: asString(rubric.id) ?? `rubric-${index + 1}`,\n description: asString(rubric.description) ?? '',\n weight: typeof rubric.weight === 'number' ? rubric.weight : 1.0,\n required: typeof rubric.required === 'boolean' ? rubric.required : true,\n }))\n .filter((r) => r.description.length > 0)\n : undefined;\n\n if (typeValue === 'rubric') {\n if (!parsedRubrics) {\n logWarning(`Skipping rubric evaluator '${name}' in '${evalId}': missing rubrics array`);\n continue;\n }\n if (parsedRubrics.length === 0) {\n logWarning(`Skipping rubric evaluator '${name}' in '${evalId}': no valid rubrics found`);\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n // Back-compat: `type: rubric` maps to `type: llm_judge` with `rubrics`.\n evaluators.push({\n name,\n type: 'llm_judge',\n rubrics: parsedRubrics,\n ...(weight !== undefined ? { weight } : {}),\n });\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n evaluators.push({\n name,\n type: 'llm_judge',\n prompt,\n promptPath,\n ...(parsedRubrics && parsedRubrics.length > 0 ? { rubrics: parsedRubrics } : {}),\n ...(weight !== undefined ? { weight } : {}),\n });\n }\n\n return evaluators.length > 0 ? evaluators : undefined;\n}\n\n/**\n * Coerce evaluator value to valid EvaluatorKind.\n */\nexport function coerceEvaluator(\n candidate: JsonValue | undefined,\n contextId: string,\n): EvaluatorKind | undefined {\n if (typeof candidate !== 'string') {\n return undefined;\n }\n if (isEvaluatorKind(candidate)) {\n return candidate;\n }\n logWarning(`Unknown evaluator '${candidate}' in ${contextId}, falling back to default`);\n return undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\n/**\n * Validate and extract weight from evaluator config.\n * Throws if weight is invalid (negative, NaN, or Infinity).\n * Returns undefined if weight is not specified.\n */\nfunction validateWeight(\n rawWeight: unknown,\n evaluatorName: string,\n evalId: string,\n): number | undefined {\n if (rawWeight === undefined) {\n return undefined;\n }\n\n if (typeof rawWeight !== 'number') {\n throw new Error(\n `Invalid weight for evaluator '${evaluatorName}' in '${evalId}': must be a number`,\n );\n }\n\n if (!Number.isFinite(rawWeight)) {\n throw new Error(\n `Invalid weight for evaluator '${evaluatorName}' in '${evalId}': must be finite (got ${rawWeight})`,\n );\n }\n\n if (rawWeight < 0) {\n throw new Error(\n `Invalid weight for evaluator '${evaluatorName}' in '${evalId}': must be non-negative (got ${rawWeight})`,\n );\n }\n\n return rawWeight;\n}\n","import { readFile } from 'node:fs/promises';\n\nimport { TEMPLATE_VARIABLES, VALID_TEMPLATE_VARIABLES } from '../template-variables.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Validate custom prompt template content from a file.\n * Reads the file and checks for valid template variables.\n * Throws an error if required template variables are missing.\n */\nexport async function validateCustomPromptContent(promptPath: string): Promise<void> {\n const content = await readFile(promptPath, 'utf8');\n validateTemplateVariables(content, promptPath);\n}\n\n/**\n * Validate template variables in a custom prompt template string.\n * Exported for testing purposes.\n * @throws Error if required template variables are missing\n */\nexport function validateTemplateVariables(content: string, source: string): void {\n // Extract all template variables from content\n const variablePattern = /\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g;\n const foundVariables = new Set<string>();\n const invalidVariables: string[] = [];\n\n let match: RegExpExecArray | null = variablePattern.exec(content);\n while (match !== null) {\n const varName = match[1];\n foundVariables.add(varName);\n if (!VALID_TEMPLATE_VARIABLES.has(varName)) {\n invalidVariables.push(varName);\n }\n match = variablePattern.exec(content);\n }\n\n // Check if template contains required variables for evaluation\n const hasCandidateAnswer = foundVariables.has(TEMPLATE_VARIABLES.CANDIDATE_ANSWER);\n const hasExpectedMessages = foundVariables.has(TEMPLATE_VARIABLES.EXPECTED_MESSAGES);\n const hasRequiredFields = hasCandidateAnswer || hasExpectedMessages;\n\n // ERROR: Missing required fields - throw error to skip this evaluator/eval case\n if (!hasRequiredFields) {\n throw new Error(\n `Missing required fields. Must include at least one of:\\n - {{ ${TEMPLATE_VARIABLES.CANDIDATE_ANSWER} }}\\n - {{ ${TEMPLATE_VARIABLES.EXPECTED_MESSAGES} }}`,\n );\n }\n\n // WARNING: Invalid variables - show warning but continue\n if (invalidVariables.length > 0) {\n const warningMessage = `${ANSI_YELLOW}Warning: Custom evaluator template at ${source}\n Contains invalid variables: ${invalidVariables.map((v) => `{{ ${v} }}`).join(', ')}\n Valid variables: ${Array.from(VALID_TEMPLATE_VARIABLES)\n .map((v) => `{{ ${v} }}`)\n .join(', ')}${ANSI_RESET}`;\n\n console.warn(warningMessage);\n }\n}\n","/**\n * Template variable constants for evaluator prompts.\n * These variables can be used in custom evaluator templates with {{ variable_name }} syntax.\n */\nexport const TEMPLATE_VARIABLES = {\n CANDIDATE_ANSWER: 'candidate_answer',\n EXPECTED_MESSAGES: 'expected_messages',\n QUESTION: 'question',\n EXPECTED_OUTCOME: 'expected_outcome',\n REFERENCE_ANSWER: 'reference_answer',\n INPUT_MESSAGES: 'input_messages',\n OUTPUT_MESSAGES: 'output_messages',\n} as const;\n\n/**\n * Type representing all valid template variable names.\n */\nexport type TemplateVariable = (typeof TEMPLATE_VARIABLES)[keyof typeof TEMPLATE_VARIABLES];\n\n/**\n * Set of all valid template variable names for runtime validation.\n */\nexport const VALID_TEMPLATE_VARIABLES = new Set<string>(Object.values(TEMPLATE_VARIABLES));\n\n/**\n * Template variables that are required for meaningful evaluation.\n * At least one of these should be present in a custom evaluator template.\n */\nexport const REQUIRED_TEMPLATE_VARIABLES = new Set<string>([\n TEMPLATE_VARIABLES.CANDIDATE_ANSWER,\n TEMPLATE_VARIABLES.EXPECTED_MESSAGES,\n]);\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { formatFileContents } from '../formatting/segment-formatter.js';\nimport type { JsonObject, TestMessage } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport { isGuidelineFile } from './config-loader.js';\nimport { resolveFileReference } from './file-resolver.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\ntype ProcessMessagesOptions = {\n readonly messages: readonly TestMessage[];\n readonly searchRoots: readonly string[];\n readonly repoRootPath: string;\n readonly guidelinePatterns?: readonly string[];\n readonly guidelinePaths?: string[];\n readonly textParts?: string[];\n readonly messageType: 'input' | 'output';\n readonly verbose: boolean;\n};\n\n/**\n * Process message content into structured segments with file resolution.\n */\nexport async function processMessages(options: ProcessMessagesOptions): Promise<JsonObject[]> {\n const {\n messages,\n searchRoots,\n repoRootPath,\n guidelinePatterns,\n guidelinePaths,\n textParts,\n messageType,\n verbose,\n } = options;\n\n const segments: JsonObject[] = [];\n\n for (const message of messages) {\n const content = message.content;\n if (typeof content === 'string') {\n segments.push({ type: 'text', value: content });\n if (textParts) {\n textParts.push(content);\n }\n continue;\n }\n\n // Structured object content (real-world style payloads). Treat as a single text segment.\n // This keeps prompt building deterministic while preserving the full payload for code evaluators\n // via evalCase.input_messages.\n if (isJsonObject(content)) {\n const rendered = JSON.stringify(content, null, 2);\n segments.push({ type: 'text', value: rendered });\n if (textParts) {\n textParts.push(rendered);\n }\n continue;\n }\n\n if (!Array.isArray(content)) {\n continue;\n }\n\n for (const rawSegment of content) {\n if (!isJsonObject(rawSegment)) {\n continue;\n }\n\n const segmentType = asString(rawSegment.type);\n if (segmentType === 'file') {\n const rawValue = asString(rawSegment.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n const context = messageType === 'input' ? '' : ' in expected_messages';\n logWarning(`File not found${context}: ${displayPath}`, attempts);\n continue;\n }\n\n try {\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n');\n\n // Only check for guidelines in input messages\n if (messageType === 'input' && guidelinePatterns && guidelinePaths) {\n const relativeToRepo = path.relative(repoRootPath, resolvedPath);\n\n if (isGuidelineFile(relativeToRepo, guidelinePatterns)) {\n guidelinePaths.push(path.resolve(resolvedPath));\n if (verbose) {\n console.log(` [Guideline] Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n continue;\n }\n }\n\n segments.push({\n type: 'file',\n path: displayPath,\n text: fileContent,\n resolvedPath: path.resolve(resolvedPath),\n });\n\n if (verbose) {\n const label = messageType === 'input' ? '[File]' : '[Expected Output File]';\n console.log(` ${label} Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n } catch (error) {\n const context = messageType === 'input' ? '' : ' expected output';\n logWarning(`Could not read${context} file ${resolvedPath}: ${(error as Error).message}`);\n }\n continue;\n }\n\n const clonedSegment = cloneJsonObject(rawSegment);\n segments.push(clonedSegment);\n const inlineValue = clonedSegment.value;\n if (typeof inlineValue === 'string' && textParts) {\n textParts.push(inlineValue);\n }\n }\n }\n\n return segments;\n}\n\n/**\n * Resolve assistant content including file references.\n * Similar to input message processing, but for expected assistant responses.\n */\nexport async function resolveAssistantContent(\n content: TestMessage['content'] | undefined,\n searchRoots: readonly string[],\n verbose: boolean,\n): Promise<string> {\n if (typeof content === 'string') {\n return content;\n }\n if (!content) {\n return '';\n }\n // Handle structured content object (e.g., { recommendation: ..., summary: ... })\n if (!Array.isArray(content)) {\n return JSON.stringify(content, null, 2);\n }\n\n // Track parts with metadata about whether they came from files\n const parts: Array<{ content: string; isFile: boolean; displayPath?: string }> = [];\n\n for (const entry of content) {\n if (typeof entry === 'string') {\n parts.push({ content: entry, isFile: false });\n continue;\n }\n\n if (!isJsonObject(entry)) {\n continue;\n }\n\n const segmentType = asString(entry.type);\n\n // Handle file references\n if (segmentType === 'file') {\n const rawValue = asString(entry.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n logWarning(`File not found in expected_messages: ${displayPath}`, attempts);\n continue;\n }\n\n try {\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n').trim();\n parts.push({ content: fileContent, isFile: true, displayPath });\n if (verbose) {\n console.log(` [Expected Assistant File] Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n } catch (error) {\n logWarning(`Could not read file ${resolvedPath}: ${(error as Error).message}`);\n }\n continue;\n }\n\n // Handle text segments\n const textValue = asString(entry.text);\n if (typeof textValue === 'string') {\n parts.push({ content: textValue, isFile: false });\n continue;\n }\n\n const valueValue = asString(entry.value);\n if (typeof valueValue === 'string') {\n parts.push({ content: valueValue, isFile: false });\n continue;\n }\n\n parts.push({ content: JSON.stringify(entry), isFile: false });\n }\n\n return formatFileContents(parts);\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction cloneJsonObject(source: JsonObject): JsonObject {\n const entries = Object.entries(source).map(([key, value]) => [key, cloneJsonValue(value)]);\n return Object.fromEntries(entries) as JsonObject;\n}\n\nfunction cloneJsonValue(value: unknown): unknown {\n if (value === null) {\n return null;\n }\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneJsonValue(item));\n }\n if (typeof value === 'object') {\n return cloneJsonObject(value as JsonObject);\n }\n return value;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\ntype ProcessExpectedMessagesOptions = {\n readonly messages: readonly TestMessage[];\n readonly searchRoots: readonly string[];\n readonly repoRootPath: string;\n readonly verbose: boolean;\n};\n\n/**\n * Extended message type for expected_messages that may include tool_calls.\n */\ntype ExtendedTestMessage = TestMessage & {\n readonly name?: string;\n readonly tool_calls?: readonly JsonObject[];\n};\n\n/**\n * Process expected_messages preserving full message structure including role and tool_calls.\n * Resolves file references and processes content.\n */\nexport async function processExpectedMessages(\n options: ProcessExpectedMessagesOptions,\n): Promise<JsonObject[]> {\n const { messages, searchRoots, verbose } = options;\n const segments: JsonObject[] = [];\n\n for (const message of messages) {\n const extendedMessage = message as ExtendedTestMessage;\n const segment: Record<string, unknown> = {\n role: message.role,\n };\n\n // Preserve optional name field\n if (extendedMessage.name) {\n segment.name = extendedMessage.name;\n }\n\n // Process content\n const content = message.content;\n if (typeof content === 'string') {\n segment.content = content;\n } else if (Array.isArray(content)) {\n // Process content array, resolving file references\n const processedContent: JsonObject[] = [];\n for (const rawSegment of content) {\n if (!isJsonObject(rawSegment)) {\n continue;\n }\n\n const segmentType = asString(rawSegment.type);\n if (segmentType === 'file') {\n const rawValue = asString(rawSegment.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n logWarning(`File not found in expected_messages: ${displayPath}`, attempts);\n continue;\n }\n\n try {\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n');\n processedContent.push({\n type: 'file',\n path: displayPath,\n text: fileContent,\n resolvedPath: path.resolve(resolvedPath),\n });\n\n if (verbose) {\n console.log(` [Expected Output File] Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n } catch (error) {\n logWarning(\n `Could not read expected output file ${resolvedPath}: ${(error as Error).message}`,\n );\n }\n continue;\n }\n\n processedContent.push(cloneJsonObject(rawSegment));\n }\n segment.content = processedContent;\n } else if (isJsonObject(content)) {\n // Handle structured content object (e.g., { recommendation: ..., summary: ... })\n segment.content = cloneJsonObject(content);\n }\n\n // Preserve tool_calls if present\n if (extendedMessage.tool_calls && Array.isArray(extendedMessage.tool_calls)) {\n segment.tool_calls = extendedMessage.tool_calls.map((tc) =>\n isJsonObject(tc) ? cloneJsonObject(tc) : tc,\n );\n }\n\n segments.push(segment as JsonObject);\n }\n\n return segments;\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { isGuidelineFile } from '../loaders/config-loader.js';\nimport { fileExists } from '../loaders/file-resolver.js';\nimport type { ChatMessageRole, ChatPrompt } from '../providers/types.js';\nimport type { EvalCase, JsonObject, TestMessage } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport {\n type FormattingMode,\n formatFileContents,\n formatSegment,\n hasVisibleContent,\n} from './segment-formatter.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Build prompt inputs by consolidating user request context and guideline content.\n */\nexport interface PromptInputs {\n readonly question: string;\n readonly guidelines: string;\n readonly chatPrompt?: ChatPrompt;\n readonly systemMessage?: string;\n}\n\n/**\n * Build prompt inputs by consolidating user request context and guideline content.\n *\n * @param testCase - The evaluation test case\n * @param mode - Formatting mode: 'agent' for file references, 'lm' for embedded content (default: 'lm')\n */\nexport async function buildPromptInputs(\n testCase: EvalCase,\n mode: FormattingMode = 'lm',\n): Promise<PromptInputs> {\n const guidelineParts: Array<{ content: string; isFile: boolean; displayPath?: string }> = [];\n for (const rawPath of testCase.guideline_paths) {\n const absolutePath = path.resolve(rawPath);\n if (!(await fileExists(absolutePath))) {\n logWarning(`Could not read guideline file ${absolutePath}: file does not exist`);\n continue;\n }\n\n try {\n const content = (await readFile(absolutePath, 'utf8')).replace(/\\r\\n/g, '\\n').trim();\n guidelineParts.push({\n content,\n isFile: true,\n displayPath: path.basename(absolutePath),\n });\n } catch (error) {\n logWarning(`Could not read guideline file ${absolutePath}: ${(error as Error).message}`);\n }\n }\n\n const guidelines = formatFileContents(guidelineParts);\n\n // Build segments per message to determine if role markers are needed\n const segmentsByMessage: JsonObject[][] = [];\n const fileContentsByPath = new Map<string, string>();\n for (const segment of testCase.input_segments) {\n if (\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n typeof segment.text === 'string'\n ) {\n fileContentsByPath.set(segment.path, segment.text);\n }\n }\n\n for (const message of testCase.input_messages) {\n const messageSegments: JsonObject[] = [];\n\n if (typeof message.content === 'string') {\n if (message.content.trim().length > 0) {\n messageSegments.push({ type: 'text', value: message.content });\n }\n } else if (Array.isArray(message.content)) {\n for (const segment of message.content) {\n if (typeof segment === 'string') {\n if (segment.trim().length > 0) {\n messageSegments.push({ type: 'text', value: segment });\n }\n } else if (isJsonObject(segment)) {\n const type = asString(segment.type);\n\n if (type === 'file') {\n const value = asString(segment.value);\n if (!value) continue;\n\n // Check if this is a guideline file (extracted separately)\n if (\n testCase.guideline_patterns &&\n isGuidelineFile(value, testCase.guideline_patterns)\n ) {\n // Reference marker only - actual content is in guidelines field\n messageSegments.push({ type: 'guideline_ref', path: value });\n continue;\n }\n\n // Find the file content from input_segments\n const fileText = fileContentsByPath.get(value);\n\n if (fileText !== undefined) {\n messageSegments.push({ type: 'file', text: fileText, path: value });\n }\n } else if (type === 'text') {\n const textValue = asString(segment.value);\n if (textValue && textValue.trim().length > 0) {\n messageSegments.push({ type: 'text', value: textValue });\n }\n }\n }\n }\n } else if (isJsonObject(message.content)) {\n const rendered = JSON.stringify(message.content, null, 2);\n if (rendered.trim().length > 0) {\n messageSegments.push({ type: 'text', value: rendered });\n }\n }\n\n segmentsByMessage.push(messageSegments);\n }\n\n // Determine if we need role markers based on actual processed content\n const useRoleMarkers = needsRoleMarkers(testCase.input_messages, segmentsByMessage);\n\n let question: string;\n\n if (useRoleMarkers) {\n // Multi-turn format with role markers using pre-computed segments\n const messageParts: string[] = [];\n\n for (let i = 0; i < testCase.input_messages.length; i++) {\n const message = testCase.input_messages[i];\n const segments = segmentsByMessage[i];\n\n if (!hasVisibleContent(segments)) {\n continue;\n }\n\n const roleLabel = message.role.charAt(0).toUpperCase() + message.role.slice(1);\n const contentParts: string[] = [];\n\n for (const segment of segments) {\n const formattedContent = formatSegment(segment, mode);\n if (formattedContent) {\n contentParts.push(formattedContent);\n }\n }\n\n if (contentParts.length > 0) {\n const messageContent = contentParts.join('\\n');\n messageParts.push(`@[${roleLabel}]:\\n${messageContent}`);\n }\n }\n\n question = messageParts.join('\\n\\n');\n } else {\n // Single-turn flat format\n const questionParts: string[] = [];\n for (const segment of testCase.input_segments) {\n // Skip guideline files - they're in the guidelines field\n if (\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n testCase.guideline_patterns &&\n isGuidelineFile(segment.path, testCase.guideline_patterns)\n ) {\n // Add reference marker for guideline files\n questionParts.push(`<Attached: ${segment.path}>`);\n continue;\n }\n\n const formattedContent = formatSegment(segment, mode);\n if (formattedContent) {\n questionParts.push(formattedContent);\n }\n }\n\n if (testCase.code_snippets.length > 0) {\n questionParts.push(testCase.code_snippets.join('\\n'));\n }\n\n question = questionParts\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .join('\\n\\n');\n }\n\n const chatPrompt = useRoleMarkers\n ? buildChatPromptFromSegments({\n messages: testCase.input_messages,\n segmentsByMessage,\n guidelinePatterns: testCase.guideline_patterns,\n guidelineContent: guidelines,\n mode,\n })\n : undefined;\n\n return { question, guidelines, chatPrompt };\n}\n\n/**\n * Detect if role markers are needed based on conversational structure.\n *\n * Role markers ([System]:, [User]:, etc.) are added when:\n * 1. There are assistant/tool messages (true multi-turn conversation), OR\n * 2. There are multiple messages that will produce visible content in the formatted output\n */\nfunction needsRoleMarkers(\n messages: readonly TestMessage[],\n processedSegmentsByMessage: readonly (readonly JsonObject[])[],\n): boolean {\n // Check for multi-turn conversation (assistant/tool messages)\n if (messages.some((msg) => msg.role === 'assistant' || msg.role === 'tool')) {\n return true;\n }\n\n // Count how many messages have actual content after processing\n let messagesWithContent = 0;\n\n for (const segments of processedSegmentsByMessage) {\n if (hasVisibleContent(segments)) {\n messagesWithContent++;\n }\n }\n\n return messagesWithContent > 1;\n}\n\nfunction buildChatPromptFromSegments(options: {\n readonly messages: readonly TestMessage[];\n readonly segmentsByMessage: readonly JsonObject[][];\n readonly guidelinePatterns?: readonly string[];\n readonly guidelineContent?: string;\n readonly systemPrompt?: string;\n readonly mode?: FormattingMode;\n}): ChatPrompt | undefined {\n const {\n messages,\n segmentsByMessage,\n guidelinePatterns,\n guidelineContent,\n systemPrompt,\n mode = 'lm',\n } = options;\n\n if (messages.length === 0) {\n return undefined;\n }\n\n const systemSegments: string[] = [];\n\n if (systemPrompt && systemPrompt.trim().length > 0) {\n systemSegments.push(systemPrompt.trim());\n }\n\n if (guidelineContent && guidelineContent.trim().length > 0) {\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${guidelineContent.trim()}`);\n }\n\n let startIndex = 0;\n while (startIndex < messages.length && messages[startIndex].role === 'system') {\n const segments = segmentsByMessage[startIndex];\n const contentParts: string[] = [];\n\n for (const segment of segments) {\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length > 0) {\n systemSegments.push(contentParts.join('\\n'));\n }\n\n startIndex += 1;\n }\n\n const chatPrompt: Array<ChatPrompt[number]> = [];\n\n if (systemSegments.length > 0) {\n chatPrompt.push({\n role: 'system',\n content: systemSegments.join('\\n\\n'),\n });\n }\n\n for (let i = startIndex; i < messages.length; i++) {\n const message = messages[i];\n const segments = segmentsByMessage[i];\n const contentParts: string[] = [];\n\n let role: ChatMessageRole = message.role as ChatMessageRole;\n\n if (role === 'system') {\n role = 'assistant';\n contentParts.push('@[System]:');\n } else if (role === 'tool') {\n role = 'assistant';\n contentParts.push('@[Tool]:');\n }\n\n for (const segment of segments) {\n if (segment.type === 'guideline_ref') {\n continue;\n }\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n const isGuidelineRef =\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n guidelinePatterns &&\n isGuidelineFile(segment.path, guidelinePatterns);\n\n if (isGuidelineRef) {\n continue;\n }\n\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length === 0) {\n continue;\n }\n\n const content = contentParts.join('\\n');\n\n chatPrompt.push({\n role,\n content,\n });\n }\n\n return chatPrompt.length > 0 ? (chatPrompt as ChatPrompt) : undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction logWarning(message: string): void {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n}\n","import { constants } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Normalize line endings to LF (\\n).\n * This ensures consistent behavior across Windows (CRLF) and Unix (LF) systems.\n */\nexport function normalizeLineEndings(content: string): string {\n return content.replace(/\\r\\n/g, '\\n');\n}\n\n/**\n * Read a text file and normalize line endings to LF (\\n).\n * This ensures consistent behavior across Windows (CRLF) and Unix (LF) systems.\n */\nexport async function readTextFile(filePath: string): Promise<string> {\n const content = await readFile(filePath, 'utf8');\n return normalizeLineEndings(content);\n}\n\n/**\n * Read a JSON file and parse it.\n */\nexport async function readJsonFile<T = unknown>(filePath: string): Promise<T> {\n const content = await readFile(filePath, 'utf8');\n return JSON.parse(content) as T;\n}\n\n/**\n * Find git repository root by walking up the directory tree.\n */\nexport async function findGitRoot(startPath: string): Promise<string | null> {\n let currentDir = path.dirname(path.resolve(startPath));\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const gitPath = path.join(currentDir, '.git');\n if (await fileExists(gitPath)) {\n return currentDir;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n return null;\n}\n\n/**\n * Build a chain of directories walking from a file's location up to repo root.\n * Used for discovering configuration files like targets.yaml or config.yaml.\n */\nexport function buildDirectoryChain(filePath: string, repoRoot: string): readonly string[] {\n const directories: string[] = [];\n const seen = new Set<string>();\n const boundary = path.resolve(repoRoot);\n let current: string | undefined = path.resolve(path.dirname(filePath));\n\n while (current !== undefined) {\n if (!seen.has(current)) {\n directories.push(current);\n seen.add(current);\n }\n if (current === boundary) {\n break;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n if (!seen.has(boundary)) {\n directories.push(boundary);\n }\n\n return directories;\n}\n\n/**\n * Build search roots for file resolution, matching yaml-parser behavior.\n * Searches from eval file directory up to repo root.\n */\nexport function buildSearchRoots(evalPath: string, repoRoot: string): readonly string[] {\n const uniqueRoots: string[] = [];\n const addRoot = (root: string): void => {\n const normalized = path.resolve(root);\n if (!uniqueRoots.includes(normalized)) {\n uniqueRoots.push(normalized);\n }\n };\n\n let currentDir = path.dirname(evalPath);\n let reachedBoundary = false;\n while (!reachedBoundary) {\n addRoot(currentDir);\n const parentDir = path.dirname(currentDir);\n if (currentDir === repoRoot || parentDir === currentDir) {\n reachedBoundary = true;\n } else {\n currentDir = parentDir;\n }\n }\n\n addRoot(repoRoot);\n addRoot(process.cwd());\n return uniqueRoots;\n}\n\n/**\n * Trim leading path separators for display.\n */\nfunction trimLeadingSeparators(value: string): string {\n const trimmed = value.replace(/^[/\\\\]+/, '');\n return trimmed.length > 0 ? trimmed : value;\n}\n\n/**\n * Resolve a file reference using search roots, matching yaml-parser behavior.\n */\nexport async function resolveFileReference(\n rawValue: string,\n searchRoots: readonly string[],\n): Promise<{\n readonly displayPath: string;\n readonly resolvedPath?: string;\n readonly attempted: readonly string[];\n}> {\n const displayPath = trimLeadingSeparators(rawValue);\n const potentialPaths: string[] = [];\n\n if (path.isAbsolute(rawValue)) {\n potentialPaths.push(path.normalize(rawValue));\n }\n\n for (const base of searchRoots) {\n potentialPaths.push(path.resolve(base, displayPath));\n }\n\n const attempted: string[] = [];\n const seen = new Set<string>();\n for (const candidate of potentialPaths) {\n const absoluteCandidate = path.resolve(candidate);\n if (seen.has(absoluteCandidate)) {\n continue;\n }\n seen.add(absoluteCandidate);\n attempted.push(absoluteCandidate);\n if (await fileExists(absoluteCandidate)) {\n return { displayPath, resolvedPath: absoluteCandidate, attempted };\n }\n }\n\n return { displayPath, attempted };\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { type AzureOpenAIProviderSettings, createAzure } from '@ai-sdk/azure';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { type LanguageModel, type ModelMessage, generateText } from 'ai';\n\nimport type { JsonObject } from '../types.js';\nimport type {\n AnthropicResolvedConfig,\n AzureResolvedConfig,\n GeminiResolvedConfig,\n RetryConfig,\n} from './targets.js';\nimport type { ChatPrompt, Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst DEFAULT_SYSTEM_PROMPT =\n 'You are a careful assistant. Follow all provided instructions and do not fabricate results.';\n\ntype TextResult = Awaited<ReturnType<typeof generateText>>;\ntype GenerateTextOptions = Parameters<typeof generateText>[0];\n\ninterface ProviderDefaults {\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly thinkingBudget?: number;\n}\n\nexport class AzureProvider implements Provider {\n readonly id: string;\n readonly kind = 'azure' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: AzureResolvedConfig,\n ) {\n this.id = `azure:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n\n const azure = createAzure(buildAzureOptions(config));\n this.model = azure(config.deploymentName);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nexport class AnthropicProvider implements Provider {\n readonly id: string;\n readonly kind = 'anthropic' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: AnthropicResolvedConfig,\n ) {\n this.id = `anthropic:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n thinkingBudget: config.thinkingBudget,\n };\n this.retryConfig = config.retry;\n\n const anthropic = createAnthropic({\n apiKey: config.apiKey,\n });\n this.model = anthropic(config.model);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n const providerOptions = buildAnthropicProviderOptions(this.defaults);\n\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n providerOptions,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nexport class GeminiProvider implements Provider {\n readonly id: string;\n readonly kind = 'gemini' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: GeminiResolvedConfig,\n ) {\n this.id = `gemini:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n\n const google = createGoogleGenerativeAI({\n apiKey: config.apiKey,\n });\n this.model = google(config.model);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nfunction buildAzureOptions(config: AzureResolvedConfig): AzureOpenAIProviderSettings {\n const options: AzureOpenAIProviderSettings = {\n apiKey: config.apiKey,\n apiVersion: config.version,\n useDeploymentBasedUrls: true,\n };\n\n const baseURL = normalizeAzureBaseUrl(config.resourceName);\n if (baseURL) {\n options.baseURL = baseURL;\n } else {\n options.resourceName = config.resourceName;\n }\n\n return options;\n}\n\nfunction normalizeAzureBaseUrl(resourceName: string): string | undefined {\n const trimmed = resourceName.trim();\n if (!/^https?:\\/\\//i.test(trimmed)) {\n return undefined;\n }\n\n const withoutSlash = trimmed.replace(/\\/+$/, '');\n const normalized = withoutSlash.endsWith('/openai') ? withoutSlash : `${withoutSlash}/openai`;\n return normalized;\n}\n\nfunction buildAnthropicProviderOptions(\n defaults: ProviderDefaults,\n): GenerateTextOptions['providerOptions'] | undefined {\n if (defaults.thinkingBudget === undefined) {\n return undefined;\n }\n\n return {\n anthropic: {\n thinking: {\n type: 'enabled',\n budgetTokens: defaults.thinkingBudget,\n },\n },\n };\n}\n\nfunction buildChatPrompt(request: ProviderRequest): ChatPrompt {\n const provided = request.chatPrompt?.length ? request.chatPrompt : undefined;\n if (provided) {\n const hasSystemMessage = provided.some((message) => message.role === 'system');\n if (hasSystemMessage) {\n return provided;\n }\n\n const systemContent = resolveSystemContent(request, false);\n return [{ role: 'system', content: systemContent }, ...provided];\n }\n\n const systemContent = resolveSystemContent(request, true);\n const userContent = request.question.trim();\n\n const prompt: ChatPrompt = [\n { role: 'system', content: systemContent },\n { role: 'user', content: userContent },\n ];\n\n return prompt;\n}\n\nfunction resolveSystemContent(request: ProviderRequest, includeGuidelines: boolean): string {\n const systemSegments: string[] = [];\n\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\n systemSegments.push(request.systemPrompt.trim());\n } else {\n systemSegments.push(DEFAULT_SYSTEM_PROMPT);\n }\n\n if (includeGuidelines && request.guidelines && request.guidelines.trim().length > 0) {\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${request.guidelines.trim()}`);\n }\n\n return systemSegments.join('\\n\\n');\n}\n\nfunction toModelMessages(chatPrompt: ChatPrompt): ModelMessage[] {\n return chatPrompt.map((message) => {\n if (message.role === 'tool' || message.role === 'function') {\n const prefix = message.name ? `@[${message.name}]: ` : '@[Tool]: ';\n return {\n role: 'assistant',\n content: `${prefix}${message.content}`,\n } satisfies ModelMessage;\n }\n\n if (message.role === 'assistant' || message.role === 'system' || message.role === 'user') {\n return {\n role: message.role,\n content: message.content,\n } satisfies ModelMessage;\n }\n\n return {\n role: 'user',\n content: message.content,\n } satisfies ModelMessage;\n });\n}\n\nfunction resolveModelSettings(\n request: ProviderRequest,\n defaults: ProviderDefaults,\n): { temperature?: number; maxOutputTokens?: number } {\n const temperature = request.temperature ?? defaults.temperature;\n const maxOutputTokens = request.maxOutputTokens ?? defaults.maxOutputTokens;\n return {\n temperature,\n maxOutputTokens,\n };\n}\n\nasync function invokeModel(options: {\n readonly model: LanguageModel;\n readonly request: ProviderRequest;\n readonly defaults: ProviderDefaults;\n readonly retryConfig?: RetryConfig;\n readonly providerOptions?: GenerateTextOptions['providerOptions'];\n}): Promise<ProviderResponse> {\n const { model, request, defaults, retryConfig, providerOptions } = options;\n const chatPrompt = buildChatPrompt(request);\n const { temperature, maxOutputTokens } = resolveModelSettings(request, defaults);\n\n const result = await withRetry(\n () =>\n generateText({\n model,\n messages: toModelMessages(chatPrompt),\n temperature,\n maxOutputTokens,\n maxRetries: 0,\n abortSignal: request.signal,\n ...(providerOptions ? { providerOptions } : {}),\n }),\n retryConfig,\n request.signal,\n );\n\n return mapResponse(result);\n}\n\nfunction mapResponse(result: TextResult): ProviderResponse {\n const content = result.text ?? '';\n return {\n raw: result,\n usage: toJsonObject(result.totalUsage ?? result.usage),\n outputMessages: [{ role: 'assistant' as const, content }],\n };\n}\n\nfunction toJsonObject(value: unknown): JsonObject | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n try {\n return JSON.parse(JSON.stringify(value)) as JsonObject;\n } catch {\n return undefined;\n }\n}\n\nfunction extractStatus(error: unknown): number | undefined {\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n\n const candidate = error as Record<string, unknown>;\n const directStatus = candidate.status ?? candidate.statusCode;\n if (typeof directStatus === 'number' && Number.isFinite(directStatus)) {\n return directStatus;\n }\n\n const responseStatus =\n typeof candidate.response === 'object' && candidate.response\n ? (candidate.response as { status?: unknown }).status\n : undefined;\n if (typeof responseStatus === 'number' && Number.isFinite(responseStatus)) {\n return responseStatus;\n }\n\n const message = typeof candidate.message === 'string' ? candidate.message : undefined;\n if (message) {\n const match = message.match(/HTTP\\s+(\\d{3})/i);\n if (match) {\n const parsed = Number.parseInt(match[1], 10);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n\n return undefined;\n}\n\nfunction isNetworkError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const candidate = error as Record<string, unknown>;\n if (candidate.name === 'AbortError') {\n return false;\n }\n\n const code = candidate.code;\n if (typeof code === 'string' && /^E(AI|CONN|HOST|NET|PIPE|TIME|REFUSED|RESET)/i.test(code)) {\n return true;\n }\n\n const message = typeof candidate.message === 'string' ? candidate.message : undefined;\n if (\n message &&\n /(network|fetch failed|ECONNRESET|ENOTFOUND|EAI_AGAIN|ETIMEDOUT|ECONNREFUSED)/i.test(message)\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction isRetryableError(error: unknown, retryableStatusCodes: readonly number[]): boolean {\n const status = extractStatus(error);\n if (status === 401 || status === 403) {\n return false;\n }\n if (typeof status === 'number') {\n return retryableStatusCodes.includes(status);\n }\n\n return isNetworkError(error);\n}\n\nfunction calculateRetryDelay(attempt: number, config: Required<RetryConfig>): number {\n const delay = Math.min(\n config.maxDelayMs,\n config.initialDelayMs * config.backoffFactor ** attempt,\n );\n return delay * (0.75 + Math.random() * 0.5);\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function withRetry<T>(\n fn: () => Promise<T>,\n retryConfig?: RetryConfig,\n signal?: AbortSignal,\n): Promise<T> {\n const config: Required<RetryConfig> = {\n maxRetries: retryConfig?.maxRetries ?? 3,\n initialDelayMs: retryConfig?.initialDelayMs ?? 1000,\n maxDelayMs: retryConfig?.maxDelayMs ?? 60000,\n backoffFactor: retryConfig?.backoffFactor ?? 2,\n retryableStatusCodes: retryConfig?.retryableStatusCodes ?? [500, 408, 429, 502, 503, 504],\n };\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n if (signal?.aborted) {\n throw new Error(`Request aborted: ${signal.reason ?? 'Unknown reason'}`);\n }\n\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt >= config.maxRetries) {\n break;\n }\n\n if (!isRetryableError(error, config.retryableStatusCodes)) {\n throw error;\n }\n\n const delay = calculateRetryDelay(attempt, config);\n await sleep(delay);\n }\n }\n\n throw lastError;\n}\n","import { type ExecException, type ExecOptions, exec as execWithCallback } from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { readTextFile } from '../file-utils.js';\nimport type { CliResolvedConfig } from './targets.js';\nimport type {\n OutputMessage,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ProviderTokenUsage,\n} from './types.js';\n\nconst execAsync = promisify(execWithCallback);\nconst DEFAULT_MAX_BUFFER = 10 * 1024 * 1024; // 10 MB to accommodate verbose CLI output\n\nexport interface CommandRunOptions {\n readonly cwd?: string;\n readonly env?: NodeJS.ProcessEnv;\n readonly timeoutMs?: number;\n readonly signal?: AbortSignal;\n}\n\nexport interface CommandRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number | null;\n readonly failed: boolean;\n readonly timedOut?: boolean;\n readonly signal?: NodeJS.Signals | null;\n}\n\nexport type CommandRunner = (\n command: string,\n options: CommandRunOptions,\n) => Promise<CommandRunResult>;\n\nasync function defaultCommandRunner(\n command: string,\n options: CommandRunOptions,\n): Promise<CommandRunResult> {\n const execOptions: ExecOptions = {\n cwd: options.cwd,\n env: options.env,\n timeout: options.timeoutMs,\n signal: options.signal,\n maxBuffer: DEFAULT_MAX_BUFFER,\n shell: process.platform === 'win32' ? 'powershell.exe' : undefined,\n };\n\n try {\n const { stdout, stderr } = await execAsync(command, execOptions);\n\n return {\n stdout,\n stderr,\n exitCode: 0,\n failed: false,\n timedOut: false,\n signal: null,\n };\n } catch (error) {\n const execError = error as ExecException & {\n stdout?: string;\n stderr?: string;\n timedOut?: boolean;\n killed?: boolean;\n };\n\n return {\n stdout: execError.stdout ?? '',\n stderr: execError.stderr ?? '',\n exitCode: typeof execError.code === 'number' ? execError.code : null,\n failed: true,\n timedOut: execError.timedOut === true || execError.killed === true,\n signal: execError.signal ?? null,\n };\n }\n}\n\nexport class CliProvider implements Provider {\n readonly id: string;\n readonly kind = 'cli';\n readonly targetName: string;\n readonly supportsBatch = true;\n\n private readonly config: CliResolvedConfig;\n private readonly runCommand: CommandRunner;\n private readonly verbose: boolean;\n private readonly keepTempFiles: boolean;\n private healthcheckPromise?: Promise<void>;\n\n constructor(\n targetName: string,\n config: CliResolvedConfig,\n runner: CommandRunner = defaultCommandRunner,\n ) {\n this.targetName = targetName;\n this.id = `cli:${targetName}`;\n this.config = config;\n this.runCommand = runner;\n this.verbose = config.verbose ?? false;\n this.keepTempFiles = config.keepTempFiles ?? false;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('CLI provider request was aborted before execution');\n }\n\n await this.ensureHealthy(request.signal);\n\n const outputFilePath = generateOutputFilePath(request.evalCaseId);\n const templateValues = buildTemplateValues(request, this.config, outputFilePath);\n const renderedCommand = renderTemplate(this.config.commandTemplate, templateValues);\n\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] cwd=${this.config.cwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n // Measure wall-clock time as fallback for duration\n const startTime = Date.now();\n const result = await this.runCommand(renderedCommand, {\n cwd: this.config.cwd,\n env: process.env,\n timeoutMs: this.config.timeoutMs,\n signal: request.signal,\n });\n const measuredDurationMs = Date.now() - startTime;\n\n if (result.failed || (result.exitCode ?? 0) !== 0) {\n if (request.signal?.aborted) {\n throw new Error('CLI provider request was aborted');\n }\n if (result.timedOut) {\n throw new Error(\n `CLI provider timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\n const detail = result.stderr.trim() || result.stdout.trim();\n const message = detail\n ? `${detail} (exit code ${codeText})`\n : `CLI exited with code ${codeText}`;\n throw new Error(message);\n }\n\n // Read from output file and parse as JSON if possible\n const responseContent = await this.readAndCleanupOutputFile(outputFilePath);\n const parsed = this.parseOutputContent(responseContent);\n\n return {\n outputMessages: parsed.outputMessages,\n tokenUsage: parsed.tokenUsage,\n costUsd: parsed.costUsd,\n durationMs: parsed.durationMs ?? measuredDurationMs,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: this.config.cwd,\n outputFile: outputFilePath,\n },\n };\n }\n\n async invokeBatch(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]> {\n if (requests.length === 0) {\n return [];\n }\n\n for (const request of requests) {\n if (request.signal?.aborted) {\n throw new Error('CLI provider batch request was aborted before execution');\n }\n }\n\n const controller = new AbortController();\n for (const request of requests) {\n request.signal?.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n await this.ensureHealthy(controller.signal);\n\n const outputFilePath = generateOutputFilePath('batch', '.jsonl');\n\n const batchInputFiles: string[] = [];\n for (const request of requests) {\n if (request.inputFiles && request.inputFiles.length > 0) {\n batchInputFiles.push(...request.inputFiles);\n }\n }\n\n const templateValues = buildTemplateValues(\n {\n question: '',\n guidelines: '',\n inputFiles: batchInputFiles,\n evalCaseId: 'batch',\n attempt: 0,\n },\n this.config,\n outputFilePath,\n );\n const renderedCommand = renderTemplate(this.config.commandTemplate, templateValues);\n\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] (batch size=${requests.length}) cwd=${this.config.cwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n // Measure wall-clock time for batch (used as fallback if records don't provide duration)\n const startTime = Date.now();\n const result = await this.runCommand(renderedCommand, {\n cwd: this.config.cwd,\n env: process.env,\n timeoutMs: this.config.timeoutMs,\n signal: controller.signal,\n });\n const measuredDurationMs = Date.now() - startTime;\n\n if (result.failed || (result.exitCode ?? 0) !== 0) {\n if (controller.signal.aborted) {\n throw new Error('CLI provider request was aborted');\n }\n if (result.timedOut) {\n throw new Error(\n `CLI provider timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\n const detail = result.stderr.trim() || result.stdout.trim();\n const message = detail\n ? `${detail} (exit code ${codeText})`\n : `CLI exited with code ${codeText}`;\n throw new Error(message);\n }\n\n const responseContent = await this.readAndCleanupOutputFile(outputFilePath);\n const recordsById = this.parseJsonlBatchOutput(responseContent);\n\n const requestedIds = requests\n .map((request) => request.evalCaseId)\n .filter((id): id is string => typeof id === 'string' && id.trim().length > 0);\n const missingIds = requestedIds.filter((id) => !recordsById.has(id));\n if (missingIds.length > 0) {\n throw new Error(`CLI batch output missing ids: ${missingIds.join(', ')}`);\n }\n\n // Calculate per-request fallback duration (total time / number of requests)\n const perRequestFallbackMs = Math.round(measuredDurationMs / requests.length);\n\n const responses: ProviderResponse[] = requests.map((request) => {\n const evalCaseId = request.evalCaseId;\n if (!evalCaseId) {\n return {\n outputMessages: [],\n durationMs: perRequestFallbackMs,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: this.config.cwd,\n outputFile: outputFilePath,\n },\n };\n }\n\n const parsed = recordsById.get(evalCaseId);\n if (!parsed) {\n return {\n outputMessages: [],\n durationMs: perRequestFallbackMs,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: this.config.cwd,\n outputFile: outputFilePath,\n },\n };\n }\n\n return {\n outputMessages: parsed.outputMessages,\n tokenUsage: parsed.tokenUsage,\n costUsd: parsed.costUsd,\n durationMs: parsed.durationMs ?? perRequestFallbackMs,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: this.config.cwd,\n outputFile: outputFilePath,\n recordId: evalCaseId,\n },\n };\n });\n\n return responses;\n }\n\n /**\n * Parse output content from CLI.\n * If the content is valid JSON with 'output_messages' or 'text' field, extract them.\n * If only 'text' is provided, wrap it in outputMessages.\n * Otherwise, treat the entire content as plain text wrapped in outputMessages.\n *\n * Also extracts optional execution metrics:\n * - token_usage: { input, output, cached? }\n * - cost_usd: number\n * - duration_ms: number\n */\n private parseOutputContent(content: string): {\n outputMessages: readonly OutputMessage[];\n tokenUsage?: ProviderTokenUsage;\n costUsd?: number;\n durationMs?: number;\n } {\n try {\n const parsed = JSON.parse(content) as unknown;\n if (typeof parsed === 'object' && parsed !== null) {\n const obj = parsed as {\n text?: unknown;\n output_messages?: unknown;\n token_usage?: unknown;\n cost_usd?: unknown;\n duration_ms?: unknown;\n };\n\n // Parse execution metrics\n const tokenUsage = this.parseTokenUsage(obj.token_usage);\n const costUsd =\n typeof obj.cost_usd === 'number' && obj.cost_usd >= 0 ? obj.cost_usd : undefined;\n const durationMs =\n typeof obj.duration_ms === 'number' && obj.duration_ms >= 0 ? obj.duration_ms : undefined;\n\n const outputMessages = this.parseOutputMessages(obj.output_messages);\n\n // If output_messages provided, use it\n if (outputMessages && outputMessages.length > 0) {\n return { outputMessages, tokenUsage, costUsd, durationMs };\n }\n\n // Fall back to text field, wrap in outputMessages\n if ('text' in obj) {\n const text = typeof obj.text === 'string' ? obj.text : String(obj.text);\n return {\n outputMessages: [{ role: 'assistant', content: text }],\n tokenUsage,\n costUsd,\n durationMs,\n };\n }\n }\n } catch {\n // Not valid JSON, treat as plain text\n }\n // Plain text content, wrap in outputMessages\n return { outputMessages: [{ role: 'assistant', content }] };\n }\n\n /**\n * Parse token_usage from CLI output.\n */\n private parseTokenUsage(tokenUsage: unknown): ProviderTokenUsage | undefined {\n if (typeof tokenUsage !== 'object' || tokenUsage === null) {\n return undefined;\n }\n\n const obj = tokenUsage as { input?: unknown; output?: unknown; cached?: unknown };\n\n if (typeof obj.input !== 'number' || typeof obj.output !== 'number') {\n return undefined;\n }\n\n return {\n input: obj.input,\n output: obj.output,\n cached: typeof obj.cached === 'number' ? obj.cached : undefined,\n };\n }\n\n /**\n * Parse output_messages from JSONL (snake_case) and convert to OutputMessage[] (camelCase).\n */\n private parseOutputMessages(outputMessages: unknown): readonly OutputMessage[] | undefined {\n if (!Array.isArray(outputMessages)) {\n return undefined;\n }\n\n const messages: OutputMessage[] = [];\n for (const msg of outputMessages) {\n if (typeof msg !== 'object' || msg === null) {\n continue;\n }\n\n const rawMsg = msg as {\n role?: unknown;\n name?: unknown;\n content?: unknown;\n tool_calls?: unknown;\n timestamp?: unknown;\n metadata?: unknown;\n };\n\n // Role is required\n if (typeof rawMsg.role !== 'string') {\n continue;\n }\n\n const message: OutputMessage = {\n role: rawMsg.role,\n name: typeof rawMsg.name === 'string' ? rawMsg.name : undefined,\n content: rawMsg.content,\n toolCalls: this.parseToolCalls(rawMsg.tool_calls),\n timestamp: typeof rawMsg.timestamp === 'string' ? rawMsg.timestamp : undefined,\n metadata:\n typeof rawMsg.metadata === 'object' && rawMsg.metadata !== null\n ? (rawMsg.metadata as Record<string, unknown>)\n : undefined,\n };\n\n messages.push(message);\n }\n\n return messages.length > 0 ? messages : undefined;\n }\n\n /**\n * Parse tool_calls from JSONL (snake_case) and convert to ToolCall[] format.\n */\n private parseToolCalls(toolCalls: unknown):\n | readonly {\n tool: string;\n input?: unknown;\n output?: unknown;\n id?: string;\n timestamp?: string;\n }[]\n | undefined {\n if (!Array.isArray(toolCalls)) {\n return undefined;\n }\n\n const calls: {\n tool: string;\n input?: unknown;\n output?: unknown;\n id?: string;\n timestamp?: string;\n }[] = [];\n for (const call of toolCalls) {\n if (typeof call !== 'object' || call === null) {\n continue;\n }\n\n const rawCall = call as {\n tool?: unknown;\n input?: unknown;\n output?: unknown;\n id?: unknown;\n timestamp?: unknown;\n };\n\n // Tool name is required\n if (typeof rawCall.tool !== 'string') {\n continue;\n }\n\n calls.push({\n tool: rawCall.tool,\n input: rawCall.input,\n output: rawCall.output,\n id: typeof rawCall.id === 'string' ? rawCall.id : undefined,\n timestamp: typeof rawCall.timestamp === 'string' ? rawCall.timestamp : undefined,\n });\n }\n\n return calls.length > 0 ? calls : undefined;\n }\n\n private parseJsonlBatchOutput(content: string): Map<\n string,\n {\n outputMessages: readonly OutputMessage[];\n tokenUsage?: ProviderTokenUsage;\n costUsd?: number;\n durationMs?: number;\n }\n > {\n const records = new Map<\n string,\n {\n outputMessages: readonly OutputMessage[];\n tokenUsage?: ProviderTokenUsage;\n costUsd?: number;\n durationMs?: number;\n }\n >();\n\n const lines = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n for (const line of lines) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line) as unknown;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`CLI batch output contains invalid JSONL line: ${reason}`);\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('CLI batch output JSONL line must be an object');\n }\n\n const obj = parsed as {\n id?: unknown;\n text?: unknown;\n output_messages?: unknown;\n token_usage?: unknown;\n cost_usd?: unknown;\n duration_ms?: unknown;\n };\n const id = typeof obj.id === 'string' ? obj.id : undefined;\n if (!id || id.trim().length === 0) {\n throw new Error('CLI batch output JSONL line missing required string field: id');\n }\n\n if (records.has(id)) {\n throw new Error(`CLI batch output contains duplicate id: ${id}`);\n }\n\n // Parse execution metrics\n const tokenUsage = this.parseTokenUsage(obj.token_usage);\n const costUsd =\n typeof obj.cost_usd === 'number' && obj.cost_usd >= 0 ? obj.cost_usd : undefined;\n const durationMs =\n typeof obj.duration_ms === 'number' && obj.duration_ms >= 0 ? obj.duration_ms : undefined;\n\n // Prefer output_messages, fall back to text wrapped in outputMessages\n const parsedOutputMessages = this.parseOutputMessages(obj.output_messages);\n let outputMessages: readonly OutputMessage[];\n if (parsedOutputMessages && parsedOutputMessages.length > 0) {\n outputMessages = parsedOutputMessages;\n } else {\n // Fall back to text field\n const text =\n typeof obj.text === 'string'\n ? obj.text\n : obj.text === undefined\n ? ''\n : JSON.stringify(obj.text);\n outputMessages = text ? [{ role: 'assistant', content: text }] : [];\n }\n\n records.set(id, {\n outputMessages,\n tokenUsage,\n costUsd,\n durationMs,\n });\n }\n\n return records;\n }\n\n private async readAndCleanupOutputFile(filePath: string): Promise<string> {\n try {\n const content = await readTextFile(filePath);\n return content;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to read output file '${filePath}': ${errorMsg}`);\n } finally {\n // Clean up temp file - ignore errors as the file might not exist on read failure\n if (!this.keepTempFiles) {\n await fs.unlink(filePath).catch(() => {\n /* ignore cleanup errors */\n });\n }\n }\n }\n\n private async ensureHealthy(signal?: AbortSignal): Promise<void> {\n if (!this.config.healthcheck) {\n return;\n }\n if (!this.healthcheckPromise) {\n this.healthcheckPromise = this.runHealthcheck(this.config.healthcheck, signal);\n }\n return this.healthcheckPromise;\n }\n\n private async runHealthcheck(\n healthcheck: CliResolvedConfig['healthcheck'],\n signal?: AbortSignal,\n ): Promise<void> {\n if (!healthcheck) {\n return;\n }\n\n const timeoutMs = healthcheck.timeoutMs ?? this.config.timeoutMs;\n\n if (healthcheck.type === 'http') {\n const controller = new AbortController();\n const timer = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : undefined;\n signal?.addEventListener('abort', () => controller.abort(), { once: true });\n\n try {\n const response = await fetch(healthcheck.url, { method: 'GET', signal: controller.signal });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\n }\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${reason}`);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n return;\n }\n\n const renderedCommand = renderTemplate(\n healthcheck.commandTemplate,\n buildTemplateValues(\n {\n question: '',\n guidelines: '',\n inputFiles: [],\n evalCaseId: 'healthcheck',\n attempt: 0,\n },\n this.config,\n generateOutputFilePath('healthcheck'),\n ),\n );\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] (healthcheck) cwd=${healthcheck.cwd ?? this.config.cwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n const result = await this.runCommand(renderedCommand, {\n cwd: healthcheck.cwd ?? this.config.cwd,\n env: process.env,\n timeoutMs,\n signal,\n });\n\n if (result.failed || (result.exitCode ?? 0) !== 0) {\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\n const detail = result.stderr.trim() || result.stdout.trim();\n const message = detail\n ? `${detail} (exit code ${codeText})`\n : `CLI healthcheck command exited with code ${codeText}`;\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${message}`);\n }\n }\n}\n\nfunction buildTemplateValues(\n request: Pick<\n ProviderRequest,\n 'question' | 'guidelines' | 'inputFiles' | 'evalCaseId' | 'attempt'\n >,\n config: CliResolvedConfig,\n outputFilePath: string,\n): Record<string, string> {\n const inputFiles = normalizeInputFiles(request.inputFiles);\n return {\n PROMPT: shellEscape(request.question ?? ''),\n GUIDELINES: shellEscape(request.guidelines ?? ''),\n EVAL_ID: shellEscape(request.evalCaseId ?? ''),\n ATTEMPT: shellEscape(String(request.attempt ?? 0)),\n FILES: formatFileList(inputFiles, config.filesFormat),\n OUTPUT_FILE: shellEscape(outputFilePath),\n };\n}\n\nfunction normalizeInputFiles(\n inputFiles: readonly string[] | undefined,\n): readonly string[] | undefined {\n if (!inputFiles || inputFiles.length === 0) {\n return undefined;\n }\n\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction formatFileList(\n files: readonly string[] | undefined,\n template: string | undefined,\n): string {\n if (!files || files.length === 0) {\n return '';\n }\n\n const formatter = template ?? '{path}';\n return files\n .map((filePath) => {\n const escapedPath = shellEscape(filePath);\n const escapedName = shellEscape(path.basename(filePath));\n return formatter.replaceAll('{path}', escapedPath).replaceAll('{basename}', escapedName);\n })\n .join(' ');\n}\n\nfunction renderTemplate(template: string, values: Record<string, string>): string {\n return template.replace(/\\{([A-Z_]+)\\}/g, (match, key) => {\n const replacement = values[key];\n return replacement !== undefined ? replacement : match;\n });\n}\n\nfunction shellEscape(value: string): string {\n if (value.length === 0) {\n return \"''\";\n }\n\n if (process.platform === 'win32') {\n // PowerShell uses backtick (`) for escaping, not backslash\n // Double quotes inside the string need to be escaped with backtick\n // Single quotes can be used instead for simpler escaping\n const escaped = value.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n\n return `'${value.replace(/'/g, \"'\\\"'\\\"'\")}'`;\n}\n\nfunction generateOutputFilePath(evalCaseId?: string, extension = '.json'): string {\n const safeEvalId = evalCaseId || 'unknown';\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 9);\n return path.join(os.tmpdir(), `agentv-${safeEvalId}-${timestamp}-${random}${extension}`);\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n","import { exec as execCallback, spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { constants, createWriteStream } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { access, mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { recordCodexLogEntry } from './codex-log-tracker.js';\nimport { buildPromptDocument, normalizeInputFiles } from './preread.js';\nimport type { CodexResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst execAsync = promisify(execCallback);\nconst WORKSPACE_PREFIX = 'agentv-codex-';\nconst PROMPT_FILENAME = 'prompt.md';\nconst JSONL_TYPE_ITEM_COMPLETED = 'item.completed';\n\n/**\n * Default system prompt for Codex CLI evaluations.\n * Ensures the agent returns code in its response rather than just writing files.\n */\nconst DEFAULT_SYSTEM_PROMPT = `**IMPORTANT**: Follow these instructions for your response:\n- Do NOT create any additional output files in the workspace.\n- All intended file outputs/changes MUST be written in your response.\n- For each intended file, include the relative path and unified git diff following the convention \\`diff --git ...\\`.\nThis is required for evaluation scoring.`;\n\ninterface CodexRunOptions {\n readonly executable: string;\n readonly args: readonly string[];\n readonly cwd: string;\n readonly prompt: string;\n readonly timeoutMs?: number;\n readonly env: NodeJS.ProcessEnv;\n readonly signal?: AbortSignal;\n readonly onStdoutChunk?: (chunk: string) => void;\n readonly onStderrChunk?: (chunk: string) => void;\n}\n\ninterface CodexRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n readonly timedOut?: boolean;\n}\n\ntype CodexRunner = (options: CodexRunOptions) => Promise<CodexRunResult>;\n\nexport class CodexProvider implements Provider {\n readonly id: string;\n readonly kind = 'codex' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: CodexResolvedConfig;\n private readonly runCodex: CodexRunner;\n private environmentCheck?: Promise<void>;\n private resolvedExecutable?: string;\n\n constructor(\n targetName: string,\n config: CodexResolvedConfig,\n runner: CodexRunner = defaultCodexRunner,\n ) {\n this.id = `codex:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n this.runCodex = runner;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Codex provider request was aborted before execution');\n }\n\n await this.ensureEnvironmentReady();\n\n const inputFiles = normalizeInputFiles(request.inputFiles);\n\n const workspaceRoot = await this.createWorkspace();\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n try {\n const basePrompt = buildPromptDocument(request, inputFiles);\n const systemPrompt = this.config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n const promptContent = `${systemPrompt}\\n\\n${basePrompt}`;\n const promptFile = path.join(workspaceRoot, PROMPT_FILENAME);\n await writeFile(promptFile, promptContent, 'utf8');\n\n const args = this.buildCodexArgs();\n const cwd = this.resolveCwd(workspaceRoot);\n\n const result = await this.executeCodex(args, cwd, promptContent, request.signal, logger);\n\n if (result.timedOut) {\n throw new Error(\n `Codex CLI timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n\n if (result.exitCode !== 0) {\n const detail = pickDetail(result.stderr, result.stdout);\n const prefix = `Codex CLI exited with code ${result.exitCode}`;\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\n }\n\n const parsed = parseCodexJson(result.stdout);\n const assistantText = extractAssistantText(parsed);\n\n return {\n raw: {\n response: parsed,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n args,\n executable: this.resolvedExecutable ?? this.config.executable,\n promptFile,\n workspace: workspaceRoot,\n inputFiles,\n logFile: logger?.filePath,\n },\n outputMessages: [{ role: 'assistant' as const, content: assistantText }],\n };\n } finally {\n await logger?.close();\n await this.cleanupWorkspace(workspaceRoot);\n }\n }\n\n private async ensureEnvironmentReady(): Promise<void> {\n if (!this.environmentCheck) {\n this.environmentCheck = this.validateEnvironment();\n }\n await this.environmentCheck;\n }\n\n private async validateEnvironment(): Promise<void> {\n this.resolvedExecutable = await locateExecutable(this.config.executable);\n }\n\n private resolveCwd(workspaceRoot: string): string {\n if (!this.config.cwd) {\n return workspaceRoot;\n }\n return path.resolve(this.config.cwd);\n }\n\n private buildCodexArgs(): string[] {\n // Global flags must come before 'exec' subcommand\n const args = [\n '--ask-for-approval',\n 'never',\n 'exec',\n '--json',\n '--color',\n 'never',\n '--skip-git-repo-check',\n ];\n if (this.config.args && this.config.args.length > 0) {\n args.push(...this.config.args);\n }\n args.push('-');\n return args;\n }\n\n private async executeCodex(\n args: readonly string[],\n cwd: string,\n promptContent: string,\n signal: AbortSignal | undefined,\n logger: CodexStreamLogger | undefined,\n ): Promise<CodexRunResult> {\n try {\n return await this.runCodex({\n executable: this.resolvedExecutable ?? this.config.executable,\n args,\n cwd,\n prompt: promptContent,\n timeoutMs: this.config.timeoutMs,\n env: process.env,\n signal,\n onStdoutChunk: logger ? (chunk) => logger.handleStdoutChunk(chunk) : undefined,\n onStderrChunk: logger ? (chunk) => logger.handleStderrChunk(chunk) : undefined,\n });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n throw new Error(\n `Codex executable '${this.config.executable}' was not found. Update the target settings.executable or add it to PATH.`,\n );\n }\n throw error;\n }\n }\n\n private async createWorkspace(): Promise<string> {\n return await mkdtemp(path.join(tmpdir(), WORKSPACE_PREFIX));\n }\n\n private async cleanupWorkspace(workspaceRoot: string): Promise<void> {\n try {\n await rm(workspaceRoot, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n\n private resolveLogDirectory(): string | undefined {\n const disabled = isCodexLogStreamingDisabled();\n if (disabled) {\n return undefined;\n }\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'codex');\n }\n\n private async createStreamLogger(\n request: ProviderRequest,\n ): Promise<CodexStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Codex stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\n\n try {\n const logger = await CodexStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n });\n recordCodexLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Codex stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\nclass CodexStreamLogger {\n readonly filePath: string;\n private readonly stream: WriteStream;\n private readonly startedAt = Date.now();\n private stdoutBuffer = '';\n private stderrBuffer = '';\n private readonly format: 'summary' | 'json';\n\n private constructor(filePath: string, format: 'summary' | 'json') {\n this.filePath = filePath;\n this.format = format;\n this.stream = createWriteStream(filePath, { flags: 'a' });\n }\n\n static async create(options: {\n readonly filePath: string;\n readonly targetName: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly format: 'summary' | 'json';\n }): Promise<CodexStreamLogger> {\n const logger = new CodexStreamLogger(options.filePath, options.format);\n const header = [\n '# Codex CLI stream log',\n `# target: ${options.targetName}`,\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\n `# started: ${new Date().toISOString()}`,\n '',\n ].filter((line): line is string => Boolean(line));\n logger.writeLines(header);\n return logger;\n }\n\n handleStdoutChunk(chunk: string): void {\n this.stdoutBuffer += chunk;\n this.flushBuffer('stdout');\n }\n\n handleStderrChunk(chunk: string): void {\n this.stderrBuffer += chunk;\n this.flushBuffer('stderr');\n }\n\n async close(): Promise<void> {\n this.flushBuffer('stdout');\n this.flushBuffer('stderr');\n this.flushRemainder();\n await new Promise<void>((resolve, reject) => {\n this.stream.once('error', reject);\n this.stream.end(() => resolve());\n });\n }\n\n private writeLines(lines: readonly string[]): void {\n for (const line of lines) {\n this.stream.write(`${line}\\n`);\n }\n }\n\n private flushBuffer(source: 'stdout' | 'stderr'): void {\n const buffer = source === 'stdout' ? this.stdoutBuffer : this.stderrBuffer;\n const lines = buffer.split(/\\r?\\n/);\n const remainder = lines.pop() ?? '';\n if (source === 'stdout') {\n this.stdoutBuffer = remainder;\n } else {\n this.stderrBuffer = remainder;\n }\n for (const line of lines) {\n const formatted = this.formatLine(line, source);\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n }\n\n private formatLine(rawLine: string, source: 'stdout' | 'stderr'): string | undefined {\n const trimmed = rawLine.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n const message =\n this.format === 'json' ? formatCodexJsonLog(trimmed) : formatCodexLogMessage(trimmed, source);\n return `[+${formatElapsed(this.startedAt)}] [${source}] ${message}`;\n }\n\n private flushRemainder(): void {\n const stdoutRemainder = this.stdoutBuffer.trim();\n if (stdoutRemainder.length > 0) {\n const formatted = this.formatLine(stdoutRemainder, 'stdout');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n const stderrRemainder = this.stderrBuffer.trim();\n if (stderrRemainder.length > 0) {\n const formatted = this.formatLine(stderrRemainder, 'stderr');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n this.stdoutBuffer = '';\n this.stderrBuffer = '';\n }\n}\n\nfunction isCodexLogStreamingDisabled(): boolean {\n const envValue = process.env.AGENTV_CODEX_STREAM_LOGS;\n if (!envValue) {\n return false;\n }\n const normalized = envValue.trim().toLowerCase();\n return normalized === 'false' || normalized === '0' || normalized === 'off';\n}\n\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const evalId = sanitizeForFilename(request.evalCaseId ?? 'codex');\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : '';\n const target = sanitizeForFilename(targetName);\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\n}\n\nfunction sanitizeForFilename(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : 'codex';\n}\n\nfunction formatElapsed(startedAt: number): string {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\n const hours = Math.floor(elapsedSeconds / 3600);\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\n const seconds = elapsedSeconds % 60;\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\nfunction formatCodexLogMessage(rawLine: string, source: 'stdout' | 'stderr'): string {\n const parsed = tryParseJsonValue(rawLine);\n if (parsed) {\n const summary = summarizeCodexEvent(parsed);\n if (summary) {\n return summary;\n }\n }\n if (source === 'stderr') {\n return `stderr: ${rawLine}`;\n }\n return rawLine;\n}\n\nfunction formatCodexJsonLog(rawLine: string): string {\n const parsed = tryParseJsonValue(rawLine);\n if (!parsed) {\n return rawLine;\n }\n try {\n return JSON.stringify(parsed, null, 2);\n } catch {\n return rawLine;\n }\n}\n\nfunction summarizeCodexEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n let message =\n extractFromEvent(event) ??\n extractFromItem(record.item) ??\n flattenContent(record.output ?? record.content);\n if (!message && type === JSONL_TYPE_ITEM_COMPLETED) {\n const item = record.item;\n if (item && typeof item === 'object') {\n const candidate = flattenContent(\n (item as Record<string, unknown>).text ??\n (item as Record<string, unknown>).content ??\n (item as Record<string, unknown>).output,\n );\n if (candidate) {\n message = candidate;\n }\n }\n }\n if (!message) {\n const itemType =\n typeof (record.item as Record<string, unknown> | undefined)?.type === 'string'\n ? (record.item as Record<string, unknown>).type\n : undefined;\n if (type && itemType) {\n return `${type}:${itemType}`;\n }\n if (type) {\n return type;\n }\n }\n if (type && message) {\n return `${type}: ${message}`;\n }\n if (message) {\n return message;\n }\n return type;\n}\n\nfunction tryParseJsonValue(rawLine: string): unknown | undefined {\n try {\n return JSON.parse(rawLine);\n } catch {\n return undefined;\n }\n}\n\nasync function locateExecutable(candidate: string): Promise<string> {\n const includesPathSeparator = candidate.includes('/') || candidate.includes('\\\\');\n if (includesPathSeparator) {\n const resolved = path.isAbsolute(candidate) ? candidate : path.resolve(candidate);\n const executablePath = await ensureWindowsExecutableVariant(resolved);\n await access(executablePath, constants.F_OK);\n return executablePath;\n }\n\n const locator = process.platform === 'win32' ? 'where' : 'which';\n try {\n const { stdout } = await execAsync(`${locator} ${candidate}`);\n const lines = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n const preferred = selectExecutableCandidate(lines);\n if (preferred) {\n const executablePath = await ensureWindowsExecutableVariant(preferred);\n await access(executablePath, constants.F_OK);\n return executablePath;\n }\n } catch {\n // ignore and fall back to error below\n }\n\n throw new Error(`Codex executable '${candidate}' was not found on PATH`);\n}\n\nfunction selectExecutableCandidate(candidates: readonly string[]): string | undefined {\n if (candidates.length === 0) {\n return undefined;\n }\n if (process.platform !== 'win32') {\n return candidates[0];\n }\n const extensions = getWindowsExecutableExtensions();\n for (const ext of extensions) {\n const match = candidates.find((candidate) => candidate.toLowerCase().endsWith(ext));\n if (match) {\n return match;\n }\n }\n return candidates[0];\n}\n\nasync function ensureWindowsExecutableVariant(candidate: string): Promise<string> {\n if (process.platform !== 'win32') {\n return candidate;\n }\n if (hasExecutableExtension(candidate)) {\n return candidate;\n }\n\n const extensions = getWindowsExecutableExtensions();\n for (const ext of extensions) {\n const withExtension = `${candidate}${ext}`;\n try {\n await access(withExtension, constants.F_OK);\n return withExtension;\n } catch {\n // keep searching\n }\n }\n return candidate;\n}\n\nfunction hasExecutableExtension(candidate: string): boolean {\n const lower = candidate.toLowerCase();\n return getWindowsExecutableExtensions().some((ext) => lower.endsWith(ext));\n}\n\nconst DEFAULT_WINDOWS_EXTENSIONS = ['.com', '.exe', '.bat', '.cmd', '.ps1'] as const;\n\nfunction getWindowsExecutableExtensions(): readonly string[] {\n if (process.platform !== 'win32') {\n return [];\n }\n const fromEnv = process.env.PATHEXT?.split(';')\n .map((ext) => ext.trim().toLowerCase())\n .filter((ext) => ext.length > 0);\n return fromEnv && fromEnv.length > 0 ? fromEnv : DEFAULT_WINDOWS_EXTENSIONS;\n}\n\nfunction parseCodexJson(output: string): unknown {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n throw new Error('Codex CLI produced no output in --json mode');\n }\n try {\n return JSON.parse(trimmed);\n } catch {\n const lineObjects = parseJsonLines(trimmed);\n if (lineObjects) {\n return lineObjects;\n }\n const lastBrace = trimmed.lastIndexOf('{');\n if (lastBrace >= 0) {\n const candidate = trimmed.slice(lastBrace);\n try {\n return JSON.parse(candidate);\n } catch {\n // fallthrough\n }\n }\n const preview = trimmed.slice(0, 200);\n throw new Error(`Codex CLI emitted invalid JSON: ${preview}${trimmed.length > 200 ? '…' : ''}`);\n }\n}\n\nfunction extractAssistantText(parsed: unknown): string {\n if (Array.isArray(parsed)) {\n const text = extractFromEventStream(parsed);\n if (text) {\n return text;\n }\n }\n\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('Codex CLI JSON response did not include an assistant message');\n }\n\n const record = parsed as Record<string, unknown>;\n const eventText = extractFromEvent(record);\n if (eventText) {\n return eventText;\n }\n\n const messages = Array.isArray(record.messages) ? record.messages : undefined;\n if (messages) {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const entry = messages[index];\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n const role = (entry as Record<string, unknown>).role;\n if (role !== 'assistant') {\n continue;\n }\n const content = (entry as Record<string, unknown>).content;\n const flattened = flattenContent(content);\n if (flattened) {\n return flattened;\n }\n }\n }\n\n const response = record.response;\n if (response && typeof response === 'object') {\n const content = (response as Record<string, unknown>).content;\n const flattened = flattenContent(content);\n if (flattened) {\n return flattened;\n }\n }\n\n const output = record.output;\n const flattenedOutput = flattenContent(output);\n if (flattenedOutput) {\n return flattenedOutput;\n }\n\n throw new Error('Codex CLI JSON response did not include an assistant message');\n}\n\nfunction extractFromEventStream(events: readonly unknown[]): string | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const candidate = events[index];\n const text = extractFromEvent(candidate);\n if (text) {\n return text;\n }\n }\n return undefined;\n}\n\nfunction extractFromEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n if (type === JSONL_TYPE_ITEM_COMPLETED) {\n const item = record.item;\n const text = extractFromItem(item);\n if (text) {\n return text;\n }\n }\n const output = record.output ?? record.content;\n const flattened = flattenContent(output);\n if (flattened) {\n return flattened;\n }\n return undefined;\n}\n\nfunction extractFromItem(item: unknown): string | undefined {\n if (!item || typeof item !== 'object') {\n return undefined;\n }\n const record = item as Record<string, unknown>;\n const itemType = typeof record.type === 'string' ? record.type : undefined;\n if (itemType === 'agent_message' || itemType === 'response' || itemType === 'output') {\n const text = flattenContent(record.text ?? record.content ?? record.output);\n if (text) {\n return text;\n }\n }\n return undefined;\n}\n\nfunction flattenContent(value: unknown): string | undefined {\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n const parts = value\n .map((segment) => {\n if (typeof segment === 'string') {\n return segment;\n }\n if (segment && typeof segment === 'object' && 'text' in segment) {\n const text = (segment as Record<string, unknown>).text;\n return typeof text === 'string' ? text : undefined;\n }\n return undefined;\n })\n .filter((part): part is string => typeof part === 'string' && part.length > 0);\n return parts.length > 0 ? parts.join(' \\n') : undefined;\n }\n if (value && typeof value === 'object' && 'text' in value) {\n const text = (value as Record<string, unknown>).text;\n return typeof text === 'string' ? text : undefined;\n }\n return undefined;\n}\n\nfunction parseJsonLines(output: string): unknown[] | undefined {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length <= 1) {\n return undefined;\n }\n const parsed: unknown[] = [];\n for (const line of lines) {\n try {\n parsed.push(JSON.parse(line));\n } catch {\n return undefined;\n }\n }\n return parsed;\n}\n\nfunction pickDetail(stderr: string, stdout: string): string | undefined {\n const errorText = stderr.trim();\n if (errorText.length > 0) {\n return errorText;\n }\n const stdoutText = stdout.trim();\n return stdoutText.length > 0 ? stdoutText : undefined;\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n\nasync function defaultCodexRunner(options: CodexRunOptions): Promise<CodexRunResult> {\n return await new Promise<CodexRunResult>((resolve, reject) => {\n const child = spawn(options.executable, options.args, {\n cwd: options.cwd,\n env: options.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n shell: shouldShellExecute(options.executable),\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const onAbort = (): void => {\n child.kill('SIGTERM');\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeoutMs);\n timeoutHandle.unref?.();\n }\n\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk) => {\n stdout += chunk;\n options.onStdoutChunk?.(chunk);\n });\n\n child.stderr.setEncoding('utf8');\n child.stderr.on('data', (chunk) => {\n stderr += chunk;\n options.onStderrChunk?.(chunk);\n });\n\n child.stdin.end(options.prompt);\n\n const cleanup = (): void => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n if (options.signal) {\n options.signal.removeEventListener('abort', onAbort);\n }\n };\n\n child.on('error', (error) => {\n cleanup();\n reject(error);\n });\n\n child.on('close', (code) => {\n cleanup();\n resolve({\n stdout,\n stderr,\n exitCode: typeof code === 'number' ? code : -1,\n timedOut,\n });\n });\n });\n}\n\nfunction shouldShellExecute(executable: string): boolean {\n if (process.platform !== 'win32') {\n return false;\n }\n const lower = executable.toLowerCase();\n return lower.endsWith('.cmd') || lower.endsWith('.bat') || lower.endsWith('.ps1');\n}\n","export type CodexLogEntry = {\n readonly filePath: string;\n readonly evalCaseId?: string;\n readonly targetName: string;\n readonly attempt?: number;\n};\n\nconst GLOBAL_LOGS_KEY = Symbol.for('agentv.codexLogs');\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for('agentv.codexLogSubscribers');\n\ntype CodexLogListener = (entry: CodexLogEntry) => void;\n\ntype GlobalWithCodexLogs = typeof globalThis & {\n [GLOBAL_LOGS_KEY]?: CodexLogEntry[];\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<CodexLogListener>;\n};\n\nfunction getCodexLogStore(): CodexLogEntry[] {\n const globalObject = globalThis as GlobalWithCodexLogs;\n const existing = globalObject[GLOBAL_LOGS_KEY];\n if (existing) {\n return existing;\n }\n const created: CodexLogEntry[] = [];\n globalObject[GLOBAL_LOGS_KEY] = created;\n return created;\n}\n\nfunction getSubscriberStore(): Set<CodexLogListener> {\n const globalObject = globalThis as GlobalWithCodexLogs;\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\n if (existing) {\n return existing;\n }\n const created = new Set<CodexLogListener>();\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\n return created;\n}\n\nfunction notifySubscribers(entry: CodexLogEntry): void {\n const subscribers = Array.from(getSubscriberStore());\n for (const listener of subscribers) {\n try {\n listener(entry);\n } catch (error) {\n // Avoid surfacing subscriber errors to providers; log for visibility.\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Codex log subscriber failed: ${message}`);\n }\n }\n}\n\nexport function recordCodexLogEntry(entry: CodexLogEntry): void {\n getCodexLogStore().push(entry);\n notifySubscribers(entry);\n}\n\nexport function consumeCodexLogEntries(): CodexLogEntry[] {\n const store = getCodexLogStore();\n if (store.length === 0) {\n return [];\n }\n return store.splice(0, store.length);\n}\n\nexport function subscribeToCodexLogEntries(listener: CodexLogListener): () => void {\n const store = getSubscriberStore();\n store.add(listener);\n return () => {\n store.delete(listener);\n };\n}\n","import path from 'node:path';\n\nimport { isGuidelineFile } from '../yaml-parser.js';\nimport type { ProviderRequest } from './types.js';\n\nexport interface PromptDocumentOptions {\n readonly guidelinePatterns?: readonly string[];\n readonly guidelineOverrides?: ReadonlySet<string>;\n}\n\nexport function buildPromptDocument(\n request: ProviderRequest,\n inputFiles: readonly string[] | undefined,\n options?: PromptDocumentOptions,\n): string {\n const parts: string[] = [];\n\n const guidelineFiles = collectGuidelineFiles(\n inputFiles,\n options?.guidelinePatterns ?? request.guideline_patterns,\n options?.guidelineOverrides,\n );\n const inputFilesList = collectInputFiles(inputFiles);\n\n const nonGuidelineInputFiles = inputFilesList.filter((file) => !guidelineFiles.includes(file));\n\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineInputFiles);\n if (prereadBlock.length > 0) {\n parts.push('\\n', prereadBlock);\n }\n\n parts.push('\\n[[ ## user_query ## ]]\\n', request.question.trim());\n\n return parts.join('\\n').trim();\n}\n\nexport function normalizeInputFiles(\n inputFiles: readonly string[] | undefined,\n): string[] | undefined {\n if (!inputFiles || inputFiles.length === 0) {\n return undefined;\n }\n const deduped = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!deduped.has(absolutePath)) {\n deduped.set(absolutePath, absolutePath);\n }\n }\n return Array.from(deduped.values());\n}\n\nexport function collectGuidelineFiles(\n inputFiles: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n overrides?: ReadonlySet<string>,\n): string[] {\n if (!inputFiles || inputFiles.length === 0) {\n return [];\n }\n\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (overrides?.has(absolutePath)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n continue;\n }\n\n const normalized = absolutePath.split(path.sep).join('/');\n if (isGuidelineFile(normalized, guidelinePatterns)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction collectInputFiles(inputFiles: readonly string[] | undefined): string[] {\n if (!inputFiles || inputFiles.length === 0) {\n return [];\n }\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n return Array.from(unique.values());\n}\n\nfunction buildMandatoryPrereadBlock(\n guidelineFiles: readonly string[],\n inputFiles: readonly string[],\n): string {\n if (guidelineFiles.length === 0 && inputFiles.length === 0) {\n return '';\n }\n\n const buildList = (files: readonly string[]): string[] =>\n files.map((absolutePath) => {\n const fileName = path.basename(absolutePath);\n const fileUri = pathToFileUri(absolutePath);\n return `* [${fileName}](${fileUri})`;\n });\n\n const sections: string[] = [];\n if (guidelineFiles.length > 0) {\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join('\\n')}.`);\n }\n\n if (inputFiles.length > 0) {\n sections.push(`Read all input files:\\n${buildList(inputFiles).join('\\n')}.`);\n }\n\n sections.push(\n 'If any file is missing, fail with ERROR: missing-file <filename> and stop.',\n 'Then apply system_instructions on the user query below.',\n );\n\n return sections.join('\\n');\n}\n\nfunction pathToFileUri(filePath: string): string {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n return `file://${normalizedPath}`;\n}\n","import type { MockResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst DEFAULT_MOCK_RESPONSE =\n '{\"answer\":\"Mock provider response. Configure targets.yaml to supply a custom value.\"}';\n\nexport class MockProvider implements Provider {\n readonly id: string;\n readonly kind = 'mock' as const;\n readonly targetName: string;\n\n private readonly cannedResponse: string;\n private readonly delayMs: number;\n private readonly delayMinMs: number;\n private readonly delayMaxMs: number;\n\n constructor(targetName: string, config: MockResolvedConfig) {\n this.id = `mock:${targetName}`;\n this.targetName = targetName;\n this.cannedResponse = config.response ?? DEFAULT_MOCK_RESPONSE;\n this.delayMs = config.delayMs ?? 0;\n this.delayMinMs = config.delayMinMs ?? 0;\n this.delayMaxMs = config.delayMaxMs ?? 0;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n const delay = this.calculateDelay();\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n return {\n outputMessages: [{ role: 'assistant' as const, content: this.cannedResponse }],\n raw: {\n question: request.question,\n guidelines: request.guidelines,\n },\n };\n }\n\n private calculateDelay(): number {\n // If range is specified, use uniform random distribution\n if (this.delayMinMs > 0 || this.delayMaxMs > 0) {\n const min = Math.max(0, this.delayMinMs);\n const max = Math.max(min, this.delayMaxMs);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n // Otherwise use fixed delay\n return this.delayMs;\n }\n}\n","import { spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { createWriteStream } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\n\nimport { recordPiLogEntry } from './pi-log-tracker.js';\nimport { normalizeInputFiles } from './preread.js';\nimport type { PiCodingAgentResolvedConfig } from './targets.js';\nimport type {\n OutputMessage,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n} from './types.js';\n\nconst WORKSPACE_PREFIX = 'agentv-pi-';\nconst PROMPT_FILENAME = 'prompt.md';\n\n/**\n * Default system prompt for Pi Coding Agent evaluations.\n * Ensures the agent returns code in its response rather than just writing files.\n */\nconst DEFAULT_SYSTEM_PROMPT = `**IMPORTANT**: Follow these instructions for your response:\n- Do NOT create any additional output files in the workspace.\n- All intended file outputs/changes MUST be written in your response.\n- For each intended file, include the relative path and unified git diff following the convention \\`diff --git ...\\`.\nThis is required for evaluation scoring.`;\n\ninterface PiRunOptions {\n readonly executable: string;\n readonly args: readonly string[];\n readonly cwd: string;\n readonly timeoutMs?: number;\n readonly env: NodeJS.ProcessEnv;\n readonly signal?: AbortSignal;\n readonly onStdoutChunk?: (chunk: string) => void;\n readonly onStderrChunk?: (chunk: string) => void;\n}\n\ninterface PiRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n readonly timedOut?: boolean;\n}\n\ntype PiRunner = (options: PiRunOptions) => Promise<PiRunResult>;\n\nexport class PiCodingAgentProvider implements Provider {\n readonly id: string;\n readonly kind = 'pi-coding-agent' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: PiCodingAgentResolvedConfig;\n private readonly runPi: PiRunner;\n\n constructor(\n targetName: string,\n config: PiCodingAgentResolvedConfig,\n runner: PiRunner = defaultPiRunner,\n ) {\n this.id = `pi-coding-agent:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n this.runPi = runner;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Pi coding agent request was aborted before execution');\n }\n\n const inputFiles = normalizeInputFiles(request.inputFiles);\n\n const workspaceRoot = await this.createWorkspace();\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n try {\n // Save prompt to file for debugging/logging\n const promptFile = path.join(workspaceRoot, PROMPT_FILENAME);\n await writeFile(promptFile, request.question, 'utf8');\n\n const args = this.buildPiArgs(request.question, inputFiles);\n const cwd = this.resolveCwd(workspaceRoot);\n\n const result = await this.executePi(args, cwd, request.signal, logger);\n\n if (result.timedOut) {\n throw new Error(\n `Pi coding agent timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n\n if (result.exitCode !== 0) {\n const detail = pickDetail(result.stderr, result.stdout);\n const prefix = `Pi coding agent exited with code ${result.exitCode}`;\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\n }\n\n const parsed = parsePiJsonl(result.stdout);\n const outputMessages = extractOutputMessages(parsed);\n const assistantText = extractAssistantText(outputMessages);\n\n return {\n raw: {\n response: parsed,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n args,\n executable: this.config.executable,\n promptFile,\n workspace: workspaceRoot,\n inputFiles,\n logFile: logger?.filePath,\n },\n outputMessages,\n };\n } finally {\n await logger?.close();\n await this.cleanupWorkspace(workspaceRoot);\n }\n }\n\n private resolveCwd(workspaceRoot: string): string {\n if (!this.config.cwd) {\n return workspaceRoot;\n }\n return path.resolve(this.config.cwd);\n }\n\n private buildPiArgs(prompt: string, inputFiles: readonly string[] | undefined): string[] {\n const args: string[] = [];\n\n // Provider and model configuration\n if (this.config.provider) {\n args.push('--provider', this.config.provider);\n }\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n if (this.config.apiKey) {\n args.push('--api-key', this.config.apiKey);\n }\n\n // Output mode - always use JSON for structured output\n args.push('--mode', 'json');\n\n // Non-interactive mode\n args.push('--print');\n\n // No session storage for eval runs\n args.push('--no-session');\n\n // Tools configuration\n if (this.config.tools) {\n args.push('--tools', this.config.tools);\n }\n\n // Thinking level\n if (this.config.thinking) {\n args.push('--thinking', this.config.thinking);\n }\n\n // Custom args\n if (this.config.args && this.config.args.length > 0) {\n args.push(...this.config.args);\n }\n\n // Input files passed with @path syntax (pi-native file inclusion)\n if (inputFiles && inputFiles.length > 0) {\n for (const file of inputFiles) {\n args.push(`@${file}`);\n }\n }\n\n // Prepend system prompt (use default if not configured)\n const systemPrompt = this.config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n const fullPrompt = `${systemPrompt}\\n\\n${prompt}`;\n\n // Escape @ symbols in prompt that aren't file references\n // Pi CLI interprets @ as file prefix, but AgentV uses @[Role]: for multi-turn\n const escapedPrompt = escapeAtSymbols(fullPrompt);\n\n // Prompt is passed as the final argument\n args.push(escapedPrompt);\n\n return args;\n }\n\n private async executePi(\n args: readonly string[],\n cwd: string,\n signal: AbortSignal | undefined,\n logger: PiStreamLogger | undefined,\n ): Promise<PiRunResult> {\n try {\n return await this.runPi({\n executable: this.config.executable,\n args,\n cwd,\n timeoutMs: this.config.timeoutMs,\n env: this.buildEnv(),\n signal,\n onStdoutChunk: logger ? (chunk) => logger.handleStdoutChunk(chunk) : undefined,\n onStderrChunk: logger ? (chunk) => logger.handleStderrChunk(chunk) : undefined,\n });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n throw new Error(\n `Pi coding agent executable '${this.config.executable}' was not found. Update the target settings.executable or add it to PATH.`,\n );\n }\n throw error;\n }\n }\n\n private buildEnv(): NodeJS.ProcessEnv {\n const env = { ...process.env };\n\n // Map provider-specific API key to the correct env var\n if (this.config.apiKey) {\n const provider = this.config.provider?.toLowerCase() ?? 'google';\n switch (provider) {\n case 'google':\n case 'gemini':\n env.GEMINI_API_KEY = this.config.apiKey;\n break;\n case 'anthropic':\n env.ANTHROPIC_API_KEY = this.config.apiKey;\n break;\n case 'openai':\n env.OPENAI_API_KEY = this.config.apiKey;\n break;\n case 'groq':\n env.GROQ_API_KEY = this.config.apiKey;\n break;\n case 'xai':\n env.XAI_API_KEY = this.config.apiKey;\n break;\n case 'openrouter':\n env.OPENROUTER_API_KEY = this.config.apiKey;\n break;\n }\n }\n\n return env;\n }\n\n private async createWorkspace(): Promise<string> {\n return await mkdtemp(path.join(tmpdir(), WORKSPACE_PREFIX));\n }\n\n private async cleanupWorkspace(workspaceRoot: string): Promise<void> {\n try {\n await rm(workspaceRoot, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n\n private resolveLogDirectory(): string | undefined {\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'pi-coding-agent');\n }\n\n private async createStreamLogger(request: ProviderRequest): Promise<PiStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Pi stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\n\n try {\n const logger = await PiStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n });\n recordPiLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Pi stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\nclass PiStreamLogger {\n readonly filePath: string;\n private readonly stream: WriteStream;\n private readonly startedAt = Date.now();\n private stdoutBuffer = '';\n private stderrBuffer = '';\n private readonly format: 'summary' | 'json';\n\n private constructor(filePath: string, format: 'summary' | 'json') {\n this.filePath = filePath;\n this.format = format;\n this.stream = createWriteStream(filePath, { flags: 'a' });\n }\n\n static async create(options: {\n readonly filePath: string;\n readonly targetName: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly format: 'summary' | 'json';\n }): Promise<PiStreamLogger> {\n const logger = new PiStreamLogger(options.filePath, options.format);\n const header = [\n '# Pi Coding Agent stream log',\n `# target: ${options.targetName}`,\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\n `# started: ${new Date().toISOString()}`,\n '',\n ].filter((line): line is string => Boolean(line));\n logger.writeLines(header);\n return logger;\n }\n\n handleStdoutChunk(chunk: string): void {\n this.stdoutBuffer += chunk;\n this.flushBuffer('stdout');\n }\n\n handleStderrChunk(chunk: string): void {\n this.stderrBuffer += chunk;\n this.flushBuffer('stderr');\n }\n\n async close(): Promise<void> {\n this.flushBuffer('stdout');\n this.flushBuffer('stderr');\n this.flushRemainder();\n await new Promise<void>((resolve, reject) => {\n this.stream.once('error', reject);\n this.stream.end(() => resolve());\n });\n }\n\n private writeLines(lines: readonly string[]): void {\n for (const line of lines) {\n this.stream.write(`${line}\\n`);\n }\n }\n\n private flushBuffer(source: 'stdout' | 'stderr'): void {\n const buffer = source === 'stdout' ? this.stdoutBuffer : this.stderrBuffer;\n const lines = buffer.split(/\\r?\\n/);\n const remainder = lines.pop() ?? '';\n if (source === 'stdout') {\n this.stdoutBuffer = remainder;\n } else {\n this.stderrBuffer = remainder;\n }\n for (const line of lines) {\n const formatted = this.formatLine(line, source);\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n }\n\n private formatLine(rawLine: string, source: 'stdout' | 'stderr'): string | undefined {\n const trimmed = rawLine.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n const message =\n this.format === 'json' ? formatPiJsonLog(trimmed) : formatPiLogMessage(trimmed, source);\n return `[+${formatElapsed(this.startedAt)}] [${source}] ${message}`;\n }\n\n private flushRemainder(): void {\n const stdoutRemainder = this.stdoutBuffer.trim();\n if (stdoutRemainder.length > 0) {\n const formatted = this.formatLine(stdoutRemainder, 'stdout');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n const stderrRemainder = this.stderrBuffer.trim();\n if (stderrRemainder.length > 0) {\n const formatted = this.formatLine(stderrRemainder, 'stderr');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n this.stdoutBuffer = '';\n this.stderrBuffer = '';\n }\n}\n\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const evalId = sanitizeForFilename(request.evalCaseId ?? 'pi');\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : '';\n const target = sanitizeForFilename(targetName);\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\n}\n\nfunction sanitizeForFilename(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : 'pi';\n}\n\nfunction formatElapsed(startedAt: number): string {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\n const hours = Math.floor(elapsedSeconds / 3600);\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\n const seconds = elapsedSeconds % 60;\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\nfunction formatPiLogMessage(rawLine: string, source: 'stdout' | 'stderr'): string {\n const parsed = tryParseJsonValue(rawLine);\n if (parsed) {\n const summary = summarizePiEvent(parsed);\n if (summary) {\n return summary;\n }\n }\n if (source === 'stderr') {\n return `stderr: ${rawLine}`;\n }\n return rawLine;\n}\n\nfunction formatPiJsonLog(rawLine: string): string {\n const parsed = tryParseJsonValue(rawLine);\n if (!parsed) {\n return rawLine;\n }\n try {\n return JSON.stringify(parsed, null, 2);\n } catch {\n return rawLine;\n }\n}\n\nfunction summarizePiEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n\n if (!type) {\n return undefined;\n }\n\n // Handle specific event types\n switch (type) {\n case 'agent_start':\n return 'agent_start';\n case 'agent_end':\n return 'agent_end';\n case 'turn_start':\n return 'turn_start';\n case 'turn_end':\n return 'turn_end';\n case 'message_start':\n case 'message_end': {\n const message = record.message as Record<string, unknown> | undefined;\n const role = message?.role;\n return `${type}: ${role}`;\n }\n case 'message_update': {\n const event = record.assistantMessageEvent as Record<string, unknown> | undefined;\n const eventType = event?.type;\n if (eventType === 'text_delta') {\n const delta = event?.delta;\n if (typeof delta === 'string') {\n const preview = delta.length > 50 ? `${delta.slice(0, 50)}...` : delta;\n return `text_delta: ${preview}`;\n }\n }\n return `message_update: ${eventType}`;\n }\n default:\n return type;\n }\n}\n\nfunction tryParseJsonValue(rawLine: string): unknown | undefined {\n try {\n return JSON.parse(rawLine);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Parse Pi coding agent JSONL output.\n * Returns an array of parsed JSON objects from each line.\n */\nfunction parsePiJsonl(output: string): unknown[] {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n throw new Error('Pi coding agent produced no output');\n }\n\n const lines = trimmed\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n const parsed: unknown[] = [];\n for (const line of lines) {\n try {\n parsed.push(JSON.parse(line));\n } catch {\n // Skip non-JSON lines (e.g., stderr mixed in)\n }\n }\n\n if (parsed.length === 0) {\n throw new Error('Pi coding agent produced no valid JSON output');\n }\n\n return parsed;\n}\n\n/**\n * Extract OutputMessage array from Pi JSONL events.\n * Looks for the agent_end event which contains the full message history.\n */\nfunction extractOutputMessages(events: unknown[]): readonly OutputMessage[] {\n // Find the agent_end event which contains all messages\n for (let i = events.length - 1; i >= 0; i--) {\n const event = events[i];\n if (!event || typeof event !== 'object') {\n continue;\n }\n const record = event as Record<string, unknown>;\n if (record.type !== 'agent_end') {\n continue;\n }\n\n const messages = record.messages;\n if (!Array.isArray(messages)) {\n continue;\n }\n\n return messages.map(convertPiMessage).filter((m): m is OutputMessage => m !== undefined);\n }\n\n // Fallback: collect messages from turn_end events\n const outputMessages: OutputMessage[] = [];\n for (const event of events) {\n if (!event || typeof event !== 'object') {\n continue;\n }\n const record = event as Record<string, unknown>;\n if (record.type === 'turn_end') {\n const message = record.message;\n const converted = convertPiMessage(message);\n if (converted) {\n outputMessages.push(converted);\n }\n }\n }\n\n return outputMessages;\n}\n\n/**\n * Convert a Pi message to AgentV OutputMessage format.\n */\nfunction convertPiMessage(message: unknown): OutputMessage | undefined {\n if (!message || typeof message !== 'object') {\n return undefined;\n }\n\n const msg = message as Record<string, unknown>;\n const role = msg.role;\n if (typeof role !== 'string') {\n return undefined;\n }\n\n // Extract text content from Pi's content array format\n const content = extractTextContent(msg.content);\n\n // Extract tool calls if present\n const toolCalls = extractToolCalls(msg.content);\n\n // Extract timestamp\n const timestamp =\n typeof msg.timestamp === 'number'\n ? new Date(msg.timestamp).toISOString()\n : typeof msg.timestamp === 'string'\n ? msg.timestamp\n : undefined;\n\n // Extract metadata (usage, model info, etc.)\n const metadata: Record<string, unknown> = {};\n if (msg.api) metadata.api = msg.api;\n if (msg.provider) metadata.provider = msg.provider;\n if (msg.model) metadata.model = msg.model;\n if (msg.usage) metadata.usage = msg.usage;\n if (msg.stopReason) metadata.stopReason = msg.stopReason;\n\n return {\n role,\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n timestamp,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n };\n}\n\n/**\n * Extract text content from Pi's content array format.\n * Pi uses: content: [{ type: \"text\", text: \"...\" }, ...]\n */\nfunction extractTextContent(content: unknown): string | undefined {\n if (typeof content === 'string') {\n return content;\n }\n\n if (!Array.isArray(content)) {\n return undefined;\n }\n\n const textParts: string[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === 'text' && typeof p.text === 'string') {\n textParts.push(p.text);\n }\n }\n\n return textParts.length > 0 ? textParts.join('\\n') : undefined;\n}\n\n/**\n * Extract tool calls from Pi's content array format.\n * Pi uses: content: [{ type: \"tool_use\", name: \"...\", input: {...} }, ...]\n */\nfunction extractToolCalls(content: unknown): readonly ToolCall[] {\n if (!Array.isArray(content)) {\n return [];\n }\n\n const toolCalls: ToolCall[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === 'tool_use' && typeof p.name === 'string') {\n toolCalls.push({\n tool: p.name,\n input: p.input,\n id: typeof p.id === 'string' ? p.id : undefined,\n });\n }\n // Also handle tool_result for output\n if (p.type === 'tool_result' && typeof p.tool_use_id === 'string') {\n // Find matching tool call and add output\n const existing = toolCalls.find((tc) => tc.id === p.tool_use_id);\n if (existing) {\n // Create new object with output added\n const idx = toolCalls.indexOf(existing);\n toolCalls[idx] = {\n ...existing,\n output: p.content,\n };\n }\n }\n }\n\n return toolCalls;\n}\n\n/**\n * Extract the final assistant text from output messages.\n */\nfunction extractAssistantText(messages: readonly OutputMessage[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === 'assistant' && msg.content) {\n if (typeof msg.content === 'string') {\n return msg.content;\n }\n return JSON.stringify(msg.content);\n }\n }\n return '';\n}\n\n/**\n * Escape @ symbols in prompt text that pi CLI would interpret as file references.\n * Pi CLI uses @path syntax for file inclusion, but AgentV prompts use @[Role]: markers.\n * We replace @[ with [[ to avoid pi trying to read these as files.\n */\nfunction escapeAtSymbols(prompt: string): string {\n // Replace @[Role]: patterns with [[Role]]: to avoid pi file interpretation\n // This handles @[System]:, @[User]:, @[Assistant]:, @[Tool]: etc.\n return prompt.replace(/@\\[([^\\]]+)\\]:/g, '[[$1]]:');\n}\n\nfunction pickDetail(stderr: string, stdout: string): string | undefined {\n const errorText = stderr.trim();\n if (errorText.length > 0) {\n return errorText;\n }\n const stdoutText = stdout.trim();\n return stdoutText.length > 0 ? stdoutText : undefined;\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n\nasync function defaultPiRunner(options: PiRunOptions): Promise<PiRunResult> {\n return await new Promise<PiRunResult>((resolve, reject) => {\n // Parse executable - may be \"node /path/to/script.js\" or just \"pi\"\n const parts = options.executable.split(/\\s+/);\n const executable = parts[0];\n const executableArgs = parts.slice(1);\n const allArgs = [...executableArgs, ...options.args];\n\n const child = spawn(executable, allArgs, {\n cwd: options.cwd,\n env: options.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n shell: false,\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const onAbort = (): void => {\n child.kill('SIGTERM');\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeoutMs);\n timeoutHandle.unref?.();\n }\n\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk) => {\n stdout += chunk;\n options.onStdoutChunk?.(chunk);\n });\n\n child.stderr.setEncoding('utf8');\n child.stderr.on('data', (chunk) => {\n stderr += chunk;\n options.onStderrChunk?.(chunk);\n });\n\n // Close stdin immediately since prompt is passed as argument\n child.stdin.end();\n\n const cleanup = (): void => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n if (options.signal) {\n options.signal.removeEventListener('abort', onAbort);\n }\n };\n\n child.on('error', (error) => {\n cleanup();\n reject(error);\n });\n\n child.on('close', (code) => {\n cleanup();\n resolve({\n stdout,\n stderr,\n exitCode: typeof code === 'number' ? code : -1,\n timedOut,\n });\n });\n });\n}\n","export type PiLogEntry = {\n readonly filePath: string;\n readonly evalCaseId?: string;\n readonly targetName: string;\n readonly attempt?: number;\n};\n\nconst GLOBAL_LOGS_KEY = Symbol.for('agentv.piLogs');\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for('agentv.piLogSubscribers');\n\ntype PiLogListener = (entry: PiLogEntry) => void;\n\ntype GlobalWithPiLogs = typeof globalThis & {\n [GLOBAL_LOGS_KEY]?: PiLogEntry[];\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<PiLogListener>;\n};\n\nfunction getPiLogStore(): PiLogEntry[] {\n const globalObject = globalThis as GlobalWithPiLogs;\n const existing = globalObject[GLOBAL_LOGS_KEY];\n if (existing) {\n return existing;\n }\n const created: PiLogEntry[] = [];\n globalObject[GLOBAL_LOGS_KEY] = created;\n return created;\n}\n\nfunction getSubscriberStore(): Set<PiLogListener> {\n const globalObject = globalThis as GlobalWithPiLogs;\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\n if (existing) {\n return existing;\n }\n const created = new Set<PiLogListener>();\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\n return created;\n}\n\nfunction notifySubscribers(entry: PiLogEntry): void {\n const subscribers = Array.from(getSubscriberStore());\n for (const listener of subscribers) {\n try {\n listener(entry);\n } catch (error) {\n // Avoid surfacing subscriber errors to providers; log for visibility.\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Pi log subscriber failed: ${message}`);\n }\n }\n}\n\nexport function recordPiLogEntry(entry: PiLogEntry): void {\n getPiLogStore().push(entry);\n notifySubscribers(entry);\n}\n\nexport function consumePiLogEntries(): PiLogEntry[] {\n const store = getPiLogStore();\n if (store.length === 0) {\n return [];\n }\n return store.splice(0, store.length);\n}\n\nexport function subscribeToPiLogEntries(listener: PiLogListener): () => void {\n const store = getSubscriberStore();\n store.add(listener);\n return () => {\n store.delete(listener);\n };\n}\n","import path from 'node:path';\nimport { z } from 'zod';\n\nimport type { EnvLookup, TargetDefinition } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Zod Schemas for CLI Provider Configuration\n// ---------------------------------------------------------------------------\n\n/**\n * Loose input schema for HTTP healthcheck configuration.\n * Accepts both snake_case (YAML convention) and camelCase (JavaScript convention)\n * property names for flexibility in configuration files.\n *\n * @example\n * ```yaml\n * healthcheck:\n * type: http\n * url: http://localhost:8080/health\n * timeout_seconds: 30\n * ```\n */\nexport const CliHealthcheckHttpInputSchema = z.object({\n type: z.literal('http'),\n url: z.string().min(1, 'healthcheck URL is required'),\n timeout_seconds: z.number().positive().optional(),\n timeoutSeconds: z.number().positive().optional(),\n});\n\n/**\n * Loose input schema for command healthcheck configuration.\n * Accepts both snake_case (YAML convention) and camelCase (JavaScript convention)\n * property names for flexibility in configuration files.\n *\n * Note: discriminatedUnion requires plain ZodObject, so command_template/commandTemplate\n * presence is validated during normalization rather than here.\n *\n * @example\n * ```yaml\n * healthcheck:\n * type: command\n * command_template: curl http://localhost:8080/health\n * cwd: /app\n * timeout_seconds: 10\n * ```\n */\nexport const CliHealthcheckCommandInputSchema = z.object({\n type: z.literal('command'),\n command_template: z.string().optional(),\n commandTemplate: z.string().optional(),\n cwd: z.string().optional(),\n timeout_seconds: z.number().positive().optional(),\n timeoutSeconds: z.number().positive().optional(),\n});\n\n/**\n * Discriminated union for healthcheck input configuration.\n * Uses the 'type' field to distinguish between HTTP and command healthchecks.\n *\n * @see CliHealthcheckHttpInputSchema for HTTP healthcheck configuration\n * @see CliHealthcheckCommandInputSchema for command healthcheck configuration\n */\nexport const CliHealthcheckInputSchema = z.discriminatedUnion('type', [\n CliHealthcheckHttpInputSchema,\n CliHealthcheckCommandInputSchema,\n]);\n\n/**\n * Loose input schema for CLI target configuration.\n * Accepts both snake_case (YAML convention) and camelCase (JavaScript convention)\n * property names for maximum flexibility in configuration files.\n *\n * This schema validates the raw YAML input structure before normalization\n * and environment variable resolution. Unknown properties are allowed\n * (passthrough mode) to support future extensions.\n *\n * @example\n * ```yaml\n * targets:\n * - name: my-agent\n * provider: cli\n * command_template: agent run {PROMPT}\n * timeout_seconds: 120\n * healthcheck:\n * type: http\n * url: http://localhost:8080/health\n * ```\n */\nexport const CliTargetInputSchema = z\n .object({\n name: z.string().min(1, 'target name is required'),\n provider: z\n .string()\n .refine((p) => p.toLowerCase() === 'cli', { message: \"provider must be 'cli'\" }),\n\n // Command template - required (accept both naming conventions)\n command_template: z.string().optional(),\n commandTemplate: z.string().optional(),\n\n // Files format - optional\n files_format: z.string().optional(),\n filesFormat: z.string().optional(),\n attachments_format: z.string().optional(),\n attachmentsFormat: z.string().optional(),\n\n // Working directory - optional\n cwd: z.string().optional(),\n\n // Timeout in seconds - optional\n timeout_seconds: z.number().positive().optional(),\n timeoutSeconds: z.number().positive().optional(),\n\n // Healthcheck configuration - optional\n healthcheck: CliHealthcheckInputSchema.optional(),\n\n // Verbose mode - optional\n verbose: z.boolean().optional(),\n cli_verbose: z.boolean().optional(),\n cliVerbose: z.boolean().optional(),\n\n // Keep temp files - optional\n keep_temp_files: z.boolean().optional(),\n keepTempFiles: z.boolean().optional(),\n keep_output_files: z.boolean().optional(),\n keepOutputFiles: z.boolean().optional(),\n\n // Common target fields\n judge_target: z.string().optional(),\n workers: z.number().int().min(1).optional(),\n provider_batching: z.boolean().optional(),\n providerBatching: z.boolean().optional(),\n })\n .refine((data) => data.command_template !== undefined || data.commandTemplate !== undefined, {\n message: 'Either command_template or commandTemplate is required',\n });\n\n/**\n * Strict normalized schema for HTTP healthcheck configuration.\n * Uses camelCase property names only and rejects unknown properties.\n * This is an internal schema used as part of CliHealthcheckSchema.\n */\nconst CliHealthcheckHttpSchema = z\n .object({\n type: z.literal('http'),\n url: z.string().min(1),\n timeoutMs: z.number().positive().optional(),\n })\n .strict();\n\n/**\n * Strict normalized schema for command healthcheck configuration.\n * Uses camelCase property names only and rejects unknown properties.\n * This is an internal schema used as part of CliHealthcheckSchema.\n */\nconst CliHealthcheckCommandSchema = z\n .object({\n type: z.literal('command'),\n commandTemplate: z.string().min(1),\n cwd: z.string().optional(),\n timeoutMs: z.number().positive().optional(),\n })\n .strict();\n\n/**\n * Strict normalized schema for healthcheck configuration.\n * Discriminated union on 'type' field supporting HTTP and command healthchecks.\n * Rejects unknown properties to catch typos and misconfigurations.\n *\n * @see CliHealthcheckHttpSchema for HTTP healthcheck fields\n * @see CliHealthcheckCommandSchema for command healthcheck fields\n */\nexport const CliHealthcheckSchema = z.discriminatedUnion('type', [\n CliHealthcheckHttpSchema,\n CliHealthcheckCommandSchema,\n]);\n\n/**\n * Strict normalized schema for CLI target configuration.\n * This is the final validated shape after environment variable resolution\n * and snake_case to camelCase normalization.\n *\n * Uses .strict() to reject unknown properties, ensuring configuration\n * errors are caught early rather than silently ignored.\n *\n * @example\n * ```typescript\n * const config: CliNormalizedConfig = {\n * commandTemplate: 'agent run {PROMPT}',\n * timeoutMs: 120000,\n * verbose: true,\n * };\n * CliTargetConfigSchema.parse(config); // Validates the normalized config\n * ```\n */\nexport const CliTargetConfigSchema = z\n .object({\n commandTemplate: z.string().min(1),\n filesFormat: z.string().optional(),\n cwd: z.string().optional(),\n timeoutMs: z.number().positive().optional(),\n healthcheck: CliHealthcheckSchema.optional(),\n verbose: z.boolean().optional(),\n keepTempFiles: z.boolean().optional(),\n })\n .strict();\n\n// Type inference from schemas\nexport type CliHealthcheckInput = z.infer<typeof CliHealthcheckInputSchema>;\nexport type CliTargetInput = z.infer<typeof CliTargetInputSchema>;\nexport type CliNormalizedHealthcheck = z.infer<typeof CliHealthcheckSchema>;\nexport type CliNormalizedConfig = z.infer<typeof CliTargetConfigSchema>;\n\n/**\n * Resolved CLI configuration type derived from CliTargetConfigSchema.\n * This is the final validated shape used by the CLI provider at runtime.\n * Using Readonly to ensure immutability for runtime safety.\n */\nexport type CliResolvedConfig = Readonly<CliNormalizedConfig>;\n\n/**\n * Normalizes a healthcheck input from loose (snake_case + camelCase) to\n * strict normalized form (camelCase only). Resolves environment variables.\n *\n * @param input - The loose healthcheck input from YAML\n * @param env - Environment variable lookup\n * @param targetName - Name of the target (for error messages)\n * @param evalFilePath - Optional path to eval file for relative path resolution\n * @returns Normalized healthcheck configuration\n */\nexport function normalizeCliHealthcheck(\n input: CliHealthcheckInput,\n env: EnvLookup,\n targetName: string,\n evalFilePath?: string,\n): CliNormalizedHealthcheck {\n const timeoutSeconds = input.timeout_seconds ?? input.timeoutSeconds;\n const timeoutMs = timeoutSeconds !== undefined ? Math.floor(timeoutSeconds * 1000) : undefined;\n\n if (input.type === 'http') {\n const url = resolveString(input.url, env, `${targetName} healthcheck URL`);\n return {\n type: 'http',\n url,\n timeoutMs,\n };\n }\n\n // type === 'command'\n const commandTemplateSource = input.command_template ?? input.commandTemplate;\n if (commandTemplateSource === undefined) {\n throw new Error(\n `${targetName} healthcheck: Either command_template or commandTemplate is required for command healthcheck`,\n );\n }\n const commandTemplate = resolveString(\n commandTemplateSource,\n env,\n `${targetName} healthcheck command template`,\n true,\n );\n\n let cwd = resolveOptionalString(input.cwd, env, `${targetName} healthcheck cwd`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n // Resolve relative cwd paths against eval file directory\n if (cwd && evalFilePath && !path.isAbsolute(cwd)) {\n cwd = path.resolve(path.dirname(path.resolve(evalFilePath)), cwd);\n }\n\n return {\n type: 'command',\n commandTemplate,\n cwd,\n timeoutMs,\n };\n}\n\n/**\n * Normalizes a CLI target input from loose (snake_case + camelCase) to\n * strict normalized form (camelCase only). Resolves environment variables.\n *\n * This function coalesces snake_case/camelCase variants and resolves\n * environment variable references using ${{ VAR_NAME }} syntax.\n *\n * @param input - The loose CLI target input from YAML\n * @param env - Environment variable lookup\n * @param evalFilePath - Optional path to eval file for relative path resolution\n * @returns Normalized CLI configuration matching CliResolvedConfig\n */\nexport function normalizeCliTargetInput(\n input: CliTargetInput,\n env: EnvLookup,\n evalFilePath?: string,\n): CliNormalizedConfig {\n const targetName = input.name;\n\n // Coalesce command template variants - at least one is required by schema refinement\n const commandTemplateSource = input.command_template ?? input.commandTemplate;\n if (commandTemplateSource === undefined) {\n throw new Error(`${targetName}: Either command_template or commandTemplate is required`);\n }\n const commandTemplate = resolveString(\n commandTemplateSource,\n env,\n `${targetName} CLI command template`,\n true,\n );\n\n // Coalesce files format variants\n const filesFormatSource =\n input.files_format ?? input.filesFormat ?? input.attachments_format ?? input.attachmentsFormat;\n const filesFormat = resolveOptionalLiteralString(filesFormatSource);\n\n // Resolve working directory\n let cwd = resolveOptionalString(input.cwd, env, `${targetName} working directory`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n // Resolve relative cwd paths against eval file directory\n if (cwd && evalFilePath && !path.isAbsolute(cwd)) {\n cwd = path.resolve(path.dirname(path.resolve(evalFilePath)), cwd);\n }\n // Fallback: if cwd is not set and we have an eval file path, use the eval directory\n if (!cwd && evalFilePath) {\n cwd = path.dirname(path.resolve(evalFilePath));\n }\n\n // Coalesce timeout variants (seconds -> ms)\n const timeoutSeconds = input.timeout_seconds ?? input.timeoutSeconds;\n const timeoutMs = timeoutSeconds !== undefined ? Math.floor(timeoutSeconds * 1000) : undefined;\n\n // Coalesce verbose variants\n const verbose = resolveOptionalBoolean(input.verbose ?? input.cli_verbose ?? input.cliVerbose);\n\n // Coalesce keepTempFiles variants\n const keepTempFiles = resolveOptionalBoolean(\n input.keep_temp_files ??\n input.keepTempFiles ??\n input.keep_output_files ??\n input.keepOutputFiles,\n );\n\n // Normalize healthcheck if present\n const healthcheck = input.healthcheck\n ? normalizeCliHealthcheck(input.healthcheck, env, targetName, evalFilePath)\n : undefined;\n\n return {\n commandTemplate,\n filesFormat,\n cwd,\n timeoutMs,\n healthcheck,\n verbose,\n keepTempFiles,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Other Provider Configurations and Utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Supported CLI placeholder tokens that can be used in command templates.\n * These are replaced with actual values during command execution.\n */\nexport const CLI_PLACEHOLDERS = new Set([\n 'PROMPT',\n 'GUIDELINES',\n 'EVAL_ID',\n 'ATTEMPT',\n 'FILES',\n 'OUTPUT_FILE',\n]);\n\nexport interface RetryConfig {\n readonly maxRetries?: number;\n readonly initialDelayMs?: number;\n readonly maxDelayMs?: number;\n readonly backoffFactor?: number;\n readonly retryableStatusCodes?: readonly number[];\n}\n\n/**\n * Azure OpenAI settings used by the Vercel AI SDK.\n */\nexport interface AzureResolvedConfig {\n readonly resourceName: string;\n readonly deploymentName: string;\n readonly apiKey: string;\n readonly version?: string;\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly retry?: RetryConfig;\n}\n\n/**\n * Anthropic Claude settings used by the Vercel AI SDK.\n */\nexport interface AnthropicResolvedConfig {\n readonly apiKey: string;\n readonly model: string;\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly thinkingBudget?: number;\n readonly retry?: RetryConfig;\n}\n\n/**\n * Google Gemini settings used by the Vercel AI SDK.\n */\nexport interface GeminiResolvedConfig {\n readonly apiKey: string;\n readonly model: string;\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly retry?: RetryConfig;\n}\n\nexport interface CodexResolvedConfig {\n readonly executable: string;\n readonly args?: readonly string[];\n readonly cwd?: string;\n readonly timeoutMs?: number;\n readonly logDir?: string;\n readonly logFormat?: 'summary' | 'json';\n readonly systemPrompt?: string;\n}\n\nexport interface PiCodingAgentResolvedConfig {\n readonly executable: string;\n readonly provider?: string;\n readonly model?: string;\n readonly apiKey?: string;\n readonly tools?: string;\n readonly thinking?: string;\n readonly args?: readonly string[];\n readonly cwd?: string;\n readonly timeoutMs?: number;\n readonly logDir?: string;\n readonly logFormat?: 'summary' | 'json';\n readonly systemPrompt?: string;\n}\n\nexport interface MockResolvedConfig {\n readonly response?: string;\n readonly delayMs?: number;\n readonly delayMinMs?: number;\n readonly delayMaxMs?: number;\n}\n\nexport interface VSCodeResolvedConfig {\n readonly command: string;\n readonly waitForResponse: boolean;\n readonly dryRun: boolean;\n readonly subagentRoot?: string;\n readonly workspaceTemplate?: string;\n}\n\n/**\n * Healthcheck configuration type derived from CliHealthcheckSchema.\n * Supports both HTTP and command-based healthchecks.\n */\nexport type CliHealthcheck = Readonly<CliNormalizedHealthcheck>;\n\n// Note: CliResolvedConfig is a type alias derived from CliNormalizedConfig (see above),\n// which itself is inferred from CliTargetConfigSchema for type safety and single source of truth.\n\nexport type ResolvedTarget =\n | {\n readonly kind: 'azure';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: AzureResolvedConfig;\n }\n | {\n readonly kind: 'anthropic';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: AnthropicResolvedConfig;\n }\n | {\n readonly kind: 'gemini';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: GeminiResolvedConfig;\n }\n | {\n readonly kind: 'codex';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: CodexResolvedConfig;\n }\n | {\n readonly kind: 'pi-coding-agent';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: PiCodingAgentResolvedConfig;\n }\n | {\n readonly kind: 'mock';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: MockResolvedConfig;\n }\n | {\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: VSCodeResolvedConfig;\n }\n | {\n readonly kind: 'cli';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: CliResolvedConfig;\n };\n\nconst BASE_TARGET_SCHEMA = z\n .object({\n name: z.string().min(1, 'target name is required'),\n provider: z.string().min(1, 'provider is required'),\n judge_target: z.string().optional(),\n workers: z.number().int().min(1).optional(),\n })\n .passthrough();\n\nconst DEFAULT_AZURE_API_VERSION = '2024-12-01-preview';\n\nfunction normalizeAzureApiVersion(value: string | undefined): string {\n if (!value) {\n return DEFAULT_AZURE_API_VERSION;\n }\n\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return DEFAULT_AZURE_API_VERSION;\n }\n\n const withoutPrefix = trimmed.replace(/^api[-_]?version\\s*=\\s*/i, '').trim();\n return withoutPrefix.length > 0 ? withoutPrefix : DEFAULT_AZURE_API_VERSION;\n}\n\nfunction resolveRetryConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): RetryConfig | undefined {\n const maxRetries = resolveOptionalNumber(\n target.max_retries ?? target.maxRetries,\n `${target.name} max retries`,\n );\n const initialDelayMs = resolveOptionalNumber(\n target.retry_initial_delay_ms ?? target.retryInitialDelayMs,\n `${target.name} retry initial delay`,\n );\n const maxDelayMs = resolveOptionalNumber(\n target.retry_max_delay_ms ?? target.retryMaxDelayMs,\n `${target.name} retry max delay`,\n );\n const backoffFactor = resolveOptionalNumber(\n target.retry_backoff_factor ?? target.retryBackoffFactor,\n `${target.name} retry backoff factor`,\n );\n const retryableStatusCodes = resolveOptionalNumberArray(\n target.retry_status_codes ?? target.retryStatusCodes,\n `${target.name} retry status codes`,\n );\n\n // Only return retry config if at least one field is set\n if (\n maxRetries === undefined &&\n initialDelayMs === undefined &&\n maxDelayMs === undefined &&\n backoffFactor === undefined &&\n retryableStatusCodes === undefined\n ) {\n return undefined;\n }\n\n return {\n maxRetries,\n initialDelayMs,\n maxDelayMs,\n backoffFactor,\n retryableStatusCodes,\n };\n}\n\nexport function resolveTargetDefinition(\n definition: TargetDefinition,\n env: EnvLookup = process.env,\n evalFilePath?: string,\n): ResolvedTarget {\n const parsed = BASE_TARGET_SCHEMA.parse(definition);\n const provider = parsed.provider.toLowerCase();\n const providerBatching = resolveOptionalBoolean(\n parsed.provider_batching ?? parsed.providerBatching,\n );\n\n switch (provider) {\n case 'azure':\n case 'azure-openai':\n return {\n kind: 'azure',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveAzureConfig(parsed, env),\n };\n case 'anthropic':\n return {\n kind: 'anthropic',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveAnthropicConfig(parsed, env),\n };\n case 'gemini':\n case 'google':\n case 'google-gemini':\n return {\n kind: 'gemini',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveGeminiConfig(parsed, env),\n };\n case 'codex':\n case 'codex-cli':\n return {\n kind: 'codex',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveCodexConfig(parsed, env),\n };\n case 'pi':\n case 'pi-coding-agent':\n return {\n kind: 'pi-coding-agent',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolvePiCodingAgentConfig(parsed, env),\n };\n case 'mock':\n return {\n kind: 'mock',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveMockConfig(parsed),\n };\n case 'vscode':\n case 'vscode-insiders':\n return {\n kind: provider as 'vscode' | 'vscode-insiders',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveVSCodeConfig(parsed, env, provider === 'vscode-insiders'),\n };\n case 'cli':\n return {\n kind: 'cli',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveCliConfig(parsed, env, evalFilePath),\n };\n default:\n throw new Error(`Unsupported provider '${parsed.provider}' in target '${parsed.name}'`);\n }\n}\n\nfunction resolveAzureConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): AzureResolvedConfig {\n const endpointSource = target.endpoint ?? target.resource ?? target.resourceName;\n const apiKeySource = target.api_key ?? target.apiKey;\n const deploymentSource = target.deployment ?? target.deploymentName ?? target.model;\n const versionSource = target.version ?? target.api_version;\n const temperatureSource = target.temperature;\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\n\n const resourceName = resolveString(endpointSource, env, `${target.name} endpoint`);\n const apiKey = resolveString(apiKeySource, env, `${target.name} api key`);\n const deploymentName = resolveString(deploymentSource, env, `${target.name} deployment`);\n const version = normalizeAzureApiVersion(\n resolveOptionalString(versionSource, env, `${target.name} api version`, {\n allowLiteral: true,\n optionalEnv: true,\n }),\n );\n const temperature = resolveOptionalNumber(temperatureSource, `${target.name} temperature`);\n const maxOutputTokens = resolveOptionalNumber(\n maxTokensSource,\n `${target.name} max output tokens`,\n );\n const retry = resolveRetryConfig(target);\n\n return {\n resourceName,\n deploymentName,\n apiKey,\n version,\n temperature,\n maxOutputTokens,\n retry,\n };\n}\n\nfunction resolveAnthropicConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): AnthropicResolvedConfig {\n const apiKeySource = target.api_key ?? target.apiKey;\n const modelSource = target.model ?? target.deployment ?? target.variant;\n const temperatureSource = target.temperature;\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\n const thinkingBudgetSource = target.thinking_budget ?? target.thinkingBudget;\n\n const apiKey = resolveString(apiKeySource, env, `${target.name} Anthropic api key`);\n const model = resolveString(modelSource, env, `${target.name} Anthropic model`);\n const retry = resolveRetryConfig(target);\n\n return {\n apiKey,\n model,\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\n thinkingBudget: resolveOptionalNumber(thinkingBudgetSource, `${target.name} thinking budget`),\n retry,\n };\n}\n\nfunction resolveGeminiConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): GeminiResolvedConfig {\n const apiKeySource = target.api_key ?? target.apiKey;\n const modelSource = target.model ?? target.deployment ?? target.variant;\n const temperatureSource = target.temperature;\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\n\n const apiKey = resolveString(apiKeySource, env, `${target.name} Google API key`);\n const model =\n resolveOptionalString(modelSource, env, `${target.name} Gemini model`, {\n allowLiteral: true,\n optionalEnv: true,\n }) ?? 'gemini-2.5-flash';\n const retry = resolveRetryConfig(target);\n\n return {\n apiKey,\n model,\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\n retry,\n };\n}\n\nfunction resolveCodexConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): CodexResolvedConfig {\n const executableSource = target.executable ?? target.command ?? target.binary;\n const argsSource = target.args ?? target.arguments;\n const cwdSource = target.cwd;\n const timeoutSource = target.timeout_seconds ?? target.timeoutSeconds;\n const logDirSource =\n target.log_dir ?? target.logDir ?? target.log_directory ?? target.logDirectory;\n const logFormatSource =\n target.log_format ??\n target.logFormat ??\n target.log_output_format ??\n target.logOutputFormat ??\n env.AGENTV_CODEX_LOG_FORMAT;\n const systemPromptSource = target.system_prompt ?? target.systemPrompt;\n\n const executable =\n resolveOptionalString(executableSource, env, `${target.name} codex executable`, {\n allowLiteral: true,\n optionalEnv: true,\n }) ?? 'codex';\n\n const args = resolveOptionalStringArray(argsSource, env, `${target.name} codex args`);\n\n const cwd = resolveOptionalString(cwdSource, env, `${target.name} codex cwd`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n const timeoutMs = resolveTimeoutMs(timeoutSource, `${target.name} codex timeout`);\n const logDir = resolveOptionalString(logDirSource, env, `${target.name} codex log directory`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n const logFormat = normalizeCodexLogFormat(logFormatSource);\n\n const systemPrompt =\n typeof systemPromptSource === 'string' && systemPromptSource.trim().length > 0\n ? systemPromptSource.trim()\n : undefined;\n\n return {\n executable,\n args,\n cwd,\n timeoutMs,\n logDir,\n logFormat,\n systemPrompt,\n };\n}\n\nfunction normalizeCodexLogFormat(value: unknown): 'summary' | 'json' | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== 'string') {\n throw new Error(\"codex log format must be 'summary' or 'json'\");\n }\n const normalized = value.trim().toLowerCase();\n if (normalized === 'json' || normalized === 'summary') {\n return normalized;\n }\n throw new Error(\"codex log format must be 'summary' or 'json'\");\n}\n\nfunction resolvePiCodingAgentConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): PiCodingAgentResolvedConfig {\n const executableSource = target.executable ?? target.command ?? target.binary;\n const providerSource = target.pi_provider ?? target.piProvider ?? target.llm_provider;\n const modelSource = target.model ?? target.pi_model ?? target.piModel;\n const apiKeySource = target.api_key ?? target.apiKey;\n const toolsSource = target.tools ?? target.pi_tools ?? target.piTools;\n const thinkingSource = target.thinking ?? target.pi_thinking ?? target.piThinking;\n const argsSource = target.args ?? target.arguments;\n const cwdSource = target.cwd;\n const timeoutSource = target.timeout_seconds ?? target.timeoutSeconds;\n const logDirSource =\n target.log_dir ?? target.logDir ?? target.log_directory ?? target.logDirectory;\n const logFormatSource = target.log_format ?? target.logFormat;\n const systemPromptSource = target.system_prompt ?? target.systemPrompt;\n\n const executable =\n resolveOptionalString(executableSource, env, `${target.name} pi executable`, {\n allowLiteral: true,\n optionalEnv: true,\n }) ?? 'pi';\n\n const provider = resolveOptionalString(providerSource, env, `${target.name} pi provider`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const model = resolveOptionalString(modelSource, env, `${target.name} pi model`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const apiKey = resolveOptionalString(apiKeySource, env, `${target.name} pi api key`, {\n allowLiteral: false,\n optionalEnv: true,\n });\n\n const tools = resolveOptionalString(toolsSource, env, `${target.name} pi tools`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const thinking = resolveOptionalString(thinkingSource, env, `${target.name} pi thinking`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const args = resolveOptionalStringArray(argsSource, env, `${target.name} pi args`);\n\n const cwd = resolveOptionalString(cwdSource, env, `${target.name} pi cwd`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const timeoutMs = resolveTimeoutMs(timeoutSource, `${target.name} pi timeout`);\n\n const logDir = resolveOptionalString(logDirSource, env, `${target.name} pi log directory`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const logFormat =\n logFormatSource === 'json' || logFormatSource === 'summary' ? logFormatSource : undefined;\n\n const systemPrompt =\n typeof systemPromptSource === 'string' && systemPromptSource.trim().length > 0\n ? systemPromptSource.trim()\n : undefined;\n\n return {\n executable,\n provider,\n model,\n apiKey,\n tools,\n thinking,\n args,\n cwd,\n timeoutMs,\n logDir,\n logFormat,\n systemPrompt,\n };\n}\n\nfunction resolveMockConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): MockResolvedConfig {\n const response = typeof target.response === 'string' ? target.response : undefined;\n return { response };\n}\n\nfunction resolveVSCodeConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n insiders: boolean,\n): VSCodeResolvedConfig {\n const workspaceTemplateEnvVar = resolveOptionalLiteralString(\n target.workspace_template ?? target.workspaceTemplate,\n );\n const workspaceTemplate = workspaceTemplateEnvVar\n ? resolveOptionalString(\n workspaceTemplateEnvVar,\n env,\n `${target.name} workspace template path`,\n {\n allowLiteral: false,\n optionalEnv: true,\n },\n )\n : undefined;\n\n const commandSource = target.vscode_cmd ?? target.command;\n const waitSource = target.wait;\n const dryRunSource = target.dry_run ?? target.dryRun;\n const subagentRootSource = target.subagent_root ?? target.subagentRoot;\n\n const defaultCommand = insiders ? 'code-insiders' : 'code';\n const command = resolveOptionalLiteralString(commandSource) ?? defaultCommand;\n\n return {\n command,\n waitForResponse: resolveOptionalBoolean(waitSource) ?? true,\n dryRun: resolveOptionalBoolean(dryRunSource) ?? false,\n subagentRoot: resolveOptionalString(subagentRootSource, env, `${target.name} subagent root`, {\n allowLiteral: true,\n optionalEnv: true,\n }),\n workspaceTemplate,\n };\n}\n\n/**\n * Custom Zod error map for CLI provider validation.\n * Provides clear, user-friendly error messages for common validation failures.\n */\nconst cliErrorMap: z.ZodErrorMap = (issue, ctx) => {\n if (issue.code === z.ZodIssueCode.unrecognized_keys) {\n return { message: `Unknown CLI provider settings: ${issue.keys.join(', ')}` };\n }\n if (issue.code === z.ZodIssueCode.invalid_union_discriminator) {\n return { message: \"healthcheck type must be 'http' or 'command'\" };\n }\n if (issue.code === z.ZodIssueCode.invalid_type && issue.expected === 'string') {\n return { message: `${ctx.defaultError} (expected a string value)` };\n }\n return { message: ctx.defaultError };\n};\n\n/**\n * Resolves a CLI target configuration using Zod schema validation and normalization.\n *\n * This function:\n * 1. Parses the raw target with CliTargetInputSchema for structural validation\n * 2. Normalizes the input using normalizeCliTargetInput() for env var resolution and casing\n * 3. Validates CLI placeholders in the command template\n *\n * @param target - The raw target definition from YAML\n * @param env - Environment variable lookup for ${{ VAR }} resolution\n * @param evalFilePath - Optional path to eval file for relative path resolution\n * @returns Normalized CLI configuration matching CliResolvedConfig\n */\nfunction resolveCliConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n evalFilePath?: string,\n): CliResolvedConfig {\n // Parse with Zod schema for structural validation with custom error messages\n const parseResult = CliTargetInputSchema.safeParse(target, { errorMap: cliErrorMap });\n if (!parseResult.success) {\n const firstError = parseResult.error.errors[0];\n const path = firstError?.path.join('.') || '';\n const prefix = path ? `${target.name} ${path}: ` : `${target.name}: `;\n throw new Error(`${prefix}${firstError?.message}`);\n }\n\n // Normalize the parsed input (handles env var resolution, casing, path resolution)\n const normalized = normalizeCliTargetInput(parseResult.data, env, evalFilePath);\n\n // Validate CLI placeholders in command template\n assertSupportedCliPlaceholders(normalized.commandTemplate, `${target.name} CLI command template`);\n\n // Validate CLI placeholders in healthcheck command template if present\n if (normalized.healthcheck?.type === 'command') {\n assertSupportedCliPlaceholders(\n normalized.healthcheck.commandTemplate,\n `${target.name} healthcheck command template`,\n );\n }\n\n return normalized;\n}\n\nfunction resolveTimeoutMs(source: unknown, description: string): number | undefined {\n const seconds = resolveOptionalNumber(source, `${description} (seconds)`);\n if (seconds === undefined) {\n return undefined;\n }\n if (seconds <= 0) {\n throw new Error(`${description} must be greater than zero seconds`);\n }\n return Math.floor(seconds * 1000);\n}\n\nfunction assertSupportedCliPlaceholders(template: string, description: string): void {\n const placeholders = extractCliPlaceholders(template);\n for (const placeholder of placeholders) {\n if (!CLI_PLACEHOLDERS.has(placeholder)) {\n throw new Error(\n `${description} includes unsupported placeholder '{${placeholder}}'. Supported placeholders: ${Array.from(CLI_PLACEHOLDERS).join(', ')}`,\n );\n }\n }\n}\n\nfunction extractCliPlaceholders(template: string): string[] {\n const matches = template.matchAll(/\\{([A-Z_]+)\\}/g);\n const results: string[] = [];\n for (const match of matches) {\n if (match[1]) {\n results.push(match[1]);\n }\n }\n return results;\n}\n\nfunction resolveString(\n source: unknown,\n env: EnvLookup,\n description: string,\n allowLiteral = false,\n): string {\n const value = resolveOptionalString(source, env, description, {\n allowLiteral,\n optionalEnv: false,\n });\n if (value === undefined) {\n throw new Error(`${description} is required`);\n }\n return value;\n}\n\nfunction resolveOptionalString(\n source: unknown,\n env: EnvLookup,\n description: string,\n options?: { allowLiteral?: boolean; optionalEnv?: boolean },\n): string | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (typeof source !== 'string') {\n throw new Error(`${description} must be a string`);\n }\n const trimmed = source.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n // Check for ${{ variable }} syntax\n const envVarMatch = trimmed.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\n if (envVarMatch) {\n const varName = envVarMatch[1];\n const envValue = env[varName];\n const optionalEnv = options?.optionalEnv ?? false;\n\n // Treat empty or undefined env vars the same way\n if (envValue === undefined || envValue.trim().length === 0) {\n if (optionalEnv) {\n return undefined;\n }\n const status = envValue === undefined ? 'is not set' : 'is empty';\n throw new Error(`Environment variable '${varName}' required for ${description} ${status}`);\n }\n return envValue;\n }\n\n // Return as literal value\n const allowLiteral = options?.allowLiteral ?? false;\n if (!allowLiteral) {\n throw new Error(\n `${description} must use \\${{ VARIABLE_NAME }} syntax for environment variables or be marked as allowing literals`,\n );\n }\n return trimmed;\n}\n\nfunction resolveOptionalLiteralString(source: unknown): string | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (typeof source !== 'string') {\n throw new Error('expected string value');\n }\n const trimmed = source.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction resolveOptionalNumber(source: unknown, description: string): number | undefined {\n if (source === undefined || source === null || source === '') {\n return undefined;\n }\n if (typeof source === 'number') {\n return Number.isFinite(source) ? source : undefined;\n }\n if (typeof source === 'string') {\n const numeric = Number(source);\n if (Number.isFinite(numeric)) {\n return numeric;\n }\n }\n throw new Error(`${description} must be a number`);\n}\n\nfunction resolveOptionalBoolean(source: unknown): boolean | undefined {\n if (source === undefined || source === null || source === '') {\n return undefined;\n }\n if (typeof source === 'boolean') {\n return source;\n }\n if (typeof source === 'string') {\n const lowered = source.trim().toLowerCase();\n if (lowered === 'true' || lowered === '1') {\n return true;\n }\n if (lowered === 'false' || lowered === '0') {\n return false;\n }\n }\n throw new Error('expected boolean value');\n}\n\nfunction resolveOptionalStringArray(\n source: unknown,\n env: EnvLookup,\n description: string,\n): readonly string[] | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (!Array.isArray(source)) {\n throw new Error(`${description} must be an array of strings`);\n }\n if (source.length === 0) {\n return undefined;\n }\n const resolved: string[] = [];\n for (let i = 0; i < source.length; i++) {\n const item = source[i];\n if (typeof item !== 'string') {\n throw new Error(`${description}[${i}] must be a string`);\n }\n const trimmed = item.trim();\n if (trimmed.length === 0) {\n throw new Error(`${description}[${i}] cannot be empty`);\n }\n\n // Check for ${{ variable }} syntax\n const envVarMatch = trimmed.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\n if (envVarMatch) {\n const varName = envVarMatch[1];\n const envValue = env[varName];\n if (envValue !== undefined) {\n if (envValue.trim().length === 0) {\n throw new Error(`Environment variable '${varName}' for ${description}[${i}] is empty`);\n }\n resolved.push(envValue);\n continue;\n }\n throw new Error(`Environment variable '${varName}' for ${description}[${i}] is not set`);\n }\n\n // Treat as literal value\n resolved.push(trimmed);\n }\n return resolved.length > 0 ? resolved : undefined;\n}\n\nfunction resolveOptionalNumberArray(\n source: unknown,\n description: string,\n): readonly number[] | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (!Array.isArray(source)) {\n throw new Error(`${description} must be an array of numbers`);\n }\n if (source.length === 0) {\n return undefined;\n }\n const resolved: number[] = [];\n for (let i = 0; i < source.length; i++) {\n const item = source[i];\n if (typeof item !== 'number' || !Number.isFinite(item)) {\n throw new Error(`${description}[${i}] must be a number`);\n }\n resolved.push(item);\n }\n return resolved.length > 0 ? resolved : undefined;\n}\n","import path from 'node:path';\nimport {\n dispatchAgentSession,\n dispatchBatchAgent,\n getSubagentRoot,\n provisionSubagents,\n} from 'subagent';\n\nimport { readTextFile } from '../file-utils.js';\nimport { isGuidelineFile } from '../yaml-parser.js';\nimport type { VSCodeResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\nimport { AGENTV_BATCH_REQUEST_TEMPLATE, AGENTV_REQUEST_TEMPLATE } from './vscode-templates.js';\n\nexport class VSCodeProvider implements Provider {\n readonly id: string;\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly targetName: string;\n readonly supportsBatch = true;\n\n private readonly config: VSCodeResolvedConfig;\n\n constructor(\n targetName: string,\n config: VSCodeResolvedConfig,\n kind: 'vscode' | 'vscode-insiders',\n ) {\n this.id = `${kind}:${targetName}`;\n this.kind = kind;\n this.targetName = targetName;\n this.config = config;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('VS Code provider request was aborted before dispatch');\n }\n\n const inputFiles = normalizeAttachments(request.inputFiles);\n const promptContent = buildPromptDocument(request, inputFiles, request.guideline_patterns);\n\n const session = await dispatchAgentSession({\n userQuery: promptContent,\n extraAttachments: inputFiles,\n requestTemplate: AGENTV_REQUEST_TEMPLATE,\n wait: this.config.waitForResponse,\n dryRun: this.config.dryRun,\n vscodeCmd: this.config.command,\n subagentRoot: this.config.subagentRoot,\n workspaceTemplate: this.config.workspaceTemplate,\n silent: true,\n });\n\n if (session.exitCode !== 0 || !session.responseFile) {\n const failure = session.error ?? 'VS Code subagent did not produce a response';\n throw new Error(failure);\n }\n\n if (this.config.dryRun) {\n return {\n outputMessages: [],\n raw: {\n session,\n inputFiles,\n },\n };\n }\n\n const responseText = await readTextFile(session.responseFile);\n\n return {\n outputMessages: [{ role: 'assistant', content: responseText }],\n raw: {\n session,\n inputFiles,\n },\n };\n }\n\n async invokeBatch(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]> {\n if (requests.length === 0) {\n return [];\n }\n\n const normalizedRequests = requests.map((req) => ({\n request: req,\n inputFiles: normalizeAttachments(req.inputFiles),\n }));\n\n const combinedInputFiles = mergeAttachments(\n normalizedRequests.map(({ inputFiles }) => inputFiles),\n );\n const userQueries = normalizedRequests.map(({ request, inputFiles }) =>\n buildPromptDocument(request, inputFiles, request.guideline_patterns),\n );\n\n const session = await dispatchBatchAgent({\n userQueries,\n extraAttachments: combinedInputFiles,\n requestTemplate: AGENTV_BATCH_REQUEST_TEMPLATE,\n wait: this.config.waitForResponse,\n dryRun: this.config.dryRun,\n vscodeCmd: this.config.command,\n subagentRoot: this.config.subagentRoot,\n workspaceTemplate: this.config.workspaceTemplate,\n silent: true,\n });\n\n if (session.exitCode !== 0 || !session.responseFiles) {\n const failure = session.error ?? 'VS Code subagent did not produce batch responses';\n throw new Error(failure);\n }\n\n if (this.config.dryRun) {\n return normalizedRequests.map(({ inputFiles }) => ({\n outputMessages: [],\n raw: {\n session,\n inputFiles,\n allInputFiles: combinedInputFiles,\n },\n }));\n }\n\n if (session.responseFiles.length !== requests.length) {\n throw new Error(\n `VS Code batch returned ${session.responseFiles.length} responses for ${requests.length} requests`,\n );\n }\n\n const responses: ProviderResponse[] = [];\n for (const [index, responseFile] of session.responseFiles.entries()) {\n const responseText = await readTextFile(responseFile);\n responses.push({\n outputMessages: [{ role: 'assistant', content: responseText }],\n raw: {\n session,\n inputFiles: normalizedRequests[index]?.inputFiles,\n allInputFiles: combinedInputFiles,\n responseFile,\n },\n });\n }\n\n return responses;\n }\n}\n\nfunction buildPromptDocument(\n request: ProviderRequest,\n attachments: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n): string {\n const parts: string[] = [];\n\n // Agent providers incorporate systemPrompt into the question\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\n parts.push(request.systemPrompt.trim());\n }\n\n const guidelineFiles = collectGuidelineFiles(attachments, guidelinePatterns);\n const attachmentFiles = collectAttachmentFiles(attachments);\n\n const nonGuidelineAttachments = attachmentFiles.filter((file) => !guidelineFiles.includes(file));\n\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineAttachments);\n if (prereadBlock.length > 0) {\n parts.push('\\n', prereadBlock);\n }\n\n parts.push('\\n[[ ## user_query ## ]]\\n', request.question.trim());\n\n return parts.join('\\n').trim();\n}\n\nfunction buildMandatoryPrereadBlock(\n guidelineFiles: readonly string[],\n attachmentFiles: readonly string[],\n): string {\n if (guidelineFiles.length === 0 && attachmentFiles.length === 0) {\n return '';\n }\n\n const buildList = (files: readonly string[]): string[] =>\n files.map((absolutePath) => {\n const fileName = path.basename(absolutePath);\n const fileUri = pathToFileUri(absolutePath);\n return `* [${fileName}](${fileUri})`;\n });\n\n const sections: string[] = [];\n if (guidelineFiles.length > 0) {\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join('\\n')}.`);\n }\n\n if (attachmentFiles.length > 0) {\n sections.push(`Read all attachment files:\\n${buildList(attachmentFiles).join('\\n')}.`);\n }\n\n sections.push(\n 'If any file is missing, fail with ERROR: missing-file <filename> and stop.',\n 'Then apply system_instructions on the user query below.',\n );\n\n return sections.join('\\n');\n}\n\nfunction collectGuidelineFiles(\n attachments: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n): string[] {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n\n const unique = new Map<string, string>();\n for (const attachment of attachments) {\n const absolutePath = path.resolve(attachment);\n const normalized = absolutePath.split(path.sep).join('/');\n\n if (isGuidelineFile(normalized, guidelinePatterns)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction collectAttachmentFiles(attachments: readonly string[] | undefined): string[] {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n const unique = new Map<string, string>();\n for (const attachment of attachments) {\n const absolutePath = path.resolve(attachment);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n return Array.from(unique.values());\n}\n\nfunction pathToFileUri(filePath: string): string {\n // Convert to absolute path if relative\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n\n // On Windows, convert backslashes to forward slashes\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n\n // Handle Windows drive letters (e.g., C:/ becomes file:///C:/)\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n\n // Unix-like paths\n return `file://${normalizedPath}`;\n}\n\nfunction _composeUserQuery(request: ProviderRequest): string {\n // For VS Code, guidelines are handled via file attachments\n // Do NOT include guideline content in the user query\n return request.question.trim();\n}\n\nfunction normalizeAttachments(attachments: readonly string[] | undefined): string[] | undefined {\n if (!attachments || attachments.length === 0) {\n return undefined;\n }\n const deduped = new Set<string>();\n for (const attachment of attachments) {\n deduped.add(path.resolve(attachment));\n }\n return Array.from(deduped);\n}\n\nfunction mergeAttachments(all: readonly (readonly string[] | undefined)[]): string[] | undefined {\n const deduped = new Set<string>();\n for (const list of all) {\n if (!list) continue;\n for (const inputFile of list) {\n deduped.add(path.resolve(inputFile));\n }\n }\n return deduped.size > 0 ? Array.from(deduped) : undefined;\n}\n\nexport interface EnsureSubagentsOptions {\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly count: number;\n readonly verbose?: boolean;\n}\n\nexport interface EnsureSubagentsResult {\n readonly provisioned: boolean;\n readonly message?: string;\n}\n\n/**\n * Ensures the required number of VSCode subagents are provisioned using the subagent package.\n * This guarantees version compatibility by using the same subagent package version.\n *\n * @param options - Configuration for subagent provisioning\n * @returns Information about the provisioning result\n */\nexport async function ensureVSCodeSubagents(\n options: EnsureSubagentsOptions,\n): Promise<EnsureSubagentsResult> {\n const { kind, count, verbose = false } = options;\n const vscodeCmd = kind === 'vscode-insiders' ? 'code-insiders' : 'code';\n const subagentRoot = getSubagentRoot(vscodeCmd);\n\n try {\n if (verbose) {\n console.log(`Provisioning ${count} subagent(s) via: subagent ${vscodeCmd} provision`);\n }\n\n const result = await provisionSubagents({\n targetRoot: subagentRoot,\n subagents: count,\n dryRun: false,\n });\n\n if (verbose) {\n if (result.created.length > 0) {\n console.log(`Created ${result.created.length} new subagent(s)`);\n }\n if (result.skippedExisting.length > 0) {\n console.log(`Reusing ${result.skippedExisting.length} existing unlocked subagent(s)`);\n }\n console.log(\n `\\ntotal unlocked subagents available: ${result.created.length + result.skippedExisting.length}`,\n );\n }\n\n return {\n provisioned: true,\n message: `Provisioned ${count} subagent(s): ${result.created.length} created, ${result.skippedExisting.length} reused`,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Don't fail if provisioning fails - agents might already exist\n if (verbose) {\n console.warn(`Provisioning failed (continuing anyway): ${errorMessage}`);\n }\n\n return {\n provisioned: false,\n message: `Provisioning failed: ${errorMessage}`,\n };\n }\n}\n","/**\n * Custom request templates for AgentV evaluation workflows\n * These templates are used when dispatching to VSCode via subagent\n */\n\nexport const AGENTV_REQUEST_TEMPLATE = `[[ ## task ## ]]\n\n{{userQuery}}\n\n[[ ## system_instructions ## ]]\n\n**IMPORTANT**: Follow these exact steps:\n1. Create and write your complete response to: {{responseFileTmp}}\n - Do NOT create any additional output files in the workspace.\n - All intended file outputs/changes MUST be written in your response file.\n - For each intended file, include the repo name, relative path and unified git diff following the convention \\`diff --git ...\\`.\n2. When completely finished, run these PowerShell commands to signal completion:\n\\`\\`\\`\nMove-Item -LiteralPath '{{responseFileTmp}}' -Destination '{{responseFileFinal}}'\nif (Test-Path subagent.lock) { del subagent.lock }\n\\`\\`\\`\n\nDo not proceed to step 2 until your response is completely written to the temporary file.\n`;\n\nexport const AGENTV_BATCH_REQUEST_TEMPLATE = `[[ ## task ## ]]\n\n{{userQuery}}\n\n[[ ## system_instructions ## ]]\n\n**IMPORTANT**: Follow these exact steps:\n1. Create and write your complete response to: {{responseFileTmp}}\n - Do NOT create any additional output files in the workspace.\n - All intended file outputs/changes MUST be written in your response file.\n - For each intended file, include the repo name, relative path and unified git diff following the convention \\`diff --git ...\\`.\n2. When completely finished and the response is stable, rename it to: {{responseFileFinal}}\n3. Do not unlock the workspace from this request; batch orchestration will handle unlocking after all responses are ready.\n`;\n\nexport const AGENTV_BATCH_ORCHESTRATOR_TEMPLATE = `MANDATORY: Run #runSubagent tool in your Available Actions for each request file to process them in isolated contexts.\nDO NOT read the request files yourself - only pass the file paths to each subagent:\n\n{{requestFiles}}\n\nAfter ALL queries complete, verify all responses exist and unlock:\n\n\\`\\`\\`powershell\n$responses = @({{responseList}})\n$missing = $responses | Where-Object { -not (Test-Path \"messages/$_\") }\nif ($missing.Count -eq 0) { del subagent.lock }\n\\`\\`\\`\n`;\n","import { constants } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { TARGETS_SCHEMA_V2 } from './types.js';\nimport type { TargetDefinition } from './types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction extractTargetsArray(parsed: Record<string, unknown>, absolutePath: string): unknown[] {\n const targets = parsed.targets;\n if (!Array.isArray(targets)) {\n throw new Error(`targets.yaml at ${absolutePath} must have a 'targets' array`);\n }\n return targets;\n}\n\nfunction assertTargetDefinition(value: unknown, index: number, filePath: string): TargetDefinition {\n if (!isRecord(value)) {\n throw new Error(`targets.yaml entry at index ${index} in ${filePath} must be an object`);\n }\n\n const name = value.name;\n const provider = value.provider;\n\n if (typeof name !== 'string' || name.trim().length === 0) {\n throw new Error(\n `targets.yaml entry at index ${index} in ${filePath} is missing a valid 'name'`,\n );\n }\n\n if (typeof provider !== 'string' || provider.trim().length === 0) {\n throw new Error(`targets.yaml entry '${name}' in ${filePath} is missing a valid 'provider'`);\n }\n\n // Pass through all properties from the YAML to support the flattened schema\n // This includes all provider-specific settings at the top level\n return value as unknown as TargetDefinition;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readTargetDefinitions(\n filePath: string,\n): Promise<readonly TargetDefinition[]> {\n const absolutePath = path.resolve(filePath);\n if (!(await fileExists(absolutePath))) {\n throw new Error(`targets.yaml not found at ${absolutePath}`);\n }\n\n const raw = await readFile(absolutePath, 'utf8');\n const parsed = parse(raw) as unknown;\n\n if (!isRecord(parsed)) {\n throw new Error(`targets.yaml at ${absolutePath} must be a YAML object with a 'targets' field`);\n }\n\n const targets = extractTargetsArray(parsed, absolutePath);\n const definitions = targets.map((entry, index) =>\n assertTargetDefinition(entry, index, absolutePath),\n );\n return definitions;\n}\n\nexport function listTargetNames(definitions: readonly TargetDefinition[]): readonly string[] {\n return definitions.map((definition) => definition.name);\n}\n","import { AnthropicProvider, AzureProvider, GeminiProvider } from './ai-sdk.js';\nimport { CliProvider } from './cli.js';\nimport { CodexProvider } from './codex.js';\nimport { MockProvider } from './mock.js';\nimport { PiCodingAgentProvider } from './pi-coding-agent.js';\nimport type { ResolvedTarget } from './targets.js';\nimport { resolveTargetDefinition } from './targets.js';\nimport type { EnvLookup, Provider, TargetDefinition } from './types.js';\nimport { VSCodeProvider } from './vscode.js';\n\nexport type {\n EnvLookup,\n Provider,\n ProviderKind,\n ProviderRequest,\n ProviderResponse,\n ProviderTokenUsage,\n TargetDefinition,\n} from './types.js';\n\nexport type {\n AnthropicResolvedConfig,\n AzureResolvedConfig,\n CliResolvedConfig,\n GeminiResolvedConfig,\n MockResolvedConfig,\n PiCodingAgentResolvedConfig,\n ResolvedTarget,\n VSCodeResolvedConfig,\n} from './targets.js';\n\nexport { resolveTargetDefinition };\nexport { readTargetDefinitions, listTargetNames } from './targets-file.js';\nexport {\n ensureVSCodeSubagents,\n type EnsureSubagentsOptions,\n type EnsureSubagentsResult,\n} from './vscode.js';\nexport { consumeCodexLogEntries, subscribeToCodexLogEntries } from './codex-log-tracker.js';\nexport { consumePiLogEntries, subscribeToPiLogEntries } from './pi-log-tracker.js';\n\nexport function createProvider(target: ResolvedTarget): Provider {\n switch (target.kind) {\n case 'azure':\n return new AzureProvider(target.name, target.config);\n case 'anthropic':\n return new AnthropicProvider(target.name, target.config);\n case 'gemini':\n return new GeminiProvider(target.name, target.config);\n case 'cli':\n return new CliProvider(target.name, target.config);\n case 'codex':\n return new CodexProvider(target.name, target.config);\n case 'pi-coding-agent':\n return new PiCodingAgentProvider(target.name, target.config);\n case 'mock':\n return new MockProvider(target.name, target.config);\n case 'vscode':\n case 'vscode-insiders':\n return new VSCodeProvider(target.name, target.config, target.kind);\n default: {\n // Exhaustive check\n const neverTarget: never = target;\n throw new Error(`Unsupported provider kind ${(neverTarget as { kind: string }).kind}`);\n }\n }\n}\n\nexport function resolveAndCreateProvider(\n definition: TargetDefinition,\n env: EnvLookup = process.env,\n): Provider {\n const resolved = resolveTargetDefinition(definition, env);\n return createProvider(resolved);\n}\n","import { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport { execShellWithStdin } from '../runtime/exec.js';\nimport type { ResolvedTarget } from './providers/targets.js';\nimport {\n type ChatPrompt,\n type OutputMessage,\n type Provider,\n type ProviderResponse,\n extractLastAssistantContent,\n} from './providers/types.js';\nimport { TEMPLATE_VARIABLES } from './template-variables.js';\nimport type {\n ToolTrajectoryEvaluatorConfig,\n ToolTrajectoryExpectedItem,\n TraceSummary,\n} from './trace.js';\nimport type {\n EvalCase,\n EvaluationVerdict,\n EvaluatorConfig,\n JsonObject,\n RubricItem,\n} from './types.js';\n\nexport type { EvaluationVerdict };\n\n/**\n * Default evaluator template for the user prompt (variables will be substituted).\n * Custom evaluators can override this via evaluatorTemplate option.\n */\nconst DEFAULT_EVALUATOR_TEMPLATE = `You are an expert evaluator. Your goal is to grade the candidate_answer based on how well it achieves the expected_outcome for the original task.\n\nUse the reference_answer as a gold standard for a high-quality response (if provided). The reference_answer may be a simple text response, or it may contain a sequence of expected agent messages including tool calls. When it contains multiple messages, the last message represents the final expected answer. The candidate_answer does not need to match it verbatim, but should capture the key points and follow the same spirit.\n\nBe concise and focused in your evaluation. Provide succinct, specific feedback rather than verbose explanations.\n\n[[ ## expected_outcome ## ]]\n{{${TEMPLATE_VARIABLES.EXPECTED_OUTCOME}}}\n\n[[ ## question ## ]]\n{{${TEMPLATE_VARIABLES.QUESTION}}}\n\n[[ ## reference_answer ## ]]\n{{${TEMPLATE_VARIABLES.REFERENCE_ANSWER}}}\n\n[[ ## candidate_answer ## ]]\n{{${TEMPLATE_VARIABLES.CANDIDATE_ANSWER}}}`;\n\nexport interface EvaluationContext {\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly attempt: number;\n readonly promptInputs: {\n readonly question: string;\n readonly guidelines: string;\n readonly systemMessage?: string;\n readonly chatPrompt?: ChatPrompt;\n };\n readonly now: Date;\n readonly judgeProvider?: Provider;\n readonly evaluatorTemplateOverride?: string;\n readonly evaluator?: EvaluatorConfig;\n /** Output messages from agent execution (primary source for tool trajectory) */\n readonly outputMessages?: readonly OutputMessage[];\n /** Lightweight summary of trace events (if available) */\n readonly traceSummary?: TraceSummary;\n}\n\nexport interface EvaluationScore {\n readonly score: number;\n readonly verdict: EvaluationVerdict;\n readonly hits: readonly string[];\n readonly misses: readonly string[];\n readonly expectedAspectCount: number;\n readonly reasoning?: string;\n readonly rawAspects?: readonly string[];\n readonly evaluatorRawRequest?: JsonObject;\n readonly evaluatorResults?: readonly ChildEvaluatorResult[];\n}\n\nexport interface ChildEvaluatorResult {\n readonly name: string;\n readonly type: string;\n readonly score: number;\n readonly weight?: number;\n readonly verdict: EvaluationVerdict;\n readonly hits: readonly string[];\n readonly misses: readonly string[];\n readonly reasoning?: string;\n readonly evaluatorRawRequest?: JsonObject;\n readonly evaluatorResults?: readonly ChildEvaluatorResult[];\n}\n\nexport interface Evaluator {\n readonly kind: string;\n evaluate(context: EvaluationContext): Promise<EvaluationScore> | EvaluationScore;\n}\n\ntype JudgeProviderResolver = (context: EvaluationContext) => Promise<Provider | undefined>;\n\nexport interface LlmJudgeEvaluatorOptions {\n readonly resolveJudgeProvider: JudgeProviderResolver;\n readonly maxOutputTokens?: number;\n readonly temperature?: number;\n readonly evaluatorTemplate?: string;\n}\n\nconst freeformEvaluationSchema = z.object({\n score: z.number().min(0).max(1).describe('Score between 0.0 and 1.0'),\n hits: z.array(z.string()).describe('Brief specific achievements').optional(),\n misses: z.array(z.string()).describe('Brief failures or omissions').optional(),\n reasoning: z.string().describe('Concise explanation (1-2 sentences)').optional(),\n});\n\nconst rubricCheckResultSchema = z.object({\n id: z.string().describe('The ID of the rubric item being checked'),\n satisfied: z.boolean().describe('Whether this rubric requirement is met'),\n reasoning: z.string().describe('Brief explanation (1-2 sentences) for this check'),\n});\n\nconst rubricEvaluationSchema = z.object({\n checks: z.array(rubricCheckResultSchema).describe('Results for each rubric item'),\n overall_reasoning: z.string().describe('Overall assessment summary (1-2 sentences)'),\n});\n\nexport class LlmJudgeEvaluator implements Evaluator {\n readonly kind = 'llm_judge';\n\n private readonly resolveJudgeProvider: JudgeProviderResolver;\n private readonly maxOutputTokens?: number;\n private readonly temperature?: number;\n private readonly evaluatorTemplate?: string;\n\n constructor(options: LlmJudgeEvaluatorOptions) {\n this.resolveJudgeProvider = options.resolveJudgeProvider;\n this.maxOutputTokens = options.maxOutputTokens;\n this.temperature = options.temperature;\n this.evaluatorTemplate = options.evaluatorTemplate;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n const judgeProvider = await this.resolveJudgeProvider(context);\n if (!judgeProvider) {\n throw new Error('No judge provider available for LLM grading');\n }\n\n const config = context.evaluator;\n if (config?.type === 'llm_judge' && config.rubrics && config.rubrics.length > 0) {\n return this.evaluateWithRubrics(context, judgeProvider, config.rubrics);\n }\n\n return this.evaluateFreeform(context, judgeProvider);\n }\n\n private async evaluateFreeform(\n context: EvaluationContext,\n judgeProvider: Provider,\n ): Promise<EvaluationScore> {\n const formattedQuestion =\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\n ? context.promptInputs.question\n : context.evalCase.question;\n\n // Prepare template variables for substitution\n const variables = {\n [TEMPLATE_VARIABLES.INPUT_MESSAGES]: JSON.stringify(context.evalCase.input_segments, null, 2),\n [TEMPLATE_VARIABLES.EXPECTED_MESSAGES]: JSON.stringify(\n context.evalCase.expected_messages,\n null,\n 2,\n ),\n [TEMPLATE_VARIABLES.OUTPUT_MESSAGES]: JSON.stringify(context.outputMessages ?? [], null, 2),\n [TEMPLATE_VARIABLES.CANDIDATE_ANSWER]: context.candidate.trim(),\n [TEMPLATE_VARIABLES.REFERENCE_ANSWER]: (context.evalCase.reference_answer ?? '').trim(),\n [TEMPLATE_VARIABLES.EXPECTED_OUTCOME]: context.evalCase.expected_outcome.trim(),\n [TEMPLATE_VARIABLES.QUESTION]: formattedQuestion.trim(),\n };\n\n // Build system prompt (only the mandatory output schema)\n const systemPrompt = buildOutputSchema();\n\n // Build user prompt based on custom template or default template\n const evaluatorTemplate =\n context.evaluatorTemplateOverride ?? this.evaluatorTemplate ?? DEFAULT_EVALUATOR_TEMPLATE;\n const userPrompt = substituteVariables(evaluatorTemplate, variables);\n\n const evaluatorRawRequest: JsonObject = {\n userPrompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n try {\n const { data, providerResponse } = await this.runWithRetry({\n context,\n judgeProvider,\n systemPrompt,\n userPrompt,\n schema: freeformEvaluationSchema,\n });\n\n const score = clampScore(data.score);\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning;\n const expectedAspectCount = Math.max(hits.length + misses.length, 1);\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount,\n reasoning,\n evaluatorRawRequest,\n };\n } catch {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [],\n expectedAspectCount: 1,\n evaluatorRawRequest,\n };\n }\n }\n\n private async evaluateWithRubrics(\n context: EvaluationContext,\n judgeProvider: Provider,\n rubrics: readonly RubricItem[],\n ): Promise<EvaluationScore> {\n if (!rubrics || rubrics.length === 0) {\n throw new Error(\n `No rubrics found for evaluator \"${context.evaluator?.name ?? 'llm_judge'}\". Run \"agentv generate rubrics\" first.`,\n );\n }\n\n const prompt = this.buildRubricPrompt(context, rubrics);\n const systemPrompt = buildRubricOutputSchema();\n\n const evaluatorRawRequest: JsonObject = {\n userPrompt: prompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n const { data } = await this.runWithRetry({\n context,\n judgeProvider,\n systemPrompt,\n userPrompt: prompt,\n schema: rubricEvaluationSchema,\n });\n\n const { score, verdict, hits, misses } = calculateRubricScore(data, rubrics);\n\n return {\n score,\n verdict,\n hits,\n misses,\n expectedAspectCount: rubrics.length,\n reasoning: data.overall_reasoning,\n evaluatorRawRequest,\n };\n }\n\n private buildRubricPrompt(context: EvaluationContext, rubrics: readonly RubricItem[]): string {\n const formattedQuestion =\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\n ? context.promptInputs.question\n : context.evalCase.question;\n\n const parts: string[] = [\n 'You are an expert evaluator. Evaluate the candidate answer against each rubric item below.',\n '',\n '[[ ## question ## ]]',\n formattedQuestion,\n '',\n '[[ ## expected_outcome ## ]]',\n context.evalCase.expected_outcome,\n '',\n ];\n\n if (context.evalCase.reference_answer && context.evalCase.reference_answer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', context.evalCase.reference_answer, '');\n }\n\n parts.push('[[ ## candidate_answer ## ]]', context.candidate, '', '[[ ## rubrics ## ]]');\n\n for (const rubric of rubrics) {\n const requiredLabel = rubric.required ? ' (REQUIRED)' : '';\n const weightLabel = rubric.weight !== 1.0 ? ` (weight: ${rubric.weight})` : '';\n parts.push(`- [${rubric.id}]${requiredLabel}${weightLabel}: ${rubric.description}`);\n }\n\n parts.push('', 'For each rubric, determine if it is satisfied and provide brief reasoning.');\n\n return parts.join('\\n');\n }\n\n private async runWithRetry<T>(options: {\n readonly context: EvaluationContext;\n readonly judgeProvider: Provider;\n readonly systemPrompt: string;\n readonly userPrompt: string;\n readonly schema: z.ZodSchema<T>;\n }): Promise<{ data: T; providerResponse?: ProviderResponse }> {\n const { context, judgeProvider, systemPrompt, userPrompt, schema } = options;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n // Prefer Vercel AI SDK language model if available.\n const model = judgeProvider.asLanguageModel?.();\n if (model) {\n const { text } = await generateText({\n model,\n system: systemPrompt,\n prompt: userPrompt,\n ...(this.maxOutputTokens ? { maxTokens: this.maxOutputTokens } : {}),\n ...(typeof this.temperature === 'number' ? { temperature: this.temperature } : {}),\n });\n\n const data = schema.parse(parseJsonFromText(text));\n return { data };\n }\n\n const response = await judgeProvider.invoke({\n question: userPrompt,\n systemPrompt,\n evalCaseId: context.evalCase.id,\n attempt: context.attempt,\n maxOutputTokens: this.maxOutputTokens,\n temperature: this.temperature,\n });\n\n const data = schema.parse(\n parseJsonFromText(extractLastAssistantContent(response.outputMessages)),\n );\n return { data, providerResponse: response };\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n }\n }\n\n throw new Error(`Failed to parse evaluator response after 3 attempts: ${lastError?.message}`);\n }\n}\n\n/**\n * Build the mandatory output schema that all evaluators must follow.\n * This schema is always appended to the evaluator template.\n */\nfunction buildOutputSchema(): string {\n return [\n 'You must respond with a single JSON object matching this schema:',\n '',\n '{',\n ' \"score\": <number between 0.0 and 1.0>,',\n ' \"hits\": [<array of strings, max 4 items, brief specific achievements>],',\n ' \"misses\": [<array of strings, max 4 items, brief specific failures or omissions, empty if none>],',\n ' \"reasoning\": \"<string, concise explanation for the score, 1-2 sentences max>\"',\n '}',\n ].join('\\n');\n}\n\nfunction buildRubricOutputSchema(): string {\n return `You are an expert evaluator. Evaluate the candidate answer against each rubric item.\nYou must return a valid JSON object matching this schema:\n{\n \"checks\": [\n {\n \"id\": \"string (rubric id)\",\n \"satisfied\": boolean,\n \"reasoning\": \"string (brief explanation)\"\n }\n ],\n \"overall_reasoning\": \"string (summary)\"\n}`;\n}\n\nfunction scoreToVerdict(score: number): EvaluationVerdict {\n if (score >= 0.8) {\n return 'pass';\n }\n if (score >= 0.6) {\n return 'borderline';\n }\n return 'fail';\n}\n\nfunction clampScore(value: number): number {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return 0;\n }\n if (value < 0) {\n return 0;\n }\n if (value > 1) {\n return 1;\n }\n return value;\n}\n\nfunction extractJsonBlob(text: string): string | undefined {\n const match = text.match(/\\{[\\s\\S]*\\}/);\n return match?.[0];\n}\n\nfunction parseJsonFromText(text: string): unknown {\n const cleaned = typeof text === 'string' ? text.replace(/```json\\n?|```/g, '').trim() : '';\n const blob = extractJsonBlob(cleaned) ?? cleaned;\n return JSON.parse(blob);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n// Code Evaluator\n\nexport interface CodeEvaluatorOptions {\n readonly script: string;\n readonly cwd?: string;\n readonly agentTimeoutMs?: number;\n}\n\nexport class CodeEvaluator implements Evaluator {\n readonly kind = 'code';\n\n private readonly script: string;\n private readonly cwd?: string;\n private readonly agentTimeoutMs?: number;\n\n constructor(options: CodeEvaluatorOptions) {\n this.script = options.script;\n this.cwd = options.cwd;\n this.agentTimeoutMs = options.agentTimeoutMs;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n const inputPayload = JSON.stringify(\n {\n question: context.evalCase.question,\n expectedOutcome: context.evalCase.expected_outcome,\n expectedMessages: context.evalCase.expected_messages,\n referenceAnswer: context.evalCase.reference_answer,\n candidateAnswer: context.candidate,\n outputMessages: context.outputMessages ?? null,\n guidelineFiles: context.evalCase.guideline_paths,\n inputFiles: context.evalCase.file_paths.filter(\n (path) => !context.evalCase.guideline_paths.includes(path),\n ),\n inputMessages: context.evalCase.input_messages,\n traceSummary: context.traceSummary ?? null,\n },\n null,\n 2,\n );\n\n try {\n const stdout = await executeScript(this.script, inputPayload, this.agentTimeoutMs, this.cwd);\n const parsed = parseJsonSafe(stdout);\n const score = clampScore(typeof parsed?.score === 'number' ? parsed.score : 0);\n const hits = Array.isArray(parsed?.hits) ? parsed.hits.filter(isNonEmptyString) : [];\n const misses = Array.isArray(parsed?.misses) ? parsed.misses.filter(isNonEmptyString) : [];\n const reasoning = typeof parsed?.reasoning === 'string' ? parsed.reasoning : undefined;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: hits.length + misses.length || 1,\n reasoning,\n evaluatorRawRequest: {\n script: this.script,\n ...(this.cwd ? { cwd: this.cwd } : {}),\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Code evaluator failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n evaluatorRawRequest: {\n script: this.script,\n ...(this.cwd ? { cwd: this.cwd } : {}),\n error: message,\n },\n };\n }\n }\n}\n\nfunction calculateRubricScore(\n result: z.infer<typeof rubricEvaluationSchema>,\n rubrics: readonly RubricItem[],\n): {\n score: number;\n verdict: EvaluationVerdict;\n hits: string[];\n misses: string[];\n} {\n const rubricMap = new Map(rubrics.map((rubric) => [rubric.id, rubric]));\n const hits: string[] = [];\n const misses: string[] = [];\n let totalWeight = 0;\n let earnedWeight = 0;\n let failedRequired = false;\n\n for (const check of result.checks) {\n const rubric = rubricMap.get(check.id);\n if (!rubric) {\n continue;\n }\n\n totalWeight += rubric.weight;\n\n if (check.satisfied) {\n earnedWeight += rubric.weight;\n hits.push(`[${rubric.id}] ${rubric.description}: ${check.reasoning}`);\n } else {\n misses.push(`[${rubric.id}] ${rubric.description}: ${check.reasoning}`);\n if (rubric.required) {\n failedRequired = true;\n }\n }\n }\n\n const score = totalWeight > 0 ? Math.min(1, Math.max(0, earnedWeight / totalWeight)) : 0;\n const verdict = failedRequired ? 'fail' : scoreToVerdict(score);\n return { score, verdict, hits, misses };\n}\n\n// Helper functions for CodeEvaluator\n\nasync function executeScript(\n scriptPath: string,\n input: string,\n agentTimeoutMs?: number,\n cwd?: string,\n): Promise<string> {\n const { stdout, stderr, exitCode } = await execShellWithStdin(scriptPath, input, {\n cwd,\n timeoutMs: agentTimeoutMs,\n });\n\n if (exitCode !== 0) {\n const trimmedErr = stderr.trim();\n throw new Error(\n trimmedErr.length > 0\n ? `Code evaluator exited with code ${exitCode}: ${trimmedErr}`\n : `Code evaluator exited with code ${exitCode}`,\n );\n }\n\n return stdout.trim();\n}\n\nfunction parseJsonSafe(payload: string): Record<string, unknown> | undefined {\n try {\n return JSON.parse(payload) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nfunction substituteVariables(template: string, variables: Record<string, string>): string {\n return template.replace(/\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g, (match, varName) => {\n return variables[varName] ?? match;\n });\n}\n\n// Tool Trajectory Evaluator\n\n/** Extracted tool call with optional arguments */\ninterface ExtractedToolCall {\n readonly name: string;\n readonly args?: Record<string, unknown>;\n}\n\n/**\n * Deep equality check for two values.\n * Handles primitives, arrays, and plain objects.\n */\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null) return a === b;\n if (typeof a !== typeof b) return false;\n if (typeof a !== 'object') return a === b;\n\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((val, i) => deepEqual(val, b[i]));\n }\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) => Object.hasOwn(bObj, key) && deepEqual(aObj[key], bObj[key]));\n}\n\n/**\n * Check if actual args match expected args.\n * - 'any' → always matches\n * - object → partial match (only specified keys, deep equality)\n */\nfunction argsMatch(\n expected: ToolTrajectoryExpectedItem['args'],\n actual: Record<string, unknown> | undefined,\n): boolean {\n // No args constraint means match\n if (expected === undefined) return true;\n // 'any' means skip validation\n if (expected === 'any') return true;\n // Partial match: check only specified keys\n if (actual === undefined) return false;\n for (const key of Object.keys(expected)) {\n if (!Object.hasOwn(actual, key)) return false;\n if (!deepEqual(expected[key], actual[key])) return false;\n }\n return true;\n}\n\nexport interface ToolTrajectoryEvaluatorOptions {\n readonly config: ToolTrajectoryEvaluatorConfig;\n}\n\nexport class ToolTrajectoryEvaluator implements Evaluator {\n readonly kind = 'tool_trajectory';\n\n private readonly config: ToolTrajectoryEvaluatorConfig;\n\n constructor(options: ToolTrajectoryEvaluatorOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { outputMessages, traceSummary } = context;\n\n // Extract tool calls from outputMessages (primary source)\n const toolCalls = this.extractToolCallsFromMessages(outputMessages);\n\n // Handle missing tool calls\n if (toolCalls.length === 0 && !traceSummary) {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: ['No trace available for evaluation'],\n expectedAspectCount: 1,\n };\n }\n\n // Build summary from tool calls if available, otherwise use provided summary\n const summary = toolCalls.length > 0 ? this.buildSummary(toolCalls) : traceSummary;\n\n if (!summary) {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: ['No trace available for evaluation'],\n expectedAspectCount: 1,\n };\n }\n\n switch (this.config.mode) {\n case 'any_order':\n return this.evaluateAnyOrder(summary);\n case 'in_order':\n return this.evaluateInOrder(toolCalls);\n case 'exact':\n return this.evaluateExact(toolCalls);\n default:\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Unknown mode: ${this.config.mode}`],\n expectedAspectCount: 1,\n };\n }\n }\n\n /**\n * Extract tool calls from output messages.\n */\n private extractToolCallsFromMessages(\n messages: readonly OutputMessage[] | undefined,\n ): readonly ExtractedToolCall[] {\n if (!messages) {\n return [];\n }\n\n const toolCalls: ExtractedToolCall[] = [];\n for (const message of messages) {\n if (message.toolCalls) {\n for (const call of message.toolCalls) {\n toolCalls.push({\n name: call.tool,\n args: call.input as Record<string, unknown> | undefined,\n });\n }\n }\n }\n return toolCalls;\n }\n\n /**\n * Build a summary from extracted tool calls.\n */\n private buildSummary(toolCalls: readonly ExtractedToolCall[]): TraceSummary {\n const toolCallsByName: Record<string, number> = {};\n for (const call of toolCalls) {\n toolCallsByName[call.name] = (toolCallsByName[call.name] ?? 0) + 1;\n }\n const toolNames = Object.keys(toolCallsByName).sort();\n return {\n eventCount: toolCalls.length,\n toolNames,\n toolCallsByName,\n errorCount: 0,\n };\n }\n\n private evaluateAnyOrder(summary: TraceSummary): EvaluationScore {\n const minimums = this.config.minimums ?? {};\n const toolNames = Object.keys(minimums);\n\n if (toolNames.length === 0) {\n return {\n score: 1,\n verdict: 'pass',\n hits: ['No tool requirements specified'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\n\n for (const toolName of toolNames) {\n const required = minimums[toolName];\n const actual = summary.toolCallsByName[toolName] ?? 0;\n if (actual >= required) {\n hits.push(`${toolName}: called ${actual} times (required ≥${required})`);\n } else {\n misses.push(`${toolName}: called ${actual} times (required ≥${required})`);\n }\n }\n\n const score = hits.length / toolNames.length;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: toolNames.length,\n };\n }\n\n private evaluateInOrder(toolCalls: readonly ExtractedToolCall[]): EvaluationScore {\n const expected = this.config.expected ?? [];\n\n if (expected.length === 0) {\n return {\n score: 1,\n verdict: 'pass',\n hits: ['No tool sequence specified'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\n let actualIndex = 0;\n\n for (let i = 0; i < expected.length; i++) {\n const expectedItem = expected[i];\n const expectedTool = expectedItem.tool;\n let found = false;\n let argsMismatch = false;\n\n while (actualIndex < toolCalls.length) {\n const actualCall = toolCalls[actualIndex];\n if (actualCall.name === expectedTool) {\n // Tool name matches, check args if specified\n if (argsMatch(expectedItem.args, actualCall.args)) {\n hits.push(`Found ${expectedTool} at position ${actualIndex}`);\n actualIndex++;\n found = true;\n break;\n }\n // Tool name matches but args don't - this is a miss for this expected item\n misses.push(\n `Expected ${expectedTool} at position ${i}: tool found at ${actualIndex} but args mismatch`,\n );\n actualIndex++;\n argsMismatch = true;\n break;\n }\n actualIndex++;\n }\n\n if (!found && !argsMismatch) {\n misses.push(`Expected ${expectedTool} at position ${i}, not found in remaining trace`);\n }\n }\n\n const score = hits.length / expected.length;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: expected.length,\n };\n }\n\n private evaluateExact(toolCalls: readonly ExtractedToolCall[]): EvaluationScore {\n const expected = this.config.expected ?? [];\n\n if (expected.length === 0) {\n return {\n score: 1,\n verdict: 'pass',\n hits: ['No tool sequence specified'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\n\n if (toolCalls.length !== expected.length) {\n misses.push(`Expected ${expected.length} tool calls, got ${toolCalls.length}`);\n }\n\n const checkLength = Math.min(expected.length, toolCalls.length);\n for (let i = 0; i < checkLength; i++) {\n const expectedItem = expected[i];\n const expectedTool = expectedItem.tool;\n const actualCall = toolCalls[i];\n const actualTool = actualCall.name;\n if (actualTool === expectedTool) {\n // Tool name matches, check args if specified\n if (argsMatch(expectedItem.args, actualCall.args)) {\n hits.push(`Position ${i}: ${expectedTool}`);\n } else {\n misses.push(`Position ${i}: ${expectedTool} args mismatch`);\n }\n } else {\n misses.push(`Position ${i}: expected ${expectedTool}, got ${actualTool}`);\n }\n }\n\n for (let i = checkLength; i < expected.length; i++) {\n misses.push(`Position ${i}: expected ${expected[i].tool}, got nothing`);\n }\n\n const score = hits.length / expected.length;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: expected.length,\n };\n }\n}\n\n// Composite Evaluator\n\nexport interface EvaluatorFactory {\n create(config: EvaluatorConfig, context: EvaluationContext): Evaluator;\n}\n\ninterface MemberResult {\n readonly id: string;\n readonly type: string;\n readonly result: EvaluationScore;\n}\n\nconst DEFAULT_COMPOSITE_AGGREGATOR_PROMPT = `Review the following evaluation results:\n{{EVALUATOR_RESULTS_JSON}}\n\nDecide the final score and verdict based on all evaluator results.\nReturn a JSON object with: score (0.0-1.0), verdict (pass/fail/borderline), and reasoning.`;\n\nexport interface CompositeEvaluatorOptions {\n readonly config: import('./types.js').CompositeEvaluatorConfig;\n readonly evaluatorFactory: EvaluatorFactory;\n readonly cwd?: string;\n}\n\nexport class CompositeEvaluator implements Evaluator {\n readonly kind = 'composite';\n\n private readonly config: import('./types.js').CompositeEvaluatorConfig;\n private readonly evaluatorFactory: EvaluatorFactory;\n private readonly cwd?: string;\n\n constructor(options: CompositeEvaluatorOptions) {\n this.config = options.config;\n this.evaluatorFactory = options.evaluatorFactory;\n this.cwd = options.cwd;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n // 1. Instantiate and run evaluators in parallel\n const memberResults = await Promise.all(\n this.config.evaluators.map(async (memberConfig) => {\n const evaluator = this.evaluatorFactory.create(memberConfig, context);\n return {\n id: memberConfig.name,\n type: memberConfig.type,\n result: await evaluator.evaluate(context),\n };\n }),\n );\n\n // 2. Aggregate results\n return this.aggregate(memberResults, context);\n }\n\n private async aggregate(\n results: readonly MemberResult[],\n context: EvaluationContext,\n ): Promise<EvaluationScore> {\n const aggregator = this.config.aggregator;\n\n switch (aggregator.type) {\n case 'code_judge':\n return this.runCodeAggregator(results, aggregator.path, aggregator.cwd ?? this.cwd);\n case 'llm_judge':\n return this.runLlmAggregator(results, context, aggregator);\n default:\n return this.runWeightedAverage(results, aggregator.weights);\n }\n }\n\n private runWeightedAverage(\n results: readonly MemberResult[],\n weights?: Record<string, number>,\n ): EvaluationScore {\n let totalWeight = 0;\n let weightedSum = 0;\n const allHits: string[] = [];\n const allMisses: string[] = [];\n const reasoningParts: string[] = [];\n const evaluatorResults: ChildEvaluatorResult[] = [];\n\n for (const member of results) {\n const weight = weights?.[member.id] ?? 1.0;\n totalWeight += weight;\n weightedSum += member.result.score * weight;\n allHits.push(...member.result.hits.map((h) => `[${member.id}] ${h}`));\n allMisses.push(...member.result.misses.map((m) => `[${member.id}] ${m}`));\n if (member.result.reasoning) {\n reasoningParts.push(`${member.id}: ${member.result.reasoning}`);\n }\n\n // Build child result entry\n evaluatorResults.push({\n name: member.id,\n type: member.type,\n score: member.result.score,\n weight,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n evaluatorResults: member.result.evaluatorResults,\n });\n }\n\n const finalScore = totalWeight > 0 ? weightedSum / totalWeight : 0;\n\n return {\n score: clampScore(finalScore),\n verdict: scoreToVerdict(finalScore),\n hits: allHits,\n misses: allMisses,\n expectedAspectCount: Math.max(allHits.length + allMisses.length, 1),\n reasoning: reasoningParts.length > 0 ? reasoningParts.join('; ') : undefined,\n evaluatorRawRequest: {\n aggregator: 'weighted_average',\n ...(weights ? { weights } : {}),\n },\n evaluatorResults,\n };\n }\n\n private async runCodeAggregator(\n results: readonly MemberResult[],\n scriptPath: string,\n cwd?: string,\n weights?: Record<string, number>,\n ): Promise<EvaluationScore> {\n const resultsObject = Object.fromEntries(results.map((r) => [r.id, r.result]));\n const inputPayload = JSON.stringify({ results: resultsObject }, null, 2);\n\n // Build child results for output\n const evaluatorResults: ChildEvaluatorResult[] = results.map((member) => ({\n name: member.id,\n type: member.type,\n score: member.result.score,\n weight: weights?.[member.id] ?? 1.0,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n evaluatorResults: member.result.evaluatorResults,\n }));\n\n try {\n const stdout = await executeScript(scriptPath, inputPayload, undefined, cwd);\n const parsed = parseJsonSafe(stdout);\n const score = clampScore(typeof parsed?.score === 'number' ? parsed.score : 0);\n const hits = Array.isArray(parsed?.hits) ? parsed.hits.filter(isNonEmptyString) : [];\n const misses = Array.isArray(parsed?.misses) ? parsed.misses.filter(isNonEmptyString) : [];\n const reasoning = typeof parsed?.reasoning === 'string' ? parsed.reasoning : undefined;\n const verdict =\n typeof parsed?.verdict === 'string' &&\n (parsed.verdict === 'pass' || parsed.verdict === 'fail' || parsed.verdict === 'borderline')\n ? parsed.verdict\n : scoreToVerdict(score);\n\n return {\n score,\n verdict,\n hits,\n misses,\n expectedAspectCount: hits.length + misses.length || 1,\n reasoning,\n evaluatorRawRequest: {\n aggregator: 'code_judge',\n script: scriptPath,\n },\n evaluatorResults,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Code aggregator failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n evaluatorRawRequest: {\n aggregator: 'code_judge',\n script: scriptPath,\n error: message,\n },\n evaluatorResults,\n };\n }\n }\n\n private async runLlmAggregator(\n results: readonly MemberResult[],\n context: EvaluationContext,\n config: Extract<import('./types.js').CompositeAggregatorConfig, { type: 'llm_judge' }>,\n ): Promise<EvaluationScore> {\n const judgeProvider = context.judgeProvider;\n if (!judgeProvider) {\n throw new Error('No judge provider available for LLM aggregation');\n }\n\n const resultsObject = Object.fromEntries(results.map((r) => [r.id, r.result]));\n const resultsJson = JSON.stringify(resultsObject, null, 2);\n\n // Build child results for output\n const evaluatorResults: ChildEvaluatorResult[] = results.map((member) => ({\n name: member.id,\n type: member.type,\n score: member.result.score,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n evaluatorResults: member.result.evaluatorResults,\n }));\n\n // Use custom prompt if provided, otherwise use default\n const promptTemplate = config.prompt ?? DEFAULT_COMPOSITE_AGGREGATOR_PROMPT;\n const userPrompt = promptTemplate.replace(/\\{\\{EVALUATOR_RESULTS_JSON\\}\\}/g, resultsJson);\n\n const systemPrompt = buildOutputSchema();\n\n const evaluatorRawRequest: JsonObject = {\n aggregator: 'llm_judge',\n userPrompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n try {\n const model = judgeProvider.asLanguageModel?.();\n if (model) {\n const { text } = await generateText({\n model,\n system: systemPrompt,\n prompt: userPrompt,\n });\n\n const data = freeformEvaluationSchema.parse(parseJsonFromText(text));\n const score = clampScore(data.score);\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: Math.max(hits.length + misses.length, 1),\n reasoning,\n evaluatorRawRequest,\n evaluatorResults,\n };\n }\n\n const response = await judgeProvider.invoke({\n question: userPrompt,\n systemPrompt,\n evalCaseId: context.evalCase.id,\n attempt: context.attempt,\n });\n\n const data = freeformEvaluationSchema.parse(\n parseJsonFromText(extractLastAssistantContent(response.outputMessages)),\n );\n const score = clampScore(data.score);\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: Math.max(hits.length + misses.length, 1),\n reasoning,\n evaluatorRawRequest,\n evaluatorResults,\n };\n } catch {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [],\n expectedAspectCount: 1,\n evaluatorRawRequest,\n evaluatorResults,\n };\n }\n }\n}\n","interface ExecOptions {\n readonly cwd?: string;\n readonly timeoutMs?: number;\n}\n\nfunction getBunSpawn():\n | ((options: {\n cmd: readonly string[];\n cwd?: string;\n stdin: Uint8Array;\n stdout: 'pipe';\n stderr: 'pipe';\n }) => {\n stdout: ReadableStream;\n stderr: ReadableStream;\n exited: Promise<number>;\n kill: () => void;\n })\n | undefined {\n const bunSpawn = (globalThis as { Bun?: { spawn?: unknown } }).Bun?.spawn;\n return typeof bunSpawn === 'function' ? (bunSpawn as ReturnType<typeof getBunSpawn>) : undefined;\n}\n\n/**\n * Execute a shell command with the given stdin payload.\n *\n * Why this exists:\n * - Under Bun, using `node:child_process` to pipe stdin to a subprocess can be unreliable.\n * - Bun's native `Bun.spawn` reliably passes stdin and returns stdout/stderr streams.\n * - Under Node, fall back to `node:child_process` for compatibility.\n */\nexport async function execShellWithStdin(\n command: string,\n stdinPayload: string,\n options: ExecOptions = {},\n): Promise<{\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}> {\n const bunSpawn = getBunSpawn();\n if (bunSpawn) {\n const encoder = new TextEncoder();\n const proc = bunSpawn({\n cmd: ['sh', '-c', command],\n cwd: options.cwd,\n stdin: encoder.encode(stdinPayload),\n stdout: 'pipe',\n stderr: 'pipe',\n });\n\n const timeout = options.timeoutMs\n ? setTimeout(() => {\n proc.kill();\n }, options.timeoutMs)\n : undefined;\n\n try {\n const stdout = await new Response(proc.stdout).text();\n const stderr = await new Response(proc.stderr).text();\n const exitCode = await proc.exited;\n return { stdout, stderr, exitCode };\n } finally {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n }\n }\n\n const { spawn } = await import('node:child_process');\n return await new Promise((resolve, reject) => {\n const child = spawn(command, {\n shell: true,\n cwd: options.cwd,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n let stderr = '';\n\n const timeout = options.timeoutMs\n ? setTimeout(() => {\n child.kill();\n reject(new Error(`Process timed out after ${options.timeoutMs}ms`));\n }, options.timeoutMs)\n : undefined;\n\n child.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n child.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n child.on('error', (error) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n reject(error);\n });\n child.on('exit', (code) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n resolve({ stdout, stderr, exitCode: code ?? 0 });\n });\n\n child.stdin?.write(stdinPayload);\n child.stdin?.end();\n });\n}\n","import type { JsonObject } from '../types.js';\n\nexport type ChatMessageRole = 'system' | 'user' | 'assistant' | 'tool' | 'function';\n\nexport interface ChatMessage {\n readonly role: ChatMessageRole;\n readonly content: string;\n readonly name?: string;\n}\n\nexport type ChatPrompt = readonly ChatMessage[];\n\nexport type ProviderKind =\n | 'azure'\n | 'anthropic'\n | 'gemini'\n | 'codex'\n | 'pi-coding-agent'\n | 'cli'\n | 'mock'\n | 'vscode'\n | 'vscode-insiders';\n\n/**\n * Agent providers that have filesystem access and don't need unwrapped guidelines.\n * These providers read files directly from the filesystem using file:// URIs.\n */\nexport const AGENT_PROVIDER_KINDS: readonly ProviderKind[] = [\n 'codex',\n 'pi-coding-agent',\n 'vscode',\n 'vscode-insiders',\n] as const;\n\n/**\n * List of all supported provider kinds.\n * This is the source of truth for provider validation.\n */\nexport const KNOWN_PROVIDERS: readonly ProviderKind[] = [\n 'azure',\n 'anthropic',\n 'gemini',\n 'codex',\n 'pi-coding-agent',\n 'cli',\n 'mock',\n 'vscode',\n 'vscode-insiders',\n] as const;\n\n/**\n * Provider aliases that are accepted in target definitions.\n * These map to the canonical ProviderKind values.\n */\nexport const PROVIDER_ALIASES: readonly string[] = [\n 'azure-openai', // alias for \"azure\"\n 'google', // alias for \"gemini\"\n 'google-gemini', // alias for \"gemini\"\n 'codex-cli', // alias for \"codex\"\n 'pi', // alias for \"pi-coding-agent\"\n 'openai', // legacy/future support\n 'bedrock', // legacy/future support\n 'vertex', // legacy/future support\n] as const;\n\n/**\n * Schema identifier for targets.yaml files (version 2).\n */\nexport const TARGETS_SCHEMA_V2 = 'agentv-targets-v2.2';\n\nexport interface ProviderRequest {\n readonly question: string;\n readonly systemPrompt?: string;\n readonly guidelines?: string;\n readonly guideline_patterns?: readonly string[];\n readonly chatPrompt?: ChatPrompt;\n readonly inputFiles?: readonly string[];\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly maxOutputTokens?: number;\n readonly temperature?: number;\n readonly metadata?: JsonObject;\n readonly signal?: AbortSignal;\n}\n\n/**\n * A tool call within an output message.\n * Represents a single tool invocation with its input and optional output.\n */\nexport interface ToolCall {\n /** Tool name */\n readonly tool: string;\n /** Tool input arguments */\n readonly input?: unknown;\n /** Tool output result */\n readonly output?: unknown;\n /** Stable identifier for pairing tool calls */\n readonly id?: string;\n /** ISO 8601 timestamp */\n readonly timestamp?: string;\n}\n\n/**\n * An output message from agent execution.\n * Represents a single message in the conversation with optional tool calls.\n */\nexport interface OutputMessage {\n /** Message role (e.g., 'assistant', 'user', 'tool') */\n readonly role: string;\n /** Optional name for the message sender */\n readonly name?: string;\n /** Message content */\n readonly content?: unknown;\n /** Tool calls made in this message */\n readonly toolCalls?: readonly ToolCall[];\n /** ISO 8601 timestamp */\n readonly timestamp?: string;\n /** Provider-specific metadata */\n readonly metadata?: Record<string, unknown>;\n}\n\n/**\n * Token usage metrics reported by provider.\n */\nexport interface ProviderTokenUsage {\n /** Input/prompt tokens consumed */\n readonly input: number;\n /** Output/completion tokens generated */\n readonly output: number;\n /** Cached tokens (optional, provider-specific) */\n readonly cached?: number;\n}\n\nexport interface ProviderResponse {\n readonly raw?: unknown;\n readonly usage?: JsonObject;\n /** Output messages from agent execution (primary source for tool trajectory) */\n readonly outputMessages?: readonly OutputMessage[];\n /** Token usage metrics (optional) */\n readonly tokenUsage?: ProviderTokenUsage;\n /** Total cost in USD (optional) */\n readonly costUsd?: number;\n /** Execution duration in milliseconds (optional) */\n readonly durationMs?: number;\n}\n\n/**\n * Extract the content from the last assistant message in an output message array.\n * Returns empty string if no assistant message found.\n */\nexport function extractLastAssistantContent(\n messages: readonly OutputMessage[] | undefined,\n): string {\n if (!messages || messages.length === 0) {\n return '';\n }\n\n // Find the last assistant message (reverse search)\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === 'assistant' && msg.content !== undefined) {\n if (typeof msg.content === 'string') {\n return msg.content;\n }\n return JSON.stringify(msg.content);\n }\n }\n\n return '';\n}\n\n/**\n * Type guard to check if a provider is an agent provider with filesystem access.\n * Agent providers read files directly and don't need unwrapped guideline content.\n */\nexport function isAgentProvider(provider: Provider | undefined): boolean {\n return provider ? AGENT_PROVIDER_KINDS.includes(provider.kind) : false;\n}\n\nexport interface Provider {\n readonly id: string;\n readonly kind: ProviderKind;\n readonly targetName: string;\n invoke(request: ProviderRequest): Promise<ProviderResponse>;\n /**\n * Optional capability marker for provider-managed batching (single session handling multiple requests).\n */\n readonly supportsBatch?: boolean;\n /**\n * Optional batch invocation hook. When defined alongside supportsBatch=true,\n * the orchestrator may send multiple requests in a single provider session.\n */\n invokeBatch?(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]>;\n /**\n * Optional method to get a Vercel AI SDK LanguageModel instance for structured output generation.\n * Used by evaluators that need generateObject/generateText from the AI SDK.\n */\n asLanguageModel?(): import('ai').LanguageModel;\n}\n\nexport type EnvLookup = Readonly<Record<string, string | undefined>>;\n\nexport interface TargetDefinition {\n readonly name: string;\n readonly provider: ProviderKind | string;\n readonly judge_target?: string | undefined;\n readonly workers?: number | undefined;\n // Provider batching\n readonly provider_batching?: boolean | undefined;\n readonly providerBatching?: boolean | undefined;\n // Azure fields\n readonly endpoint?: string | unknown | undefined;\n readonly resource?: string | unknown | undefined;\n readonly resourceName?: string | unknown | undefined;\n readonly api_key?: string | unknown | undefined;\n readonly apiKey?: string | unknown | undefined;\n readonly deployment?: string | unknown | undefined;\n readonly deploymentName?: string | unknown | undefined;\n readonly model?: string | unknown | undefined;\n readonly version?: string | unknown | undefined;\n readonly api_version?: string | unknown | undefined;\n // Anthropic fields\n readonly variant?: string | unknown | undefined;\n readonly thinking_budget?: number | unknown | undefined;\n readonly thinkingBudget?: number | unknown | undefined;\n // Common fields\n readonly temperature?: number | unknown | undefined;\n readonly max_output_tokens?: number | unknown | undefined;\n readonly maxTokens?: number | unknown | undefined;\n // Codex fields\n readonly executable?: string | unknown | undefined;\n readonly command?: string | unknown | undefined;\n readonly binary?: string | unknown | undefined;\n readonly args?: unknown | undefined;\n readonly arguments?: unknown | undefined;\n readonly cwd?: string | unknown | undefined;\n readonly timeout_seconds?: number | unknown | undefined;\n readonly timeoutSeconds?: number | unknown | undefined;\n readonly log_dir?: string | unknown | undefined;\n readonly logDir?: string | unknown | undefined;\n readonly log_directory?: string | unknown | undefined;\n readonly logDirectory?: string | unknown | undefined;\n readonly log_format?: string | unknown | undefined;\n readonly logFormat?: string | unknown | undefined;\n readonly log_output_format?: string | unknown | undefined;\n readonly logOutputFormat?: string | unknown | undefined;\n // Mock fields\n readonly response?: string | unknown | undefined;\n readonly delayMs?: number | unknown | undefined;\n readonly delayMinMs?: number | unknown | undefined;\n readonly delayMaxMs?: number | unknown | undefined;\n // VSCode fields\n readonly vscode_cmd?: string | unknown | undefined;\n readonly wait?: boolean | unknown | undefined;\n readonly dry_run?: boolean | unknown | undefined;\n readonly dryRun?: boolean | unknown | undefined;\n readonly subagent_root?: string | unknown | undefined;\n readonly subagentRoot?: string | unknown | undefined;\n readonly workspace_template?: string | unknown | undefined;\n readonly workspaceTemplate?: string | unknown | undefined;\n // CLI fields\n readonly command_template?: string | unknown | undefined;\n readonly commandTemplate?: string | unknown | undefined;\n readonly files_format?: string | unknown | undefined;\n readonly filesFormat?: string | unknown | undefined;\n readonly attachments_format?: string | unknown | undefined;\n readonly attachmentsFormat?: string | unknown | undefined;\n readonly env?: unknown | undefined;\n readonly healthcheck?: unknown | undefined;\n // Retry configuration fields\n readonly max_retries?: number | unknown | undefined;\n readonly maxRetries?: number | unknown | undefined;\n readonly retry_initial_delay_ms?: number | unknown | undefined;\n readonly retryInitialDelayMs?: number | unknown | undefined;\n readonly retry_max_delay_ms?: number | unknown | undefined;\n readonly retryMaxDelayMs?: number | unknown | undefined;\n readonly retry_backoff_factor?: number | unknown | undefined;\n readonly retryBackoffFactor?: number | unknown | undefined;\n readonly retry_status_codes?: unknown | undefined;\n readonly retryStatusCodes?: unknown | undefined;\n}\n","import { createHash, randomUUID } from 'node:crypto';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport pLimit from 'p-limit';\n\nimport {\n type ChildEvaluatorResult,\n CodeEvaluator,\n CompositeEvaluator,\n type EvaluationScore,\n type Evaluator,\n LlmJudgeEvaluator,\n ToolTrajectoryEvaluator,\n} from './evaluators.js';\nimport { readJsonFile, readTextFile } from './file-utils.js';\nimport { createProvider } from './providers/index.js';\nimport { type ResolvedTarget, resolveTargetDefinition } from './providers/targets.js';\nimport type {\n EnvLookup,\n OutputMessage,\n Provider,\n ProviderRequest,\n ProviderResponse,\n TargetDefinition,\n} from './providers/types.js';\nimport { extractLastAssistantContent, isAgentProvider } from './providers/types.js';\nimport {\n type ToolTrajectoryEvaluatorConfig,\n type TraceSummary,\n computeTraceSummary,\n mergeExecutionMetrics,\n} from './trace.js';\nimport type {\n EvalCase,\n EvaluationResult,\n EvaluationVerdict,\n EvaluatorConfig,\n EvaluatorKind,\n EvaluatorResult,\n JsonObject,\n JsonValue,\n} from './types.js';\nimport { type PromptInputs, buildPromptInputs, loadEvalCases } from './yaml-parser.js';\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport interface EvaluationCache {\n get(key: string): MaybePromise<ProviderResponse | undefined>;\n set(key: string, value: ProviderResponse): MaybePromise<void>;\n}\n\nexport interface RunEvalCaseOptions {\n readonly evalCase: EvalCase;\n readonly provider: Provider;\n readonly target: ResolvedTarget;\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\n readonly now?: () => Date;\n readonly maxRetries?: number;\n readonly agentTimeoutMs?: number;\n readonly promptDumpDir?: string;\n readonly cache?: EvaluationCache;\n readonly useCache?: boolean;\n readonly signal?: AbortSignal;\n readonly judgeProvider?: Provider;\n}\n\nexport interface ProgressEvent {\n readonly workerId: number;\n readonly evalId: string;\n readonly status: 'pending' | 'running' | 'completed' | 'failed';\n readonly startedAt?: number;\n readonly completedAt?: number;\n readonly error?: string;\n}\n\nexport interface RunEvaluationOptions {\n readonly testFilePath: string;\n readonly repoRoot: URL | string;\n readonly target: ResolvedTarget;\n readonly targets?: readonly TargetDefinition[];\n readonly env?: EnvLookup;\n readonly providerFactory?: (target: ResolvedTarget) => Provider;\n readonly evaluators?: Partial<Record<string, Evaluator>>;\n readonly maxRetries?: number;\n readonly agentTimeoutMs?: number;\n readonly promptDumpDir?: string;\n readonly cache?: EvaluationCache;\n readonly useCache?: boolean;\n readonly now?: () => Date;\n readonly evalId?: string;\n readonly verbose?: boolean;\n readonly maxConcurrency?: number;\n readonly evalCases?: readonly EvalCase[];\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\n}\n\nexport async function runEvaluation(\n options: RunEvaluationOptions,\n): Promise<readonly EvaluationResult[]> {\n const {\n testFilePath: evalFilePath,\n repoRoot,\n target,\n targets,\n env,\n providerFactory,\n evaluators,\n maxRetries,\n agentTimeoutMs,\n promptDumpDir,\n cache,\n useCache,\n now,\n evalId,\n verbose,\n evalCases: preloadedEvalCases,\n onResult,\n onProgress,\n } = options;\n\n // Use pre-loaded eval cases if provided, otherwise load them\n const evalCases =\n preloadedEvalCases ?? (await loadEvalCases(evalFilePath, repoRoot, { verbose, evalId }));\n\n const filteredEvalCases = filterEvalCases(evalCases, evalId);\n if (filteredEvalCases.length === 0) {\n if (evalId) {\n throw new Error(`Eval case with id '${evalId}' not found in ${evalFilePath}`);\n }\n return [];\n }\n\n const resolvedTargetsByName = new Map<string, ResolvedTarget>();\n resolvedTargetsByName.set(target.name, target);\n\n const targetDefinitions = new Map<string, TargetDefinition>();\n for (const definition of targets ?? []) {\n targetDefinitions.set(definition.name, definition);\n }\n\n const envLookup: EnvLookup = env ?? process.env;\n const providerCache = new Map<string, Provider>();\n\n const getOrCreateProvider = (resolved: ResolvedTarget): Provider => {\n const existing = providerCache.get(resolved.name);\n if (existing) {\n return existing;\n }\n const factory = providerFactory ?? createProvider;\n const instance = factory(resolved);\n providerCache.set(resolved.name, instance);\n return instance;\n };\n\n const resolveTargetByName = (name: string): ResolvedTarget | undefined => {\n if (resolvedTargetsByName.has(name)) {\n return resolvedTargetsByName.get(name);\n }\n const definition = targetDefinitions.get(name);\n if (!definition) {\n return undefined;\n }\n const resolved = resolveTargetDefinition(definition, envLookup, evalFilePath);\n resolvedTargetsByName.set(name, resolved);\n return resolved;\n };\n\n const resolveJudgeProvider = async (\n targetContext: ResolvedTarget,\n ): Promise<Provider | undefined> => {\n const judgeName = targetContext.judgeTarget ?? targetContext.name;\n const resolvedJudge = resolveTargetByName(judgeName);\n if (!resolvedJudge) {\n return getOrCreateProvider(targetContext);\n }\n return getOrCreateProvider(resolvedJudge);\n };\n\n const evaluatorRegistry = buildEvaluatorRegistry(evaluators, resolveJudgeProvider);\n\n const primaryProvider = getOrCreateProvider(target);\n const providerSupportsBatch =\n target.providerBatching === true &&\n primaryProvider.supportsBatch === true &&\n typeof primaryProvider.invokeBatch === 'function';\n if (target.providerBatching && !providerSupportsBatch && verbose) {\n console.warn(\n `Provider batching requested for target '${target.name}', but provider does not advertise batch support. Using per-case dispatch.`,\n );\n }\n\n // Notify about total test count before starting\n if (onProgress && filteredEvalCases.length > 0) {\n // Emit initial pending events for all tests\n for (let i = 0; i < filteredEvalCases.length; i++) {\n await onProgress({\n workerId: i + 1,\n evalId: filteredEvalCases[i].id,\n status: 'pending',\n });\n }\n }\n\n if (providerSupportsBatch) {\n try {\n return await runBatchEvaluation({\n evalCases: filteredEvalCases,\n provider: primaryProvider,\n target,\n evaluatorRegistry,\n promptDumpDir,\n nowFn: now ?? (() => new Date()),\n onProgress,\n onResult,\n verbose,\n resolveJudgeProvider,\n agentTimeoutMs,\n });\n } catch (error) {\n if (verbose) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `Provider batch execution failed, falling back to per-case dispatch: ${message}`,\n );\n }\n }\n }\n\n // Resolve worker count: CLI option > target setting > default (1)\n const workers = options.maxConcurrency ?? target.workers ?? 1;\n const limit = pLimit(workers);\n\n // Track worker assignments for progress reporting\n let nextWorkerId = 1;\n const workerIdByEvalId = new Map<string, number>();\n\n // Map test cases to limited promises for parallel execution\n const promises = filteredEvalCases.map((evalCase) =>\n limit(async () => {\n // Assign worker ID when test starts executing\n const workerId = nextWorkerId++;\n workerIdByEvalId.set(evalCase.id, workerId);\n\n if (onProgress) {\n await onProgress({\n workerId,\n evalId: evalCase.id,\n status: 'running',\n startedAt: Date.now(),\n });\n }\n\n try {\n const judgeProvider = await resolveJudgeProvider(target);\n const result = await runEvalCase({\n evalCase: evalCase,\n provider: primaryProvider,\n target,\n evaluators: evaluatorRegistry,\n maxRetries,\n agentTimeoutMs,\n promptDumpDir,\n cache,\n useCache,\n now,\n judgeProvider,\n });\n\n if (onProgress) {\n await onProgress({\n workerId,\n evalId: evalCase.id,\n status: result.error ? 'failed' : 'completed',\n startedAt: 0, // Not used for completed status\n completedAt: Date.now(),\n error: result.error,\n });\n }\n\n if (onResult) {\n await onResult(result);\n }\n return result;\n } catch (error) {\n if (onProgress) {\n await onProgress({\n workerId,\n evalId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: error instanceof Error ? error.message : String(error),\n });\n }\n throw error;\n }\n }),\n );\n\n // Wait for all workers to complete\n const settled = await Promise.allSettled(promises);\n\n // Extract results, handling both fulfilled and rejected promises\n const results: EvaluationResult[] = [];\n for (let i = 0; i < settled.length; i++) {\n const outcome = settled[i];\n if (outcome.status === 'fulfilled') {\n results.push(outcome.value);\n } else {\n // Build error result for rejected promise\n const evalCase = filteredEvalCases[i];\n const promptInputs = await buildPromptInputs(evalCase);\n const errorResult = buildErrorResult(\n evalCase,\n target.name,\n (now ?? (() => new Date()))(),\n outcome.reason,\n promptInputs,\n primaryProvider,\n );\n results.push(errorResult);\n if (onResult) {\n await onResult(errorResult);\n }\n }\n }\n\n return results;\n}\n\nasync function runBatchEvaluation(options: {\n readonly evalCases: readonly EvalCase[];\n readonly provider: Provider;\n readonly target: ResolvedTarget;\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\n readonly llm_judge: Evaluator;\n };\n readonly promptDumpDir?: string;\n readonly nowFn: () => Date;\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\n readonly verbose?: boolean;\n readonly resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>;\n readonly agentTimeoutMs?: number;\n}): Promise<readonly EvaluationResult[]> {\n const {\n evalCases,\n provider,\n target,\n evaluatorRegistry,\n promptDumpDir,\n nowFn,\n onProgress,\n onResult,\n resolveJudgeProvider,\n agentTimeoutMs,\n } = options;\n\n // Prepare prompt inputs up front so we can reuse them for grading.\n const promptInputsList: PromptInputs[] = [];\n const formattingMode = isAgentProvider(provider) ? 'agent' : 'lm';\n\n for (const evalCase of evalCases) {\n const promptInputs = await buildPromptInputs(evalCase, formattingMode);\n if (promptDumpDir) {\n await dumpPrompt(promptDumpDir, evalCase, promptInputs);\n }\n promptInputsList.push(promptInputs);\n }\n\n const batchRequests: ProviderRequest[] = evalCases.map((evalCase, index) => {\n const promptInputs = promptInputsList[index];\n return {\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_patterns: evalCase.guideline_patterns,\n inputFiles: evalCase.file_paths,\n evalCaseId: evalCase.id,\n metadata: {\n systemPrompt: promptInputs.systemMessage ?? '',\n },\n };\n });\n\n const batchResponse = await provider.invokeBatch?.(batchRequests);\n if (!Array.isArray(batchResponse)) {\n throw new Error('Provider batching failed: invokeBatch did not return an array');\n }\n if (batchResponse.length !== evalCases.length) {\n throw new Error(\n `Provider batching failed: expected ${evalCases.length} responses, received ${batchResponse.length}`,\n );\n }\n\n if (onProgress) {\n const startedAt = Date.now();\n for (let i = 0; i < evalCases.length; i++) {\n await onProgress({\n workerId: 1,\n evalId: evalCases[i].id,\n status: 'running',\n startedAt,\n });\n }\n }\n\n const results: EvaluationResult[] = [];\n for (let i = 0; i < evalCases.length; i++) {\n const evalCase = evalCases[i];\n const promptInputs = promptInputsList[i];\n const providerResponse = batchResponse[i];\n\n // Extract outputMessages from batch response\n const outputMessages = providerResponse.outputMessages;\n const baseSummary = outputMessages ? computeTraceSummary(outputMessages) : undefined;\n // Merge execution metrics from provider response\n const traceSummary = baseSummary\n ? mergeExecutionMetrics(baseSummary, {\n tokenUsage: providerResponse.tokenUsage,\n costUsd: providerResponse.costUsd,\n durationMs: providerResponse.durationMs,\n })\n : undefined;\n\n // Extract candidate from last assistant message in output_messages\n const candidate = extractLastAssistantContent(outputMessages);\n\n let result: EvaluationResult;\n try {\n result = await evaluateCandidate({\n evalCase,\n candidate,\n target,\n provider,\n evaluators: evaluatorRegistry,\n promptInputs,\n nowFn,\n attempt: 0,\n judgeProvider: await resolveJudgeProvider(target),\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n });\n } catch (error) {\n const errorResult = buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n error,\n promptInputs,\n provider,\n );\n results.push(errorResult);\n if (onResult) {\n await onResult(errorResult);\n }\n if (onProgress) {\n await onProgress({\n workerId: 1,\n evalId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: error instanceof Error ? error.message : String(error),\n });\n }\n continue;\n }\n\n results.push(result);\n if (onResult) {\n await onResult(result);\n }\n\n if (onProgress) {\n await onProgress({\n workerId: 1,\n evalId: evalCase.id,\n status: 'completed',\n startedAt: 0,\n completedAt: Date.now(),\n });\n }\n }\n\n return results;\n}\n\nexport async function runEvalCase(options: RunEvalCaseOptions): Promise<EvaluationResult> {\n const {\n evalCase,\n provider,\n target,\n evaluators,\n now,\n maxRetries,\n agentTimeoutMs,\n promptDumpDir,\n cache,\n useCache,\n signal,\n judgeProvider,\n } = options;\n\n const formattingMode = isAgentProvider(provider) ? 'agent' : 'lm';\n const promptInputs = await buildPromptInputs(evalCase, formattingMode);\n if (promptDumpDir) {\n await dumpPrompt(promptDumpDir, evalCase, promptInputs);\n }\n\n const cacheKey = useCache ? createCacheKey(provider, target, evalCase, promptInputs) : undefined;\n let cachedResponse: ProviderResponse | undefined;\n if (cacheKey && cache) {\n cachedResponse = await cache.get(cacheKey);\n }\n\n const nowFn = now ?? (() => new Date());\n\n const attemptBudget = (maxRetries ?? 0) + 1;\n let attempt = 0;\n let providerResponse: ProviderResponse | undefined = cachedResponse;\n let lastError: unknown;\n\n while (!providerResponse && attempt < attemptBudget) {\n try {\n providerResponse = await invokeProvider(provider, {\n evalCase: evalCase,\n target,\n promptInputs,\n attempt,\n agentTimeoutMs,\n signal,\n });\n } catch (error) {\n lastError = error;\n if (isTimeoutLike(error) && attempt + 1 < attemptBudget) {\n attempt += 1;\n continue;\n }\n return buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs, provider);\n }\n }\n\n if (!providerResponse) {\n return buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n lastError ?? new Error('Provider did not return a response'),\n promptInputs,\n provider,\n );\n }\n\n if (cacheKey && cache && !cachedResponse) {\n await cache.set(cacheKey, providerResponse);\n }\n\n // Extract outputMessages from provider response\n const outputMessages = providerResponse.outputMessages;\n\n // Compute trace summary if outputMessages available\n const baseSummary = outputMessages ? computeTraceSummary(outputMessages) : undefined;\n // Merge execution metrics from provider response\n const traceSummary = baseSummary\n ? mergeExecutionMetrics(baseSummary, {\n tokenUsage: providerResponse.tokenUsage,\n costUsd: providerResponse.costUsd,\n durationMs: providerResponse.durationMs,\n })\n : undefined;\n\n // Extract candidate from last assistant message in output_messages\n const candidate = extractLastAssistantContent(outputMessages);\n\n try {\n return await evaluateCandidate({\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n promptInputs,\n nowFn,\n attempt,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n });\n } catch (error) {\n return buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs, provider);\n }\n}\n\nasync function evaluateCandidate(options: {\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\n readonly promptInputs: PromptInputs;\n readonly nowFn: () => Date;\n readonly attempt: number;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly outputMessages?: readonly OutputMessage[];\n readonly traceSummary?: TraceSummary;\n}): Promise<EvaluationResult> {\n const {\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n promptInputs,\n nowFn,\n attempt,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n } = options;\n\n const gradeTimestamp = nowFn();\n const { score, evaluatorResults } = await runEvaluatorsForCase({\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n attempt,\n promptInputs,\n now: gradeTimestamp,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n });\n\n const completedAt = nowFn();\n\n let agentProviderRequest: JsonObject | undefined;\n let lmProviderRequest: JsonObject | undefined;\n\n if (isAgentProvider(provider)) {\n agentProviderRequest = {\n question: promptInputs.question,\n guideline_paths: evalCase.guideline_paths,\n } as JsonObject;\n } else {\n if (promptInputs.chatPrompt) {\n lmProviderRequest = {\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\n } as JsonObject;\n } else {\n lmProviderRequest = {\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n } as JsonObject;\n }\n }\n\n return {\n timestamp: completedAt.toISOString(),\n evalId: evalCase.id,\n dataset: evalCase.dataset,\n conversationId: evalCase.conversation_id,\n score: score.score,\n hits: score.hits,\n misses: score.misses,\n candidateAnswer: candidate,\n target: target.name,\n reasoning: score.reasoning,\n rawAspects: score.rawAspects,\n agentProviderRequest: agentProviderRequest,\n lmProviderRequest: lmProviderRequest,\n evaluatorProviderRequest: evaluatorResults ? undefined : score.evaluatorRawRequest,\n evaluatorResults: evaluatorResults,\n traceSummary: traceSummary,\n };\n}\n\nasync function runEvaluatorsForCase(options: {\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly outputMessages?: readonly OutputMessage[];\n readonly traceSummary?: TraceSummary;\n}): Promise<{ score: EvaluationScore; evaluatorResults?: EvaluatorResult[] }> {\n const {\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n } = options;\n\n if (evalCase.evaluators && evalCase.evaluators.length > 0) {\n return runEvaluatorList({\n evalCase,\n evaluators: evalCase.evaluators,\n candidate,\n target,\n provider,\n evaluatorRegistry: evaluators,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n });\n }\n\n const evaluatorKind = evalCase.evaluator ?? 'llm_judge';\n const activeEvaluator = evaluators[evaluatorKind] ?? evaluators.llm_judge;\n if (!activeEvaluator) {\n throw new Error(`No evaluator registered for kind '${evaluatorKind}'`);\n }\n\n const score = await activeEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n outputMessages,\n traceSummary,\n });\n\n return { score };\n}\n\nasync function runEvaluatorList(options: {\n readonly evalCase: EvalCase;\n readonly evaluators: readonly EvaluatorConfig[];\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\n readonly llm_judge: Evaluator;\n };\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly outputMessages?: readonly OutputMessage[];\n readonly traceSummary?: TraceSummary;\n}): Promise<{ score: EvaluationScore; evaluatorResults: EvaluatorResult[] }> {\n const {\n evalCase,\n evaluators,\n candidate,\n target,\n provider,\n evaluatorRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n } = options;\n\n const scored: Array<{\n readonly score: EvaluationScore;\n readonly name: string;\n readonly type: string;\n readonly weight?: number;\n }> = [];\n const evaluatorResults: EvaluatorResult[] = [];\n\n for (const evaluator of evaluators ?? []) {\n try {\n if (evaluator.type === 'llm_judge') {\n const score = await runLlmJudgeEvaluator({\n config: evaluator,\n evalCase,\n candidate,\n target,\n provider,\n evaluatorRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n evaluatorProviderRequest: score.evaluatorRawRequest,\n });\n }\n\n if (evaluator.type === 'code') {\n const codeEvaluator = new CodeEvaluator({\n script: evaluator.script,\n cwd: evaluator.resolvedCwd ?? evaluator.cwd,\n agentTimeoutMs,\n });\n const score = await codeEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n outputMessages,\n traceSummary,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: 'code_judge', weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: 'code_judge',\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n evaluatorProviderRequest: score.evaluatorRawRequest,\n });\n }\n\n if (evaluator.type === 'composite') {\n const evalFileDir = evalCase.guideline_paths[0]\n ? path.dirname(evalCase.guideline_paths[0])\n : process.cwd();\n\n const createEvaluator = (memberConfig: import('./types.js').EvaluatorConfig): Evaluator => {\n switch (memberConfig.type) {\n case 'llm_judge':\n return evaluatorRegistry.llm_judge;\n case 'code':\n return new CodeEvaluator({\n script: memberConfig.script,\n cwd: memberConfig.resolvedCwd ?? memberConfig.cwd,\n agentTimeoutMs,\n });\n case 'composite':\n return new CompositeEvaluator({\n config: memberConfig,\n cwd: evalFileDir,\n evaluatorFactory: { create: createEvaluator },\n });\n case 'tool_trajectory':\n return new ToolTrajectoryEvaluator({\n config: memberConfig as ToolTrajectoryEvaluatorConfig,\n });\n default: {\n const unknownConfig = memberConfig as { type: string };\n throw new Error(`Unsupported evaluator type in composite: ${unknownConfig.type}`);\n }\n }\n };\n\n const compositeEvaluator = new CompositeEvaluator({\n config: evaluator,\n cwd: evalFileDir,\n evaluatorFactory: { create: createEvaluator },\n });\n const score = await compositeEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n evaluatorProviderRequest: score.evaluatorRawRequest,\n evaluatorResults: mapChildResults(score.evaluatorResults),\n });\n }\n\n if (evaluator.type === 'tool_trajectory') {\n const trajectoryEvaluator = new ToolTrajectoryEvaluator({\n config: evaluator as ToolTrajectoryEvaluatorConfig,\n });\n const score = trajectoryEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n outputMessages,\n traceSummary,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const fallbackScore: EvaluationScore = {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Evaluator '${evaluator.name}' failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n };\n const resultType = evaluator.type === 'code' ? 'code_judge' : evaluator.type;\n const weight = evaluator.weight ?? 1.0;\n scored.push({\n score: fallbackScore,\n name: evaluator.name ?? 'unknown',\n type: resultType ?? 'llm_judge',\n weight,\n });\n evaluatorResults.push({\n name: evaluator.name ?? 'unknown',\n type: resultType ?? 'llm_judge',\n score: 0,\n weight,\n verdict: 'fail',\n hits: [],\n misses: [`Evaluator '${evaluator.name ?? 'unknown'}' failed: ${message}`],\n reasoning: message,\n });\n }\n }\n\n const aggregateScore =\n scored.length > 0\n ? computeWeightedMean(\n scored.map((entry) => ({ score: entry.score.score, weight: entry.weight })),\n )\n : 0;\n const hits = scored.flatMap((entry) => entry.score.hits);\n const misses = scored.flatMap((entry) => entry.score.misses);\n const expectedAspectCount = scored.reduce(\n (total, entry) => total + (entry.score.expectedAspectCount ?? 0),\n 0,\n );\n const rawAspects = scored.flatMap((entry) => entry.score.rawAspects ?? []);\n const reasoningParts = scored\n .map((entry) => (entry.score.reasoning ? `${entry.name}: ${entry.score.reasoning}` : undefined))\n .filter(isNonEmptyString);\n const reasoning = reasoningParts.length > 0 ? reasoningParts.join(' | ') : undefined;\n\n const score: EvaluationScore = {\n score: aggregateScore,\n verdict: scoreToVerdict(aggregateScore),\n hits,\n misses,\n expectedAspectCount,\n reasoning,\n rawAspects: rawAspects.length > 0 ? rawAspects : undefined,\n };\n\n return { score, evaluatorResults };\n}\n\nasync function runLlmJudgeEvaluator(options: {\n readonly config: import('./types.js').LlmJudgeEvaluatorConfig;\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\n readonly llm_judge: Evaluator;\n };\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly judgeProvider?: Provider;\n}): Promise<EvaluationScore> {\n const {\n config,\n evalCase,\n candidate,\n target,\n provider,\n evaluatorRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n } = options;\n const customPrompt = await resolveCustomPrompt(config);\n\n return evaluatorRegistry.llm_judge.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n evaluatorTemplateOverride: customPrompt,\n evaluator: config,\n });\n}\n\nasync function resolveCustomPrompt(config: {\n readonly prompt?: string;\n readonly promptPath?: string;\n}): Promise<string | undefined> {\n if (config.promptPath) {\n try {\n const content = await readTextFile(config.promptPath);\n return content;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Could not read custom prompt at ${config.promptPath}: ${message}`);\n }\n }\n return config.prompt;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction scoreToVerdict(score: number): EvaluationVerdict {\n if (score >= 0.8) {\n return 'pass';\n }\n if (score >= 0.6) {\n return 'borderline';\n }\n return 'fail';\n}\n\nfunction filterEvalCases(evalCases: readonly EvalCase[], evalId?: string): readonly EvalCase[] {\n if (!evalId) {\n return evalCases;\n }\n return evalCases.filter((evalCase) => evalCase.id === evalId);\n}\n\nfunction buildEvaluatorRegistry(\n overrides: Partial<Record<string, Evaluator>> | undefined,\n resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>,\n): Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator } {\n const llmJudge =\n overrides?.llm_judge ??\n new LlmJudgeEvaluator({\n resolveJudgeProvider: async (context) => {\n if (context.judgeProvider) {\n return context.judgeProvider;\n }\n return resolveJudgeProvider(context.target);\n },\n });\n\n return {\n ...overrides,\n llm_judge: llmJudge,\n };\n}\n\nasync function dumpPrompt(\n directory: string,\n evalCase: EvalCase,\n promptInputs: PromptInputs,\n): Promise<void> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filename = `${timestamp}_${sanitizeFilename(evalCase.id)}.json`;\n const filePath = path.resolve(directory, filename);\n\n await mkdir(path.dirname(filePath), { recursive: true });\n const payload = {\n eval_id: evalCase.id,\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_paths: evalCase.guideline_paths,\n } satisfies Record<string, unknown>;\n\n await writeFile(filePath, JSON.stringify(payload, null, 2), 'utf8');\n}\n\nfunction sanitizeFilename(value: string): string {\n if (!value) {\n return 'prompt';\n }\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : randomUUID();\n}\n\nasync function invokeProvider(\n provider: Provider,\n options: {\n readonly evalCase: EvalCase;\n readonly target: ResolvedTarget;\n readonly promptInputs: PromptInputs;\n readonly attempt: number;\n readonly agentTimeoutMs?: number;\n readonly signal?: AbortSignal;\n },\n): Promise<ProviderResponse> {\n const { evalCase, promptInputs, attempt, agentTimeoutMs, signal } = options;\n\n const controller = new AbortController();\n const timeout = agentTimeoutMs ? setTimeout(() => controller.abort(), agentTimeoutMs) : undefined;\n\n if (signal) {\n signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n return await provider.invoke({\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_patterns: evalCase.guideline_patterns,\n chatPrompt: promptInputs.chatPrompt,\n inputFiles: evalCase.file_paths,\n evalCaseId: evalCase.id,\n attempt,\n metadata: {\n systemPrompt: promptInputs.systemMessage ?? '',\n },\n signal: controller.signal,\n });\n } finally {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n }\n}\n\nfunction buildErrorResult(\n evalCase: EvalCase,\n targetName: string,\n timestamp: Date,\n error: unknown,\n promptInputs: PromptInputs,\n provider?: Provider,\n): EvaluationResult {\n const message = error instanceof Error ? error.message : String(error);\n\n let agentProviderRequest: JsonObject | undefined;\n let lmProviderRequest: JsonObject | undefined;\n\n if (isAgentProvider(provider)) {\n agentProviderRequest = {\n question: promptInputs.question,\n guideline_paths: evalCase.guideline_paths,\n error: message,\n } as JsonObject;\n } else {\n if (promptInputs.chatPrompt) {\n lmProviderRequest = {\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\n guideline_paths: evalCase.guideline_paths,\n error: message,\n } as JsonObject;\n } else {\n lmProviderRequest = {\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_paths: evalCase.guideline_paths,\n error: message,\n } as JsonObject;\n }\n }\n\n return {\n timestamp: timestamp.toISOString(),\n evalId: evalCase.id,\n dataset: evalCase.dataset,\n conversationId: evalCase.conversation_id,\n score: 0,\n hits: [],\n misses: [`Error: ${message}`],\n candidateAnswer: `Error occurred: ${message}`,\n target: targetName,\n rawAspects: [],\n agentProviderRequest: agentProviderRequest,\n lmProviderRequest: lmProviderRequest,\n error: message,\n } satisfies EvaluationResult;\n}\n\nfunction createCacheKey(\n provider: Provider,\n target: ResolvedTarget,\n evalCase: EvalCase,\n promptInputs: PromptInputs,\n): string {\n const hash = createHash('sha256');\n hash.update(provider.id);\n hash.update(target.name);\n hash.update(evalCase.id);\n hash.update(promptInputs.question);\n hash.update(promptInputs.guidelines);\n hash.update(promptInputs.systemMessage ?? '');\n if (promptInputs.chatPrompt) {\n hash.update(JSON.stringify(promptInputs.chatPrompt));\n }\n return hash.digest('hex');\n}\n\nfunction isTimeoutLike(error: unknown): boolean {\n if (!error) {\n return false;\n }\n if (\n typeof DOMException !== 'undefined' &&\n error instanceof DOMException &&\n error.name === 'AbortError'\n ) {\n return true;\n }\n if (error instanceof Error) {\n const name = error.name?.toLowerCase();\n const message = error.message?.toLowerCase();\n return name.includes('timeout') || message.includes('timeout');\n }\n const value = String(error).toLowerCase();\n return value.includes('timeout');\n}\n\nfunction mapChildResults(\n children?: readonly ChildEvaluatorResult[],\n): readonly EvaluatorResult[] | undefined {\n if (!children || children.length === 0) {\n return undefined;\n }\n\n return children.map((child) => ({\n name: child.name,\n type: child.type as EvaluatorKind,\n score: child.score,\n weight: child.weight,\n verdict: child.verdict,\n hits: child.hits,\n misses: child.misses,\n reasoning: child.reasoning,\n evaluatorProviderRequest: child.evaluatorRawRequest,\n evaluatorResults: mapChildResults(child.evaluatorResults),\n }));\n}\n\n/**\n * Compute weighted mean of scores, defaulting missing weights to 1.0.\n * Returns 0 if total weight is 0.\n */\nfunction computeWeightedMean(\n entries: readonly { readonly score: number; readonly weight?: number }[],\n): number {\n let totalWeight = 0;\n let weightedSum = 0;\n\n for (const entry of entries) {\n const weight = entry.weight ?? 1.0;\n totalWeight += weight;\n weightedSum += entry.score * weight;\n }\n\n return totalWeight > 0 ? weightedSum / totalWeight : 0;\n}\n","/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\n\t\t// Clean up tail reference when queue becomes empty\n\t\tif (!this.#head) {\n\t\t\tthis.#tail = undefined;\n\t\t}\n\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t\t// Since `pendingCount` has been decreased by one, increase `activeCount` by one.\n\t\t\tactiveCount++;\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue `internalResolve` instead of the `run` function\n\t\t// to preserve asynchronous context.\n\t\tnew Promise(internalResolve => {\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(\n\t\t\trun.bind(undefined, function_, resolve, arguments_),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// after the `internalResolve` function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency) {\n\t\t\t\tresumeNext();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nexport function limitFunction(function_, option) {\n\tconst {concurrency} = option;\n\tconst limit = pLimit(concurrency);\n\n\treturn (...arguments_) => limit(() => function_(...arguments_));\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n","import { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport type { Provider } from '../providers/types.js';\nimport type { RubricItem } from '../types.js';\n\nconst rubricItemSchema = z.object({\n id: z.string().describe('Short identifier for this rubric (e.g., clarity, completeness)'),\n description: z.string().describe('What this rubric checks for'),\n weight: z.number().default(1.0).describe('Relative importance (default 1.0)'),\n required: z.boolean().default(true).describe('Whether this is a mandatory requirement'),\n});\n\nconst rubricGenerationSchema = z.object({\n rubrics: z.array(rubricItemSchema).describe('List of evaluation rubrics'),\n});\n\nexport interface GenerateRubricsOptions {\n readonly expectedOutcome: string;\n readonly question?: string;\n readonly referenceAnswer?: string;\n readonly provider: Provider;\n}\n\n/**\n * Generate rubrics from expected outcome using an LLM.\n */\nexport async function generateRubrics(\n options: GenerateRubricsOptions,\n): Promise<readonly RubricItem[]> {\n const { expectedOutcome, question, referenceAnswer, provider } = options;\n\n const prompt = buildPrompt(expectedOutcome, question, referenceAnswer);\n\n const model = provider.asLanguageModel?.();\n if (!model) {\n throw new Error('Provider does not support language model interface');\n }\n\n const system = `You are an expert at creating evaluation rubrics.\nYou must return a valid JSON object matching this schema:\n{\n \"rubrics\": [\n {\n \"id\": \"string (short identifier)\",\n \"description\": \"string (what to check)\",\n \"weight\": number (default 1.0),\n \"required\": boolean (default true)\n }\n ]\n}`;\n\n let result: z.infer<typeof rubricGenerationSchema> | undefined;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const { text } = await generateText({\n model,\n system,\n prompt,\n });\n\n const cleaned = text.replace(/```json\\n?|```/g, '').trim();\n result = rubricGenerationSchema.parse(JSON.parse(cleaned));\n break;\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n // Continue to next attempt\n }\n }\n\n if (!result) {\n throw new Error(`Failed to parse generated rubrics after 3 attempts: ${lastError?.message}`);\n }\n\n return result.rubrics;\n}\n\nfunction buildPrompt(expectedOutcome: string, question?: string, referenceAnswer?: string): string {\n const parts: string[] = [\n 'You are an expert at creating evaluation rubrics.',\n 'Given the expected outcome (and optionally the question and reference answer),',\n 'generate a list of specific, measurable rubric items to evaluate whether an answer meets the expected outcome.',\n '',\n 'Each rubric should:',\n '- Be specific and testable',\n '- Have a short, descriptive ID',\n '- Include a clear description of what to check',\n '- Indicate if it is required (mandatory) or optional',\n '- Have an appropriate weight (default 1.0, use higher values for more important aspects)',\n '',\n 'Generate 3-7 rubric items that comprehensively cover the expected outcome.',\n '',\n '[[ ## expected_outcome ## ]]',\n expectedOutcome,\n '',\n ];\n\n if (question && question.trim().length > 0) {\n parts.push('[[ ## question ## ]]', question, '');\n }\n\n if (referenceAnswer && referenceAnswer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', referenceAnswer, '');\n }\n\n return parts.join('\\n');\n}\n"],"mappings":"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","names":["buildDirectoryChain","buildSearchRoots","fileExists","resolveFileReference","import_promises","import_node_path","import_yaml","import_promises","import_node_path","path","path","micromatch","import_node_path","import_promises","ANSI_YELLOW","ANSI_RESET","ANSI_YELLOW","ANSI_RESET","isJsonObject","logWarning","asString","weight","path","promptPath","import_promises","import_node_path","ANSI_YELLOW","ANSI_RESET","asString","logWarning","path","asString","logWarning","ANSI_YELLOW","ANSI_RESET","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","DEFAULT_SYSTEM_PROMPT","normalizeInputFiles","path","formatTimeoutSuffix","import_node_child_process","import_node_crypto","import_node_fs","import_promises","import_node_os","import_node_path","GLOBAL_LOGS_KEY","GLOBAL_SUBSCRIBERS_KEY","getSubscriberStore","notifySubscribers","WORKSPACE_PREFIX","PROMPT_FILENAME","DEFAULT_SYSTEM_PROMPT","normalizeInputFiles","path","formatTimeoutSuffix","pickDetail","extractAssistantText","buildLogFilename","formatElapsed","sanitizeForFilename","tryParseJsonValue","event","import_node_path","path","import_node_path","buildPromptDocument","collectGuidelineFiles","buildMandatoryPrereadBlock","path","pathToFileUri","path","import_node_fs","import_promises","import_node_path","import_yaml","fileExists","path","import_ai","import_zod","spawn","data","path","score","hits","misses","reasoning","import_node_crypto","import_promises","import_node_path","score","path","isNonEmptyString","scoreToVerdict","import_ai","import_zod"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/evaluation/types.ts","../src/evaluation/trace.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/validation/prompt-validator.ts","../src/evaluation/template-variables.ts","../src/evaluation/loaders/message-processor.ts","../src/evaluation/formatting/prompt-builder.ts","../src/evaluation/file-utils.ts","../src/evaluation/providers/ai-sdk.ts","../src/evaluation/providers/claude-code.ts","../src/evaluation/providers/claude-code-log-tracker.ts","../src/evaluation/providers/preread.ts","../src/evaluation/providers/cli.ts","../src/evaluation/providers/codex.ts","../src/evaluation/providers/codex-log-tracker.ts","../src/evaluation/providers/mock.ts","../src/evaluation/providers/pi-agent-sdk.ts","../src/evaluation/providers/pi-coding-agent.ts","../src/evaluation/providers/pi-log-tracker.ts","../src/evaluation/providers/targets.ts","../src/evaluation/providers/vscode.ts","../src/evaluation/providers/vscode-templates.ts","../src/evaluation/providers/targets-file.ts","../src/evaluation/providers/index.ts","../src/evaluation/evaluators.ts","../src/runtime/exec.ts","../src/evaluation/case-conversion.ts","../src/evaluation/providers/types.ts","../src/evaluation/orchestrator.ts","../../../node_modules/.bun/yocto-queue@1.2.2/node_modules/yocto-queue/index.js","../../../node_modules/.bun/p-limit@6.2.0/node_modules/p-limit/index.js","../src/evaluation/generators/rubric-generator.ts"],"sourcesContent":["export * from './evaluation/types.js';\nexport * from './evaluation/trace.js';\nexport * from './evaluation/yaml-parser.js';\nexport * from './evaluation/file-utils.js';\nexport * from './evaluation/providers/index.js';\nexport * from './evaluation/evaluators.js';\nexport * from './evaluation/orchestrator.js';\nexport * from './evaluation/generators/index.js';\n\nexport type AgentKernel = {\n status: string;\n};\n\nexport function createAgentKernel(): AgentKernel {\n return { status: 'stub' };\n}\n","import type { ToolTrajectoryEvaluatorConfig, TraceSummary } from './trace.js';\n\n/**\n * JSON primitive values appearing in AgentV payloads.\n */\nexport type JsonPrimitive = string | number | boolean | null;\n\n/**\n * Immutable JSON object representation for test fixtures.\n */\nexport interface JsonObject {\n readonly [key: string]: JsonValue;\n}\n\n/**\n * Recursive JSON value supporting nested structures.\n */\nexport type JsonValue = JsonPrimitive | JsonObject | readonly JsonValue[];\n\nconst TEST_MESSAGE_ROLE_VALUES = ['system', 'user', 'assistant', 'tool'] as const;\n\n/**\n * Immutable list of supported message roles.\n */\nexport const TEST_MESSAGE_ROLES = TEST_MESSAGE_ROLE_VALUES;\n\n/**\n * Role literals used by test messages.\n */\nexport type TestMessageRole = (typeof TEST_MESSAGE_ROLE_VALUES)[number];\n\nconst TEST_MESSAGE_ROLE_SET: ReadonlySet<string> = new Set(TEST_MESSAGE_ROLE_VALUES);\n\n/**\n * Text or structured payload attached to a message.\n */\nexport type TestMessageContent = string | JsonObject | readonly JsonObject[];\n\n/**\n * System-authored instruction message.\n */\nexport type SystemTestMessage = {\n readonly role: 'system';\n readonly content: TestMessageContent;\n};\n\n/**\n * User-authored prompt message.\n */\nexport type UserTestMessage = {\n readonly role: 'user';\n readonly content: TestMessageContent;\n};\n\n/**\n * Assistant response message.\n */\nexport type AssistantTestMessage = {\n readonly role: 'assistant';\n readonly content: TestMessageContent;\n};\n\n/**\n * Tool invocation message.\n */\nexport type ToolTestMessage = {\n readonly role: 'tool';\n readonly content: TestMessageContent;\n};\n\n/**\n * Conversation message union with role discrimination.\n */\nexport type TestMessage =\n | SystemTestMessage\n | UserTestMessage\n | AssistantTestMessage\n | ToolTestMessage;\n\n/**\n * Guard validating supported message roles.\n */\nexport function isTestMessageRole(value: unknown): value is TestMessageRole {\n return typeof value === 'string' && TEST_MESSAGE_ROLE_SET.has(value);\n}\n\n/**\n * Guard matching AgentV JSON objects.\n */\nexport function isJsonObject(value: unknown): value is JsonObject {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n return Object.values(value as Record<string, unknown>).every(isJsonValue);\n}\n\n/**\n * Guard matching AgentV JSON values.\n */\nexport function isJsonValue(value: unknown): value is JsonValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every(isJsonValue);\n }\n if (typeof value === 'object') {\n return isJsonObject(value);\n }\n return false;\n}\n\n/**\n * Guard validating raw test messages.\n * A valid test message has:\n * - A valid role (system, user, assistant, tool)\n * - Either content (string or array of objects) OR tool_calls (for assistant messages)\n */\nexport function isTestMessage(value: unknown): value is TestMessage {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const candidate = value as { role?: unknown; content?: unknown; tool_calls?: unknown };\n if (!isTestMessageRole(candidate.role)) {\n return false;\n }\n // Check for valid content\n if (typeof candidate.content === 'string') {\n return true;\n }\n if (Array.isArray(candidate.content) && candidate.content.every(isJsonObject)) {\n return true;\n }\n // Allow messages with tool_calls but no content (for expected_messages format)\n if (Array.isArray(candidate.tool_calls) && candidate.tool_calls.length > 0) {\n return true;\n }\n // Allow messages with structured content object (e.g., { recommendation: ..., summary: ... })\n if (isJsonObject(candidate.content)) {\n return true;\n }\n return false;\n}\n\nconst EVALUATOR_KIND_VALUES = [\n 'code_judge',\n 'llm_judge',\n 'rubric',\n 'composite',\n 'tool_trajectory',\n 'field_accuracy',\n 'latency',\n 'cost',\n 'token_usage',\n] as const;\n\nexport type EvaluatorKind = (typeof EVALUATOR_KIND_VALUES)[number];\n\nconst EVALUATOR_KIND_SET: ReadonlySet<string> = new Set(EVALUATOR_KIND_VALUES);\n\nexport function isEvaluatorKind(value: unknown): value is EvaluatorKind {\n return typeof value === 'string' && EVALUATOR_KIND_SET.has(value);\n}\n\nexport type CodeEvaluatorConfig = {\n readonly name: string;\n readonly type: 'code';\n readonly script: readonly string[];\n readonly resolvedScriptPath?: string;\n readonly cwd?: string;\n readonly resolvedCwd?: string;\n readonly weight?: number;\n /** Pass-through configuration for the code_judge script (any unrecognized YAML properties) */\n readonly config?: JsonObject;\n};\n\nexport type LlmJudgeEvaluatorConfig = {\n readonly name: string;\n readonly type: 'llm_judge';\n readonly prompt?: string;\n readonly promptPath?: string;\n readonly rubrics?: readonly RubricItem[];\n readonly weight?: number;\n};\n\nexport type RubricItem = {\n readonly id: string;\n readonly description: string;\n readonly weight: number;\n readonly required: boolean;\n};\n\nexport type CompositeAggregatorConfig =\n | { readonly type: 'weighted_average'; readonly weights?: Record<string, number> }\n | { readonly type: 'code_judge'; readonly path: string; readonly cwd?: string }\n | {\n readonly type: 'llm_judge';\n readonly prompt?: string;\n readonly promptPath?: string;\n readonly model?: string;\n };\n\nexport type CompositeEvaluatorConfig = {\n readonly name: string;\n readonly type: 'composite';\n readonly evaluators: readonly EvaluatorConfig[];\n readonly aggregator: CompositeAggregatorConfig;\n readonly weight?: number;\n};\n\n/**\n * Match type for field accuracy evaluation.\n * Note: For fuzzy string matching (Levenshtein, Jaro-Winkler, etc.), use a code_judge evaluator.\n * See examples/features/document-extraction/fuzzy_match.ts for an example.\n */\nexport type FieldMatchType = 'exact' | 'numeric_tolerance' | 'date';\n\n/**\n * Aggregation strategy for combining field scores.\n */\nexport type FieldAggregationType = 'weighted_average' | 'all_or_nothing';\n\n/**\n * Configuration for a single field to evaluate.\n */\nexport type FieldConfig = {\n /** Dot-notation path to the field (e.g., \"invoice.vendor.name\" or \"items[0].amount\") */\n readonly path: string;\n /** Match strategy for this field */\n readonly match: FieldMatchType;\n /** Whether this field is required (missing required fields count as failures) */\n readonly required?: boolean;\n /** Weight for aggregation (default: 1.0) */\n readonly weight?: number;\n /** Tolerance for numeric matching (absolute value unless relative is true) */\n readonly tolerance?: number;\n /** Whether tolerance is relative (percentage) vs absolute */\n readonly relative?: boolean;\n /** Date formats to try when parsing (default: common formats) */\n readonly formats?: readonly string[];\n};\n\n/**\n * Configuration for the field_accuracy evaluator.\n */\nexport type FieldAccuracyEvaluatorConfig = {\n readonly name: string;\n readonly type: 'field_accuracy';\n /** Fields to compare between candidate and expected */\n readonly fields: readonly FieldConfig[];\n /** Strategy for combining field scores (default: weighted_average) */\n readonly aggregation?: FieldAggregationType;\n readonly weight?: number;\n};\n\n/**\n * Configuration for the latency evaluator.\n * Checks execution duration against a threshold.\n */\nexport type LatencyEvaluatorConfig = {\n readonly name: string;\n readonly type: 'latency';\n /** Maximum allowed duration in milliseconds */\n readonly threshold: number;\n readonly weight?: number;\n};\n\n/**\n * Configuration for the cost evaluator.\n * Checks execution cost against a budget.\n */\nexport type CostEvaluatorConfig = {\n readonly name: string;\n readonly type: 'cost';\n /** Maximum allowed cost in USD */\n readonly budget: number;\n readonly weight?: number;\n};\n\n/**\n * Configuration for the token_usage evaluator.\n * Checks provider-reported token usage against configured limits.\n */\nexport type TokenUsageEvaluatorConfig = {\n readonly name: string;\n readonly type: 'token_usage';\n /** Maximum allowed total tokens (input + output + cached, when present) */\n readonly max_total?: number;\n /** Maximum allowed input tokens (prompt) */\n readonly max_input?: number;\n /** Maximum allowed output tokens (completion) */\n readonly max_output?: number;\n readonly weight?: number;\n};\n\nexport type EvaluatorConfig =\n | CodeEvaluatorConfig\n | LlmJudgeEvaluatorConfig\n | CompositeEvaluatorConfig\n | ToolTrajectoryEvaluatorConfig\n | FieldAccuracyEvaluatorConfig\n | LatencyEvaluatorConfig\n | CostEvaluatorConfig\n | TokenUsageEvaluatorConfig;\n\n/**\n * Eval case definition sourced from AgentV specs.\n */\nexport interface EvalCase {\n readonly id: string;\n readonly dataset?: string;\n readonly conversation_id?: string;\n readonly question: string;\n readonly input_messages: readonly TestMessage[];\n readonly input_segments: readonly JsonObject[];\n readonly expected_messages: readonly JsonObject[];\n readonly reference_answer?: string;\n readonly guideline_paths: readonly string[];\n readonly guideline_patterns?: readonly string[];\n readonly file_paths: readonly string[];\n readonly code_snippets: readonly string[];\n readonly expected_outcome: string;\n readonly evaluator?: EvaluatorKind;\n readonly evaluators?: readonly EvaluatorConfig[];\n}\n\n/**\n * Evaluator scorecard for a single eval case run.\n */\nexport interface EvaluationResult {\n readonly timestamp: string;\n readonly evalId: string;\n readonly dataset?: string;\n readonly conversationId?: string;\n readonly score: number;\n readonly hits: readonly string[];\n readonly misses: readonly string[];\n readonly candidateAnswer: string;\n readonly target: string;\n readonly reasoning?: string;\n readonly agentProviderRequest?: JsonObject;\n readonly lmProviderRequest?: JsonObject;\n readonly evaluatorProviderRequest?: JsonObject;\n readonly evaluatorResults?: readonly EvaluatorResult[];\n readonly error?: string;\n /** Lightweight summary of the execution trace (always included when available) */\n readonly traceSummary?: TraceSummary;\n}\n\nexport type EvaluationVerdict = 'pass' | 'fail' | 'borderline';\n\nexport interface EvaluatorResult {\n readonly name: string;\n readonly type: EvaluatorKind;\n readonly score: number;\n readonly weight?: number;\n readonly verdict?: EvaluationVerdict;\n readonly hits: readonly string[];\n readonly misses: readonly string[];\n readonly reasoning?: string;\n readonly rawRequest?: JsonObject;\n readonly evaluatorProviderRequest?: JsonObject;\n readonly evaluatorResults?: readonly EvaluatorResult[];\n}\n\n/**\n * Convenience accessor matching the Python hit_count property.\n */\nexport function getHitCount(result: Pick<EvaluationResult, 'hits'>): number {\n return result.hits.length;\n}\n","/**\n * Trace event types for capturing agent execution traces.\n * Provides a normalized, provider-agnostic model for tool-call trajectories.\n */\n\n/**\n * Token usage metrics from provider execution.\n */\nexport interface TokenUsage {\n /** Input/prompt tokens consumed */\n readonly input: number;\n /** Output/completion tokens generated */\n readonly output: number;\n /** Cached tokens (optional, provider-specific) */\n readonly cached?: number;\n}\n\n/**\n * Compact summary of a trace for lightweight persistence.\n * Included in results by default to avoid payload bloat.\n */\nexport interface TraceSummary {\n /** Total number of events in trace */\n readonly eventCount: number;\n /** Unique tool names, sorted alphabetically */\n readonly toolNames: readonly string[];\n /** Map of tool name to call count */\n readonly toolCallsByName: Readonly<Record<string, number>>;\n /** Number of error events */\n readonly errorCount: number;\n /** Token usage metrics (optional, from provider) */\n readonly tokenUsage?: TokenUsage;\n /** Total cost in USD (optional, from provider) */\n readonly costUsd?: number;\n /** Total execution duration in milliseconds (optional) */\n readonly durationMs?: number;\n /** Per-tool duration arrays in milliseconds (optional) */\n readonly toolDurations?: Readonly<Record<string, readonly number[]>>;\n}\n\n/**\n * Configuration for tool_trajectory evaluator.\n */\nexport interface ToolTrajectoryEvaluatorConfig {\n readonly name: string;\n readonly type: 'tool_trajectory';\n /** Matching mode */\n readonly mode: 'any_order' | 'in_order' | 'exact';\n /** Minimum call counts per tool (for any_order mode) */\n readonly minimums?: Readonly<Record<string, number>>;\n /** Expected tool sequence (for in_order/exact modes) */\n readonly expected?: readonly ToolTrajectoryExpectedItem[];\n /** Optional weight for top-level aggregation (defaults to 1.0) */\n readonly weight?: number;\n}\n\n/**\n * Expected tool call item in a trajectory sequence.\n */\nexport interface ToolTrajectoryExpectedItem {\n readonly tool: string;\n /** Optional argument matching: 'any' skips validation, object performs partial deep equality */\n readonly args?: 'any' | Record<string, unknown>;\n}\n\n/**\n * Simplified input type for computeTraceSummary.\n * Matches OutputMessage structure without requiring full provider/types import.\n */\ninterface OutputMessageLike {\n readonly toolCalls?: readonly {\n readonly tool: string;\n }[];\n}\n\n/**\n * Compute a lightweight summary from output messages.\n * Used for default result persistence without payload bloat.\n */\nexport function computeTraceSummary(messages: readonly OutputMessageLike[]): TraceSummary {\n const toolCallCounts: Record<string, number> = {};\n let totalToolCalls = 0;\n\n for (const message of messages) {\n if (!message.toolCalls) continue;\n\n for (const toolCall of message.toolCalls) {\n toolCallCounts[toolCall.tool] = (toolCallCounts[toolCall.tool] ?? 0) + 1;\n totalToolCalls++;\n }\n }\n\n const toolNames = Object.keys(toolCallCounts).sort();\n\n return {\n eventCount: totalToolCalls,\n toolNames,\n toolCallsByName: toolCallCounts,\n errorCount: 0,\n };\n}\n\n/**\n * Default tool names considered as exploration/read-only operations.\n * Can be overridden per-evaluation via config.\n */\nexport const DEFAULT_EXPLORATION_TOOLS = [\n 'read',\n 'grep',\n 'glob',\n 'search',\n 'list',\n 'Read',\n 'Grep',\n 'Glob',\n 'WebSearch',\n 'WebFetch',\n] as const;\n\n/**\n * Ratio of exploration tool calls to total tool calls.\n * Returns undefined if there are no tool calls.\n *\n * @param summary - Trace summary with tool call counts\n * @param explorationTools - Tool names considered exploration (defaults to DEFAULT_EXPLORATION_TOOLS)\n * @returns Ratio between 0 and 1, or undefined if no tool calls\n */\nexport function explorationRatio(\n summary: TraceSummary,\n explorationTools: readonly string[] = DEFAULT_EXPLORATION_TOOLS,\n): number | undefined {\n if (summary.eventCount === 0) return undefined;\n\n const explorationCalls = explorationTools.reduce(\n (sum, tool) => sum + (summary.toolCallsByName[tool] ?? 0),\n 0,\n );\n\n return explorationCalls / summary.eventCount;\n}\n\n/**\n * Average tokens consumed per tool call.\n * Returns undefined if tokenUsage is not available or no tool calls.\n *\n * @param summary - Trace summary with optional token usage\n * @returns Average tokens per tool call, or undefined\n */\nexport function tokensPerTool(summary: TraceSummary): number | undefined {\n if (!summary.tokenUsage || summary.eventCount === 0) return undefined;\n\n const totalTokens = summary.tokenUsage.input + summary.tokenUsage.output;\n return totalTokens / summary.eventCount;\n}\n\n/**\n * Average tool duration across all tool calls.\n * Returns undefined if toolDurations is not available or empty.\n *\n * @param summary - Trace summary with optional tool durations\n * @returns Average duration in milliseconds, or undefined\n */\nexport function avgToolDurationMs(summary: TraceSummary): number | undefined {\n if (!summary.toolDurations) return undefined;\n\n let totalDuration = 0;\n let totalCalls = 0;\n\n for (const durations of Object.values(summary.toolDurations)) {\n for (const duration of durations) {\n totalDuration += duration;\n totalCalls++;\n }\n }\n\n if (totalCalls === 0) return undefined;\n return totalDuration / totalCalls;\n}\n\n/**\n * Execution metrics from provider response.\n */\nexport interface ExecutionMetrics {\n readonly tokenUsage?: TokenUsage;\n readonly costUsd?: number;\n readonly durationMs?: number;\n}\n\n/**\n * Merge execution metrics from provider response into a trace summary.\n * Returns a new TraceSummary with metrics fields populated.\n *\n * @param summary - Base trace summary from computeTraceSummary\n * @param metrics - Optional execution metrics from provider\n * @returns TraceSummary with merged metrics\n */\nexport function mergeExecutionMetrics(\n summary: TraceSummary,\n metrics?: ExecutionMetrics,\n): TraceSummary {\n if (!metrics) return summary;\n\n return {\n ...summary,\n tokenUsage: metrics.tokenUsage,\n costUsd: metrics.costUsd,\n durationMs: metrics.durationMs,\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { extractCodeBlocks } from './formatting/segment-formatter.js';\nimport { extractTargetFromSuite, loadConfig } from './loaders/config-loader.js';\nimport { coerceEvaluator, parseEvaluators } from './loaders/evaluator-parser.js';\nimport { buildSearchRoots, resolveToAbsolutePath } from './loaders/file-resolver.js';\nimport { processExpectedMessages, processMessages } from './loaders/message-processor.js';\nimport type { EvalCase, JsonObject, JsonValue, TestMessage } from './types.js';\nimport { isJsonObject, isTestMessage } from './types.js';\n\n// Re-export public APIs from modules\nexport { buildPromptInputs, type PromptInputs } from './formatting/prompt-builder.js';\nexport { extractCodeBlocks } from './formatting/segment-formatter.js';\nexport { isGuidelineFile } from './loaders/config-loader.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RED = '\\u001b[31m';\nconst ANSI_RESET = '\\u001b[0m';\n\ntype LoadOptions = {\n readonly verbose?: boolean;\n readonly evalId?: string;\n};\n\ntype RawTestSuite = JsonObject & {\n readonly evalcases?: JsonValue;\n readonly target?: JsonValue;\n readonly execution?: JsonValue;\n readonly dataset?: JsonValue;\n};\n\ntype RawEvalCase = JsonObject & {\n readonly id?: JsonValue;\n readonly conversation_id?: JsonValue;\n readonly outcome?: JsonValue;\n readonly expected_outcome?: JsonValue;\n readonly input_messages?: JsonValue;\n readonly expected_messages?: JsonValue;\n readonly execution?: JsonValue;\n readonly evaluators?: JsonValue;\n readonly rubrics?: JsonValue;\n};\n\n/**\n * Read metadata from a test suite file (like target name).\n * This is a convenience function for CLI tools that need metadata without loading all eval cases.\n */\nexport async function readTestSuiteMetadata(testFilePath: string): Promise<{ target?: string }> {\n try {\n const absolutePath = path.resolve(testFilePath);\n const content = await readFile(absolutePath, 'utf8');\n const parsed = parse(content) as unknown;\n\n if (!isJsonObject(parsed)) {\n return {};\n }\n\n return { target: extractTargetFromSuite(parsed) };\n } catch {\n return {};\n }\n}\n\n/**\n * Load eval cases from a AgentV YAML specification file.\n */\nexport async function loadEvalCases(\n evalFilePath: string,\n repoRoot: URL | string,\n options?: LoadOptions,\n): Promise<readonly EvalCase[]> {\n const verbose = options?.verbose ?? false;\n const evalIdFilter = options?.evalId;\n const absoluteTestPath = path.resolve(evalFilePath);\n\n const repoRootPath = resolveToAbsolutePath(repoRoot);\n const searchRoots = buildSearchRoots(absoluteTestPath, repoRootPath);\n\n // Load configuration (walks up directory tree to repo root)\n const config = await loadConfig(absoluteTestPath, repoRootPath);\n const guidelinePatterns = config?.guideline_patterns;\n\n const rawFile = await readFile(absoluteTestPath, 'utf8');\n const parsed = parse(rawFile) as unknown;\n if (!isJsonObject(parsed)) {\n throw new Error(`Invalid test file format: ${evalFilePath}`);\n }\n\n const suite = parsed as RawTestSuite;\n const datasetNameFromSuite = asString(suite.dataset)?.trim();\n const fallbackDataset = path.basename(absoluteTestPath).replace(/\\.ya?ml$/i, '') || 'eval';\n const datasetName =\n datasetNameFromSuite && datasetNameFromSuite.length > 0\n ? datasetNameFromSuite\n : fallbackDataset;\n\n const rawTestcases = suite.evalcases;\n if (!Array.isArray(rawTestcases)) {\n throw new Error(`Invalid test file format: ${evalFilePath} - missing 'evalcases' field`);\n }\n\n const globalEvaluator = coerceEvaluator(suite.evaluator, 'global') ?? 'llm_judge';\n\n // Extract global target from execution.target (or legacy root-level target)\n const globalExecution = isJsonObject(suite.execution) ? suite.execution : undefined;\n const _globalTarget = asString(globalExecution?.target) ?? asString(suite.target);\n\n const results: EvalCase[] = [];\n\n for (const rawEvalcase of rawTestcases) {\n if (!isJsonObject(rawEvalcase)) {\n logWarning('Skipping invalid eval case entry (expected object)');\n continue;\n }\n\n const evalcase = rawEvalcase as RawEvalCase;\n const id = asString(evalcase.id);\n\n // Skip eval cases that don't match the filter\n if (evalIdFilter && id !== evalIdFilter) {\n continue;\n }\n\n const conversationId = asString(evalcase.conversation_id);\n // Support both expected_outcome and outcome (backward compatibility)\n const outcome = asString(evalcase.expected_outcome) ?? asString(evalcase.outcome);\n\n const inputMessagesValue = evalcase.input_messages;\n const expectedMessagesValue = evalcase.expected_messages;\n\n if (!id || !outcome || !Array.isArray(inputMessagesValue)) {\n logError(\n `Skipping incomplete eval case: ${id ?? 'unknown'}. Missing required fields: id, outcome, and/or input_messages`,\n );\n continue;\n }\n\n // expected_messages is optional - for outcome-only evaluation\n const hasExpectedMessages =\n Array.isArray(expectedMessagesValue) && expectedMessagesValue.length > 0;\n\n // V2 format: input_messages vs expected_messages\n const inputMessages = inputMessagesValue.filter((msg): msg is TestMessage =>\n isTestMessage(msg),\n );\n const expectedMessages = hasExpectedMessages\n ? expectedMessagesValue.filter((msg): msg is TestMessage => isTestMessage(msg))\n : [];\n\n if (hasExpectedMessages && expectedMessages.length === 0) {\n logError(`No valid expected message found for eval case: ${id}`);\n continue;\n }\n\n const guidelinePaths: string[] = [];\n const inputTextParts: string[] = [];\n\n // Process all input messages to extract files and guidelines\n const inputSegments = await processMessages({\n messages: inputMessages,\n searchRoots,\n repoRootPath,\n guidelinePatterns,\n guidelinePaths,\n textParts: inputTextParts,\n messageType: 'input',\n verbose,\n });\n\n // Process expected_messages into segments (only if provided)\n // Preserve full message structure including role and tool_calls for expected_messages evaluator\n const outputSegments = hasExpectedMessages\n ? await processExpectedMessages({\n messages: expectedMessages,\n searchRoots,\n repoRootPath,\n verbose,\n })\n : [];\n\n const codeSnippets = extractCodeBlocks(inputSegments);\n\n // Build reference_answer:\n // Extract the content from the last message in expected_messages (similar to candidate_answer)\n let referenceAnswer = '';\n if (outputSegments.length > 0) {\n // Get the last message\n const lastMessage = outputSegments[outputSegments.length - 1];\n const content = lastMessage.content;\n const toolCalls = lastMessage.tool_calls;\n\n if (typeof content === 'string') {\n referenceAnswer = content;\n } else if (content !== undefined && content !== null) {\n // Serialize just the content, not the entire message\n referenceAnswer = JSON.stringify(content, null, 2);\n } else if (toolCalls !== undefined && toolCalls !== null) {\n // Message with only tool_calls - serialize just the tool_calls\n referenceAnswer = JSON.stringify(toolCalls, null, 2);\n }\n }\n const question = inputTextParts\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .join(' ');\n\n const evalCaseEvaluatorKind = coerceEvaluator(evalcase.evaluator, id) ?? globalEvaluator;\n let evaluators: Awaited<ReturnType<typeof parseEvaluators>>;\n try {\n evaluators = await parseEvaluators(evalcase, globalExecution, searchRoots, id ?? 'unknown');\n } catch (error) {\n // Skip entire eval case if evaluator validation fails\n const message = error instanceof Error ? error.message : String(error);\n logError(`Skipping eval case '${id}': ${message}`);\n continue;\n }\n\n // Handle inline rubrics field (syntactic sugar)\n const inlineRubrics = evalcase.rubrics;\n if (inlineRubrics !== undefined && Array.isArray(inlineRubrics)) {\n const rubricItems = inlineRubrics\n .filter((r): r is JsonObject | string => isJsonObject(r) || typeof r === 'string')\n .map((rubric, index) => {\n if (typeof rubric === 'string') {\n return {\n id: `rubric-${index + 1}`,\n description: rubric,\n weight: 1.0,\n required: true,\n };\n }\n return {\n id: asString(rubric.id) ?? `rubric-${index + 1}`,\n description: asString(rubric.description) ?? '',\n weight: typeof rubric.weight === 'number' ? rubric.weight : 1.0,\n required: typeof rubric.required === 'boolean' ? rubric.required : true,\n };\n })\n .filter((r) => r.description.length > 0);\n\n if (rubricItems.length > 0) {\n const rubricEvaluator: import('./types.js').LlmJudgeEvaluatorConfig = {\n name: 'rubric',\n type: 'llm_judge',\n rubrics: rubricItems,\n };\n // Prepend rubric evaluator to existing evaluators\n evaluators = evaluators ? [rubricEvaluator, ...evaluators] : [rubricEvaluator];\n }\n }\n\n // Extract file paths from all input segments (non-guideline files)\n const userFilePaths: string[] = [];\n for (const segment of inputSegments) {\n if (segment.type === 'file' && typeof segment.resolvedPath === 'string') {\n userFilePaths.push(segment.resolvedPath);\n }\n }\n\n // Combine all file paths (guidelines + regular files)\n const allFilePaths = [\n ...guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\n ...userFilePaths,\n ];\n\n const testCase: EvalCase = {\n id,\n dataset: datasetName,\n conversation_id: conversationId,\n question: question,\n input_messages: inputMessages,\n input_segments: inputSegments,\n expected_messages: outputSegments,\n reference_answer: referenceAnswer,\n guideline_paths: guidelinePaths.map((guidelinePath) => path.resolve(guidelinePath)),\n guideline_patterns: guidelinePatterns,\n file_paths: allFilePaths,\n code_snippets: codeSnippets,\n expected_outcome: outcome,\n evaluator: evalCaseEvaluatorKind,\n evaluators,\n };\n\n if (verbose) {\n console.log(`\\n[Eval Case: ${id}]`);\n if (testCase.guideline_paths.length > 0) {\n console.log(` Guidelines used: ${testCase.guideline_paths.length}`);\n for (const guidelinePath of testCase.guideline_paths) {\n console.log(` - ${guidelinePath}`);\n }\n } else {\n console.log(' No guidelines found');\n }\n }\n\n results.push(testCase);\n }\n\n return results;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\nfunction logError(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.error(`${ANSI_RED}Error: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.error(`${ANSI_RED}Error: ${message}${ANSI_RESET}`);\n }\n}\n","import type { JsonObject } from '../types.js';\n\n/**\n * Formatting mode for segment content.\n * - 'agent': File references only (for providers with filesystem access)\n * - 'lm': Embedded file content with XML tags (for language model providers)\n */\nexport type FormattingMode = 'agent' | 'lm';\n\n/**\n * Extract fenced code blocks from AgentV user segments.\n */\nexport function extractCodeBlocks(segments: readonly JsonObject[]): readonly string[] {\n const CODE_BLOCK_PATTERN = /```[\\s\\S]*?```/g;\n const codeBlocks: string[] = [];\n for (const segment of segments) {\n const typeValue = segment.type;\n if (typeof typeValue !== 'string' || typeValue !== 'text') {\n continue;\n }\n const textValue = segment.value;\n if (typeof textValue !== 'string') {\n continue;\n }\n const matches = textValue.match(CODE_BLOCK_PATTERN);\n if (matches) {\n codeBlocks.push(...matches);\n }\n }\n return codeBlocks;\n}\n\n/**\n * Format file contents with XML tags for all files.\n */\nexport function formatFileContents(\n parts: Array<{ content: string; isFile: boolean; displayPath?: string }>,\n): string {\n const fileCount = parts.filter((p) => p.isFile).length;\n\n // Use XML tags if any files are present\n if (fileCount > 0) {\n return parts\n .map((part) => {\n if (part.isFile && part.displayPath) {\n return `<file path=\"${part.displayPath}\">\\n${part.content}\\n</file>`;\n }\n return part.content;\n })\n .join('\\n\\n');\n }\n\n // Otherwise, join normally\n return parts.map((p) => p.content).join(' ');\n}\n\n/**\n * Format a segment into its display string.\n * Text segments return their value; file segments return formatted file content with header.\n *\n * @param segment - The segment to format\n * @param mode - Formatting mode: 'agent' for file references, 'lm' for embedded content\n */\nexport function formatSegment(\n segment: JsonObject,\n mode: FormattingMode = 'lm',\n): string | undefined {\n const type = asString(segment.type);\n\n if (type === 'text') {\n return asString(segment.value);\n }\n\n if (type === 'guideline_ref') {\n const refPath = asString(segment.path);\n return refPath ? `<Attached: ${refPath}>` : undefined;\n }\n\n if (type === 'file') {\n const filePath = asString(segment.path);\n if (!filePath) {\n return undefined;\n }\n\n // Agent mode: return file reference only\n if (mode === 'agent') {\n return `<file: path=\"${filePath}\">`;\n }\n\n // LM mode: return embedded content with XML tags\n const text = asString(segment.text);\n if (text && filePath) {\n // Use formatFileContents for consistent XML formatting\n return formatFileContents([{ content: text.trim(), isFile: true, displayPath: filePath }]);\n }\n }\n\n return undefined;\n}\n\n/**\n * Check if processed segments contain visible content (text or file attachments).\n */\nexport function hasVisibleContent(segments: readonly JsonObject[]): boolean {\n return segments.some((segment) => {\n const type = asString(segment.type);\n\n if (type === 'text') {\n const value = asString(segment.value);\n return value !== undefined && value.trim().length > 0;\n }\n\n if (type === 'guideline_ref') {\n return false;\n }\n\n if (type === 'file') {\n const text = asString(segment.text);\n return text !== undefined && text.trim().length > 0;\n }\n\n return false;\n });\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport micromatch from 'micromatch';\nimport { parse } from 'yaml';\n\nimport type { JsonObject, JsonValue } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport { buildDirectoryChain, fileExists } from './file-resolver.js';\n\nconst SCHEMA_CONFIG_V2 = 'agentv-config-v2';\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\nexport type AgentVConfig = {\n readonly $schema?: JsonValue;\n readonly guideline_patterns?: readonly string[];\n};\n\n/**\n * Load optional .agentv/config.yaml configuration file.\n * Searches from eval file directory up to repo root.\n */\nexport async function loadConfig(\n evalFilePath: string,\n repoRoot: string,\n): Promise<AgentVConfig | null> {\n const directories = buildDirectoryChain(evalFilePath, repoRoot);\n\n for (const directory of directories) {\n const configPath = path.join(directory, '.agentv', 'config.yaml');\n\n if (!(await fileExists(configPath))) {\n continue;\n }\n\n try {\n const rawConfig = await readFile(configPath, 'utf8');\n const parsed = parse(rawConfig) as unknown;\n\n if (!isJsonObject(parsed)) {\n logWarning(`Invalid .agentv/config.yaml format at ${configPath}`);\n continue;\n }\n\n const config = parsed as AgentVConfig;\n\n // Check $schema field to ensure V2 format\n const schema = config.$schema;\n\n if (schema !== SCHEMA_CONFIG_V2) {\n const message =\n typeof schema === 'string'\n ? `Invalid $schema value '${schema}' in ${configPath}. Expected '${SCHEMA_CONFIG_V2}'`\n : `Missing required field '$schema' in ${configPath}.\\nPlease add '$schema: ${SCHEMA_CONFIG_V2}' at the top of the file.`;\n logWarning(message);\n continue;\n }\n\n const guidelinePatterns = config.guideline_patterns;\n if (guidelinePatterns !== undefined && !Array.isArray(guidelinePatterns)) {\n logWarning(`Invalid guideline_patterns in ${configPath}, expected array`);\n continue;\n }\n\n if (\n Array.isArray(guidelinePatterns) &&\n !guidelinePatterns.every((p) => typeof p === 'string')\n ) {\n logWarning(`Invalid guideline_patterns in ${configPath}, all entries must be strings`);\n continue;\n }\n\n return {\n guideline_patterns: guidelinePatterns as readonly string[] | undefined,\n };\n } catch (error) {\n logWarning(\n `Could not read .agentv/config.yaml at ${configPath}: ${(error as Error).message}`,\n );\n }\n }\n\n return null;\n}\n\n/**\n * Determine whether a path references guideline content (instructions or prompts).\n */\nexport function isGuidelineFile(filePath: string, patterns?: readonly string[]): boolean {\n const normalized = filePath.split('\\\\').join('/');\n const patternsToUse = patterns ?? [];\n\n return micromatch.isMatch(normalized, patternsToUse as string[]);\n}\n\n/**\n * Extract target name from parsed eval suite (checks execution.target then falls back to root-level target).\n */\nexport function extractTargetFromSuite(suite: JsonObject): string | undefined {\n // Check execution.target first (new location), fallback to root-level target (legacy)\n const execution = suite.execution;\n if (execution && typeof execution === 'object' && !Array.isArray(execution)) {\n const executionTarget = (execution as Record<string, unknown>).target;\n if (typeof executionTarget === 'string' && executionTarget.trim().length > 0) {\n return executionTarget.trim();\n }\n }\n\n // Fallback to legacy root-level target\n const targetValue = suite.target;\n if (typeof targetValue === 'string' && targetValue.trim().length > 0) {\n return targetValue.trim();\n }\n\n return undefined;\n}\n\nfunction logWarning(message: string): void {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n}\n","import { constants } from 'node:fs';\nimport { access } from 'node:fs/promises';\nimport path from 'node:path';\n\n/**\n * Check if a file exists on disk.\n */\nexport async function fileExists(absolutePath: string): Promise<boolean> {\n try {\n await access(absolutePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Convert URL or string to absolute file path.\n */\nexport function resolveToAbsolutePath(candidate: URL | string): string {\n if (candidate instanceof URL) {\n return new URL(candidate).pathname;\n }\n if (typeof candidate === 'string') {\n if (candidate.startsWith('file://')) {\n return new URL(candidate).pathname;\n }\n return path.resolve(candidate);\n }\n throw new TypeError('Unsupported repoRoot value. Expected string or URL.');\n}\n\n/**\n * Build a chain of directories walking from a file's location up to repo root.\n * Used for discovering configuration files.\n */\nexport function buildDirectoryChain(filePath: string, repoRoot: string): readonly string[] {\n const directories: string[] = [];\n const seen = new Set<string>();\n const boundary = path.resolve(repoRoot);\n let current: string | undefined = path.resolve(path.dirname(filePath));\n\n while (current !== undefined) {\n if (!seen.has(current)) {\n directories.push(current);\n seen.add(current);\n }\n if (current === boundary) {\n break;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n if (!seen.has(boundary)) {\n directories.push(boundary);\n }\n\n return directories;\n}\n\n/**\n * Build search roots for file resolution.\n * Searches from eval file directory up to repo root.\n */\nexport function buildSearchRoots(evalPath: string, repoRoot: string): readonly string[] {\n const uniqueRoots: string[] = [];\n const addRoot = (root: string): void => {\n const normalized = path.resolve(root);\n if (!uniqueRoots.includes(normalized)) {\n uniqueRoots.push(normalized);\n }\n };\n\n let currentDir = path.dirname(evalPath);\n let reachedBoundary = false;\n while (!reachedBoundary) {\n addRoot(currentDir);\n const parentDir = path.dirname(currentDir);\n if (currentDir === repoRoot || parentDir === currentDir) {\n reachedBoundary = true;\n } else {\n currentDir = parentDir;\n }\n }\n\n addRoot(repoRoot);\n addRoot(process.cwd());\n return uniqueRoots;\n}\n\n/**\n * Trim leading path separators for display.\n */\nfunction trimLeadingSeparators(value: string): string {\n const trimmed = value.replace(/^[/\\\\]+/, '');\n return trimmed.length > 0 ? trimmed : value;\n}\n\n/**\n * Resolve a file reference using search roots.\n */\nexport async function resolveFileReference(\n rawValue: string,\n searchRoots: readonly string[],\n): Promise<{\n readonly displayPath: string;\n readonly resolvedPath?: string;\n readonly attempted: readonly string[];\n}> {\n const displayPath = trimLeadingSeparators(rawValue);\n const potentialPaths: string[] = [];\n\n if (path.isAbsolute(rawValue)) {\n potentialPaths.push(path.normalize(rawValue));\n }\n\n for (const base of searchRoots) {\n potentialPaths.push(path.resolve(base, displayPath));\n }\n\n const attempted: string[] = [];\n const seen = new Set<string>();\n for (const candidate of potentialPaths) {\n const absoluteCandidate = path.resolve(candidate);\n if (seen.has(absoluteCandidate)) {\n continue;\n }\n seen.add(absoluteCandidate);\n attempted.push(absoluteCandidate);\n if (await fileExists(absoluteCandidate)) {\n return { displayPath, resolvedPath: absoluteCandidate, attempted };\n }\n }\n\n return { displayPath, attempted };\n}\n","import path from 'node:path';\n\nimport type { ToolTrajectoryEvaluatorConfig, ToolTrajectoryExpectedItem } from '../trace.js';\nimport type { EvaluatorConfig, EvaluatorKind, JsonObject, JsonValue } from '../types.js';\nimport { isEvaluatorKind } from '../types.js';\nimport { validateCustomPromptContent } from '../validation/prompt-validator.js';\nimport { resolveFileReference } from './file-resolver.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Parse evaluators from eval case configuration.\n */\nexport async function parseEvaluators(\n rawEvalCase: JsonObject & {\n readonly execution?: JsonValue;\n readonly evaluators?: JsonValue;\n },\n globalExecution: JsonObject | undefined,\n searchRoots: readonly string[],\n evalId: string,\n): Promise<readonly EvaluatorConfig[] | undefined> {\n const execution = rawEvalCase.execution;\n // Priority: case-level execution.evaluators > case-level evaluators > global execution.evaluators\n const candidateEvaluators = isJsonObject(execution)\n ? (execution.evaluators ?? rawEvalCase.evaluators)\n : (rawEvalCase.evaluators ?? globalExecution?.evaluators);\n if (candidateEvaluators === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(candidateEvaluators)) {\n logWarning(`Skipping evaluators for '${evalId}': expected array`);\n return undefined;\n }\n\n const evaluators: EvaluatorConfig[] = [];\n\n for (const rawEvaluator of candidateEvaluators) {\n if (!isJsonObject(rawEvaluator)) {\n logWarning(`Skipping invalid evaluator entry for '${evalId}' (expected object)`);\n continue;\n }\n\n const name = asString(rawEvaluator.name);\n const typeValue = rawEvaluator.type;\n\n if (!name || !isEvaluatorKind(typeValue)) {\n logWarning(`Skipping evaluator with invalid name/type in '${evalId}'`);\n continue;\n }\n\n if (typeValue === 'code_judge') {\n let script: string[] | undefined;\n const rawScript = rawEvaluator.script;\n\n if (typeof rawScript === 'string') {\n const trimmed = rawScript.trim();\n if (trimmed.length === 0) {\n throw new Error(\n `Invalid code_judge script for evaluator '${name}' in '${evalId}': script cannot be empty`,\n );\n }\n script = parseCommandToArgv(trimmed);\n } else {\n script = asStringArray(\n rawScript,\n `code_judge script for evaluator '${name}' in '${evalId}'`,\n );\n }\n\n if (!script) {\n logWarning(`Skipping code_judge evaluator '${name}' in '${evalId}': missing script`);\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n const cwd = asString(rawEvaluator.cwd);\n let resolvedCwd: string | undefined;\n\n if (cwd) {\n const resolved = await resolveFileReference(cwd, searchRoots);\n if (resolved.resolvedPath) {\n resolvedCwd = path.resolve(resolved.resolvedPath);\n } else {\n logWarning(\n `Code_judge evaluator '${name}' in '${evalId}': cwd not found (${resolved.displayPath})`,\n resolved.attempted.length > 0\n ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`)\n : undefined,\n );\n }\n } else {\n resolvedCwd = searchRoots[0];\n }\n\n // Collect unrecognized properties as pass-through config\n const knownProps = new Set(['name', 'type', 'script', 'cwd', 'weight']);\n const config: Record<string, JsonValue> = {};\n for (const [key, value] of Object.entries(rawEvaluator)) {\n if (!knownProps.has(key) && value !== undefined) {\n config[key] = value as JsonValue;\n }\n }\n\n evaluators.push({\n name,\n type: 'code',\n script,\n cwd,\n resolvedCwd,\n ...(weight !== undefined ? { weight } : {}),\n ...(Object.keys(config).length > 0 ? { config } : {}),\n });\n continue;\n }\n\n if (typeValue === 'composite') {\n const rawMembers = rawEvaluator.evaluators;\n if (!Array.isArray(rawMembers)) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': missing evaluators array`,\n );\n continue;\n }\n\n const rawAggregator = rawEvaluator.aggregator;\n if (!isJsonObject(rawAggregator)) {\n logWarning(`Skipping composite evaluator '${name}' in '${evalId}': missing aggregator`);\n continue;\n }\n\n const aggregatorType = asString(rawAggregator.type);\n if (\n aggregatorType !== 'weighted_average' &&\n aggregatorType !== 'code_judge' &&\n aggregatorType !== 'llm_judge'\n ) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': invalid aggregator type '${aggregatorType}'`,\n );\n continue;\n }\n\n // Recursively parse member evaluators\n const memberEvaluators: EvaluatorConfig[] = [];\n for (const rawMember of rawMembers) {\n if (!isJsonObject(rawMember)) {\n logWarning(`Skipping invalid member evaluator in composite '${name}' (expected object)`);\n continue;\n }\n\n const memberName = asString(rawMember.name);\n const memberType = rawMember.type;\n\n if (!memberName || !isEvaluatorKind(memberType)) {\n logWarning(`Skipping member evaluator with invalid name/type in composite '${name}'`);\n continue;\n }\n\n // Parse member evaluator (reuse existing logic for code, llm_judge, code_judge)\n const memberConfigs = await parseEvaluators(\n { evaluators: [rawMember] },\n undefined,\n searchRoots,\n `${evalId}:${name}:${memberName}`,\n );\n\n if (memberConfigs && memberConfigs.length > 0) {\n memberEvaluators.push(memberConfigs[0]);\n }\n }\n\n if (memberEvaluators.length === 0) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': no valid member evaluators`,\n );\n continue;\n }\n\n // Parse aggregator config\n let aggregator: import('../types.js').CompositeAggregatorConfig;\n\n if (aggregatorType === 'weighted_average') {\n const weights = isJsonObject(rawAggregator.weights)\n ? (rawAggregator.weights as Record<string, unknown>)\n : undefined;\n const parsedWeights: Record<string, number> = {};\n if (weights) {\n for (const [key, value] of Object.entries(weights)) {\n if (typeof value === 'number') {\n parsedWeights[key] = value;\n }\n }\n }\n aggregator = {\n type: 'weighted_average',\n ...(Object.keys(parsedWeights).length > 0 ? { weights: parsedWeights } : {}),\n };\n } else if (aggregatorType === 'code_judge') {\n const aggregatorPath = asString(rawAggregator.path);\n if (!aggregatorPath) {\n logWarning(\n `Skipping composite evaluator '${name}' in '${evalId}': code_judge aggregator missing path`,\n );\n continue;\n }\n\n // Set cwd to eval file directory (first search root)\n // Paths are resolved relative to this directory\n aggregator = {\n type: 'code_judge',\n path: aggregatorPath,\n cwd: searchRoots[0],\n };\n } else {\n // llm_judge aggregator\n const aggregatorPrompt = asString(rawAggregator.prompt);\n let promptPath: string | undefined;\n\n if (aggregatorPrompt) {\n const resolved = await resolveFileReference(aggregatorPrompt, searchRoots);\n if (resolved.resolvedPath) {\n promptPath = path.resolve(resolved.resolvedPath);\n }\n }\n\n aggregator = {\n type: 'llm_judge',\n ...(aggregatorPrompt ? { prompt: aggregatorPrompt } : {}),\n ...(promptPath ? { promptPath } : {}),\n };\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n evaluators.push({\n name,\n type: 'composite',\n evaluators: memberEvaluators,\n aggregator,\n ...(weight !== undefined ? { weight } : {}),\n });\n continue;\n }\n\n if (typeValue === 'tool_trajectory') {\n const mode = asString(rawEvaluator.mode);\n if (mode !== 'any_order' && mode !== 'in_order' && mode !== 'exact') {\n logWarning(\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': invalid mode '${mode}' (must be any_order, in_order, or exact)`,\n );\n continue;\n }\n\n const rawMinimums = rawEvaluator.minimums;\n let minimums: Record<string, number> | undefined;\n if (rawMinimums !== undefined) {\n if (!isJsonObject(rawMinimums)) {\n logWarning(\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': minimums must be an object`,\n );\n continue;\n }\n minimums = {};\n for (const [toolName, count] of Object.entries(rawMinimums)) {\n if (typeof count === 'number' && count >= 0) {\n minimums[toolName] = count;\n }\n }\n }\n\n const rawExpected = rawEvaluator.expected;\n let expected: ToolTrajectoryExpectedItem[] | undefined;\n if (rawExpected !== undefined) {\n if (!Array.isArray(rawExpected)) {\n logWarning(\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': expected must be an array`,\n );\n continue;\n }\n expected = [];\n for (const item of rawExpected) {\n if (isJsonObject(item) && typeof item.tool === 'string') {\n // Parse optional args field: 'any' or Record<string, unknown>\n let args: ToolTrajectoryExpectedItem['args'];\n if (item.args === 'any') {\n args = 'any';\n } else if (isJsonObject(item.args)) {\n args = item.args as Record<string, unknown>;\n }\n expected.push({ tool: item.tool, ...(args !== undefined ? { args } : {}) });\n }\n }\n }\n\n // Validate config completeness based on mode\n if (mode === 'any_order' && !minimums) {\n logWarning(\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': any_order mode requires minimums`,\n );\n continue;\n }\n\n if ((mode === 'in_order' || mode === 'exact') && !expected) {\n logWarning(\n `Skipping tool_trajectory evaluator '${name}' in '${evalId}': ${mode} mode requires expected`,\n );\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n const config: ToolTrajectoryEvaluatorConfig = {\n name,\n type: 'tool_trajectory',\n mode,\n ...(minimums ? { minimums } : {}),\n ...(expected ? { expected } : {}),\n ...(weight !== undefined ? { weight } : {}),\n };\n\n evaluators.push(config);\n continue;\n }\n\n if (typeValue === 'field_accuracy') {\n const rawFields = rawEvaluator.fields;\n if (!Array.isArray(rawFields)) {\n logWarning(\n `Skipping field_accuracy evaluator '${name}' in '${evalId}': missing fields array`,\n );\n continue;\n }\n\n if (rawFields.length === 0) {\n logWarning(\n `Skipping field_accuracy evaluator '${name}' in '${evalId}': fields array is empty`,\n );\n continue;\n }\n\n const fields: import('../types.js').FieldConfig[] = [];\n for (const rawField of rawFields) {\n if (!isJsonObject(rawField)) {\n logWarning(\n `Skipping invalid field entry in field_accuracy evaluator '${name}' (expected object)`,\n );\n continue;\n }\n\n const fieldPath = asString(rawField.path);\n const match = asString(rawField.match);\n\n if (!fieldPath) {\n logWarning(\n `Skipping field without path in field_accuracy evaluator '${name}' in '${evalId}'`,\n );\n continue;\n }\n\n if (!match || !isValidFieldMatchType(match)) {\n logWarning(\n `Skipping field '${fieldPath}' with invalid match type '${match}' in evaluator '${name}' (must be exact, numeric_tolerance, or date). For fuzzy matching, use a code_judge evaluator.`,\n );\n continue;\n }\n\n const fieldConfig: import('../types.js').FieldConfig = {\n path: fieldPath,\n match,\n ...(typeof rawField.required === 'boolean' ? { required: rawField.required } : {}),\n ...(typeof rawField.weight === 'number' ? { weight: rawField.weight } : {}),\n ...(typeof rawField.tolerance === 'number' ? { tolerance: rawField.tolerance } : {}),\n ...(typeof rawField.relative === 'boolean' ? { relative: rawField.relative } : {}),\n ...(Array.isArray(rawField.formats)\n ? { formats: rawField.formats.filter((f): f is string => typeof f === 'string') }\n : {}),\n };\n\n fields.push(fieldConfig);\n }\n\n if (fields.length === 0) {\n logWarning(\n `Skipping field_accuracy evaluator '${name}' in '${evalId}': no valid fields found`,\n );\n continue;\n }\n\n const aggregation = asString(rawEvaluator.aggregation);\n const validAggregation = isValidFieldAggregationType(aggregation) ? aggregation : undefined;\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n evaluators.push({\n name,\n type: 'field_accuracy',\n fields,\n ...(validAggregation ? { aggregation: validAggregation } : {}),\n ...(weight !== undefined ? { weight } : {}),\n });\n continue;\n }\n\n if (typeValue === 'latency') {\n const threshold = rawEvaluator.threshold;\n if (typeof threshold !== 'number' || threshold < 0) {\n logWarning(\n `Skipping latency evaluator '${name}' in '${evalId}': threshold must be a non-negative number`,\n );\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n evaluators.push({\n name,\n type: 'latency',\n threshold,\n ...(weight !== undefined ? { weight } : {}),\n });\n continue;\n }\n\n if (typeValue === 'cost') {\n const budget = rawEvaluator.budget;\n if (typeof budget !== 'number' || budget < 0) {\n logWarning(\n `Skipping cost evaluator '${name}' in '${evalId}': budget must be a non-negative number`,\n );\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n evaluators.push({\n name,\n type: 'cost',\n budget,\n ...(weight !== undefined ? { weight } : {}),\n });\n continue;\n }\n\n if (typeValue === 'token_usage') {\n const maxTotal = rawEvaluator.max_total ?? rawEvaluator.maxTotal;\n const maxInput = rawEvaluator.max_input ?? rawEvaluator.maxInput;\n const maxOutput = rawEvaluator.max_output ?? rawEvaluator.maxOutput;\n\n const limits = [\n ['max_total', maxTotal],\n ['max_input', maxInput],\n ['max_output', maxOutput],\n ] as const;\n\n const validLimits: Partial<Record<'max_total' | 'max_input' | 'max_output', number>> = {};\n\n for (const [key, raw] of limits) {\n if (raw === undefined) continue;\n if (typeof raw !== 'number' || !Number.isFinite(raw) || raw < 0) {\n logWarning(\n `Skipping token_usage evaluator '${name}' in '${evalId}': ${key} must be a non-negative finite number`,\n );\n continue;\n }\n validLimits[key] = raw;\n }\n\n if (\n validLimits.max_total === undefined &&\n validLimits.max_input === undefined &&\n validLimits.max_output === undefined\n ) {\n logWarning(\n `Skipping token_usage evaluator '${name}' in '${evalId}': must set at least one of max_total, max_input, max_output`,\n );\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n evaluators.push({\n name,\n type: 'token_usage',\n ...validLimits,\n ...(weight !== undefined ? { weight } : {}),\n });\n continue;\n }\n\n const prompt = asString(rawEvaluator.prompt);\n let promptPath: string | undefined;\n if (prompt) {\n const resolved = await resolveFileReference(prompt, searchRoots);\n if (resolved.resolvedPath) {\n promptPath = path.resolve(resolved.resolvedPath);\n // Validate custom prompt content upfront - throws error if validation fails\n try {\n await validateCustomPromptContent(promptPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n // Add context and re-throw for the caller to handle\n throw new Error(`Evaluator '${name}' template (${promptPath}): ${message}`);\n }\n } else {\n logWarning(\n `Inline prompt used for evaluator '${name}' in '${evalId}' (file not found: ${resolved.displayPath})`,\n resolved.attempted.length > 0\n ? resolved.attempted.map((attempt) => ` Tried: ${attempt}`)\n : undefined,\n );\n }\n }\n\n const _model = asString(rawEvaluator.model);\n\n const rawRubrics = rawEvaluator.rubrics;\n const parsedRubrics = Array.isArray(rawRubrics)\n ? rawRubrics\n .filter((r): r is JsonObject => isJsonObject(r))\n .map((rubric, index) => ({\n id: asString(rubric.id) ?? `rubric-${index + 1}`,\n description: asString(rubric.description) ?? '',\n weight: typeof rubric.weight === 'number' ? rubric.weight : 1.0,\n required: typeof rubric.required === 'boolean' ? rubric.required : true,\n }))\n .filter((r) => r.description.length > 0)\n : undefined;\n\n if (typeValue === 'rubric') {\n if (!parsedRubrics) {\n logWarning(`Skipping rubric evaluator '${name}' in '${evalId}': missing rubrics array`);\n continue;\n }\n if (parsedRubrics.length === 0) {\n logWarning(`Skipping rubric evaluator '${name}' in '${evalId}': no valid rubrics found`);\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n // Back-compat: `type: rubric` maps to `type: llm_judge` with `rubrics`.\n evaluators.push({\n name,\n type: 'llm_judge',\n rubrics: parsedRubrics,\n ...(weight !== undefined ? { weight } : {}),\n });\n continue;\n }\n\n const weight = validateWeight(rawEvaluator.weight, name, evalId);\n\n evaluators.push({\n name,\n type: 'llm_judge',\n prompt,\n promptPath,\n ...(parsedRubrics && parsedRubrics.length > 0 ? { rubrics: parsedRubrics } : {}),\n ...(weight !== undefined ? { weight } : {}),\n });\n }\n\n return evaluators.length > 0 ? evaluators : undefined;\n}\n\n/**\n * Coerce evaluator value to valid EvaluatorKind.\n */\nexport function coerceEvaluator(\n candidate: JsonValue | undefined,\n contextId: string,\n): EvaluatorKind | undefined {\n if (typeof candidate !== 'string') {\n return undefined;\n }\n if (isEvaluatorKind(candidate)) {\n return candidate;\n }\n logWarning(`Unknown evaluator '${candidate}' in ${contextId}, falling back to default`);\n return undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction asStringArray(value: unknown, description: string): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n throw new Error(`${description} must be an array of strings (argv tokens)`);\n }\n\n if (value.length === 0) {\n throw new Error(`${description} cannot be empty`);\n }\n\n const result: string[] = [];\n for (const [index, entry] of value.entries()) {\n if (typeof entry !== 'string') {\n throw new Error(`${description}[${index}] must be a string`);\n }\n if (entry.trim().length === 0) {\n throw new Error(`${description}[${index}] cannot be empty`);\n }\n result.push(entry);\n }\n\n return result;\n}\n\nfunction parseCommandToArgv(command: string): string[] {\n if (process.platform === 'win32') {\n return ['cmd.exe', '/c', command];\n }\n return ['sh', '-lc', command];\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\n/**\n * Validate and extract weight from evaluator config.\n * Throws if weight is invalid (negative, NaN, or Infinity).\n * Returns undefined if weight is not specified.\n */\nfunction validateWeight(\n rawWeight: unknown,\n evaluatorName: string,\n evalId: string,\n): number | undefined {\n if (rawWeight === undefined) {\n return undefined;\n }\n\n if (typeof rawWeight !== 'number') {\n throw new Error(\n `Invalid weight for evaluator '${evaluatorName}' in '${evalId}': must be a number`,\n );\n }\n\n if (!Number.isFinite(rawWeight)) {\n throw new Error(\n `Invalid weight for evaluator '${evaluatorName}' in '${evalId}': must be finite (got ${rawWeight})`,\n );\n }\n\n if (rawWeight < 0) {\n throw new Error(\n `Invalid weight for evaluator '${evaluatorName}' in '${evalId}': must be non-negative (got ${rawWeight})`,\n );\n }\n\n return rawWeight;\n}\n\nconst VALID_FIELD_MATCH_TYPES = new Set(['exact', 'numeric_tolerance', 'date']);\n\nfunction isValidFieldMatchType(value: unknown): value is import('../types.js').FieldMatchType {\n return typeof value === 'string' && VALID_FIELD_MATCH_TYPES.has(value);\n}\n\nconst VALID_FIELD_AGGREGATION_TYPES = new Set(['weighted_average', 'all_or_nothing']);\n\nfunction isValidFieldAggregationType(\n value: unknown,\n): value is import('../types.js').FieldAggregationType {\n return typeof value === 'string' && VALID_FIELD_AGGREGATION_TYPES.has(value);\n}\n","import { readFile } from 'node:fs/promises';\n\nimport { TEMPLATE_VARIABLES, VALID_TEMPLATE_VARIABLES } from '../template-variables.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Validate custom prompt template content from a file.\n * Reads the file and checks for valid template variables.\n * Throws an error if required template variables are missing.\n */\nexport async function validateCustomPromptContent(promptPath: string): Promise<void> {\n const content = await readFile(promptPath, 'utf8');\n validateTemplateVariables(content, promptPath);\n}\n\n/**\n * Validate template variables in a custom prompt template string.\n * Exported for testing purposes.\n * @throws Error if required template variables are missing\n */\nexport function validateTemplateVariables(content: string, source: string): void {\n // Extract all template variables from content\n const variablePattern = /\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g;\n const foundVariables = new Set<string>();\n const invalidVariables: string[] = [];\n\n let match: RegExpExecArray | null = variablePattern.exec(content);\n while (match !== null) {\n const varName = match[1];\n foundVariables.add(varName);\n if (!VALID_TEMPLATE_VARIABLES.has(varName)) {\n invalidVariables.push(varName);\n }\n match = variablePattern.exec(content);\n }\n\n // Check if template contains required variables for evaluation\n const hasCandidateAnswer = foundVariables.has(TEMPLATE_VARIABLES.CANDIDATE_ANSWER);\n const hasExpectedMessages = foundVariables.has(TEMPLATE_VARIABLES.EXPECTED_MESSAGES);\n const hasRequiredFields = hasCandidateAnswer || hasExpectedMessages;\n\n // ERROR: Missing required fields - throw error to skip this evaluator/eval case\n if (!hasRequiredFields) {\n throw new Error(\n `Missing required fields. Must include at least one of:\\n - {{ ${TEMPLATE_VARIABLES.CANDIDATE_ANSWER} }}\\n - {{ ${TEMPLATE_VARIABLES.EXPECTED_MESSAGES} }}`,\n );\n }\n\n // WARNING: Invalid variables - show warning but continue\n if (invalidVariables.length > 0) {\n const warningMessage = `${ANSI_YELLOW}Warning: Custom evaluator template at ${source}\n Contains invalid variables: ${invalidVariables.map((v) => `{{ ${v} }}`).join(', ')}\n Valid variables: ${Array.from(VALID_TEMPLATE_VARIABLES)\n .map((v) => `{{ ${v} }}`)\n .join(', ')}${ANSI_RESET}`;\n\n console.warn(warningMessage);\n }\n}\n","/**\n * Template variable constants for evaluator prompts.\n * These variables can be used in custom evaluator templates with {{ variable_name }} syntax.\n */\nexport const TEMPLATE_VARIABLES = {\n CANDIDATE_ANSWER: 'candidate_answer',\n EXPECTED_MESSAGES: 'expected_messages',\n QUESTION: 'question',\n EXPECTED_OUTCOME: 'expected_outcome',\n REFERENCE_ANSWER: 'reference_answer',\n INPUT_MESSAGES: 'input_messages',\n OUTPUT_MESSAGES: 'output_messages',\n} as const;\n\n/**\n * Type representing all valid template variable names.\n */\nexport type TemplateVariable = (typeof TEMPLATE_VARIABLES)[keyof typeof TEMPLATE_VARIABLES];\n\n/**\n * Set of all valid template variable names for runtime validation.\n */\nexport const VALID_TEMPLATE_VARIABLES = new Set<string>(Object.values(TEMPLATE_VARIABLES));\n\n/**\n * Template variables that are required for meaningful evaluation.\n * At least one of these should be present in a custom evaluator template.\n */\nexport const REQUIRED_TEMPLATE_VARIABLES = new Set<string>([\n TEMPLATE_VARIABLES.CANDIDATE_ANSWER,\n TEMPLATE_VARIABLES.EXPECTED_MESSAGES,\n]);\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { formatFileContents } from '../formatting/segment-formatter.js';\nimport type { JsonObject, TestMessage } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport { isGuidelineFile } from './config-loader.js';\nimport { resolveFileReference } from './file-resolver.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\ntype ProcessMessagesOptions = {\n readonly messages: readonly TestMessage[];\n readonly searchRoots: readonly string[];\n readonly repoRootPath: string;\n readonly guidelinePatterns?: readonly string[];\n readonly guidelinePaths?: string[];\n readonly textParts?: string[];\n readonly messageType: 'input' | 'output';\n readonly verbose: boolean;\n};\n\n/**\n * Process message content into structured segments with file resolution.\n */\nexport async function processMessages(options: ProcessMessagesOptions): Promise<JsonObject[]> {\n const {\n messages,\n searchRoots,\n repoRootPath,\n guidelinePatterns,\n guidelinePaths,\n textParts,\n messageType,\n verbose,\n } = options;\n\n const segments: JsonObject[] = [];\n\n for (const message of messages) {\n const content = message.content;\n if (typeof content === 'string') {\n segments.push({ type: 'text', value: content });\n if (textParts) {\n textParts.push(content);\n }\n continue;\n }\n\n // Structured object content (real-world style payloads). Treat as a single text segment.\n // This keeps prompt building deterministic while preserving the full payload for code evaluators\n // via evalCase.input_messages.\n if (isJsonObject(content)) {\n const rendered = JSON.stringify(content, null, 2);\n segments.push({ type: 'text', value: rendered });\n if (textParts) {\n textParts.push(rendered);\n }\n continue;\n }\n\n if (!Array.isArray(content)) {\n continue;\n }\n\n for (const rawSegment of content) {\n if (!isJsonObject(rawSegment)) {\n continue;\n }\n\n const segmentType = asString(rawSegment.type);\n if (segmentType === 'file') {\n const rawValue = asString(rawSegment.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n const context = messageType === 'input' ? '' : ' in expected_messages';\n logWarning(`File not found${context}: ${displayPath}`, attempts);\n continue;\n }\n\n try {\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n');\n\n // Only check for guidelines in input messages\n if (messageType === 'input' && guidelinePatterns && guidelinePaths) {\n const relativeToRepo = path.relative(repoRootPath, resolvedPath);\n\n if (isGuidelineFile(relativeToRepo, guidelinePatterns)) {\n guidelinePaths.push(path.resolve(resolvedPath));\n if (verbose) {\n console.log(` [Guideline] Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n continue;\n }\n }\n\n segments.push({\n type: 'file',\n path: displayPath,\n text: fileContent,\n resolvedPath: path.resolve(resolvedPath),\n });\n\n if (verbose) {\n const label = messageType === 'input' ? '[File]' : '[Expected Output File]';\n console.log(` ${label} Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n } catch (error) {\n const context = messageType === 'input' ? '' : ' expected output';\n logWarning(`Could not read${context} file ${resolvedPath}: ${(error as Error).message}`);\n }\n continue;\n }\n\n const clonedSegment = cloneJsonObject(rawSegment);\n segments.push(clonedSegment);\n const inlineValue = clonedSegment.value;\n if (typeof inlineValue === 'string' && textParts) {\n textParts.push(inlineValue);\n }\n }\n }\n\n return segments;\n}\n\n/**\n * Resolve assistant content including file references.\n * Similar to input message processing, but for expected assistant responses.\n */\nexport async function resolveAssistantContent(\n content: TestMessage['content'] | undefined,\n searchRoots: readonly string[],\n verbose: boolean,\n): Promise<string> {\n if (typeof content === 'string') {\n return content;\n }\n if (!content) {\n return '';\n }\n // Handle structured content object (e.g., { recommendation: ..., summary: ... })\n if (!Array.isArray(content)) {\n return JSON.stringify(content, null, 2);\n }\n\n // Track parts with metadata about whether they came from files\n const parts: Array<{ content: string; isFile: boolean; displayPath?: string }> = [];\n\n for (const entry of content) {\n if (typeof entry === 'string') {\n parts.push({ content: entry, isFile: false });\n continue;\n }\n\n if (!isJsonObject(entry)) {\n continue;\n }\n\n const segmentType = asString(entry.type);\n\n // Handle file references\n if (segmentType === 'file') {\n const rawValue = asString(entry.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n logWarning(`File not found in expected_messages: ${displayPath}`, attempts);\n continue;\n }\n\n try {\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n').trim();\n parts.push({ content: fileContent, isFile: true, displayPath });\n if (verbose) {\n console.log(` [Expected Assistant File] Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n } catch (error) {\n logWarning(`Could not read file ${resolvedPath}: ${(error as Error).message}`);\n }\n continue;\n }\n\n // Handle text segments\n const textValue = asString(entry.text);\n if (typeof textValue === 'string') {\n parts.push({ content: textValue, isFile: false });\n continue;\n }\n\n const valueValue = asString(entry.value);\n if (typeof valueValue === 'string') {\n parts.push({ content: valueValue, isFile: false });\n continue;\n }\n\n parts.push({ content: JSON.stringify(entry), isFile: false });\n }\n\n return formatFileContents(parts);\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction cloneJsonObject(source: JsonObject): JsonObject {\n const entries = Object.entries(source).map(([key, value]) => [key, cloneJsonValue(value)]);\n return Object.fromEntries(entries) as JsonObject;\n}\n\nfunction cloneJsonValue(value: unknown): unknown {\n if (value === null) {\n return null;\n }\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => cloneJsonValue(item));\n }\n if (typeof value === 'object') {\n return cloneJsonObject(value as JsonObject);\n }\n return value;\n}\n\nfunction logWarning(message: string, details?: readonly string[]): void {\n if (details && details.length > 0) {\n const detailBlock = details.join('\\n');\n console.warn(`${ANSI_YELLOW}Warning: ${message}\\n${detailBlock}${ANSI_RESET}`);\n } else {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n }\n}\n\ntype ProcessExpectedMessagesOptions = {\n readonly messages: readonly TestMessage[];\n readonly searchRoots: readonly string[];\n readonly repoRootPath: string;\n readonly verbose: boolean;\n};\n\n/**\n * Extended message type for expected_messages that may include tool_calls.\n */\ntype ExtendedTestMessage = TestMessage & {\n readonly name?: string;\n readonly tool_calls?: readonly JsonObject[];\n};\n\n/**\n * Process expected_messages preserving full message structure including role and tool_calls.\n * Resolves file references and processes content.\n */\nexport async function processExpectedMessages(\n options: ProcessExpectedMessagesOptions,\n): Promise<JsonObject[]> {\n const { messages, searchRoots, verbose } = options;\n const segments: JsonObject[] = [];\n\n for (const message of messages) {\n const extendedMessage = message as ExtendedTestMessage;\n const segment: Record<string, unknown> = {\n role: message.role,\n };\n\n // Preserve optional name field\n if (extendedMessage.name) {\n segment.name = extendedMessage.name;\n }\n\n // Process content\n const content = message.content;\n if (typeof content === 'string') {\n segment.content = content;\n } else if (Array.isArray(content)) {\n // Process content array, resolving file references\n const processedContent: JsonObject[] = [];\n for (const rawSegment of content) {\n if (!isJsonObject(rawSegment)) {\n continue;\n }\n\n const segmentType = asString(rawSegment.type);\n if (segmentType === 'file') {\n const rawValue = asString(rawSegment.value);\n if (!rawValue) {\n continue;\n }\n\n const { displayPath, resolvedPath, attempted } = await resolveFileReference(\n rawValue,\n searchRoots,\n );\n\n if (!resolvedPath) {\n const attempts = attempted.length\n ? [' Tried:', ...attempted.map((candidate) => ` ${candidate}`)]\n : undefined;\n logWarning(`File not found in expected_messages: ${displayPath}`, attempts);\n continue;\n }\n\n try {\n const fileContent = (await readFile(resolvedPath, 'utf8')).replace(/\\r\\n/g, '\\n');\n processedContent.push({\n type: 'file',\n path: displayPath,\n text: fileContent,\n resolvedPath: path.resolve(resolvedPath),\n });\n\n if (verbose) {\n console.log(` [Expected Output File] Found: ${displayPath}`);\n console.log(` Resolved to: ${resolvedPath}`);\n }\n } catch (error) {\n logWarning(\n `Could not read expected output file ${resolvedPath}: ${(error as Error).message}`,\n );\n }\n continue;\n }\n\n processedContent.push(cloneJsonObject(rawSegment));\n }\n segment.content = processedContent;\n } else if (isJsonObject(content)) {\n // Handle structured content object (e.g., { recommendation: ..., summary: ... })\n segment.content = cloneJsonObject(content);\n }\n\n // Preserve tool_calls if present\n if (extendedMessage.tool_calls && Array.isArray(extendedMessage.tool_calls)) {\n segment.tool_calls = extendedMessage.tool_calls.map((tc) =>\n isJsonObject(tc) ? cloneJsonObject(tc) : tc,\n );\n }\n\n segments.push(segment as JsonObject);\n }\n\n return segments;\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { isGuidelineFile } from '../loaders/config-loader.js';\nimport { fileExists } from '../loaders/file-resolver.js';\nimport type { ChatMessageRole, ChatPrompt } from '../providers/types.js';\nimport type { EvalCase, JsonObject, TestMessage } from '../types.js';\nimport { isJsonObject } from '../types.js';\nimport {\n type FormattingMode,\n formatFileContents,\n formatSegment,\n hasVisibleContent,\n} from './segment-formatter.js';\n\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Build prompt inputs by consolidating user request context and guideline content.\n */\nexport interface PromptInputs {\n readonly question: string;\n readonly guidelines: string;\n readonly chatPrompt?: ChatPrompt;\n readonly systemMessage?: string;\n}\n\n/**\n * Build prompt inputs by consolidating user request context and guideline content.\n *\n * @param testCase - The evaluation test case\n * @param mode - Formatting mode: 'agent' for file references, 'lm' for embedded content (default: 'lm')\n */\nexport async function buildPromptInputs(\n testCase: EvalCase,\n mode: FormattingMode = 'lm',\n): Promise<PromptInputs> {\n const guidelineParts: Array<{ content: string; isFile: boolean; displayPath?: string }> = [];\n for (const rawPath of testCase.guideline_paths) {\n const absolutePath = path.resolve(rawPath);\n if (!(await fileExists(absolutePath))) {\n logWarning(`Could not read guideline file ${absolutePath}: file does not exist`);\n continue;\n }\n\n try {\n const content = (await readFile(absolutePath, 'utf8')).replace(/\\r\\n/g, '\\n').trim();\n guidelineParts.push({\n content,\n isFile: true,\n displayPath: path.basename(absolutePath),\n });\n } catch (error) {\n logWarning(`Could not read guideline file ${absolutePath}: ${(error as Error).message}`);\n }\n }\n\n const guidelines = formatFileContents(guidelineParts);\n\n // Build segments per message to determine if role markers are needed\n const segmentsByMessage: JsonObject[][] = [];\n const fileContentsByPath = new Map<string, string>();\n for (const segment of testCase.input_segments) {\n if (\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n typeof segment.text === 'string'\n ) {\n fileContentsByPath.set(segment.path, segment.text);\n }\n }\n\n for (const message of testCase.input_messages) {\n const messageSegments: JsonObject[] = [];\n\n if (typeof message.content === 'string') {\n if (message.content.trim().length > 0) {\n messageSegments.push({ type: 'text', value: message.content });\n }\n } else if (Array.isArray(message.content)) {\n for (const segment of message.content) {\n if (typeof segment === 'string') {\n if (segment.trim().length > 0) {\n messageSegments.push({ type: 'text', value: segment });\n }\n } else if (isJsonObject(segment)) {\n const type = asString(segment.type);\n\n if (type === 'file') {\n const value = asString(segment.value);\n if (!value) continue;\n\n // Check if this is a guideline file (extracted separately)\n if (\n testCase.guideline_patterns &&\n isGuidelineFile(value, testCase.guideline_patterns)\n ) {\n // Reference marker only - actual content is in guidelines field\n messageSegments.push({ type: 'guideline_ref', path: value });\n continue;\n }\n\n // Find the file content from input_segments\n const fileText = fileContentsByPath.get(value);\n\n if (fileText !== undefined) {\n messageSegments.push({ type: 'file', text: fileText, path: value });\n }\n } else if (type === 'text') {\n const textValue = asString(segment.value);\n if (textValue && textValue.trim().length > 0) {\n messageSegments.push({ type: 'text', value: textValue });\n }\n }\n }\n }\n } else if (isJsonObject(message.content)) {\n const rendered = JSON.stringify(message.content, null, 2);\n if (rendered.trim().length > 0) {\n messageSegments.push({ type: 'text', value: rendered });\n }\n }\n\n segmentsByMessage.push(messageSegments);\n }\n\n // Determine if we need role markers based on actual processed content\n const useRoleMarkers = needsRoleMarkers(testCase.input_messages, segmentsByMessage);\n\n let question: string;\n\n if (useRoleMarkers) {\n // Multi-turn format with role markers using pre-computed segments\n const messageParts: string[] = [];\n\n for (let i = 0; i < testCase.input_messages.length; i++) {\n const message = testCase.input_messages[i];\n const segments = segmentsByMessage[i];\n\n if (!hasVisibleContent(segments)) {\n continue;\n }\n\n const roleLabel = message.role.charAt(0).toUpperCase() + message.role.slice(1);\n const contentParts: string[] = [];\n\n for (const segment of segments) {\n const formattedContent = formatSegment(segment, mode);\n if (formattedContent) {\n contentParts.push(formattedContent);\n }\n }\n\n if (contentParts.length > 0) {\n const messageContent = contentParts.join('\\n');\n messageParts.push(`@[${roleLabel}]:\\n${messageContent}`);\n }\n }\n\n question = messageParts.join('\\n\\n');\n } else {\n // Single-turn flat format\n const questionParts: string[] = [];\n for (const segment of testCase.input_segments) {\n // Skip guideline files - they're in the guidelines field\n if (\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n testCase.guideline_patterns &&\n isGuidelineFile(segment.path, testCase.guideline_patterns)\n ) {\n // Add reference marker for guideline files\n questionParts.push(`<Attached: ${segment.path}>`);\n continue;\n }\n\n const formattedContent = formatSegment(segment, mode);\n if (formattedContent) {\n questionParts.push(formattedContent);\n }\n }\n\n if (testCase.code_snippets.length > 0) {\n questionParts.push(testCase.code_snippets.join('\\n'));\n }\n\n question = questionParts\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .join('\\n\\n');\n }\n\n const chatPrompt = useRoleMarkers\n ? buildChatPromptFromSegments({\n messages: testCase.input_messages,\n segmentsByMessage,\n guidelinePatterns: testCase.guideline_patterns,\n guidelineContent: guidelines,\n mode,\n })\n : undefined;\n\n return { question, guidelines, chatPrompt };\n}\n\n/**\n * Detect if role markers are needed based on conversational structure.\n *\n * Role markers ([System]:, [User]:, etc.) are added when:\n * 1. There are assistant/tool messages (true multi-turn conversation), OR\n * 2. There are multiple messages that will produce visible content in the formatted output\n */\nfunction needsRoleMarkers(\n messages: readonly TestMessage[],\n processedSegmentsByMessage: readonly (readonly JsonObject[])[],\n): boolean {\n // Check for multi-turn conversation (assistant/tool messages)\n if (messages.some((msg) => msg.role === 'assistant' || msg.role === 'tool')) {\n return true;\n }\n\n // Count how many messages have actual content after processing\n let messagesWithContent = 0;\n\n for (const segments of processedSegmentsByMessage) {\n if (hasVisibleContent(segments)) {\n messagesWithContent++;\n }\n }\n\n return messagesWithContent > 1;\n}\n\nfunction buildChatPromptFromSegments(options: {\n readonly messages: readonly TestMessage[];\n readonly segmentsByMessage: readonly JsonObject[][];\n readonly guidelinePatterns?: readonly string[];\n readonly guidelineContent?: string;\n readonly systemPrompt?: string;\n readonly mode?: FormattingMode;\n}): ChatPrompt | undefined {\n const {\n messages,\n segmentsByMessage,\n guidelinePatterns,\n guidelineContent,\n systemPrompt,\n mode = 'lm',\n } = options;\n\n if (messages.length === 0) {\n return undefined;\n }\n\n const systemSegments: string[] = [];\n\n if (systemPrompt && systemPrompt.trim().length > 0) {\n systemSegments.push(systemPrompt.trim());\n }\n\n if (guidelineContent && guidelineContent.trim().length > 0) {\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${guidelineContent.trim()}`);\n }\n\n let startIndex = 0;\n while (startIndex < messages.length && messages[startIndex].role === 'system') {\n const segments = segmentsByMessage[startIndex];\n const contentParts: string[] = [];\n\n for (const segment of segments) {\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length > 0) {\n systemSegments.push(contentParts.join('\\n'));\n }\n\n startIndex += 1;\n }\n\n const chatPrompt: Array<ChatPrompt[number]> = [];\n\n if (systemSegments.length > 0) {\n chatPrompt.push({\n role: 'system',\n content: systemSegments.join('\\n\\n'),\n });\n }\n\n for (let i = startIndex; i < messages.length; i++) {\n const message = messages[i];\n const segments = segmentsByMessage[i];\n const contentParts: string[] = [];\n\n let role: ChatMessageRole = message.role as ChatMessageRole;\n\n if (role === 'system') {\n role = 'assistant';\n contentParts.push('@[System]:');\n } else if (role === 'tool') {\n role = 'assistant';\n contentParts.push('@[Tool]:');\n }\n\n for (const segment of segments) {\n if (segment.type === 'guideline_ref') {\n continue;\n }\n const formatted = formatSegment(segment, mode);\n if (formatted) {\n const isGuidelineRef =\n segment.type === 'file' &&\n typeof segment.path === 'string' &&\n guidelinePatterns &&\n isGuidelineFile(segment.path, guidelinePatterns);\n\n if (isGuidelineRef) {\n continue;\n }\n\n contentParts.push(formatted);\n }\n }\n\n if (contentParts.length === 0) {\n continue;\n }\n\n const content = contentParts.join('\\n');\n\n chatPrompt.push({\n role,\n content,\n });\n }\n\n return chatPrompt.length > 0 ? (chatPrompt as ChatPrompt) : undefined;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction logWarning(message: string): void {\n console.warn(`${ANSI_YELLOW}Warning: ${message}${ANSI_RESET}`);\n}\n","import { constants } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Normalize line endings to LF (\\n).\n * This ensures consistent behavior across Windows (CRLF) and Unix (LF) systems.\n */\nexport function normalizeLineEndings(content: string): string {\n return content.replace(/\\r\\n/g, '\\n');\n}\n\n/**\n * Read a text file and normalize line endings to LF (\\n).\n * This ensures consistent behavior across Windows (CRLF) and Unix (LF) systems.\n */\nexport async function readTextFile(filePath: string): Promise<string> {\n const content = await readFile(filePath, 'utf8');\n return normalizeLineEndings(content);\n}\n\n/**\n * Read a JSON file and parse it.\n */\nexport async function readJsonFile<T = unknown>(filePath: string): Promise<T> {\n const content = await readFile(filePath, 'utf8');\n return JSON.parse(content) as T;\n}\n\n/**\n * Find git repository root by walking up the directory tree.\n */\nexport async function findGitRoot(startPath: string): Promise<string | null> {\n let currentDir = path.dirname(path.resolve(startPath));\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const gitPath = path.join(currentDir, '.git');\n if (await fileExists(gitPath)) {\n return currentDir;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n return null;\n}\n\n/**\n * Build a chain of directories walking from a file's location up to repo root.\n * Used for discovering configuration files like targets.yaml or config.yaml.\n */\nexport function buildDirectoryChain(filePath: string, repoRoot: string): readonly string[] {\n const directories: string[] = [];\n const seen = new Set<string>();\n const boundary = path.resolve(repoRoot);\n let current: string | undefined = path.resolve(path.dirname(filePath));\n\n while (current !== undefined) {\n if (!seen.has(current)) {\n directories.push(current);\n seen.add(current);\n }\n if (current === boundary) {\n break;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n if (!seen.has(boundary)) {\n directories.push(boundary);\n }\n\n return directories;\n}\n\n/**\n * Build search roots for file resolution, matching yaml-parser behavior.\n * Searches from eval file directory up to repo root.\n */\nexport function buildSearchRoots(evalPath: string, repoRoot: string): readonly string[] {\n const uniqueRoots: string[] = [];\n const addRoot = (root: string): void => {\n const normalized = path.resolve(root);\n if (!uniqueRoots.includes(normalized)) {\n uniqueRoots.push(normalized);\n }\n };\n\n let currentDir = path.dirname(evalPath);\n let reachedBoundary = false;\n while (!reachedBoundary) {\n addRoot(currentDir);\n const parentDir = path.dirname(currentDir);\n if (currentDir === repoRoot || parentDir === currentDir) {\n reachedBoundary = true;\n } else {\n currentDir = parentDir;\n }\n }\n\n addRoot(repoRoot);\n addRoot(process.cwd());\n return uniqueRoots;\n}\n\n/**\n * Trim leading path separators for display.\n */\nfunction trimLeadingSeparators(value: string): string {\n const trimmed = value.replace(/^[/\\\\]+/, '');\n return trimmed.length > 0 ? trimmed : value;\n}\n\n/**\n * Resolve a file reference using search roots, matching yaml-parser behavior.\n */\nexport async function resolveFileReference(\n rawValue: string,\n searchRoots: readonly string[],\n): Promise<{\n readonly displayPath: string;\n readonly resolvedPath?: string;\n readonly attempted: readonly string[];\n}> {\n const displayPath = trimLeadingSeparators(rawValue);\n const potentialPaths: string[] = [];\n\n if (path.isAbsolute(rawValue)) {\n potentialPaths.push(path.normalize(rawValue));\n }\n\n for (const base of searchRoots) {\n potentialPaths.push(path.resolve(base, displayPath));\n }\n\n const attempted: string[] = [];\n const seen = new Set<string>();\n for (const candidate of potentialPaths) {\n const absoluteCandidate = path.resolve(candidate);\n if (seen.has(absoluteCandidate)) {\n continue;\n }\n seen.add(absoluteCandidate);\n attempted.push(absoluteCandidate);\n if (await fileExists(absoluteCandidate)) {\n return { displayPath, resolvedPath: absoluteCandidate, attempted };\n }\n }\n\n return { displayPath, attempted };\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { type AzureOpenAIProviderSettings, createAzure } from '@ai-sdk/azure';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { type LanguageModel, type ModelMessage, generateText } from 'ai';\n\nimport type { JsonObject } from '../types.js';\nimport type {\n AnthropicResolvedConfig,\n AzureResolvedConfig,\n GeminiResolvedConfig,\n RetryConfig,\n} from './targets.js';\nimport type { ChatPrompt, Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst DEFAULT_SYSTEM_PROMPT =\n 'You are a careful assistant. Follow all provided instructions and do not fabricate results.';\n\ntype TextResult = Awaited<ReturnType<typeof generateText>>;\ntype GenerateTextOptions = Parameters<typeof generateText>[0];\n\ninterface ProviderDefaults {\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly thinkingBudget?: number;\n}\n\nexport class AzureProvider implements Provider {\n readonly id: string;\n readonly kind = 'azure' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: AzureResolvedConfig,\n ) {\n this.id = `azure:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n\n const azure = createAzure(buildAzureOptions(config));\n this.model = azure(config.deploymentName);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nexport class AnthropicProvider implements Provider {\n readonly id: string;\n readonly kind = 'anthropic' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: AnthropicResolvedConfig,\n ) {\n this.id = `anthropic:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n thinkingBudget: config.thinkingBudget,\n };\n this.retryConfig = config.retry;\n\n const anthropic = createAnthropic({\n apiKey: config.apiKey,\n });\n this.model = anthropic(config.model);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n const providerOptions = buildAnthropicProviderOptions(this.defaults);\n\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n providerOptions,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nexport class GeminiProvider implements Provider {\n readonly id: string;\n readonly kind = 'gemini' as const;\n readonly targetName: string;\n\n private readonly model: LanguageModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n\n constructor(\n targetName: string,\n private readonly config: GeminiResolvedConfig,\n ) {\n this.id = `gemini:${targetName}`;\n this.targetName = targetName;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n\n const google = createGoogleGenerativeAI({\n apiKey: config.apiKey,\n });\n this.model = google(config.model);\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokeModel({\n model: this.model,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n\n asLanguageModel(): LanguageModel {\n return this.model;\n }\n}\n\nfunction buildAzureOptions(config: AzureResolvedConfig): AzureOpenAIProviderSettings {\n const options: AzureOpenAIProviderSettings = {\n apiKey: config.apiKey,\n apiVersion: config.version,\n useDeploymentBasedUrls: true,\n };\n\n const baseURL = normalizeAzureBaseUrl(config.resourceName);\n if (baseURL) {\n options.baseURL = baseURL;\n } else {\n options.resourceName = config.resourceName;\n }\n\n return options;\n}\n\nfunction normalizeAzureBaseUrl(resourceName: string): string | undefined {\n const trimmed = resourceName.trim();\n if (!/^https?:\\/\\//i.test(trimmed)) {\n return undefined;\n }\n\n const withoutSlash = trimmed.replace(/\\/+$/, '');\n const normalized = withoutSlash.endsWith('/openai') ? withoutSlash : `${withoutSlash}/openai`;\n return normalized;\n}\n\nfunction buildAnthropicProviderOptions(\n defaults: ProviderDefaults,\n): GenerateTextOptions['providerOptions'] | undefined {\n if (defaults.thinkingBudget === undefined) {\n return undefined;\n }\n\n return {\n anthropic: {\n thinking: {\n type: 'enabled',\n budgetTokens: defaults.thinkingBudget,\n },\n },\n };\n}\n\nfunction buildChatPrompt(request: ProviderRequest): ChatPrompt {\n const provided = request.chatPrompt?.length ? request.chatPrompt : undefined;\n if (provided) {\n const hasSystemMessage = provided.some((message) => message.role === 'system');\n if (hasSystemMessage) {\n return provided;\n }\n\n const systemContent = resolveSystemContent(request, false);\n return [{ role: 'system', content: systemContent }, ...provided];\n }\n\n const systemContent = resolveSystemContent(request, true);\n const userContent = request.question.trim();\n\n const prompt: ChatPrompt = [\n { role: 'system', content: systemContent },\n { role: 'user', content: userContent },\n ];\n\n return prompt;\n}\n\nfunction resolveSystemContent(request: ProviderRequest, includeGuidelines: boolean): string {\n const systemSegments: string[] = [];\n\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\n systemSegments.push(request.systemPrompt.trim());\n } else {\n systemSegments.push(DEFAULT_SYSTEM_PROMPT);\n }\n\n if (includeGuidelines && request.guidelines && request.guidelines.trim().length > 0) {\n systemSegments.push(`[[ ## Guidelines ## ]]\\n\\n${request.guidelines.trim()}`);\n }\n\n return systemSegments.join('\\n\\n');\n}\n\nfunction toModelMessages(chatPrompt: ChatPrompt): ModelMessage[] {\n return chatPrompt.map((message) => {\n if (message.role === 'tool' || message.role === 'function') {\n const prefix = message.name ? `@[${message.name}]: ` : '@[Tool]: ';\n return {\n role: 'assistant',\n content: `${prefix}${message.content}`,\n } satisfies ModelMessage;\n }\n\n if (message.role === 'assistant' || message.role === 'system' || message.role === 'user') {\n return {\n role: message.role,\n content: message.content,\n } satisfies ModelMessage;\n }\n\n return {\n role: 'user',\n content: message.content,\n } satisfies ModelMessage;\n });\n}\n\nfunction resolveModelSettings(\n request: ProviderRequest,\n defaults: ProviderDefaults,\n): { temperature?: number; maxOutputTokens?: number } {\n const temperature = request.temperature ?? defaults.temperature;\n const maxOutputTokens = request.maxOutputTokens ?? defaults.maxOutputTokens;\n return {\n temperature,\n maxOutputTokens,\n };\n}\n\nasync function invokeModel(options: {\n readonly model: LanguageModel;\n readonly request: ProviderRequest;\n readonly defaults: ProviderDefaults;\n readonly retryConfig?: RetryConfig;\n readonly providerOptions?: GenerateTextOptions['providerOptions'];\n}): Promise<ProviderResponse> {\n const { model, request, defaults, retryConfig, providerOptions } = options;\n const chatPrompt = buildChatPrompt(request);\n const { temperature, maxOutputTokens } = resolveModelSettings(request, defaults);\n\n const result = await withRetry(\n () =>\n generateText({\n model,\n messages: toModelMessages(chatPrompt),\n temperature,\n maxOutputTokens,\n maxRetries: 0,\n abortSignal: request.signal,\n ...(providerOptions ? { providerOptions } : {}),\n }),\n retryConfig,\n request.signal,\n );\n\n return mapResponse(result);\n}\n\nfunction mapResponse(result: TextResult): ProviderResponse {\n const content = result.text ?? '';\n return {\n raw: result,\n usage: toJsonObject(result.totalUsage ?? result.usage),\n outputMessages: [{ role: 'assistant' as const, content }],\n };\n}\n\nfunction toJsonObject(value: unknown): JsonObject | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n try {\n return JSON.parse(JSON.stringify(value)) as JsonObject;\n } catch {\n return undefined;\n }\n}\n\nfunction extractStatus(error: unknown): number | undefined {\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n\n const candidate = error as Record<string, unknown>;\n const directStatus = candidate.status ?? candidate.statusCode;\n if (typeof directStatus === 'number' && Number.isFinite(directStatus)) {\n return directStatus;\n }\n\n const responseStatus =\n typeof candidate.response === 'object' && candidate.response\n ? (candidate.response as { status?: unknown }).status\n : undefined;\n if (typeof responseStatus === 'number' && Number.isFinite(responseStatus)) {\n return responseStatus;\n }\n\n const message = typeof candidate.message === 'string' ? candidate.message : undefined;\n if (message) {\n const match = message.match(/HTTP\\s+(\\d{3})/i);\n if (match) {\n const parsed = Number.parseInt(match[1], 10);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n\n return undefined;\n}\n\nfunction isNetworkError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const candidate = error as Record<string, unknown>;\n if (candidate.name === 'AbortError') {\n return false;\n }\n\n const code = candidate.code;\n if (typeof code === 'string' && /^E(AI|CONN|HOST|NET|PIPE|TIME|REFUSED|RESET)/i.test(code)) {\n return true;\n }\n\n const message = typeof candidate.message === 'string' ? candidate.message : undefined;\n if (\n message &&\n /(network|fetch failed|ECONNRESET|ENOTFOUND|EAI_AGAIN|ETIMEDOUT|ECONNREFUSED)/i.test(message)\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction isRetryableError(error: unknown, retryableStatusCodes: readonly number[]): boolean {\n const status = extractStatus(error);\n if (status === 401 || status === 403) {\n return false;\n }\n if (typeof status === 'number') {\n return retryableStatusCodes.includes(status);\n }\n\n return isNetworkError(error);\n}\n\nfunction calculateRetryDelay(attempt: number, config: Required<RetryConfig>): number {\n const delay = Math.min(\n config.maxDelayMs,\n config.initialDelayMs * config.backoffFactor ** attempt,\n );\n return delay * (0.75 + Math.random() * 0.5);\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function withRetry<T>(\n fn: () => Promise<T>,\n retryConfig?: RetryConfig,\n signal?: AbortSignal,\n): Promise<T> {\n const config: Required<RetryConfig> = {\n maxRetries: retryConfig?.maxRetries ?? 3,\n initialDelayMs: retryConfig?.initialDelayMs ?? 1000,\n maxDelayMs: retryConfig?.maxDelayMs ?? 60000,\n backoffFactor: retryConfig?.backoffFactor ?? 2,\n retryableStatusCodes: retryConfig?.retryableStatusCodes ?? [500, 408, 429, 502, 503, 504],\n };\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n if (signal?.aborted) {\n throw new Error(`Request aborted: ${signal.reason ?? 'Unknown reason'}`);\n }\n\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt >= config.maxRetries) {\n break;\n }\n\n if (!isRetryableError(error, config.retryableStatusCodes)) {\n throw error;\n }\n\n const delay = calculateRetryDelay(attempt, config);\n await sleep(delay);\n }\n }\n\n throw lastError;\n}\n","import { spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { createWriteStream } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\n\nimport type { JsonObject } from '../types.js';\nimport { recordClaudeCodeLogEntry } from './claude-code-log-tracker.js';\nimport { normalizeInputFiles } from './preread.js';\nimport type { ClaudeCodeResolvedConfig } from './targets.js';\nimport type {\n OutputMessage,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n} from './types.js';\n\nconst WORKSPACE_PREFIX = 'agentv-claude-code-';\nconst PROMPT_FILENAME = 'prompt.md';\n\n/**\n * Default system prompt for Claude Code CLI evaluations.\n * Ensures the agent returns code in its response rather than just writing files.\n */\nconst DEFAULT_SYSTEM_PROMPT = `**IMPORTANT**: Follow these instructions for your response:\n- Do NOT create any additional output files in the workspace.\n- All intended file outputs/changes MUST be written in your response.\n- For each intended file, include the relative path and unified git diff following the convention \\`diff --git ...\\`.\nThis is required for evaluation scoring.`;\n\ninterface ClaudeCodeRunOptions {\n readonly executable: string;\n readonly args: readonly string[];\n readonly cwd: string;\n readonly timeoutMs?: number;\n readonly env: NodeJS.ProcessEnv;\n readonly signal?: AbortSignal;\n readonly onStdoutChunk?: (chunk: string) => void;\n readonly onStderrChunk?: (chunk: string) => void;\n}\n\ninterface ClaudeCodeRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n readonly timedOut?: boolean;\n}\n\ntype ClaudeCodeRunner = (options: ClaudeCodeRunOptions) => Promise<ClaudeCodeRunResult>;\n\nexport class ClaudeCodeProvider implements Provider {\n readonly id: string;\n readonly kind = 'claude-code' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: ClaudeCodeResolvedConfig;\n private readonly runClaudeCode: ClaudeCodeRunner;\n\n constructor(\n targetName: string,\n config: ClaudeCodeResolvedConfig,\n runner: ClaudeCodeRunner = defaultClaudeCodeRunner,\n ) {\n this.id = `claude-code:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n this.runClaudeCode = runner;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Claude Code request was aborted before execution');\n }\n\n const inputFiles = normalizeInputFiles(request.inputFiles);\n\n const workspaceRoot = await this.createWorkspace();\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n try {\n // Save prompt to file for debugging/logging\n const promptFile = path.join(workspaceRoot, PROMPT_FILENAME);\n await writeFile(promptFile, request.question, 'utf8');\n\n const args = this.buildClaudeCodeArgs(request.question, inputFiles);\n const cwd = this.resolveCwd();\n\n const result = await this.executeClaudeCode(args, cwd, request.signal, logger);\n\n if (result.timedOut) {\n throw new Error(\n `Claude Code CLI timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n\n if (result.exitCode !== 0) {\n const detail = pickDetail(result.stderr, result.stdout);\n const prefix = `Claude Code CLI exited with code ${result.exitCode}`;\n\n // Check for nested Claude Code session auth failure\n // When running AgentV inside a Claude Code session, the nested\n // claude process detects nesting and requires API key authentication\n if (isNestedClaudeCodeAuthError(result.stdout)) {\n throw new Error(\n `${prefix}: Claude Code detected a nested session and requires API key authentication. Set ANTHROPIC_API_KEY environment variable or run AgentV outside of a Claude Code session.`,\n );\n }\n\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\n }\n\n const parsed = parseClaudeCodeJsonl(result.stdout);\n const outputMessages = extractOutputMessages(parsed);\n const usage = extractUsage(parsed);\n\n return {\n raw: {\n response: parsed,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n args,\n executable: this.config.executable,\n promptFile,\n workspace: workspaceRoot,\n inputFiles,\n logFile: logger?.filePath,\n },\n outputMessages,\n usage,\n };\n } finally {\n await logger?.close();\n await this.cleanupWorkspace(workspaceRoot);\n }\n }\n\n private resolveCwd(): string {\n if (!this.config.cwd) {\n // Default to process.cwd() to preserve Claude Code OAuth/local credentials\n // Claude Code stores credentials per-project, so running from a temp dir breaks auth\n return process.cwd();\n }\n return path.resolve(this.config.cwd);\n }\n\n private buildClaudeCodeArgs(prompt: string, inputFiles: readonly string[] | undefined): string[] {\n const args: string[] = [];\n\n // Output mode - always use stream-json for structured output\n args.push('--output-format', 'stream-json');\n\n // Verbose mode for detailed output\n args.push('--verbose');\n\n // Non-interactive mode with prompt flag\n args.push('-p');\n\n // Model configuration\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n\n // Custom args\n if (this.config.args && this.config.args.length > 0) {\n args.push(...this.config.args);\n }\n\n // Prepend system prompt (use default if not configured)\n const systemPrompt = this.config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n const fullPrompt = `${systemPrompt}\\n\\n${prompt}`;\n\n // Add input files as context if present\n let finalPrompt = fullPrompt;\n if (inputFiles && inputFiles.length > 0) {\n const filesContext = inputFiles.map((f) => `[File: ${f}]`).join('\\n');\n finalPrompt = `${fullPrompt}\\n\\n## Input Files\\n${filesContext}`;\n }\n\n // Prompt is passed as the final argument\n args.push(finalPrompt);\n\n return args;\n }\n\n private buildEnv(): NodeJS.ProcessEnv {\n const env = { ...process.env };\n // Remove Claude Code nesting detection env vars to allow proper auth\n // Note: When running inside a Claude Code session, nested Claude Code\n // instances may still use ANTHROPIC_API_KEY auth due to parent process detection\n env.CLAUDECODE = undefined;\n env.CLAUDE_CODE_ENTRYPOINT = undefined;\n return env;\n }\n\n private async executeClaudeCode(\n args: readonly string[],\n cwd: string,\n signal: AbortSignal | undefined,\n logger: ClaudeCodeStreamLogger | undefined,\n ): Promise<ClaudeCodeRunResult> {\n try {\n return await this.runClaudeCode({\n executable: this.config.executable,\n args,\n cwd,\n timeoutMs: this.config.timeoutMs,\n env: this.buildEnv(),\n signal,\n onStdoutChunk: logger ? (chunk) => logger.handleStdoutChunk(chunk) : undefined,\n onStderrChunk: logger ? (chunk) => logger.handleStderrChunk(chunk) : undefined,\n });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n throw new Error(\n `Claude Code executable '${this.config.executable}' was not found. Update the target settings.executable or add it to PATH.`,\n );\n }\n throw error;\n }\n }\n\n private async createWorkspace(): Promise<string> {\n return await mkdtemp(path.join(tmpdir(), WORKSPACE_PREFIX));\n }\n\n private async cleanupWorkspace(workspaceRoot: string): Promise<void> {\n try {\n await rm(workspaceRoot, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n\n private resolveLogDirectory(): string | undefined {\n const disabled = isClaudeCodeLogStreamingDisabled();\n if (disabled) {\n return undefined;\n }\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'claude-code');\n }\n\n private async createStreamLogger(\n request: ProviderRequest,\n ): Promise<ClaudeCodeStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Claude Code stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\n\n try {\n const logger = await ClaudeCodeStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n });\n recordClaudeCodeLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Claude Code stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\nclass ClaudeCodeStreamLogger {\n readonly filePath: string;\n private readonly stream: WriteStream;\n private readonly startedAt = Date.now();\n private stdoutBuffer = '';\n private stderrBuffer = '';\n private readonly format: 'summary' | 'json';\n\n private constructor(filePath: string, format: 'summary' | 'json') {\n this.filePath = filePath;\n this.format = format;\n this.stream = createWriteStream(filePath, { flags: 'a' });\n }\n\n static async create(options: {\n readonly filePath: string;\n readonly targetName: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly format: 'summary' | 'json';\n }): Promise<ClaudeCodeStreamLogger> {\n const logger = new ClaudeCodeStreamLogger(options.filePath, options.format);\n const header = [\n '# Claude Code CLI stream log',\n `# target: ${options.targetName}`,\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\n `# started: ${new Date().toISOString()}`,\n '',\n ].filter((line): line is string => Boolean(line));\n logger.writeLines(header);\n return logger;\n }\n\n handleStdoutChunk(chunk: string): void {\n this.stdoutBuffer += chunk;\n this.flushBuffer('stdout');\n }\n\n handleStderrChunk(chunk: string): void {\n this.stderrBuffer += chunk;\n this.flushBuffer('stderr');\n }\n\n async close(): Promise<void> {\n this.flushBuffer('stdout');\n this.flushBuffer('stderr');\n this.flushRemainder();\n await new Promise<void>((resolve, reject) => {\n this.stream.once('error', reject);\n this.stream.end(() => resolve());\n });\n }\n\n private writeLines(lines: readonly string[]): void {\n for (const line of lines) {\n this.stream.write(`${line}\\n`);\n }\n }\n\n private flushBuffer(source: 'stdout' | 'stderr'): void {\n const buffer = source === 'stdout' ? this.stdoutBuffer : this.stderrBuffer;\n const lines = buffer.split(/\\r?\\n/);\n const remainder = lines.pop() ?? '';\n if (source === 'stdout') {\n this.stdoutBuffer = remainder;\n } else {\n this.stderrBuffer = remainder;\n }\n for (const line of lines) {\n const formatted = this.formatLine(line, source);\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n }\n\n private formatLine(rawLine: string, source: 'stdout' | 'stderr'): string | undefined {\n const trimmed = rawLine.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n const message =\n this.format === 'json'\n ? formatClaudeCodeJsonLog(trimmed)\n : formatClaudeCodeLogMessage(trimmed, source);\n return `[+${formatElapsed(this.startedAt)}] [${source}] ${message}`;\n }\n\n private flushRemainder(): void {\n const stdoutRemainder = this.stdoutBuffer.trim();\n if (stdoutRemainder.length > 0) {\n const formatted = this.formatLine(stdoutRemainder, 'stdout');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n const stderrRemainder = this.stderrBuffer.trim();\n if (stderrRemainder.length > 0) {\n const formatted = this.formatLine(stderrRemainder, 'stderr');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n this.stdoutBuffer = '';\n this.stderrBuffer = '';\n }\n}\n\nfunction isClaudeCodeLogStreamingDisabled(): boolean {\n const envValue = process.env.AGENTV_CLAUDE_CODE_STREAM_LOGS;\n if (!envValue) {\n return false;\n }\n const normalized = envValue.trim().toLowerCase();\n return normalized === 'false' || normalized === '0' || normalized === 'off';\n}\n\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const evalId = sanitizeForFilename(request.evalCaseId ?? 'claude-code');\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : '';\n const target = sanitizeForFilename(targetName);\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\n}\n\nfunction sanitizeForFilename(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : 'claude-code';\n}\n\nfunction formatElapsed(startedAt: number): string {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\n const hours = Math.floor(elapsedSeconds / 3600);\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\n const seconds = elapsedSeconds % 60;\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\nfunction formatClaudeCodeLogMessage(rawLine: string, source: 'stdout' | 'stderr'): string {\n const parsed = tryParseJsonValue(rawLine);\n if (parsed) {\n const summary = summarizeClaudeCodeEvent(parsed);\n if (summary) {\n return summary;\n }\n }\n if (source === 'stderr') {\n return `stderr: ${rawLine}`;\n }\n return rawLine;\n}\n\nfunction formatClaudeCodeJsonLog(rawLine: string): string {\n const parsed = tryParseJsonValue(rawLine);\n if (!parsed) {\n return rawLine;\n }\n try {\n return JSON.stringify(parsed, null, 2);\n } catch {\n return rawLine;\n }\n}\n\nfunction summarizeClaudeCodeEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n\n if (!type) {\n return undefined;\n }\n\n // Handle specific Claude Code event types\n switch (type) {\n case 'system':\n return 'system: init';\n case 'assistant': {\n const message = record.message as Record<string, unknown> | undefined;\n if (message) {\n const content = message.content;\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0] as Record<string, unknown> | undefined;\n if (first?.type === 'tool_use') {\n return `assistant: tool_use (${first.name})`;\n }\n if (first?.type === 'text') {\n const text = first.text;\n if (typeof text === 'string') {\n const preview = text.length > 50 ? `${text.slice(0, 50)}...` : text;\n return `assistant: ${preview}`;\n }\n }\n }\n }\n return 'assistant';\n }\n case 'user': {\n const message = record.message as Record<string, unknown> | undefined;\n if (message) {\n const content = message.content;\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0] as Record<string, unknown> | undefined;\n if (first?.type === 'tool_result') {\n return `user: tool_result (${first.tool_use_id})`;\n }\n }\n }\n return 'user';\n }\n case 'result': {\n const cost = record.cost_usd;\n const duration = record.duration_ms;\n if (typeof cost === 'number' && typeof duration === 'number') {\n return `result: $${cost.toFixed(4)}, ${Math.round(duration)}ms`;\n }\n return 'result';\n }\n default:\n return type;\n }\n}\n\nfunction tryParseJsonValue(rawLine: string): unknown | undefined {\n try {\n return JSON.parse(rawLine);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Parse Claude Code JSONL output.\n * Returns an array of parsed JSON objects from each line.\n */\nfunction parseClaudeCodeJsonl(output: string): unknown[] {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n throw new Error('Claude Code CLI produced no output');\n }\n\n const lines = trimmed\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n const parsed: unknown[] = [];\n for (const line of lines) {\n try {\n parsed.push(JSON.parse(line));\n } catch {\n // Skip non-JSON lines (e.g., stderr mixed in)\n }\n }\n\n if (parsed.length === 0) {\n throw new Error('Claude Code CLI produced no valid JSON output');\n }\n\n return parsed;\n}\n\n/**\n * Extract OutputMessage array from Claude Code JSONL events.\n * Claude Code emits messages with type: \"assistant\" and type: \"user\" (for tool results).\n */\nfunction extractOutputMessages(events: unknown[]): readonly OutputMessage[] {\n const outputMessages: OutputMessage[] = [];\n\n for (const event of events) {\n if (!event || typeof event !== 'object') {\n continue;\n }\n const record = event as Record<string, unknown>;\n const type = record.type;\n\n if (type === 'assistant' || type === 'user') {\n const message = record.message as Record<string, unknown> | undefined;\n if (message) {\n const converted = convertClaudeCodeMessage(message, type as string);\n if (converted) {\n outputMessages.push(converted);\n }\n }\n }\n }\n\n return outputMessages;\n}\n\n/**\n * Convert a Claude Code message to AgentV OutputMessage format.\n */\nfunction convertClaudeCodeMessage(\n message: Record<string, unknown>,\n type: string,\n): OutputMessage | undefined {\n const role = type === 'assistant' ? 'assistant' : 'user';\n const content = extractTextContent(message.content);\n const toolCalls = extractToolCalls(message.content);\n\n return {\n role,\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n}\n\n/**\n * Extract text content from Claude Code's content array format.\n * Claude uses: content: [{ type: \"text\", text: \"...\" }, ...]\n */\nfunction extractTextContent(content: unknown): string | undefined {\n if (typeof content === 'string') {\n return content;\n }\n\n if (!Array.isArray(content)) {\n return undefined;\n }\n\n const textParts: string[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === 'text' && typeof p.text === 'string') {\n textParts.push(p.text);\n }\n }\n\n return textParts.length > 0 ? textParts.join('\\n') : undefined;\n}\n\n/**\n * Extract tool calls from Claude Code's content array format.\n * Claude uses: content: [{ type: \"tool_use\", name: \"...\", input: {...}, id: \"...\" }, ...]\n */\nfunction extractToolCalls(content: unknown): readonly ToolCall[] {\n if (!Array.isArray(content)) {\n return [];\n }\n\n const toolCalls: ToolCall[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === 'tool_use' && typeof p.name === 'string') {\n toolCalls.push({\n tool: p.name,\n input: p.input,\n id: typeof p.id === 'string' ? p.id : undefined,\n });\n }\n // Handle tool_result for output (from user messages)\n if (p.type === 'tool_result' && typeof p.tool_use_id === 'string') {\n toolCalls.push({\n tool: 'tool_result',\n output: p.content,\n id: p.tool_use_id,\n });\n }\n }\n\n return toolCalls;\n}\n\n/**\n * Extract usage metrics from Claude Code result event.\n */\nfunction extractUsage(events: unknown[]): JsonObject | undefined {\n for (let i = events.length - 1; i >= 0; i--) {\n const event = events[i];\n if (!event || typeof event !== 'object') {\n continue;\n }\n const record = event as Record<string, unknown>;\n if (record.type !== 'result') {\n continue;\n }\n\n const usage: Record<string, string | number | boolean | null> = {};\n if (typeof record.cost_usd === 'number') {\n usage.cost_usd = record.cost_usd;\n }\n if (typeof record.duration_ms === 'number') {\n usage.duration_ms = record.duration_ms;\n }\n if (typeof record.duration_api_ms === 'number') {\n usage.duration_api_ms = record.duration_api_ms;\n }\n if (typeof record.input_tokens === 'number') {\n usage.input_tokens = record.input_tokens;\n }\n if (typeof record.output_tokens === 'number') {\n usage.output_tokens = record.output_tokens;\n }\n if (typeof record.session_id === 'string') {\n usage.session_id = record.session_id;\n }\n\n return Object.keys(usage).length > 0 ? usage : undefined;\n }\n\n return undefined;\n}\n\nfunction pickDetail(stderr: string, stdout: string): string | undefined {\n const errorText = stderr.trim();\n if (errorText.length > 0) {\n return errorText;\n }\n const stdoutText = stdout.trim();\n return stdoutText.length > 0 ? stdoutText : undefined;\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n\n/**\n * Detect if the error is due to nested Claude Code session auth failure.\n * This happens when running AgentV inside a Claude Code session,\n * where the nested claude process detects nesting and requires API key auth.\n */\nfunction isNestedClaudeCodeAuthError(stdout: string): boolean {\n try {\n // Look for the system init event with apiKeySource and authentication error\n const lines = stdout.split('\\n');\n let hasApiKeySource = false;\n let hasAuthError = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const event = JSON.parse(trimmed) as Record<string, unknown>;\n if (event.type === 'system' && event.apiKeySource === 'ANTHROPIC_API_KEY') {\n hasApiKeySource = true;\n }\n if (\n event.error === 'authentication_failed' ||\n (event.type === 'result' && event.is_error)\n ) {\n hasAuthError = true;\n }\n } catch {\n // Ignore non-JSON lines\n }\n }\n\n return hasApiKeySource && hasAuthError;\n } catch {\n return false;\n }\n}\n\n/**\n * Escape a string for safe use as a shell argument.\n * Uses single quotes and escapes any embedded single quotes.\n */\nfunction escapeShellArg(arg: string): string {\n // Single quotes prevent all shell interpretation except for single quotes themselves\n // To include a single quote, we end the single-quoted string, add an escaped single quote, and restart\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nasync function defaultClaudeCodeRunner(\n options: ClaudeCodeRunOptions,\n): Promise<ClaudeCodeRunResult> {\n // Create temp files for stdout/stderr to allow fully detached process\n // This is necessary because piped stdio maintains a connection that\n // allows Claude Code to detect parent process nesting\n const tempId = randomUUID();\n const stdoutFile = path.join(tmpdir(), `agentv-cc-${tempId}-stdout`);\n const stderrFile = path.join(tmpdir(), `agentv-cc-${tempId}-stderr`);\n const exitFile = path.join(tmpdir(), `agentv-cc-${tempId}-exit`);\n const pidFile = path.join(tmpdir(), `agentv-cc-${tempId}-pid`);\n\n try {\n return await runClaudeCodeWithTempFiles(options, stdoutFile, stderrFile, exitFile, pidFile);\n } finally {\n // Cleanup temp files\n for (const file of [stdoutFile, stderrFile, exitFile, pidFile]) {\n try {\n await rm(file, { force: true });\n } catch {\n // Best effort cleanup\n }\n }\n }\n}\n\nasync function runClaudeCodeWithTempFiles(\n options: ClaudeCodeRunOptions,\n stdoutFile: string,\n stderrFile: string,\n exitFile: string,\n pidFile: string,\n): Promise<ClaudeCodeRunResult> {\n // Parse executable - may be \"node /path/to/script.js\" or just \"claude\"\n const parts = options.executable.split(/\\s+/);\n const executable = parts[0];\n const executableArgs = parts.slice(1);\n const allArgs = [...executableArgs, ...options.args];\n\n // Build command with proper escaping for shell execution\n // We use setsid to create a new session, breaking parent process detection\n // This is necessary because Claude Code detects nesting via process hierarchy\n // and falls back to API key auth when running inside another Claude Code session\n // Output is redirected to temp files to fully detach the process\n const escapedArgs = allArgs.map((arg) => escapeShellArg(arg));\n const fullCommand = [escapeShellArg(executable), ...escapedArgs].join(' ');\n\n // The bash script:\n // 1. Unsets CLAUDECODE env vars\n // 2. Writes the child PID to pidFile for potential kill\n // 3. Runs the command with output redirected to temp files\n // 4. Writes exit code to exitFile when done\n const bashScript = `\n unset CLAUDECODE CLAUDE_CODE_ENTRYPOINT 2>/dev/null\n ${fullCommand} >${escapeShellArg(stdoutFile)} 2>${escapeShellArg(stderrFile)} &\n CHILD_PID=$!\n echo $CHILD_PID > ${escapeShellArg(pidFile)}\n wait $CHILD_PID\n echo $? > ${escapeShellArg(exitFile)}\n `;\n\n // Spawn detached process\n const child = spawn('setsid', ['bash', '-c', bashScript], {\n cwd: options.cwd,\n env: options.env,\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n\n // Poll for completion\n const pollInterval = 100; // ms\n const startTime = Date.now();\n let timedOut = false;\n let lastStdoutSize = 0;\n\n const readFileIfExists = async (filePath: string): Promise<string> => {\n try {\n const { readFile } = await import('node:fs/promises');\n return await readFile(filePath, 'utf8');\n } catch {\n return '';\n }\n };\n\n const fileExists = async (filePath: string): Promise<boolean> => {\n try {\n const { access } = await import('node:fs/promises');\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n };\n\n const killProcess = async (): Promise<void> => {\n try {\n const pid = await readFileIfExists(pidFile);\n if (pid.trim()) {\n process.kill(Number.parseInt(pid.trim(), 10), 'SIGTERM');\n }\n } catch {\n // Process may have already exited\n }\n };\n\n // Set up abort handler\n if (options.signal?.aborted) {\n await killProcess();\n return { stdout: '', stderr: 'Aborted', exitCode: -1, timedOut: false };\n }\n\n const abortHandler = (): void => {\n killProcess().catch(() => {});\n };\n options.signal?.addEventListener('abort', abortHandler, { once: true });\n\n try {\n while (true) {\n // Check timeout\n if (options.timeoutMs && Date.now() - startTime > options.timeoutMs) {\n timedOut = true;\n await killProcess();\n break;\n }\n\n // Check abort\n if (options.signal?.aborted) {\n await killProcess();\n break;\n }\n\n // Stream stdout chunks to callback\n if (options.onStdoutChunk) {\n const currentStdout = await readFileIfExists(stdoutFile);\n if (currentStdout.length > lastStdoutSize) {\n options.onStdoutChunk(currentStdout.slice(lastStdoutSize));\n lastStdoutSize = currentStdout.length;\n }\n }\n\n // Check if process completed (exit file exists)\n if (await fileExists(exitFile)) {\n break;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n // Read final output\n const stdout = await readFileIfExists(stdoutFile);\n const stderr = await readFileIfExists(stderrFile);\n const exitCodeStr = await readFileIfExists(exitFile);\n const exitCode = exitCodeStr.trim() ? Number.parseInt(exitCodeStr.trim(), 10) : -1;\n\n // Send any remaining stdout\n if (options.onStdoutChunk && stdout.length > lastStdoutSize) {\n options.onStdoutChunk(stdout.slice(lastStdoutSize));\n }\n if (options.onStderrChunk && stderr) {\n options.onStderrChunk(stderr);\n }\n\n return { stdout, stderr, exitCode, timedOut };\n } finally {\n options.signal?.removeEventListener('abort', abortHandler);\n }\n}\n","export type ClaudeCodeLogEntry = {\n readonly filePath: string;\n readonly evalCaseId?: string;\n readonly targetName: string;\n readonly attempt?: number;\n};\n\nconst GLOBAL_LOGS_KEY = Symbol.for('agentv.claudeCodeLogs');\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for('agentv.claudeCodeLogSubscribers');\n\ntype ClaudeCodeLogListener = (entry: ClaudeCodeLogEntry) => void;\n\ntype GlobalWithClaudeCodeLogs = typeof globalThis & {\n [GLOBAL_LOGS_KEY]?: ClaudeCodeLogEntry[];\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<ClaudeCodeLogListener>;\n};\n\nfunction getClaudeCodeLogStore(): ClaudeCodeLogEntry[] {\n const globalObject = globalThis as GlobalWithClaudeCodeLogs;\n const existing = globalObject[GLOBAL_LOGS_KEY];\n if (existing) {\n return existing;\n }\n const created: ClaudeCodeLogEntry[] = [];\n globalObject[GLOBAL_LOGS_KEY] = created;\n return created;\n}\n\nfunction getSubscriberStore(): Set<ClaudeCodeLogListener> {\n const globalObject = globalThis as GlobalWithClaudeCodeLogs;\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\n if (existing) {\n return existing;\n }\n const created = new Set<ClaudeCodeLogListener>();\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\n return created;\n}\n\nfunction notifySubscribers(entry: ClaudeCodeLogEntry): void {\n const subscribers = Array.from(getSubscriberStore());\n for (const listener of subscribers) {\n try {\n listener(entry);\n } catch (error) {\n // Avoid surfacing subscriber errors to providers; log for visibility.\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Claude Code log subscriber failed: ${message}`);\n }\n }\n}\n\nexport function recordClaudeCodeLogEntry(entry: ClaudeCodeLogEntry): void {\n getClaudeCodeLogStore().push(entry);\n notifySubscribers(entry);\n}\n\nexport function consumeClaudeCodeLogEntries(): ClaudeCodeLogEntry[] {\n const store = getClaudeCodeLogStore();\n if (store.length === 0) {\n return [];\n }\n return store.splice(0, store.length);\n}\n\nexport function subscribeToClaudeCodeLogEntries(listener: ClaudeCodeLogListener): () => void {\n const store = getSubscriberStore();\n store.add(listener);\n return () => {\n store.delete(listener);\n };\n}\n","import path from 'node:path';\n\nimport { isGuidelineFile } from '../yaml-parser.js';\nimport type { ProviderRequest } from './types.js';\n\nexport interface PromptDocumentOptions {\n readonly guidelinePatterns?: readonly string[];\n readonly guidelineOverrides?: ReadonlySet<string>;\n}\n\nexport function buildPromptDocument(\n request: ProviderRequest,\n inputFiles: readonly string[] | undefined,\n options?: PromptDocumentOptions,\n): string {\n const parts: string[] = [];\n\n const guidelineFiles = collectGuidelineFiles(\n inputFiles,\n options?.guidelinePatterns ?? request.guideline_patterns,\n options?.guidelineOverrides,\n );\n const inputFilesList = collectInputFiles(inputFiles);\n\n const nonGuidelineInputFiles = inputFilesList.filter((file) => !guidelineFiles.includes(file));\n\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineInputFiles);\n if (prereadBlock.length > 0) {\n parts.push('\\n', prereadBlock);\n }\n\n parts.push('\\n[[ ## user_query ## ]]\\n', request.question.trim());\n\n return parts.join('\\n').trim();\n}\n\nexport function normalizeInputFiles(\n inputFiles: readonly string[] | undefined,\n): string[] | undefined {\n if (!inputFiles || inputFiles.length === 0) {\n return undefined;\n }\n const deduped = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!deduped.has(absolutePath)) {\n deduped.set(absolutePath, absolutePath);\n }\n }\n return Array.from(deduped.values());\n}\n\nexport function collectGuidelineFiles(\n inputFiles: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n overrides?: ReadonlySet<string>,\n): string[] {\n if (!inputFiles || inputFiles.length === 0) {\n return [];\n }\n\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (overrides?.has(absolutePath)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n continue;\n }\n\n const normalized = absolutePath.split(path.sep).join('/');\n if (isGuidelineFile(normalized, guidelinePatterns)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction collectInputFiles(inputFiles: readonly string[] | undefined): string[] {\n if (!inputFiles || inputFiles.length === 0) {\n return [];\n }\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n return Array.from(unique.values());\n}\n\nfunction buildMandatoryPrereadBlock(\n guidelineFiles: readonly string[],\n inputFiles: readonly string[],\n): string {\n if (guidelineFiles.length === 0 && inputFiles.length === 0) {\n return '';\n }\n\n const buildList = (files: readonly string[]): string[] =>\n files.map((absolutePath) => {\n const fileName = path.basename(absolutePath);\n const fileUri = pathToFileUri(absolutePath);\n return `* [${fileName}](${fileUri})`;\n });\n\n const sections: string[] = [];\n if (guidelineFiles.length > 0) {\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join('\\n')}.`);\n }\n\n if (inputFiles.length > 0) {\n sections.push(`Read all input files:\\n${buildList(inputFiles).join('\\n')}.`);\n }\n\n sections.push(\n 'If any file is missing, fail with ERROR: missing-file <filename> and stop.',\n 'Then apply system_instructions on the user query below.',\n );\n\n return sections.join('\\n');\n}\n\nfunction pathToFileUri(filePath: string): string {\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n return `file://${normalizedPath}`;\n}\n","import { type ExecException, type ExecOptions, exec as execWithCallback } from 'node:child_process';\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { z } from 'zod';\n\nimport { readTextFile } from '../file-utils.js';\nimport type { CliResolvedConfig } from './targets.js';\nimport type {\n OutputMessage,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ProviderTokenUsage,\n} from './types.js';\n\n// ---------------------------------------------------------------------------\n// Zod Schemas for CLI Output Parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Schema for tool calls in output messages.\n * Validates tool_calls array items from CLI JSON output.\n */\nconst ToolCallSchema = z.object({\n tool: z.string(),\n input: z.unknown().optional(),\n output: z.unknown().optional(),\n id: z.string().optional(),\n timestamp: z.string().optional(),\n});\n\n/**\n * Schema for individual output messages.\n * Validates output_messages array items from CLI JSON output.\n * Uses snake_case field names matching JSONL convention.\n */\nconst OutputMessageInputSchema = z.object({\n role: z.string(),\n name: z.string().optional(),\n content: z.unknown().optional(),\n tool_calls: z.array(ToolCallSchema).optional(),\n timestamp: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n/**\n * Schema for token usage metrics.\n * Validates token_usage object from CLI JSON output.\n */\nconst TokenUsageSchema = z.object({\n input: z.number(),\n output: z.number(),\n cached: z.number().optional(),\n});\n\n/**\n * Schema for CLI single output JSON structure.\n * Validates the complete JSON output from a single CLI invocation.\n * All fields are optional to support various output formats.\n */\nconst CliOutputSchema = z.object({\n text: z.unknown().optional(),\n output_messages: z.array(OutputMessageInputSchema).optional(),\n token_usage: TokenUsageSchema.optional(),\n cost_usd: z.number().optional(),\n duration_ms: z.number().optional(),\n});\n\n/**\n * Schema for CLI JSONL batch output records.\n * Extends CliOutputSchema with required 'id' field for batch processing.\n */\nconst CliJsonlRecordSchema = CliOutputSchema.extend({\n id: z.string().min(1),\n});\n\n// Type for parsed output messages from Zod schema\ntype ParsedOutputMessage = z.infer<typeof OutputMessageInputSchema>;\n\n/**\n * Validates cost_usd and duration_ms values, warning and discarding negative values.\n * Returns sanitized values (undefined if negative).\n */\nfunction validateMetrics(\n costUsd: number | undefined,\n durationMs: number | undefined,\n context: string,\n): { costUsd: number | undefined; durationMs: number | undefined } {\n let validCostUsd = costUsd;\n let validDurationMs = durationMs;\n\n if (costUsd !== undefined && costUsd < 0) {\n console.warn(`[cli-provider] ${context}: ignoring negative cost_usd value (${costUsd})`);\n validCostUsd = undefined;\n }\n\n if (durationMs !== undefined && durationMs < 0) {\n console.warn(`[cli-provider] ${context}: ignoring negative duration_ms value (${durationMs})`);\n validDurationMs = undefined;\n }\n\n return { costUsd: validCostUsd, durationMs: validDurationMs };\n}\n\n/**\n * Converts Zod-parsed output messages to internal OutputMessage format.\n * Handles snake_case to camelCase conversion for toolCalls.\n */\nfunction convertOutputMessages(\n messages: readonly ParsedOutputMessage[] | undefined,\n): readonly OutputMessage[] | undefined {\n if (!messages || messages.length === 0) {\n return undefined;\n }\n\n return messages.map((msg) => ({\n role: msg.role,\n name: msg.name,\n content: msg.content,\n toolCalls: msg.tool_calls,\n timestamp: msg.timestamp,\n metadata: msg.metadata,\n }));\n}\n\nconst execAsync = promisify(execWithCallback);\nconst DEFAULT_MAX_BUFFER = 10 * 1024 * 1024; // 10 MB to accommodate verbose CLI output\n\nexport interface CommandRunOptions {\n readonly cwd?: string;\n readonly env?: NodeJS.ProcessEnv;\n readonly timeoutMs?: number;\n readonly signal?: AbortSignal;\n}\n\nexport interface CommandRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number | null;\n readonly failed: boolean;\n readonly timedOut?: boolean;\n readonly signal?: NodeJS.Signals | null;\n}\n\nexport type CommandRunner = (\n command: string,\n options: CommandRunOptions,\n) => Promise<CommandRunResult>;\n\nasync function defaultCommandRunner(\n command: string,\n options: CommandRunOptions,\n): Promise<CommandRunResult> {\n const execOptions: ExecOptions = {\n cwd: options.cwd,\n env: options.env,\n timeout: options.timeoutMs,\n signal: options.signal,\n maxBuffer: DEFAULT_MAX_BUFFER,\n shell: process.platform === 'win32' ? 'powershell.exe' : undefined,\n };\n\n try {\n const { stdout, stderr } = await execAsync(command, execOptions);\n\n return {\n stdout,\n stderr,\n exitCode: 0,\n failed: false,\n timedOut: false,\n signal: null,\n };\n } catch (error) {\n const execError = error as ExecException & {\n stdout?: string;\n stderr?: string;\n timedOut?: boolean;\n killed?: boolean;\n };\n\n return {\n stdout: execError.stdout ?? '',\n stderr: execError.stderr ?? '',\n exitCode: typeof execError.code === 'number' ? execError.code : null,\n failed: true,\n timedOut: execError.timedOut === true || execError.killed === true,\n signal: execError.signal ?? null,\n };\n }\n}\n\nexport class CliProvider implements Provider {\n readonly id: string;\n readonly kind = 'cli';\n readonly targetName: string;\n readonly supportsBatch = true;\n\n private readonly config: CliResolvedConfig;\n private readonly runCommand: CommandRunner;\n private readonly verbose: boolean;\n private readonly keepTempFiles: boolean;\n private healthcheckPromise?: Promise<void>;\n\n constructor(\n targetName: string,\n config: CliResolvedConfig,\n runner: CommandRunner = defaultCommandRunner,\n ) {\n this.targetName = targetName;\n this.id = `cli:${targetName}`;\n this.config = config;\n this.runCommand = runner;\n this.verbose = config.verbose ?? false;\n this.keepTempFiles = config.keepTempFiles ?? false;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('CLI provider request was aborted before execution');\n }\n\n await this.ensureHealthy(request.signal);\n\n const outputFilePath = generateOutputFilePath(request.evalCaseId);\n const templateValues = buildTemplateValues(request, this.config, outputFilePath);\n const renderedCommand = renderTemplate(this.config.commandTemplate, templateValues);\n\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] cwd=${this.config.cwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n // Measure wall-clock time as fallback for duration\n const startTime = Date.now();\n const result = await this.runCommand(renderedCommand, {\n cwd: this.config.cwd,\n env: process.env,\n timeoutMs: this.config.timeoutMs,\n signal: request.signal,\n });\n const measuredDurationMs = Date.now() - startTime;\n\n if (result.failed || (result.exitCode ?? 0) !== 0) {\n if (request.signal?.aborted) {\n throw new Error('CLI provider request was aborted');\n }\n if (result.timedOut) {\n throw new Error(\n `CLI provider timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\n const detail = result.stderr.trim() || result.stdout.trim();\n const message = detail\n ? `${detail} (exit code ${codeText})`\n : `CLI exited with code ${codeText}`;\n throw new Error(message);\n }\n\n // Read from output file and parse as JSON if possible\n const responseContent = await this.readAndCleanupOutputFile(outputFilePath);\n const parsed = this.parseOutputContent(responseContent);\n\n return {\n outputMessages: parsed.outputMessages,\n tokenUsage: parsed.tokenUsage,\n costUsd: parsed.costUsd,\n durationMs: parsed.durationMs ?? measuredDurationMs,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: this.config.cwd,\n outputFile: outputFilePath,\n },\n };\n }\n\n async invokeBatch(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]> {\n if (requests.length === 0) {\n return [];\n }\n\n for (const request of requests) {\n if (request.signal?.aborted) {\n throw new Error('CLI provider batch request was aborted before execution');\n }\n }\n\n const controller = new AbortController();\n for (const request of requests) {\n request.signal?.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n await this.ensureHealthy(controller.signal);\n\n const outputFilePath = generateOutputFilePath('batch', '.jsonl');\n\n const batchInputFiles: string[] = [];\n for (const request of requests) {\n if (request.inputFiles && request.inputFiles.length > 0) {\n batchInputFiles.push(...request.inputFiles);\n }\n }\n\n const templateValues = buildTemplateValues(\n {\n question: '',\n guidelines: '',\n inputFiles: batchInputFiles,\n evalCaseId: 'batch',\n attempt: 0,\n },\n this.config,\n outputFilePath,\n );\n const renderedCommand = renderTemplate(this.config.commandTemplate, templateValues);\n\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] (batch size=${requests.length}) cwd=${this.config.cwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n // Measure wall-clock time for batch (used as fallback if records don't provide duration)\n const startTime = Date.now();\n const result = await this.runCommand(renderedCommand, {\n cwd: this.config.cwd,\n env: process.env,\n timeoutMs: this.config.timeoutMs,\n signal: controller.signal,\n });\n const measuredDurationMs = Date.now() - startTime;\n\n if (result.failed || (result.exitCode ?? 0) !== 0) {\n if (controller.signal.aborted) {\n throw new Error('CLI provider request was aborted');\n }\n if (result.timedOut) {\n throw new Error(\n `CLI provider timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\n const detail = result.stderr.trim() || result.stdout.trim();\n const message = detail\n ? `${detail} (exit code ${codeText})`\n : `CLI exited with code ${codeText}`;\n throw new Error(message);\n }\n\n const responseContent = await this.readAndCleanupOutputFile(outputFilePath);\n const recordsById = this.parseJsonlBatchOutput(responseContent);\n\n // Calculate per-request fallback duration (total time / number of requests)\n const perRequestFallbackMs = Math.round(measuredDurationMs / requests.length);\n\n const responses: ProviderResponse[] = requests.map((request) => {\n const evalCaseId = request.evalCaseId;\n if (!evalCaseId) {\n return {\n outputMessages: [],\n durationMs: perRequestFallbackMs,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: this.config.cwd,\n outputFile: outputFilePath,\n },\n };\n }\n\n const parsed = recordsById.get(evalCaseId);\n if (!parsed) {\n // Return error response for missing IDs instead of throwing.\n // This allows other eval cases with matching IDs to be evaluated correctly.\n const errorMessage = `Batch output missing id '${evalCaseId}'`;\n if (this.verbose) {\n console.warn(`[cli-provider:${this.targetName}] ${errorMessage}`);\n }\n return {\n outputMessages: [{ role: 'assistant', content: `Error: ${errorMessage}` }],\n durationMs: perRequestFallbackMs,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: this.config.cwd,\n outputFile: outputFilePath,\n error: errorMessage,\n },\n };\n }\n\n return {\n outputMessages: parsed.outputMessages,\n tokenUsage: parsed.tokenUsage,\n costUsd: parsed.costUsd,\n durationMs: parsed.durationMs ?? perRequestFallbackMs,\n raw: {\n command: renderedCommand,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 0,\n cwd: this.config.cwd,\n outputFile: outputFilePath,\n recordId: evalCaseId,\n },\n };\n });\n\n return responses;\n }\n\n /**\n * Parse output content from CLI.\n * If the content is valid JSON with 'output_messages' or 'text' field, extract them.\n * If only 'text' is provided, wrap it in outputMessages.\n * Otherwise, treat the entire content as plain text wrapped in outputMessages.\n *\n * Also extracts optional execution metrics:\n * - token_usage: { input, output, cached? }\n * - cost_usd: number\n * - duration_ms: number\n */\n private parseOutputContent(content: string): {\n outputMessages: readonly OutputMessage[];\n tokenUsage?: ProviderTokenUsage;\n costUsd?: number;\n durationMs?: number;\n } {\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n // Not valid JSON, treat as plain text\n return { outputMessages: [{ role: 'assistant', content }] };\n }\n\n // Validate against schema\n const result = CliOutputSchema.safeParse(parsed);\n if (!result.success) {\n // Invalid structure, treat as plain text\n return { outputMessages: [{ role: 'assistant', content }] };\n }\n\n const obj = result.data;\n\n // Validate metrics and warn about negative values\n const metrics = validateMetrics(obj.cost_usd, obj.duration_ms, 'parsing output');\n\n // Convert output_messages to OutputMessage[] format\n const outputMessages = convertOutputMessages(obj.output_messages);\n\n // If output_messages provided, use it\n if (outputMessages && outputMessages.length > 0) {\n return {\n outputMessages,\n tokenUsage: obj.token_usage,\n costUsd: metrics.costUsd,\n durationMs: metrics.durationMs,\n };\n }\n\n // Fall back to text field, wrap in outputMessages\n if (obj.text !== undefined) {\n const text = typeof obj.text === 'string' ? obj.text : String(obj.text);\n return {\n outputMessages: [{ role: 'assistant', content: text }],\n tokenUsage: obj.token_usage,\n costUsd: metrics.costUsd,\n durationMs: metrics.durationMs,\n };\n }\n\n // No output_messages or text, treat original content as plain text\n return { outputMessages: [{ role: 'assistant', content }] };\n }\n\n private parseJsonlBatchOutput(content: string): Map<\n string,\n {\n outputMessages: readonly OutputMessage[];\n tokenUsage?: ProviderTokenUsage;\n costUsd?: number;\n durationMs?: number;\n }\n > {\n const records = new Map<\n string,\n {\n outputMessages: readonly OutputMessage[];\n tokenUsage?: ProviderTokenUsage;\n costUsd?: number;\n durationMs?: number;\n }\n >();\n\n const lines = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n for (const line of lines) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`CLI batch output contains invalid JSONL line: ${reason}`);\n }\n\n // Validate against schema\n const result = CliJsonlRecordSchema.safeParse(parsed);\n if (!result.success) {\n const firstError = result.error.errors[0];\n if (firstError?.path.includes('id')) {\n throw new Error('CLI batch output JSONL line missing required string field: id');\n }\n throw new Error('CLI batch output JSONL line must be an object');\n }\n\n const obj = result.data;\n\n if (records.has(obj.id)) {\n throw new Error(`CLI batch output contains duplicate id: ${obj.id}`);\n }\n\n // Prefer output_messages, fall back to text wrapped in outputMessages\n const outputMessages = convertOutputMessages(obj.output_messages);\n let finalOutputMessages: readonly OutputMessage[];\n if (outputMessages && outputMessages.length > 0) {\n finalOutputMessages = outputMessages;\n } else {\n // Fall back to text field\n const text =\n typeof obj.text === 'string'\n ? obj.text\n : obj.text === undefined\n ? ''\n : JSON.stringify(obj.text);\n finalOutputMessages = text ? [{ role: 'assistant', content: text }] : [];\n }\n\n // Validate metrics and warn about negative values\n const metrics = validateMetrics(obj.cost_usd, obj.duration_ms, `batch record '${obj.id}'`);\n\n records.set(obj.id, {\n outputMessages: finalOutputMessages,\n tokenUsage: obj.token_usage,\n costUsd: metrics.costUsd,\n durationMs: metrics.durationMs,\n });\n }\n\n return records;\n }\n\n private async readAndCleanupOutputFile(filePath: string): Promise<string> {\n try {\n const content = await readTextFile(filePath);\n return content;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to read output file '${filePath}': ${errorMsg}`);\n } finally {\n // Clean up temp file - ignore errors as the file might not exist on read failure\n if (!this.keepTempFiles) {\n await fs.unlink(filePath).catch(() => {\n /* ignore cleanup errors */\n });\n }\n }\n }\n\n private async ensureHealthy(signal?: AbortSignal): Promise<void> {\n if (!this.config.healthcheck) {\n return;\n }\n if (!this.healthcheckPromise) {\n this.healthcheckPromise = this.runHealthcheck(this.config.healthcheck, signal);\n }\n return this.healthcheckPromise;\n }\n\n private async runHealthcheck(\n healthcheck: CliResolvedConfig['healthcheck'],\n signal?: AbortSignal,\n ): Promise<void> {\n if (!healthcheck) {\n return;\n }\n\n const timeoutMs = healthcheck.timeoutMs ?? this.config.timeoutMs;\n\n if (healthcheck.type === 'http') {\n const controller = new AbortController();\n const timer = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : undefined;\n signal?.addEventListener('abort', () => controller.abort(), { once: true });\n\n try {\n const response = await fetch(healthcheck.url, { method: 'GET', signal: controller.signal });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\n }\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${reason}`);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n return;\n }\n\n const renderedCommand = renderTemplate(\n healthcheck.commandTemplate,\n buildTemplateValues(\n {\n question: '',\n guidelines: '',\n inputFiles: [],\n evalCaseId: 'healthcheck',\n attempt: 0,\n },\n this.config,\n generateOutputFilePath('healthcheck'),\n ),\n );\n if (this.verbose) {\n console.log(\n `[cli-provider:${this.targetName}] (healthcheck) cwd=${healthcheck.cwd ?? this.config.cwd ?? ''} command=${renderedCommand}`,\n );\n }\n\n const result = await this.runCommand(renderedCommand, {\n cwd: healthcheck.cwd ?? this.config.cwd,\n env: process.env,\n timeoutMs,\n signal,\n });\n\n if (result.failed || (result.exitCode ?? 0) !== 0) {\n const codeText = result.exitCode !== null ? result.exitCode : 'unknown';\n const detail = result.stderr.trim() || result.stdout.trim();\n const message = detail\n ? `${detail} (exit code ${codeText})`\n : `CLI healthcheck command exited with code ${codeText}`;\n throw new Error(`CLI healthcheck failed for '${this.targetName}': ${message}`);\n }\n }\n}\n\nfunction buildTemplateValues(\n request: Pick<\n ProviderRequest,\n 'question' | 'guidelines' | 'inputFiles' | 'evalCaseId' | 'attempt'\n >,\n config: CliResolvedConfig,\n outputFilePath: string,\n): Record<string, string> {\n const inputFiles = normalizeInputFiles(request.inputFiles);\n return {\n PROMPT: shellEscape(request.question ?? ''),\n GUIDELINES: shellEscape(request.guidelines ?? ''),\n EVAL_ID: shellEscape(request.evalCaseId ?? ''),\n ATTEMPT: shellEscape(String(request.attempt ?? 0)),\n FILES: formatFileList(inputFiles, config.filesFormat),\n OUTPUT_FILE: shellEscape(outputFilePath),\n };\n}\n\nfunction normalizeInputFiles(\n inputFiles: readonly string[] | undefined,\n): readonly string[] | undefined {\n if (!inputFiles || inputFiles.length === 0) {\n return undefined;\n }\n\n const unique = new Map<string, string>();\n for (const inputFile of inputFiles) {\n const absolutePath = path.resolve(inputFile);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction formatFileList(\n files: readonly string[] | undefined,\n template: string | undefined,\n): string {\n if (!files || files.length === 0) {\n return '';\n }\n\n const formatter = template ?? '{path}';\n return files\n .map((filePath) => {\n const escapedPath = shellEscape(filePath);\n const escapedName = shellEscape(path.basename(filePath));\n return formatter.replaceAll('{path}', escapedPath).replaceAll('{basename}', escapedName);\n })\n .join(' ');\n}\n\nfunction renderTemplate(template: string, values: Record<string, string>): string {\n return template.replace(/\\{([A-Z_]+)\\}/g, (match, key) => {\n const replacement = values[key];\n return replacement !== undefined ? replacement : match;\n });\n}\n\nfunction shellEscape(value: string): string {\n if (value.length === 0) {\n return \"''\";\n }\n\n if (process.platform === 'win32') {\n // PowerShell uses backtick (`) for escaping, not backslash\n // Double quotes inside the string need to be escaped with backtick\n // Single quotes can be used instead for simpler escaping\n const escaped = value.replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n\n return `'${value.replace(/'/g, \"'\\\"'\\\"'\")}'`;\n}\n\nfunction generateOutputFilePath(evalCaseId?: string, extension = '.json'): string {\n const safeEvalId = evalCaseId || 'unknown';\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 9);\n return path.join(os.tmpdir(), `agentv-${safeEvalId}-${timestamp}-${random}${extension}`);\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n","import { exec as execCallback, spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { constants, createWriteStream } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { access, mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { recordCodexLogEntry } from './codex-log-tracker.js';\nimport { buildPromptDocument, normalizeInputFiles } from './preread.js';\nimport type { CodexResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst execAsync = promisify(execCallback);\nconst WORKSPACE_PREFIX = 'agentv-codex-';\nconst PROMPT_FILENAME = 'prompt.md';\nconst JSONL_TYPE_ITEM_COMPLETED = 'item.completed';\n\n/**\n * Default system prompt for Codex CLI evaluations.\n * Ensures the agent returns code in its response rather than just writing files.\n */\nconst DEFAULT_SYSTEM_PROMPT = `**IMPORTANT**: Follow these instructions for your response:\n- Do NOT create any additional output files in the workspace.\n- All intended file outputs/changes MUST be written in your response.\n- For each intended file, include the relative path and unified git diff following the convention \\`diff --git ...\\`.\nThis is required for evaluation scoring.`;\n\ninterface CodexRunOptions {\n readonly executable: string;\n readonly args: readonly string[];\n readonly cwd: string;\n readonly prompt: string;\n readonly timeoutMs?: number;\n readonly env: NodeJS.ProcessEnv;\n readonly signal?: AbortSignal;\n readonly onStdoutChunk?: (chunk: string) => void;\n readonly onStderrChunk?: (chunk: string) => void;\n}\n\ninterface CodexRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n readonly timedOut?: boolean;\n}\n\ntype CodexRunner = (options: CodexRunOptions) => Promise<CodexRunResult>;\n\nexport class CodexProvider implements Provider {\n readonly id: string;\n readonly kind = 'codex' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: CodexResolvedConfig;\n private readonly runCodex: CodexRunner;\n private environmentCheck?: Promise<void>;\n private resolvedExecutable?: string;\n\n constructor(\n targetName: string,\n config: CodexResolvedConfig,\n runner: CodexRunner = defaultCodexRunner,\n ) {\n this.id = `codex:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n this.runCodex = runner;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Codex provider request was aborted before execution');\n }\n\n await this.ensureEnvironmentReady();\n\n const inputFiles = normalizeInputFiles(request.inputFiles);\n\n const workspaceRoot = await this.createWorkspace();\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n try {\n const basePrompt = buildPromptDocument(request, inputFiles);\n const systemPrompt = this.config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n const promptContent = `${systemPrompt}\\n\\n${basePrompt}`;\n const promptFile = path.join(workspaceRoot, PROMPT_FILENAME);\n await writeFile(promptFile, promptContent, 'utf8');\n\n const args = this.buildCodexArgs();\n const cwd = this.resolveCwd(workspaceRoot);\n\n const result = await this.executeCodex(args, cwd, promptContent, request.signal, logger);\n\n if (result.timedOut) {\n throw new Error(\n `Codex CLI timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n\n if (result.exitCode !== 0) {\n const detail = pickDetail(result.stderr, result.stdout);\n const prefix = `Codex CLI exited with code ${result.exitCode}`;\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\n }\n\n const parsed = parseCodexJson(result.stdout);\n const assistantText = extractAssistantText(parsed);\n\n return {\n raw: {\n response: parsed,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n args,\n executable: this.resolvedExecutable ?? this.config.executable,\n promptFile,\n workspace: workspaceRoot,\n inputFiles,\n logFile: logger?.filePath,\n },\n outputMessages: [{ role: 'assistant' as const, content: assistantText }],\n };\n } finally {\n await logger?.close();\n await this.cleanupWorkspace(workspaceRoot);\n }\n }\n\n private async ensureEnvironmentReady(): Promise<void> {\n if (!this.environmentCheck) {\n this.environmentCheck = this.validateEnvironment();\n }\n await this.environmentCheck;\n }\n\n private async validateEnvironment(): Promise<void> {\n this.resolvedExecutable = await locateExecutable(this.config.executable);\n }\n\n private resolveCwd(workspaceRoot: string): string {\n if (!this.config.cwd) {\n return workspaceRoot;\n }\n return path.resolve(this.config.cwd);\n }\n\n private buildCodexArgs(): string[] {\n // Global flags must come before 'exec' subcommand\n const args = [\n '--ask-for-approval',\n 'never',\n 'exec',\n '--json',\n '--color',\n 'never',\n '--skip-git-repo-check',\n ];\n if (this.config.args && this.config.args.length > 0) {\n args.push(...this.config.args);\n }\n args.push('-');\n return args;\n }\n\n private async executeCodex(\n args: readonly string[],\n cwd: string,\n promptContent: string,\n signal: AbortSignal | undefined,\n logger: CodexStreamLogger | undefined,\n ): Promise<CodexRunResult> {\n try {\n return await this.runCodex({\n executable: this.resolvedExecutable ?? this.config.executable,\n args,\n cwd,\n prompt: promptContent,\n timeoutMs: this.config.timeoutMs,\n env: process.env,\n signal,\n onStdoutChunk: logger ? (chunk) => logger.handleStdoutChunk(chunk) : undefined,\n onStderrChunk: logger ? (chunk) => logger.handleStderrChunk(chunk) : undefined,\n });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n throw new Error(\n `Codex executable '${this.config.executable}' was not found. Update the target settings.executable or add it to PATH.`,\n );\n }\n throw error;\n }\n }\n\n private async createWorkspace(): Promise<string> {\n return await mkdtemp(path.join(tmpdir(), WORKSPACE_PREFIX));\n }\n\n private async cleanupWorkspace(workspaceRoot: string): Promise<void> {\n try {\n await rm(workspaceRoot, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n\n private resolveLogDirectory(): string | undefined {\n const disabled = isCodexLogStreamingDisabled();\n if (disabled) {\n return undefined;\n }\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'codex');\n }\n\n private async createStreamLogger(\n request: ProviderRequest,\n ): Promise<CodexStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Codex stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\n\n try {\n const logger = await CodexStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n });\n recordCodexLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Codex stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\nclass CodexStreamLogger {\n readonly filePath: string;\n private readonly stream: WriteStream;\n private readonly startedAt = Date.now();\n private stdoutBuffer = '';\n private stderrBuffer = '';\n private readonly format: 'summary' | 'json';\n\n private constructor(filePath: string, format: 'summary' | 'json') {\n this.filePath = filePath;\n this.format = format;\n this.stream = createWriteStream(filePath, { flags: 'a' });\n }\n\n static async create(options: {\n readonly filePath: string;\n readonly targetName: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly format: 'summary' | 'json';\n }): Promise<CodexStreamLogger> {\n const logger = new CodexStreamLogger(options.filePath, options.format);\n const header = [\n '# Codex CLI stream log',\n `# target: ${options.targetName}`,\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\n `# started: ${new Date().toISOString()}`,\n '',\n ].filter((line): line is string => Boolean(line));\n logger.writeLines(header);\n return logger;\n }\n\n handleStdoutChunk(chunk: string): void {\n this.stdoutBuffer += chunk;\n this.flushBuffer('stdout');\n }\n\n handleStderrChunk(chunk: string): void {\n this.stderrBuffer += chunk;\n this.flushBuffer('stderr');\n }\n\n async close(): Promise<void> {\n this.flushBuffer('stdout');\n this.flushBuffer('stderr');\n this.flushRemainder();\n await new Promise<void>((resolve, reject) => {\n this.stream.once('error', reject);\n this.stream.end(() => resolve());\n });\n }\n\n private writeLines(lines: readonly string[]): void {\n for (const line of lines) {\n this.stream.write(`${line}\\n`);\n }\n }\n\n private flushBuffer(source: 'stdout' | 'stderr'): void {\n const buffer = source === 'stdout' ? this.stdoutBuffer : this.stderrBuffer;\n const lines = buffer.split(/\\r?\\n/);\n const remainder = lines.pop() ?? '';\n if (source === 'stdout') {\n this.stdoutBuffer = remainder;\n } else {\n this.stderrBuffer = remainder;\n }\n for (const line of lines) {\n const formatted = this.formatLine(line, source);\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n }\n\n private formatLine(rawLine: string, source: 'stdout' | 'stderr'): string | undefined {\n const trimmed = rawLine.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n const message =\n this.format === 'json' ? formatCodexJsonLog(trimmed) : formatCodexLogMessage(trimmed, source);\n return `[+${formatElapsed(this.startedAt)}] [${source}] ${message}`;\n }\n\n private flushRemainder(): void {\n const stdoutRemainder = this.stdoutBuffer.trim();\n if (stdoutRemainder.length > 0) {\n const formatted = this.formatLine(stdoutRemainder, 'stdout');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n const stderrRemainder = this.stderrBuffer.trim();\n if (stderrRemainder.length > 0) {\n const formatted = this.formatLine(stderrRemainder, 'stderr');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n this.stdoutBuffer = '';\n this.stderrBuffer = '';\n }\n}\n\nfunction isCodexLogStreamingDisabled(): boolean {\n const envValue = process.env.AGENTV_CODEX_STREAM_LOGS;\n if (!envValue) {\n return false;\n }\n const normalized = envValue.trim().toLowerCase();\n return normalized === 'false' || normalized === '0' || normalized === 'off';\n}\n\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const evalId = sanitizeForFilename(request.evalCaseId ?? 'codex');\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : '';\n const target = sanitizeForFilename(targetName);\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\n}\n\nfunction sanitizeForFilename(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : 'codex';\n}\n\nfunction formatElapsed(startedAt: number): string {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\n const hours = Math.floor(elapsedSeconds / 3600);\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\n const seconds = elapsedSeconds % 60;\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\nfunction formatCodexLogMessage(rawLine: string, source: 'stdout' | 'stderr'): string {\n const parsed = tryParseJsonValue(rawLine);\n if (parsed) {\n const summary = summarizeCodexEvent(parsed);\n if (summary) {\n return summary;\n }\n }\n if (source === 'stderr') {\n return `stderr: ${rawLine}`;\n }\n return rawLine;\n}\n\nfunction formatCodexJsonLog(rawLine: string): string {\n const parsed = tryParseJsonValue(rawLine);\n if (!parsed) {\n return rawLine;\n }\n try {\n return JSON.stringify(parsed, null, 2);\n } catch {\n return rawLine;\n }\n}\n\nfunction summarizeCodexEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n let message =\n extractFromEvent(event) ??\n extractFromItem(record.item) ??\n flattenContent(record.output ?? record.content);\n if (!message && type === JSONL_TYPE_ITEM_COMPLETED) {\n const item = record.item;\n if (item && typeof item === 'object') {\n const candidate = flattenContent(\n (item as Record<string, unknown>).text ??\n (item as Record<string, unknown>).content ??\n (item as Record<string, unknown>).output,\n );\n if (candidate) {\n message = candidate;\n }\n }\n }\n if (!message) {\n const itemType =\n typeof (record.item as Record<string, unknown> | undefined)?.type === 'string'\n ? (record.item as Record<string, unknown>).type\n : undefined;\n if (type && itemType) {\n return `${type}:${itemType}`;\n }\n if (type) {\n return type;\n }\n }\n if (type && message) {\n return `${type}: ${message}`;\n }\n if (message) {\n return message;\n }\n return type;\n}\n\nfunction tryParseJsonValue(rawLine: string): unknown | undefined {\n try {\n return JSON.parse(rawLine);\n } catch {\n return undefined;\n }\n}\n\nasync function locateExecutable(candidate: string): Promise<string> {\n const includesPathSeparator = candidate.includes('/') || candidate.includes('\\\\');\n if (includesPathSeparator) {\n const resolved = path.isAbsolute(candidate) ? candidate : path.resolve(candidate);\n const executablePath = await ensureWindowsExecutableVariant(resolved);\n await access(executablePath, constants.F_OK);\n return executablePath;\n }\n\n const locator = process.platform === 'win32' ? 'where' : 'which';\n try {\n const { stdout } = await execAsync(`${locator} ${candidate}`);\n const lines = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n const preferred = selectExecutableCandidate(lines);\n if (preferred) {\n const executablePath = await ensureWindowsExecutableVariant(preferred);\n await access(executablePath, constants.F_OK);\n return executablePath;\n }\n } catch {\n // ignore and fall back to error below\n }\n\n throw new Error(`Codex executable '${candidate}' was not found on PATH`);\n}\n\nfunction selectExecutableCandidate(candidates: readonly string[]): string | undefined {\n if (candidates.length === 0) {\n return undefined;\n }\n if (process.platform !== 'win32') {\n return candidates[0];\n }\n const extensions = getWindowsExecutableExtensions();\n for (const ext of extensions) {\n const match = candidates.find((candidate) => candidate.toLowerCase().endsWith(ext));\n if (match) {\n return match;\n }\n }\n return candidates[0];\n}\n\nasync function ensureWindowsExecutableVariant(candidate: string): Promise<string> {\n if (process.platform !== 'win32') {\n return candidate;\n }\n if (hasExecutableExtension(candidate)) {\n return candidate;\n }\n\n const extensions = getWindowsExecutableExtensions();\n for (const ext of extensions) {\n const withExtension = `${candidate}${ext}`;\n try {\n await access(withExtension, constants.F_OK);\n return withExtension;\n } catch {\n // keep searching\n }\n }\n return candidate;\n}\n\nfunction hasExecutableExtension(candidate: string): boolean {\n const lower = candidate.toLowerCase();\n return getWindowsExecutableExtensions().some((ext) => lower.endsWith(ext));\n}\n\nconst DEFAULT_WINDOWS_EXTENSIONS = ['.com', '.exe', '.bat', '.cmd', '.ps1'] as const;\n\nfunction getWindowsExecutableExtensions(): readonly string[] {\n if (process.platform !== 'win32') {\n return [];\n }\n const fromEnv = process.env.PATHEXT?.split(';')\n .map((ext) => ext.trim().toLowerCase())\n .filter((ext) => ext.length > 0);\n return fromEnv && fromEnv.length > 0 ? fromEnv : DEFAULT_WINDOWS_EXTENSIONS;\n}\n\nfunction parseCodexJson(output: string): unknown {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n throw new Error('Codex CLI produced no output in --json mode');\n }\n try {\n return JSON.parse(trimmed);\n } catch {\n const lineObjects = parseJsonLines(trimmed);\n if (lineObjects) {\n return lineObjects;\n }\n const lastBrace = trimmed.lastIndexOf('{');\n if (lastBrace >= 0) {\n const candidate = trimmed.slice(lastBrace);\n try {\n return JSON.parse(candidate);\n } catch {\n // fallthrough\n }\n }\n const preview = trimmed.slice(0, 200);\n throw new Error(`Codex CLI emitted invalid JSON: ${preview}${trimmed.length > 200 ? '…' : ''}`);\n }\n}\n\nfunction extractAssistantText(parsed: unknown): string {\n if (Array.isArray(parsed)) {\n const text = extractFromEventStream(parsed);\n if (text) {\n return text;\n }\n }\n\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('Codex CLI JSON response did not include an assistant message');\n }\n\n const record = parsed as Record<string, unknown>;\n const eventText = extractFromEvent(record);\n if (eventText) {\n return eventText;\n }\n\n const messages = Array.isArray(record.messages) ? record.messages : undefined;\n if (messages) {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const entry = messages[index];\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n const role = (entry as Record<string, unknown>).role;\n if (role !== 'assistant') {\n continue;\n }\n const content = (entry as Record<string, unknown>).content;\n const flattened = flattenContent(content);\n if (flattened) {\n return flattened;\n }\n }\n }\n\n const response = record.response;\n if (response && typeof response === 'object') {\n const content = (response as Record<string, unknown>).content;\n const flattened = flattenContent(content);\n if (flattened) {\n return flattened;\n }\n }\n\n const output = record.output;\n const flattenedOutput = flattenContent(output);\n if (flattenedOutput) {\n return flattenedOutput;\n }\n\n throw new Error('Codex CLI JSON response did not include an assistant message');\n}\n\nfunction extractFromEventStream(events: readonly unknown[]): string | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const candidate = events[index];\n const text = extractFromEvent(candidate);\n if (text) {\n return text;\n }\n }\n return undefined;\n}\n\nfunction extractFromEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n if (type === JSONL_TYPE_ITEM_COMPLETED) {\n const item = record.item;\n const text = extractFromItem(item);\n if (text) {\n return text;\n }\n }\n const output = record.output ?? record.content;\n const flattened = flattenContent(output);\n if (flattened) {\n return flattened;\n }\n return undefined;\n}\n\nfunction extractFromItem(item: unknown): string | undefined {\n if (!item || typeof item !== 'object') {\n return undefined;\n }\n const record = item as Record<string, unknown>;\n const itemType = typeof record.type === 'string' ? record.type : undefined;\n if (itemType === 'agent_message' || itemType === 'response' || itemType === 'output') {\n const text = flattenContent(record.text ?? record.content ?? record.output);\n if (text) {\n return text;\n }\n }\n return undefined;\n}\n\nfunction flattenContent(value: unknown): string | undefined {\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n const parts = value\n .map((segment) => {\n if (typeof segment === 'string') {\n return segment;\n }\n if (segment && typeof segment === 'object' && 'text' in segment) {\n const text = (segment as Record<string, unknown>).text;\n return typeof text === 'string' ? text : undefined;\n }\n return undefined;\n })\n .filter((part): part is string => typeof part === 'string' && part.length > 0);\n return parts.length > 0 ? parts.join(' \\n') : undefined;\n }\n if (value && typeof value === 'object' && 'text' in value) {\n const text = (value as Record<string, unknown>).text;\n return typeof text === 'string' ? text : undefined;\n }\n return undefined;\n}\n\nfunction parseJsonLines(output: string): unknown[] | undefined {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length <= 1) {\n return undefined;\n }\n const parsed: unknown[] = [];\n for (const line of lines) {\n try {\n parsed.push(JSON.parse(line));\n } catch {\n return undefined;\n }\n }\n return parsed;\n}\n\nfunction pickDetail(stderr: string, stdout: string): string | undefined {\n const errorText = stderr.trim();\n if (errorText.length > 0) {\n return errorText;\n }\n const stdoutText = stdout.trim();\n return stdoutText.length > 0 ? stdoutText : undefined;\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n\nasync function defaultCodexRunner(options: CodexRunOptions): Promise<CodexRunResult> {\n return await new Promise<CodexRunResult>((resolve, reject) => {\n const child = spawn(options.executable, options.args, {\n cwd: options.cwd,\n env: options.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n shell: shouldShellExecute(options.executable),\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const onAbort = (): void => {\n child.kill('SIGTERM');\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeoutMs);\n timeoutHandle.unref?.();\n }\n\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk) => {\n stdout += chunk;\n options.onStdoutChunk?.(chunk);\n });\n\n child.stderr.setEncoding('utf8');\n child.stderr.on('data', (chunk) => {\n stderr += chunk;\n options.onStderrChunk?.(chunk);\n });\n\n child.stdin.end(options.prompt);\n\n const cleanup = (): void => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n if (options.signal) {\n options.signal.removeEventListener('abort', onAbort);\n }\n };\n\n child.on('error', (error) => {\n cleanup();\n reject(error);\n });\n\n child.on('close', (code) => {\n cleanup();\n resolve({\n stdout,\n stderr,\n exitCode: typeof code === 'number' ? code : -1,\n timedOut,\n });\n });\n });\n}\n\nfunction shouldShellExecute(executable: string): boolean {\n if (process.platform !== 'win32') {\n return false;\n }\n const lower = executable.toLowerCase();\n return lower.endsWith('.cmd') || lower.endsWith('.bat') || lower.endsWith('.ps1');\n}\n","export type CodexLogEntry = {\n readonly filePath: string;\n readonly evalCaseId?: string;\n readonly targetName: string;\n readonly attempt?: number;\n};\n\nconst GLOBAL_LOGS_KEY = Symbol.for('agentv.codexLogs');\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for('agentv.codexLogSubscribers');\n\ntype CodexLogListener = (entry: CodexLogEntry) => void;\n\ntype GlobalWithCodexLogs = typeof globalThis & {\n [GLOBAL_LOGS_KEY]?: CodexLogEntry[];\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<CodexLogListener>;\n};\n\nfunction getCodexLogStore(): CodexLogEntry[] {\n const globalObject = globalThis as GlobalWithCodexLogs;\n const existing = globalObject[GLOBAL_LOGS_KEY];\n if (existing) {\n return existing;\n }\n const created: CodexLogEntry[] = [];\n globalObject[GLOBAL_LOGS_KEY] = created;\n return created;\n}\n\nfunction getSubscriberStore(): Set<CodexLogListener> {\n const globalObject = globalThis as GlobalWithCodexLogs;\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\n if (existing) {\n return existing;\n }\n const created = new Set<CodexLogListener>();\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\n return created;\n}\n\nfunction notifySubscribers(entry: CodexLogEntry): void {\n const subscribers = Array.from(getSubscriberStore());\n for (const listener of subscribers) {\n try {\n listener(entry);\n } catch (error) {\n // Avoid surfacing subscriber errors to providers; log for visibility.\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Codex log subscriber failed: ${message}`);\n }\n }\n}\n\nexport function recordCodexLogEntry(entry: CodexLogEntry): void {\n getCodexLogStore().push(entry);\n notifySubscribers(entry);\n}\n\nexport function consumeCodexLogEntries(): CodexLogEntry[] {\n const store = getCodexLogStore();\n if (store.length === 0) {\n return [];\n }\n return store.splice(0, store.length);\n}\n\nexport function subscribeToCodexLogEntries(listener: CodexLogListener): () => void {\n const store = getSubscriberStore();\n store.add(listener);\n return () => {\n store.delete(listener);\n };\n}\n","import type { MockResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst DEFAULT_MOCK_RESPONSE =\n '{\"answer\":\"Mock provider response. Configure targets.yaml to supply a custom value.\"}';\n\nexport class MockProvider implements Provider {\n readonly id: string;\n readonly kind = 'mock' as const;\n readonly targetName: string;\n\n private readonly cannedResponse: string;\n private readonly delayMs: number;\n private readonly delayMinMs: number;\n private readonly delayMaxMs: number;\n\n constructor(targetName: string, config: MockResolvedConfig) {\n this.id = `mock:${targetName}`;\n this.targetName = targetName;\n this.cannedResponse = config.response ?? DEFAULT_MOCK_RESPONSE;\n this.delayMs = config.delayMs ?? 0;\n this.delayMinMs = config.delayMinMs ?? 0;\n this.delayMaxMs = config.delayMaxMs ?? 0;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n const delay = this.calculateDelay();\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n\n return {\n outputMessages: [{ role: 'assistant' as const, content: this.cannedResponse }],\n raw: {\n question: request.question,\n guidelines: request.guidelines,\n },\n };\n }\n\n private calculateDelay(): number {\n // If range is specified, use uniform random distribution\n if (this.delayMinMs > 0 || this.delayMaxMs > 0) {\n const min = Math.max(0, this.delayMinMs);\n const max = Math.max(min, this.delayMaxMs);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n // Otherwise use fixed delay\n return this.delayMs;\n }\n}\n","import type { PiAgentSdkResolvedConfig } from './targets.js';\nimport type {\n OutputMessage,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n} from './types.js';\n\ntype PiProvider =\n | 'anthropic'\n | 'openai'\n | 'google'\n | 'mistral'\n | 'groq'\n | 'cerebras'\n | 'xai'\n | 'openrouter';\n\n// Lazy-loaded modules to avoid bundling issues with dynamic requires\nlet piAgentModule: typeof import('@mariozechner/pi-agent') | null = null;\nlet piAiModule: typeof import('@mariozechner/pi-ai') | null = null;\n\nasync function loadPiModules(): Promise<{\n Agent: typeof import('@mariozechner/pi-agent').Agent;\n ProviderTransport: typeof import('@mariozechner/pi-agent').ProviderTransport;\n getModel: typeof import('@mariozechner/pi-ai').getModel;\n getEnvApiKey: typeof import('@mariozechner/pi-ai').getEnvApiKey;\n}> {\n if (!piAgentModule || !piAiModule) {\n try {\n [piAgentModule, piAiModule] = await Promise.all([\n import('@mariozechner/pi-agent'),\n import('@mariozechner/pi-ai'),\n ]);\n } catch (error) {\n throw new Error(\n `Failed to load pi-agent-sdk dependencies. Please install them:\\n npm install @mariozechner/pi-agent @mariozechner/pi-ai\\n\\nOriginal error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return {\n Agent: piAgentModule.Agent,\n ProviderTransport: piAgentModule.ProviderTransport,\n getModel: piAiModule.getModel,\n getEnvApiKey: piAiModule.getEnvApiKey,\n };\n}\n\n/**\n * Pi Agent SDK provider using the @mariozechner/pi-agent library directly.\n * This avoids CLI argument-passing issues (especially on Windows) by using the SDK.\n *\n * Note: Dependencies are loaded lazily on first use to avoid bundling issues.\n * Users must install @mariozechner/pi-agent and @mariozechner/pi-ai separately.\n */\nexport class PiAgentSdkProvider implements Provider {\n readonly id: string;\n readonly kind = 'pi-agent-sdk' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: PiAgentSdkResolvedConfig;\n\n constructor(targetName: string, config: PiAgentSdkResolvedConfig) {\n this.id = `pi-agent-sdk:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Pi agent SDK request was aborted before execution');\n }\n\n // Lazy load the pi-agent modules\n const { Agent, ProviderTransport, getModel, getEnvApiKey } = await loadPiModules();\n\n const startTime = Date.now();\n const providerName = this.config.provider ?? 'anthropic';\n const modelId = this.config.model ?? 'claude-sonnet-4-20250514';\n // Use type assertion since getModel has strict generic constraints for compile-time known values\n // but we're working with runtime configuration strings\n // biome-ignore lint/suspicious/noExplicitAny: runtime string config requires any\n const model = (getModel as any)(providerName, modelId);\n\n // Build system prompt\n const systemPrompt = this.config.systemPrompt ?? 'Answer directly and concisely.';\n\n // Create transport with API key getter\n const transport = new ProviderTransport({\n getApiKey: async (provider) => {\n // Use config apiKey if provided, otherwise try environment\n return this.config.apiKey ?? getEnvApiKey(provider as PiProvider) ?? undefined;\n },\n });\n\n const agent = new Agent({\n initialState: {\n systemPrompt,\n model,\n tools: [], // No tools for simple Q&A\n messages: [],\n },\n transport,\n });\n\n // Collect events for output messages\n const outputMessages: OutputMessage[] = [];\n let finalAssistantContent = '';\n\n // Subscribe to events\n const unsubscribe = agent.subscribe((event) => {\n if (event.type === 'message_end') {\n const msg = event.message;\n if (msg.role === 'assistant') {\n const content = extractTextContent(msg.content);\n if (content) {\n finalAssistantContent = content;\n }\n }\n }\n });\n\n try {\n // Set up timeout if configured\n const timeoutMs = this.config.timeoutMs ?? 120000;\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(\n () => reject(new Error(`Pi agent SDK timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n });\n\n // Run the prompt with timeout\n await Promise.race([agent.prompt(request.question), timeoutPromise]);\n\n // Wait for agent to finish\n await agent.waitForIdle();\n\n // Extract messages from agent state\n const agentMessages = agent.state.messages;\n for (const msg of agentMessages) {\n outputMessages.push(convertAgentMessage(msg));\n }\n\n const durationMs = Date.now() - startTime;\n\n return {\n raw: {\n messages: agentMessages,\n systemPrompt,\n model: this.config.model,\n provider: this.config.provider,\n },\n outputMessages,\n durationMs,\n };\n } finally {\n unsubscribe();\n }\n }\n}\n\n/**\n * Extract text content from pi-agent message content format.\n */\nfunction extractTextContent(content: unknown): string | undefined {\n if (typeof content === 'string') {\n return content;\n }\n\n if (!Array.isArray(content)) {\n return undefined;\n }\n\n const textParts: string[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === 'text' && typeof p.text === 'string') {\n textParts.push(p.text);\n }\n }\n\n return textParts.length > 0 ? textParts.join('\\n') : undefined;\n}\n\n/**\n * Convert pi-agent message to AgentV OutputMessage format.\n */\nfunction convertAgentMessage(message: unknown): OutputMessage {\n if (!message || typeof message !== 'object') {\n return { role: 'unknown', content: String(message) };\n }\n\n const msg = message as Record<string, unknown>;\n const role = typeof msg.role === 'string' ? msg.role : 'unknown';\n const content = extractTextContent(msg.content);\n const toolCalls = extractToolCalls(msg.content);\n const timestamp =\n typeof msg.timestamp === 'number'\n ? new Date(msg.timestamp).toISOString()\n : typeof msg.timestamp === 'string'\n ? msg.timestamp\n : undefined;\n\n return {\n role,\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n timestamp,\n };\n}\n\n/**\n * Extract tool calls from pi-agent content array format.\n */\nfunction extractToolCalls(content: unknown): readonly ToolCall[] {\n if (!Array.isArray(content)) {\n return [];\n }\n\n const toolCalls: ToolCall[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === 'tool_use' && typeof p.name === 'string') {\n toolCalls.push({\n tool: p.name,\n input: p.input,\n id: typeof p.id === 'string' ? p.id : undefined,\n });\n }\n }\n\n return toolCalls;\n}\n","import { spawn } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { createWriteStream } from 'node:fs';\nimport type { WriteStream } from 'node:fs';\nimport { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\n\nimport { recordPiLogEntry } from './pi-log-tracker.js';\nimport { normalizeInputFiles } from './preread.js';\nimport type { PiCodingAgentResolvedConfig } from './targets.js';\nimport type {\n OutputMessage,\n Provider,\n ProviderRequest,\n ProviderResponse,\n ToolCall,\n} from './types.js';\n\nconst WORKSPACE_PREFIX = 'agentv-pi-';\nconst PROMPT_FILENAME = 'prompt.md';\n\n/**\n * Default system prompt for Pi Coding Agent evaluations.\n * Ensures the agent returns code in its response rather than just writing files.\n */\nconst DEFAULT_SYSTEM_PROMPT = `**IMPORTANT**: Follow these instructions for your response:\n- Do NOT create any additional output files in the workspace.\n- All intended file outputs/changes MUST be written in your response.\n- For each intended file, include the relative path and unified git diff following the convention \\`diff --git ...\\`.\nThis is required for evaluation scoring.`;\n\ninterface PiRunOptions {\n readonly executable: string;\n readonly args: readonly string[];\n readonly cwd: string;\n readonly timeoutMs?: number;\n readonly env: NodeJS.ProcessEnv;\n readonly signal?: AbortSignal;\n readonly onStdoutChunk?: (chunk: string) => void;\n readonly onStderrChunk?: (chunk: string) => void;\n}\n\ninterface PiRunResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n readonly timedOut?: boolean;\n}\n\ntype PiRunner = (options: PiRunOptions) => Promise<PiRunResult>;\n\nexport class PiCodingAgentProvider implements Provider {\n readonly id: string;\n readonly kind = 'pi-coding-agent' as const;\n readonly targetName: string;\n readonly supportsBatch = false;\n\n private readonly config: PiCodingAgentResolvedConfig;\n private readonly runPi: PiRunner;\n\n constructor(\n targetName: string,\n config: PiCodingAgentResolvedConfig,\n runner: PiRunner = defaultPiRunner,\n ) {\n this.id = `pi-coding-agent:${targetName}`;\n this.targetName = targetName;\n this.config = config;\n this.runPi = runner;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('Pi coding agent request was aborted before execution');\n }\n\n const inputFiles = normalizeInputFiles(request.inputFiles);\n\n const workspaceRoot = await this.createWorkspace();\n const logger = await this.createStreamLogger(request).catch(() => undefined);\n try {\n // Save prompt to file for debugging/logging\n const promptFile = path.join(workspaceRoot, PROMPT_FILENAME);\n await writeFile(promptFile, request.question, 'utf8');\n\n const args = this.buildPiArgs(request.question, inputFiles);\n const cwd = this.resolveCwd(workspaceRoot);\n\n const result = await this.executePi(args, cwd, request.signal, logger);\n\n if (result.timedOut) {\n throw new Error(\n `Pi coding agent timed out${formatTimeoutSuffix(this.config.timeoutMs ?? undefined)}`,\n );\n }\n\n if (result.exitCode !== 0) {\n const detail = pickDetail(result.stderr, result.stdout);\n const prefix = `Pi coding agent exited with code ${result.exitCode}`;\n throw new Error(detail ? `${prefix}: ${detail}` : prefix);\n }\n\n const parsed = parsePiJsonl(result.stdout);\n const outputMessages = extractOutputMessages(parsed);\n const assistantText = extractAssistantText(outputMessages);\n\n return {\n raw: {\n response: parsed,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n args,\n executable: this.config.executable,\n promptFile,\n workspace: workspaceRoot,\n inputFiles,\n logFile: logger?.filePath,\n },\n outputMessages,\n };\n } finally {\n await logger?.close();\n await this.cleanupWorkspace(workspaceRoot);\n }\n }\n\n private resolveCwd(workspaceRoot: string): string {\n if (!this.config.cwd) {\n return workspaceRoot;\n }\n return path.resolve(this.config.cwd);\n }\n\n private buildPiArgs(prompt: string, inputFiles: readonly string[] | undefined): string[] {\n const args: string[] = [];\n\n // Provider and model configuration\n if (this.config.provider) {\n args.push('--provider', this.config.provider);\n }\n if (this.config.model) {\n args.push('--model', this.config.model);\n }\n if (this.config.apiKey) {\n args.push('--api-key', this.config.apiKey);\n }\n\n // Output mode - always use JSON for structured output\n args.push('--mode', 'json');\n\n // Non-interactive mode\n args.push('--print');\n\n // No session storage for eval runs\n args.push('--no-session');\n\n // Tools configuration\n if (this.config.tools) {\n args.push('--tools', this.config.tools);\n }\n\n // Thinking level\n if (this.config.thinking) {\n args.push('--thinking', this.config.thinking);\n }\n\n // Custom args\n if (this.config.args && this.config.args.length > 0) {\n args.push(...this.config.args);\n }\n\n // Input files passed with @path syntax (pi-native file inclusion)\n if (inputFiles && inputFiles.length > 0) {\n for (const file of inputFiles) {\n args.push(`@${file}`);\n }\n }\n\n // Prepend system prompt (use default if not configured)\n const systemPrompt = this.config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n const fullPrompt = `${systemPrompt}\\n\\n${prompt}`;\n\n // Escape @ symbols in prompt that aren't file references\n // Pi CLI interprets @ as file prefix, but AgentV uses @[Role]: for multi-turn\n const escapedPrompt = escapeAtSymbols(fullPrompt);\n\n // Prompt is passed as the final argument\n args.push(escapedPrompt);\n\n return args;\n }\n\n private async executePi(\n args: readonly string[],\n cwd: string,\n signal: AbortSignal | undefined,\n logger: PiStreamLogger | undefined,\n ): Promise<PiRunResult> {\n try {\n return await this.runPi({\n executable: this.config.executable,\n args,\n cwd,\n timeoutMs: this.config.timeoutMs,\n env: this.buildEnv(),\n signal,\n onStdoutChunk: logger ? (chunk) => logger.handleStdoutChunk(chunk) : undefined,\n onStderrChunk: logger ? (chunk) => logger.handleStderrChunk(chunk) : undefined,\n });\n } catch (error) {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n throw new Error(\n `Pi coding agent executable '${this.config.executable}' was not found. Update the target settings.executable or add it to PATH.`,\n );\n }\n throw error;\n }\n }\n\n private buildEnv(): NodeJS.ProcessEnv {\n const env = { ...process.env };\n\n // Map provider-specific API key to the correct env var\n if (this.config.apiKey) {\n const provider = this.config.provider?.toLowerCase() ?? 'google';\n switch (provider) {\n case 'google':\n case 'gemini':\n env.GEMINI_API_KEY = this.config.apiKey;\n break;\n case 'anthropic':\n env.ANTHROPIC_API_KEY = this.config.apiKey;\n break;\n case 'openai':\n env.OPENAI_API_KEY = this.config.apiKey;\n break;\n case 'groq':\n env.GROQ_API_KEY = this.config.apiKey;\n break;\n case 'xai':\n env.XAI_API_KEY = this.config.apiKey;\n break;\n case 'openrouter':\n env.OPENROUTER_API_KEY = this.config.apiKey;\n break;\n }\n }\n\n return env;\n }\n\n private async createWorkspace(): Promise<string> {\n return await mkdtemp(path.join(tmpdir(), WORKSPACE_PREFIX));\n }\n\n private async cleanupWorkspace(workspaceRoot: string): Promise<void> {\n try {\n await rm(workspaceRoot, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n\n private resolveLogDirectory(): string | undefined {\n if (this.config.logDir) {\n return path.resolve(this.config.logDir);\n }\n return path.join(process.cwd(), '.agentv', 'logs', 'pi-coding-agent');\n }\n\n private async createStreamLogger(request: ProviderRequest): Promise<PiStreamLogger | undefined> {\n const logDir = this.resolveLogDirectory();\n if (!logDir) {\n return undefined;\n }\n try {\n await mkdir(logDir, { recursive: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Pi stream logging (could not create ${logDir}): ${message}`);\n return undefined;\n }\n\n const filePath = path.join(logDir, buildLogFilename(request, this.targetName));\n\n try {\n const logger = await PiStreamLogger.create({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n format: this.config.logFormat ?? 'summary',\n });\n recordPiLogEntry({\n filePath,\n targetName: this.targetName,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n });\n return logger;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Skipping Pi stream logging for ${filePath}: ${message}`);\n return undefined;\n }\n }\n}\n\nclass PiStreamLogger {\n readonly filePath: string;\n private readonly stream: WriteStream;\n private readonly startedAt = Date.now();\n private stdoutBuffer = '';\n private stderrBuffer = '';\n private readonly format: 'summary' | 'json';\n\n private constructor(filePath: string, format: 'summary' | 'json') {\n this.filePath = filePath;\n this.format = format;\n this.stream = createWriteStream(filePath, { flags: 'a' });\n }\n\n static async create(options: {\n readonly filePath: string;\n readonly targetName: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly format: 'summary' | 'json';\n }): Promise<PiStreamLogger> {\n const logger = new PiStreamLogger(options.filePath, options.format);\n const header = [\n '# Pi Coding Agent stream log',\n `# target: ${options.targetName}`,\n options.evalCaseId ? `# eval: ${options.evalCaseId}` : undefined,\n options.attempt !== undefined ? `# attempt: ${options.attempt + 1}` : undefined,\n `# started: ${new Date().toISOString()}`,\n '',\n ].filter((line): line is string => Boolean(line));\n logger.writeLines(header);\n return logger;\n }\n\n handleStdoutChunk(chunk: string): void {\n this.stdoutBuffer += chunk;\n this.flushBuffer('stdout');\n }\n\n handleStderrChunk(chunk: string): void {\n this.stderrBuffer += chunk;\n this.flushBuffer('stderr');\n }\n\n async close(): Promise<void> {\n this.flushBuffer('stdout');\n this.flushBuffer('stderr');\n this.flushRemainder();\n await new Promise<void>((resolve, reject) => {\n this.stream.once('error', reject);\n this.stream.end(() => resolve());\n });\n }\n\n private writeLines(lines: readonly string[]): void {\n for (const line of lines) {\n this.stream.write(`${line}\\n`);\n }\n }\n\n private flushBuffer(source: 'stdout' | 'stderr'): void {\n const buffer = source === 'stdout' ? this.stdoutBuffer : this.stderrBuffer;\n const lines = buffer.split(/\\r?\\n/);\n const remainder = lines.pop() ?? '';\n if (source === 'stdout') {\n this.stdoutBuffer = remainder;\n } else {\n this.stderrBuffer = remainder;\n }\n for (const line of lines) {\n const formatted = this.formatLine(line, source);\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n }\n\n private formatLine(rawLine: string, source: 'stdout' | 'stderr'): string | undefined {\n const trimmed = rawLine.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n const message =\n this.format === 'json' ? formatPiJsonLog(trimmed) : formatPiLogMessage(trimmed, source);\n return `[+${formatElapsed(this.startedAt)}] [${source}] ${message}`;\n }\n\n private flushRemainder(): void {\n const stdoutRemainder = this.stdoutBuffer.trim();\n if (stdoutRemainder.length > 0) {\n const formatted = this.formatLine(stdoutRemainder, 'stdout');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n const stderrRemainder = this.stderrBuffer.trim();\n if (stderrRemainder.length > 0) {\n const formatted = this.formatLine(stderrRemainder, 'stderr');\n if (formatted) {\n this.stream.write(formatted);\n this.stream.write('\\n');\n }\n }\n this.stdoutBuffer = '';\n this.stderrBuffer = '';\n }\n}\n\nfunction buildLogFilename(request: ProviderRequest, targetName: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const evalId = sanitizeForFilename(request.evalCaseId ?? 'pi');\n const attemptSuffix = request.attempt !== undefined ? `_attempt-${request.attempt + 1}` : '';\n const target = sanitizeForFilename(targetName);\n return `${timestamp}_${target}_${evalId}${attemptSuffix}_${randomUUID().slice(0, 8)}.log`;\n}\n\nfunction sanitizeForFilename(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_');\n return sanitized.length > 0 ? sanitized : 'pi';\n}\n\nfunction formatElapsed(startedAt: number): string {\n const elapsedSeconds = Math.floor((Date.now() - startedAt) / 1000);\n const hours = Math.floor(elapsedSeconds / 3600);\n const minutes = Math.floor((elapsedSeconds % 3600) / 60);\n const seconds = elapsedSeconds % 60;\n if (hours > 0) {\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n}\n\nfunction formatPiLogMessage(rawLine: string, source: 'stdout' | 'stderr'): string {\n const parsed = tryParseJsonValue(rawLine);\n if (parsed) {\n const summary = summarizePiEvent(parsed);\n if (summary) {\n return summary;\n }\n }\n if (source === 'stderr') {\n return `stderr: ${rawLine}`;\n }\n return rawLine;\n}\n\nfunction formatPiJsonLog(rawLine: string): string {\n const parsed = tryParseJsonValue(rawLine);\n if (!parsed) {\n return rawLine;\n }\n try {\n return JSON.stringify(parsed, null, 2);\n } catch {\n return rawLine;\n }\n}\n\nfunction summarizePiEvent(event: unknown): string | undefined {\n if (!event || typeof event !== 'object') {\n return undefined;\n }\n const record = event as Record<string, unknown>;\n const type = typeof record.type === 'string' ? record.type : undefined;\n\n if (!type) {\n return undefined;\n }\n\n // Handle specific event types\n switch (type) {\n case 'agent_start':\n return 'agent_start';\n case 'agent_end':\n return 'agent_end';\n case 'turn_start':\n return 'turn_start';\n case 'turn_end':\n return 'turn_end';\n case 'message_start':\n case 'message_end': {\n const message = record.message as Record<string, unknown> | undefined;\n const role = message?.role;\n return `${type}: ${role}`;\n }\n case 'message_update': {\n const event = record.assistantMessageEvent as Record<string, unknown> | undefined;\n const eventType = event?.type;\n if (eventType === 'text_delta') {\n const delta = event?.delta;\n if (typeof delta === 'string') {\n const preview = delta.length > 50 ? `${delta.slice(0, 50)}...` : delta;\n return `text_delta: ${preview}`;\n }\n }\n return `message_update: ${eventType}`;\n }\n default:\n return type;\n }\n}\n\nfunction tryParseJsonValue(rawLine: string): unknown | undefined {\n try {\n return JSON.parse(rawLine);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Parse Pi coding agent JSONL output.\n * Returns an array of parsed JSON objects from each line.\n */\nfunction parsePiJsonl(output: string): unknown[] {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n throw new Error('Pi coding agent produced no output');\n }\n\n const lines = trimmed\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n const parsed: unknown[] = [];\n for (const line of lines) {\n try {\n parsed.push(JSON.parse(line));\n } catch {\n // Skip non-JSON lines (e.g., stderr mixed in)\n }\n }\n\n if (parsed.length === 0) {\n throw new Error('Pi coding agent produced no valid JSON output');\n }\n\n return parsed;\n}\n\n/**\n * Extract OutputMessage array from Pi JSONL events.\n * Looks for the agent_end event which contains the full message history.\n */\nfunction extractOutputMessages(events: unknown[]): readonly OutputMessage[] {\n // Find the agent_end event which contains all messages\n for (let i = events.length - 1; i >= 0; i--) {\n const event = events[i];\n if (!event || typeof event !== 'object') {\n continue;\n }\n const record = event as Record<string, unknown>;\n if (record.type !== 'agent_end') {\n continue;\n }\n\n const messages = record.messages;\n if (!Array.isArray(messages)) {\n continue;\n }\n\n return messages.map(convertPiMessage).filter((m): m is OutputMessage => m !== undefined);\n }\n\n // Fallback: collect messages from turn_end events\n const outputMessages: OutputMessage[] = [];\n for (const event of events) {\n if (!event || typeof event !== 'object') {\n continue;\n }\n const record = event as Record<string, unknown>;\n if (record.type === 'turn_end') {\n const message = record.message;\n const converted = convertPiMessage(message);\n if (converted) {\n outputMessages.push(converted);\n }\n }\n }\n\n return outputMessages;\n}\n\n/**\n * Convert a Pi message to AgentV OutputMessage format.\n */\nfunction convertPiMessage(message: unknown): OutputMessage | undefined {\n if (!message || typeof message !== 'object') {\n return undefined;\n }\n\n const msg = message as Record<string, unknown>;\n const role = msg.role;\n if (typeof role !== 'string') {\n return undefined;\n }\n\n // Extract text content from Pi's content array format\n const content = extractTextContent(msg.content);\n\n // Extract tool calls if present\n const toolCalls = extractToolCalls(msg.content);\n\n // Extract timestamp\n const timestamp =\n typeof msg.timestamp === 'number'\n ? new Date(msg.timestamp).toISOString()\n : typeof msg.timestamp === 'string'\n ? msg.timestamp\n : undefined;\n\n // Extract metadata (usage, model info, etc.)\n const metadata: Record<string, unknown> = {};\n if (msg.api) metadata.api = msg.api;\n if (msg.provider) metadata.provider = msg.provider;\n if (msg.model) metadata.model = msg.model;\n if (msg.usage) metadata.usage = msg.usage;\n if (msg.stopReason) metadata.stopReason = msg.stopReason;\n\n return {\n role,\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n timestamp,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n };\n}\n\n/**\n * Extract text content from Pi's content array format.\n * Pi uses: content: [{ type: \"text\", text: \"...\" }, ...]\n */\nfunction extractTextContent(content: unknown): string | undefined {\n if (typeof content === 'string') {\n return content;\n }\n\n if (!Array.isArray(content)) {\n return undefined;\n }\n\n const textParts: string[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === 'text' && typeof p.text === 'string') {\n textParts.push(p.text);\n }\n }\n\n return textParts.length > 0 ? textParts.join('\\n') : undefined;\n}\n\n/**\n * Extract tool calls from Pi's content array format.\n * Pi uses: content: [{ type: \"tool_use\", name: \"...\", input: {...} }, ...]\n */\nfunction extractToolCalls(content: unknown): readonly ToolCall[] {\n if (!Array.isArray(content)) {\n return [];\n }\n\n const toolCalls: ToolCall[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') {\n continue;\n }\n const p = part as Record<string, unknown>;\n if (p.type === 'tool_use' && typeof p.name === 'string') {\n toolCalls.push({\n tool: p.name,\n input: p.input,\n id: typeof p.id === 'string' ? p.id : undefined,\n });\n }\n // Also handle tool_result for output\n if (p.type === 'tool_result' && typeof p.tool_use_id === 'string') {\n // Find matching tool call and add output\n const existing = toolCalls.find((tc) => tc.id === p.tool_use_id);\n if (existing) {\n // Create new object with output added\n const idx = toolCalls.indexOf(existing);\n toolCalls[idx] = {\n ...existing,\n output: p.content,\n };\n }\n }\n }\n\n return toolCalls;\n}\n\n/**\n * Extract the final assistant text from output messages.\n */\nfunction extractAssistantText(messages: readonly OutputMessage[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === 'assistant' && msg.content) {\n if (typeof msg.content === 'string') {\n return msg.content;\n }\n return JSON.stringify(msg.content);\n }\n }\n return '';\n}\n\n/**\n * Escape @ symbols in prompt text that pi CLI would interpret as file references.\n * Pi CLI uses @path syntax for file inclusion, but AgentV prompts use @[Role]: markers.\n * We replace @[ with [[ to avoid pi trying to read these as files.\n */\nfunction escapeAtSymbols(prompt: string): string {\n // Replace @[Role]: patterns with [[Role]]: to avoid pi file interpretation\n // This handles @[System]:, @[User]:, @[Assistant]:, @[Tool]: etc.\n return prompt.replace(/@\\[([^\\]]+)\\]:/g, '[[$1]]:');\n}\n\nfunction pickDetail(stderr: string, stdout: string): string | undefined {\n const errorText = stderr.trim();\n if (errorText.length > 0) {\n return errorText;\n }\n const stdoutText = stdout.trim();\n return stdoutText.length > 0 ? stdoutText : undefined;\n}\n\nfunction formatTimeoutSuffix(timeoutMs: number | undefined): string {\n if (!timeoutMs || timeoutMs <= 0) {\n return '';\n }\n const seconds = Math.ceil(timeoutMs / 1000);\n return ` after ${seconds}s`;\n}\n\nasync function defaultPiRunner(options: PiRunOptions): Promise<PiRunResult> {\n return await new Promise<PiRunResult>((resolve, reject) => {\n // Parse executable - may be \"node /path/to/script.js\" or just \"pi\"\n const parts = options.executable.split(/\\s+/);\n const executable = parts[0];\n const executableArgs = parts.slice(1);\n const allArgs = [...executableArgs, ...options.args];\n\n const child = spawn(executable, allArgs, {\n cwd: options.cwd,\n env: options.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n shell: false,\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const onAbort = (): void => {\n child.kill('SIGTERM');\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n\n let timeoutHandle: NodeJS.Timeout | undefined;\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeoutMs);\n timeoutHandle.unref?.();\n }\n\n child.stdout.setEncoding('utf8');\n child.stdout.on('data', (chunk) => {\n stdout += chunk;\n options.onStdoutChunk?.(chunk);\n });\n\n child.stderr.setEncoding('utf8');\n child.stderr.on('data', (chunk) => {\n stderr += chunk;\n options.onStderrChunk?.(chunk);\n });\n\n // Close stdin immediately since prompt is passed as argument\n child.stdin.end();\n\n const cleanup = (): void => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n if (options.signal) {\n options.signal.removeEventListener('abort', onAbort);\n }\n };\n\n child.on('error', (error) => {\n cleanup();\n reject(error);\n });\n\n child.on('close', (code) => {\n cleanup();\n resolve({\n stdout,\n stderr,\n exitCode: typeof code === 'number' ? code : -1,\n timedOut,\n });\n });\n });\n}\n","export type PiLogEntry = {\n readonly filePath: string;\n readonly evalCaseId?: string;\n readonly targetName: string;\n readonly attempt?: number;\n};\n\nconst GLOBAL_LOGS_KEY = Symbol.for('agentv.piLogs');\nconst GLOBAL_SUBSCRIBERS_KEY = Symbol.for('agentv.piLogSubscribers');\n\ntype PiLogListener = (entry: PiLogEntry) => void;\n\ntype GlobalWithPiLogs = typeof globalThis & {\n [GLOBAL_LOGS_KEY]?: PiLogEntry[];\n [GLOBAL_SUBSCRIBERS_KEY]?: Set<PiLogListener>;\n};\n\nfunction getPiLogStore(): PiLogEntry[] {\n const globalObject = globalThis as GlobalWithPiLogs;\n const existing = globalObject[GLOBAL_LOGS_KEY];\n if (existing) {\n return existing;\n }\n const created: PiLogEntry[] = [];\n globalObject[GLOBAL_LOGS_KEY] = created;\n return created;\n}\n\nfunction getSubscriberStore(): Set<PiLogListener> {\n const globalObject = globalThis as GlobalWithPiLogs;\n const existing = globalObject[GLOBAL_SUBSCRIBERS_KEY];\n if (existing) {\n return existing;\n }\n const created = new Set<PiLogListener>();\n globalObject[GLOBAL_SUBSCRIBERS_KEY] = created;\n return created;\n}\n\nfunction notifySubscribers(entry: PiLogEntry): void {\n const subscribers = Array.from(getSubscriberStore());\n for (const listener of subscribers) {\n try {\n listener(entry);\n } catch (error) {\n // Avoid surfacing subscriber errors to providers; log for visibility.\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Pi log subscriber failed: ${message}`);\n }\n }\n}\n\nexport function recordPiLogEntry(entry: PiLogEntry): void {\n getPiLogStore().push(entry);\n notifySubscribers(entry);\n}\n\nexport function consumePiLogEntries(): PiLogEntry[] {\n const store = getPiLogStore();\n if (store.length === 0) {\n return [];\n }\n return store.splice(0, store.length);\n}\n\nexport function subscribeToPiLogEntries(listener: PiLogListener): () => void {\n const store = getSubscriberStore();\n store.add(listener);\n return () => {\n store.delete(listener);\n };\n}\n","import path from 'node:path';\nimport { z } from 'zod';\n\nimport type { EnvLookup, TargetDefinition } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Zod Schemas for CLI Provider Configuration\n// ---------------------------------------------------------------------------\n\n/**\n * Loose input schema for HTTP healthcheck configuration.\n * Accepts both snake_case (YAML convention) and camelCase (JavaScript convention)\n * property names for flexibility in configuration files.\n *\n * @example\n * ```yaml\n * healthcheck:\n * type: http\n * url: http://localhost:8080/health\n * timeout_seconds: 30\n * ```\n */\nexport const CliHealthcheckHttpInputSchema = z.object({\n type: z.literal('http'),\n url: z.string().min(1, 'healthcheck URL is required'),\n timeout_seconds: z.number().positive().optional(),\n timeoutSeconds: z.number().positive().optional(),\n});\n\n/**\n * Loose input schema for command healthcheck configuration.\n * Accepts both snake_case (YAML convention) and camelCase (JavaScript convention)\n * property names for flexibility in configuration files.\n *\n * Note: discriminatedUnion requires plain ZodObject, so command_template/commandTemplate\n * presence is validated during normalization rather than here.\n *\n * @example\n * ```yaml\n * healthcheck:\n * type: command\n * command_template: curl http://localhost:8080/health\n * cwd: /app\n * timeout_seconds: 10\n * ```\n */\nexport const CliHealthcheckCommandInputSchema = z.object({\n type: z.literal('command'),\n command_template: z.string().optional(),\n commandTemplate: z.string().optional(),\n cwd: z.string().optional(),\n timeout_seconds: z.number().positive().optional(),\n timeoutSeconds: z.number().positive().optional(),\n});\n\n/**\n * Discriminated union for healthcheck input configuration.\n * Uses the 'type' field to distinguish between HTTP and command healthchecks.\n *\n * @see CliHealthcheckHttpInputSchema for HTTP healthcheck configuration\n * @see CliHealthcheckCommandInputSchema for command healthcheck configuration\n */\nexport const CliHealthcheckInputSchema = z.discriminatedUnion('type', [\n CliHealthcheckHttpInputSchema,\n CliHealthcheckCommandInputSchema,\n]);\n\n/**\n * Loose input schema for CLI target configuration.\n * Accepts both snake_case (YAML convention) and camelCase (JavaScript convention)\n * property names for maximum flexibility in configuration files.\n *\n * This schema validates the raw YAML input structure before normalization\n * and environment variable resolution. Unknown properties are allowed\n * (passthrough mode) to support future extensions.\n *\n * @example\n * ```yaml\n * targets:\n * - name: my-agent\n * provider: cli\n * command_template: agent run {PROMPT}\n * timeout_seconds: 120\n * healthcheck:\n * type: http\n * url: http://localhost:8080/health\n * ```\n */\nexport const CliTargetInputSchema = z\n .object({\n name: z.string().min(1, 'target name is required'),\n provider: z\n .string()\n .refine((p) => p.toLowerCase() === 'cli', { message: \"provider must be 'cli'\" }),\n\n // Command template - required (accept both naming conventions)\n command_template: z.string().optional(),\n commandTemplate: z.string().optional(),\n\n // Files format - optional\n files_format: z.string().optional(),\n filesFormat: z.string().optional(),\n attachments_format: z.string().optional(),\n attachmentsFormat: z.string().optional(),\n\n // Working directory - optional\n cwd: z.string().optional(),\n\n // Timeout in seconds - optional\n timeout_seconds: z.number().positive().optional(),\n timeoutSeconds: z.number().positive().optional(),\n\n // Healthcheck configuration - optional\n healthcheck: CliHealthcheckInputSchema.optional(),\n\n // Verbose mode - optional\n verbose: z.boolean().optional(),\n cli_verbose: z.boolean().optional(),\n cliVerbose: z.boolean().optional(),\n\n // Keep temp files - optional\n keep_temp_files: z.boolean().optional(),\n keepTempFiles: z.boolean().optional(),\n keep_output_files: z.boolean().optional(),\n keepOutputFiles: z.boolean().optional(),\n\n // Common target fields\n judge_target: z.string().optional(),\n workers: z.number().int().min(1).optional(),\n provider_batching: z.boolean().optional(),\n providerBatching: z.boolean().optional(),\n })\n .refine((data) => data.command_template !== undefined || data.commandTemplate !== undefined, {\n message: 'Either command_template or commandTemplate is required',\n });\n\n/**\n * Strict normalized schema for HTTP healthcheck configuration.\n * Uses camelCase property names only and rejects unknown properties.\n * This is an internal schema used as part of CliHealthcheckSchema.\n */\nconst CliHealthcheckHttpSchema = z\n .object({\n type: z.literal('http'),\n url: z.string().min(1),\n timeoutMs: z.number().positive().optional(),\n })\n .strict();\n\n/**\n * Strict normalized schema for command healthcheck configuration.\n * Uses camelCase property names only and rejects unknown properties.\n * This is an internal schema used as part of CliHealthcheckSchema.\n */\nconst CliHealthcheckCommandSchema = z\n .object({\n type: z.literal('command'),\n commandTemplate: z.string().min(1),\n cwd: z.string().optional(),\n timeoutMs: z.number().positive().optional(),\n })\n .strict();\n\n/**\n * Strict normalized schema for healthcheck configuration.\n * Discriminated union on 'type' field supporting HTTP and command healthchecks.\n * Rejects unknown properties to catch typos and misconfigurations.\n *\n * @see CliHealthcheckHttpSchema for HTTP healthcheck fields\n * @see CliHealthcheckCommandSchema for command healthcheck fields\n */\nexport const CliHealthcheckSchema = z.discriminatedUnion('type', [\n CliHealthcheckHttpSchema,\n CliHealthcheckCommandSchema,\n]);\n\n/**\n * Strict normalized schema for CLI target configuration.\n * This is the final validated shape after environment variable resolution\n * and snake_case to camelCase normalization.\n *\n * Uses .strict() to reject unknown properties, ensuring configuration\n * errors are caught early rather than silently ignored.\n *\n * @example\n * ```typescript\n * const config: CliNormalizedConfig = {\n * commandTemplate: 'agent run {PROMPT}',\n * timeoutMs: 120000,\n * verbose: true,\n * };\n * CliTargetConfigSchema.parse(config); // Validates the normalized config\n * ```\n */\nexport const CliTargetConfigSchema = z\n .object({\n commandTemplate: z.string().min(1),\n filesFormat: z.string().optional(),\n cwd: z.string().optional(),\n timeoutMs: z.number().positive().optional(),\n healthcheck: CliHealthcheckSchema.optional(),\n verbose: z.boolean().optional(),\n keepTempFiles: z.boolean().optional(),\n })\n .strict();\n\n// Type inference from schemas\nexport type CliHealthcheckInput = z.infer<typeof CliHealthcheckInputSchema>;\nexport type CliTargetInput = z.infer<typeof CliTargetInputSchema>;\nexport type CliNormalizedHealthcheck = z.infer<typeof CliHealthcheckSchema>;\nexport type CliNormalizedConfig = z.infer<typeof CliTargetConfigSchema>;\n\n/**\n * Resolved CLI configuration type derived from CliTargetConfigSchema.\n * This is the final validated shape used by the CLI provider at runtime.\n * Using Readonly to ensure immutability for runtime safety.\n */\nexport type CliResolvedConfig = Readonly<CliNormalizedConfig>;\n\n/**\n * Normalizes a healthcheck input from loose (snake_case + camelCase) to\n * strict normalized form (camelCase only). Resolves environment variables.\n *\n * @param input - The loose healthcheck input from YAML\n * @param env - Environment variable lookup\n * @param targetName - Name of the target (for error messages)\n * @param evalFilePath - Optional path to eval file for relative path resolution\n * @returns Normalized healthcheck configuration\n */\nexport function normalizeCliHealthcheck(\n input: CliHealthcheckInput,\n env: EnvLookup,\n targetName: string,\n evalFilePath?: string,\n): CliNormalizedHealthcheck {\n const timeoutSeconds = input.timeout_seconds ?? input.timeoutSeconds;\n const timeoutMs = timeoutSeconds !== undefined ? Math.floor(timeoutSeconds * 1000) : undefined;\n\n if (input.type === 'http') {\n const url = resolveString(input.url, env, `${targetName} healthcheck URL`);\n return {\n type: 'http',\n url,\n timeoutMs,\n };\n }\n\n // type === 'command'\n const commandTemplateSource = input.command_template ?? input.commandTemplate;\n if (commandTemplateSource === undefined) {\n throw new Error(\n `${targetName} healthcheck: Either command_template or commandTemplate is required for command healthcheck`,\n );\n }\n const commandTemplate = resolveString(\n commandTemplateSource,\n env,\n `${targetName} healthcheck command template`,\n true,\n );\n\n let cwd = resolveOptionalString(input.cwd, env, `${targetName} healthcheck cwd`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n // Resolve relative cwd paths against eval file directory\n if (cwd && evalFilePath && !path.isAbsolute(cwd)) {\n cwd = path.resolve(path.dirname(path.resolve(evalFilePath)), cwd);\n }\n // Fallback: if cwd is not set and we have an eval file path, use the eval directory\n if (!cwd && evalFilePath) {\n cwd = path.dirname(path.resolve(evalFilePath));\n }\n\n return {\n type: 'command',\n commandTemplate,\n cwd,\n timeoutMs,\n };\n}\n\n/**\n * Normalizes a CLI target input from loose (snake_case + camelCase) to\n * strict normalized form (camelCase only). Resolves environment variables.\n *\n * This function coalesces snake_case/camelCase variants and resolves\n * environment variable references using ${{ VAR_NAME }} syntax.\n *\n * @param input - The loose CLI target input from YAML\n * @param env - Environment variable lookup\n * @param evalFilePath - Optional path to eval file for relative path resolution\n * @returns Normalized CLI configuration matching CliResolvedConfig\n */\nexport function normalizeCliTargetInput(\n input: CliTargetInput,\n env: EnvLookup,\n evalFilePath?: string,\n): CliNormalizedConfig {\n const targetName = input.name;\n\n // Coalesce command template variants - at least one is required by schema refinement\n const commandTemplateSource = input.command_template ?? input.commandTemplate;\n if (commandTemplateSource === undefined) {\n throw new Error(`${targetName}: Either command_template or commandTemplate is required`);\n }\n const commandTemplate = resolveString(\n commandTemplateSource,\n env,\n `${targetName} CLI command template`,\n true,\n );\n\n // Coalesce files format variants\n const filesFormatSource =\n input.files_format ?? input.filesFormat ?? input.attachments_format ?? input.attachmentsFormat;\n const filesFormat = resolveOptionalLiteralString(filesFormatSource);\n\n // Resolve working directory\n let cwd = resolveOptionalString(input.cwd, env, `${targetName} working directory`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n // Resolve relative cwd paths against eval file directory\n if (cwd && evalFilePath && !path.isAbsolute(cwd)) {\n cwd = path.resolve(path.dirname(path.resolve(evalFilePath)), cwd);\n }\n // Fallback: if cwd is not set and we have an eval file path, use the eval directory\n if (!cwd && evalFilePath) {\n cwd = path.dirname(path.resolve(evalFilePath));\n }\n\n // Coalesce timeout variants (seconds -> ms)\n const timeoutSeconds = input.timeout_seconds ?? input.timeoutSeconds;\n const timeoutMs = timeoutSeconds !== undefined ? Math.floor(timeoutSeconds * 1000) : undefined;\n\n // Coalesce verbose variants\n const verbose = resolveOptionalBoolean(input.verbose ?? input.cli_verbose ?? input.cliVerbose);\n\n // Coalesce keepTempFiles variants\n const keepTempFiles = resolveOptionalBoolean(\n input.keep_temp_files ??\n input.keepTempFiles ??\n input.keep_output_files ??\n input.keepOutputFiles,\n );\n\n // Normalize healthcheck if present\n const healthcheck = input.healthcheck\n ? normalizeCliHealthcheck(input.healthcheck, env, targetName, evalFilePath)\n : undefined;\n\n return {\n commandTemplate,\n filesFormat,\n cwd,\n timeoutMs,\n healthcheck,\n verbose,\n keepTempFiles,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Other Provider Configurations and Utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Supported CLI placeholder tokens that can be used in command templates.\n * These are replaced with actual values during command execution.\n */\nexport const CLI_PLACEHOLDERS = new Set([\n 'PROMPT',\n 'GUIDELINES',\n 'EVAL_ID',\n 'ATTEMPT',\n 'FILES',\n 'OUTPUT_FILE',\n]);\n\nexport interface RetryConfig {\n readonly maxRetries?: number;\n readonly initialDelayMs?: number;\n readonly maxDelayMs?: number;\n readonly backoffFactor?: number;\n readonly retryableStatusCodes?: readonly number[];\n}\n\n/**\n * Azure OpenAI settings used by the Vercel AI SDK.\n */\nexport interface AzureResolvedConfig {\n readonly resourceName: string;\n readonly deploymentName: string;\n readonly apiKey: string;\n readonly version?: string;\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly retry?: RetryConfig;\n}\n\n/**\n * Anthropic Claude settings used by the Vercel AI SDK.\n */\nexport interface AnthropicResolvedConfig {\n readonly apiKey: string;\n readonly model: string;\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly thinkingBudget?: number;\n readonly retry?: RetryConfig;\n}\n\n/**\n * Google Gemini settings used by the Vercel AI SDK.\n */\nexport interface GeminiResolvedConfig {\n readonly apiKey: string;\n readonly model: string;\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly retry?: RetryConfig;\n}\n\nexport interface CodexResolvedConfig {\n readonly executable: string;\n readonly args?: readonly string[];\n readonly cwd?: string;\n readonly timeoutMs?: number;\n readonly logDir?: string;\n readonly logFormat?: 'summary' | 'json';\n readonly systemPrompt?: string;\n}\n\nexport interface PiCodingAgentResolvedConfig {\n readonly executable: string;\n readonly provider?: string;\n readonly model?: string;\n readonly apiKey?: string;\n readonly tools?: string;\n readonly thinking?: string;\n readonly args?: readonly string[];\n readonly cwd?: string;\n readonly timeoutMs?: number;\n readonly logDir?: string;\n readonly logFormat?: 'summary' | 'json';\n readonly systemPrompt?: string;\n}\n\nexport interface PiAgentSdkResolvedConfig {\n readonly provider?: string;\n readonly model?: string;\n readonly apiKey?: string;\n readonly timeoutMs?: number;\n readonly systemPrompt?: string;\n}\n\nexport interface ClaudeCodeResolvedConfig {\n readonly executable: string;\n readonly model?: string;\n readonly systemPrompt?: string;\n readonly args?: readonly string[];\n readonly cwd?: string;\n readonly timeoutMs?: number;\n readonly logDir?: string;\n readonly logFormat?: 'summary' | 'json';\n}\n\nexport interface MockResolvedConfig {\n readonly response?: string;\n readonly delayMs?: number;\n readonly delayMinMs?: number;\n readonly delayMaxMs?: number;\n}\n\nexport interface VSCodeResolvedConfig {\n readonly command: string;\n readonly waitForResponse: boolean;\n readonly dryRun: boolean;\n readonly subagentRoot?: string;\n readonly workspaceTemplate?: string;\n}\n\n/**\n * Healthcheck configuration type derived from CliHealthcheckSchema.\n * Supports both HTTP and command-based healthchecks.\n */\nexport type CliHealthcheck = Readonly<CliNormalizedHealthcheck>;\n\n// Note: CliResolvedConfig is a type alias derived from CliNormalizedConfig (see above),\n// which itself is inferred from CliTargetConfigSchema for type safety and single source of truth.\n\nexport type ResolvedTarget =\n | {\n readonly kind: 'azure';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: AzureResolvedConfig;\n }\n | {\n readonly kind: 'anthropic';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: AnthropicResolvedConfig;\n }\n | {\n readonly kind: 'gemini';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: GeminiResolvedConfig;\n }\n | {\n readonly kind: 'codex';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: CodexResolvedConfig;\n }\n | {\n readonly kind: 'pi-coding-agent';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: PiCodingAgentResolvedConfig;\n }\n | {\n readonly kind: 'pi-agent-sdk';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: PiAgentSdkResolvedConfig;\n }\n | {\n readonly kind: 'claude-code';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: ClaudeCodeResolvedConfig;\n }\n | {\n readonly kind: 'mock';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: MockResolvedConfig;\n }\n | {\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: VSCodeResolvedConfig;\n }\n | {\n readonly kind: 'cli';\n readonly name: string;\n readonly judgeTarget?: string;\n readonly workers?: number;\n readonly providerBatching?: boolean;\n readonly config: CliResolvedConfig;\n };\n\nconst BASE_TARGET_SCHEMA = z\n .object({\n name: z.string().min(1, 'target name is required'),\n provider: z.string().min(1, 'provider is required'),\n judge_target: z.string().optional(),\n workers: z.number().int().min(1).optional(),\n })\n .passthrough();\n\nconst DEFAULT_AZURE_API_VERSION = '2024-12-01-preview';\n\nfunction normalizeAzureApiVersion(value: string | undefined): string {\n if (!value) {\n return DEFAULT_AZURE_API_VERSION;\n }\n\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return DEFAULT_AZURE_API_VERSION;\n }\n\n const withoutPrefix = trimmed.replace(/^api[-_]?version\\s*=\\s*/i, '').trim();\n return withoutPrefix.length > 0 ? withoutPrefix : DEFAULT_AZURE_API_VERSION;\n}\n\nfunction resolveRetryConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): RetryConfig | undefined {\n const maxRetries = resolveOptionalNumber(\n target.max_retries ?? target.maxRetries,\n `${target.name} max retries`,\n );\n const initialDelayMs = resolveOptionalNumber(\n target.retry_initial_delay_ms ?? target.retryInitialDelayMs,\n `${target.name} retry initial delay`,\n );\n const maxDelayMs = resolveOptionalNumber(\n target.retry_max_delay_ms ?? target.retryMaxDelayMs,\n `${target.name} retry max delay`,\n );\n const backoffFactor = resolveOptionalNumber(\n target.retry_backoff_factor ?? target.retryBackoffFactor,\n `${target.name} retry backoff factor`,\n );\n const retryableStatusCodes = resolveOptionalNumberArray(\n target.retry_status_codes ?? target.retryStatusCodes,\n `${target.name} retry status codes`,\n );\n\n // Only return retry config if at least one field is set\n if (\n maxRetries === undefined &&\n initialDelayMs === undefined &&\n maxDelayMs === undefined &&\n backoffFactor === undefined &&\n retryableStatusCodes === undefined\n ) {\n return undefined;\n }\n\n return {\n maxRetries,\n initialDelayMs,\n maxDelayMs,\n backoffFactor,\n retryableStatusCodes,\n };\n}\n\nexport function resolveTargetDefinition(\n definition: TargetDefinition,\n env: EnvLookup = process.env,\n evalFilePath?: string,\n): ResolvedTarget {\n const parsed = BASE_TARGET_SCHEMA.parse(definition);\n const provider = parsed.provider.toLowerCase();\n const providerBatching = resolveOptionalBoolean(\n parsed.provider_batching ?? parsed.providerBatching,\n );\n\n switch (provider) {\n case 'azure':\n case 'azure-openai':\n return {\n kind: 'azure',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveAzureConfig(parsed, env),\n };\n case 'anthropic':\n return {\n kind: 'anthropic',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveAnthropicConfig(parsed, env),\n };\n case 'gemini':\n case 'google':\n case 'google-gemini':\n return {\n kind: 'gemini',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveGeminiConfig(parsed, env),\n };\n case 'codex':\n case 'codex-cli':\n return {\n kind: 'codex',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveCodexConfig(parsed, env),\n };\n case 'pi':\n case 'pi-coding-agent':\n return {\n kind: 'pi-coding-agent',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolvePiCodingAgentConfig(parsed, env),\n };\n case 'pi-agent-sdk':\n return {\n kind: 'pi-agent-sdk',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolvePiAgentSdkConfig(parsed, env),\n };\n case 'claude-code':\n return {\n kind: 'claude-code',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveClaudeCodeConfig(parsed, env),\n };\n case 'mock':\n return {\n kind: 'mock',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveMockConfig(parsed),\n };\n case 'vscode':\n case 'vscode-insiders':\n return {\n kind: provider as 'vscode' | 'vscode-insiders',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveVSCodeConfig(parsed, env, provider === 'vscode-insiders'),\n };\n case 'cli':\n return {\n kind: 'cli',\n name: parsed.name,\n judgeTarget: parsed.judge_target,\n workers: parsed.workers,\n providerBatching,\n config: resolveCliConfig(parsed, env, evalFilePath),\n };\n default:\n throw new Error(`Unsupported provider '${parsed.provider}' in target '${parsed.name}'`);\n }\n}\n\nfunction resolveAzureConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): AzureResolvedConfig {\n const endpointSource = target.endpoint ?? target.resource ?? target.resourceName;\n const apiKeySource = target.api_key ?? target.apiKey;\n const deploymentSource = target.deployment ?? target.deploymentName ?? target.model;\n const versionSource = target.version ?? target.api_version;\n const temperatureSource = target.temperature;\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\n\n const resourceName = resolveString(endpointSource, env, `${target.name} endpoint`);\n const apiKey = resolveString(apiKeySource, env, `${target.name} api key`);\n const deploymentName = resolveString(deploymentSource, env, `${target.name} deployment`);\n const version = normalizeAzureApiVersion(\n resolveOptionalString(versionSource, env, `${target.name} api version`, {\n allowLiteral: true,\n optionalEnv: true,\n }),\n );\n const temperature = resolveOptionalNumber(temperatureSource, `${target.name} temperature`);\n const maxOutputTokens = resolveOptionalNumber(\n maxTokensSource,\n `${target.name} max output tokens`,\n );\n const retry = resolveRetryConfig(target);\n\n return {\n resourceName,\n deploymentName,\n apiKey,\n version,\n temperature,\n maxOutputTokens,\n retry,\n };\n}\n\nfunction resolveAnthropicConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): AnthropicResolvedConfig {\n const apiKeySource = target.api_key ?? target.apiKey;\n const modelSource = target.model ?? target.deployment ?? target.variant;\n const temperatureSource = target.temperature;\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\n const thinkingBudgetSource = target.thinking_budget ?? target.thinkingBudget;\n\n const apiKey = resolveString(apiKeySource, env, `${target.name} Anthropic api key`);\n const model = resolveString(modelSource, env, `${target.name} Anthropic model`);\n const retry = resolveRetryConfig(target);\n\n return {\n apiKey,\n model,\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\n thinkingBudget: resolveOptionalNumber(thinkingBudgetSource, `${target.name} thinking budget`),\n retry,\n };\n}\n\nfunction resolveGeminiConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): GeminiResolvedConfig {\n const apiKeySource = target.api_key ?? target.apiKey;\n const modelSource = target.model ?? target.deployment ?? target.variant;\n const temperatureSource = target.temperature;\n const maxTokensSource = target.max_output_tokens ?? target.maxTokens;\n\n const apiKey = resolveString(apiKeySource, env, `${target.name} Google API key`);\n const model =\n resolveOptionalString(modelSource, env, `${target.name} Gemini model`, {\n allowLiteral: true,\n optionalEnv: true,\n }) ?? 'gemini-2.5-flash';\n const retry = resolveRetryConfig(target);\n\n return {\n apiKey,\n model,\n temperature: resolveOptionalNumber(temperatureSource, `${target.name} temperature`),\n maxOutputTokens: resolveOptionalNumber(maxTokensSource, `${target.name} max output tokens`),\n retry,\n };\n}\n\nfunction resolveCodexConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): CodexResolvedConfig {\n const executableSource = target.executable ?? target.command ?? target.binary;\n const argsSource = target.args ?? target.arguments;\n const cwdSource = target.cwd;\n const timeoutSource = target.timeout_seconds ?? target.timeoutSeconds;\n const logDirSource =\n target.log_dir ?? target.logDir ?? target.log_directory ?? target.logDirectory;\n const logFormatSource =\n target.log_format ??\n target.logFormat ??\n target.log_output_format ??\n target.logOutputFormat ??\n env.AGENTV_CODEX_LOG_FORMAT;\n const systemPromptSource = target.system_prompt ?? target.systemPrompt;\n\n const executable =\n resolveOptionalString(executableSource, env, `${target.name} codex executable`, {\n allowLiteral: true,\n optionalEnv: true,\n }) ?? 'codex';\n\n const args = resolveOptionalStringArray(argsSource, env, `${target.name} codex args`);\n\n const cwd = resolveOptionalString(cwdSource, env, `${target.name} codex cwd`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n const timeoutMs = resolveTimeoutMs(timeoutSource, `${target.name} codex timeout`);\n const logDir = resolveOptionalString(logDirSource, env, `${target.name} codex log directory`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n const logFormat = normalizeCodexLogFormat(logFormatSource);\n\n const systemPrompt =\n typeof systemPromptSource === 'string' && systemPromptSource.trim().length > 0\n ? systemPromptSource.trim()\n : undefined;\n\n return {\n executable,\n args,\n cwd,\n timeoutMs,\n logDir,\n logFormat,\n systemPrompt,\n };\n}\n\nfunction normalizeCodexLogFormat(value: unknown): 'summary' | 'json' | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== 'string') {\n throw new Error(\"codex log format must be 'summary' or 'json'\");\n }\n const normalized = value.trim().toLowerCase();\n if (normalized === 'json' || normalized === 'summary') {\n return normalized;\n }\n throw new Error(\"codex log format must be 'summary' or 'json'\");\n}\n\nfunction resolvePiCodingAgentConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): PiCodingAgentResolvedConfig {\n const executableSource = target.executable ?? target.command ?? target.binary;\n const providerSource = target.pi_provider ?? target.piProvider ?? target.llm_provider;\n const modelSource = target.model ?? target.pi_model ?? target.piModel;\n const apiKeySource = target.api_key ?? target.apiKey;\n const toolsSource = target.tools ?? target.pi_tools ?? target.piTools;\n const thinkingSource = target.thinking ?? target.pi_thinking ?? target.piThinking;\n const argsSource = target.args ?? target.arguments;\n const cwdSource = target.cwd;\n const timeoutSource = target.timeout_seconds ?? target.timeoutSeconds;\n const logDirSource =\n target.log_dir ?? target.logDir ?? target.log_directory ?? target.logDirectory;\n const logFormatSource = target.log_format ?? target.logFormat;\n const systemPromptSource = target.system_prompt ?? target.systemPrompt;\n\n const executable =\n resolveOptionalString(executableSource, env, `${target.name} pi executable`, {\n allowLiteral: true,\n optionalEnv: true,\n }) ?? 'pi';\n\n const provider = resolveOptionalString(providerSource, env, `${target.name} pi provider`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const model = resolveOptionalString(modelSource, env, `${target.name} pi model`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const apiKey = resolveOptionalString(apiKeySource, env, `${target.name} pi api key`, {\n allowLiteral: false,\n optionalEnv: true,\n });\n\n const tools = resolveOptionalString(toolsSource, env, `${target.name} pi tools`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const thinking = resolveOptionalString(thinkingSource, env, `${target.name} pi thinking`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const args = resolveOptionalStringArray(argsSource, env, `${target.name} pi args`);\n\n const cwd = resolveOptionalString(cwdSource, env, `${target.name} pi cwd`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const timeoutMs = resolveTimeoutMs(timeoutSource, `${target.name} pi timeout`);\n\n const logDir = resolveOptionalString(logDirSource, env, `${target.name} pi log directory`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const logFormat =\n logFormatSource === 'json' || logFormatSource === 'summary' ? logFormatSource : undefined;\n\n const systemPrompt =\n typeof systemPromptSource === 'string' && systemPromptSource.trim().length > 0\n ? systemPromptSource.trim()\n : undefined;\n\n return {\n executable,\n provider,\n model,\n apiKey,\n tools,\n thinking,\n args,\n cwd,\n timeoutMs,\n logDir,\n logFormat,\n systemPrompt,\n };\n}\n\nfunction resolvePiAgentSdkConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): PiAgentSdkResolvedConfig {\n const providerSource = target.pi_provider ?? target.piProvider ?? target.llm_provider;\n const modelSource = target.model ?? target.pi_model ?? target.piModel;\n const apiKeySource = target.api_key ?? target.apiKey;\n const timeoutSource = target.timeout_seconds ?? target.timeoutSeconds;\n const systemPromptSource = target.system_prompt ?? target.systemPrompt;\n\n const provider = resolveOptionalString(\n providerSource,\n env,\n `${target.name} pi-agent-sdk provider`,\n {\n allowLiteral: true,\n optionalEnv: true,\n },\n );\n\n const model = resolveOptionalString(modelSource, env, `${target.name} pi-agent-sdk model`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const apiKey = resolveOptionalString(apiKeySource, env, `${target.name} pi-agent-sdk api key`, {\n allowLiteral: false,\n optionalEnv: true,\n });\n\n const timeoutMs = resolveTimeoutMs(timeoutSource, `${target.name} pi-agent-sdk timeout`);\n\n const systemPrompt =\n typeof systemPromptSource === 'string' && systemPromptSource.trim().length > 0\n ? systemPromptSource.trim()\n : undefined;\n\n return {\n provider,\n model,\n apiKey,\n timeoutMs,\n systemPrompt,\n };\n}\n\nfunction resolveClaudeCodeConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n): ClaudeCodeResolvedConfig {\n const executableSource = target.executable ?? target.command ?? target.binary;\n const modelSource = target.model;\n const argsSource = target.args ?? target.arguments;\n const cwdSource = target.cwd;\n const timeoutSource = target.timeout_seconds ?? target.timeoutSeconds;\n const logDirSource =\n target.log_dir ?? target.logDir ?? target.log_directory ?? target.logDirectory;\n const logFormatSource =\n target.log_format ??\n target.logFormat ??\n target.log_output_format ??\n target.logOutputFormat ??\n env.AGENTV_CLAUDE_CODE_LOG_FORMAT;\n const systemPromptSource = target.system_prompt ?? target.systemPrompt;\n\n const executable =\n resolveOptionalString(executableSource, env, `${target.name} claude-code executable`, {\n allowLiteral: true,\n optionalEnv: true,\n }) ?? 'claude';\n\n const model = resolveOptionalString(modelSource, env, `${target.name} claude-code model`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const args = resolveOptionalStringArray(argsSource, env, `${target.name} claude-code args`);\n\n const cwd = resolveOptionalString(cwdSource, env, `${target.name} claude-code cwd`, {\n allowLiteral: true,\n optionalEnv: true,\n });\n\n const timeoutMs = resolveTimeoutMs(timeoutSource, `${target.name} claude-code timeout`);\n\n const logDir = resolveOptionalString(\n logDirSource,\n env,\n `${target.name} claude-code log directory`,\n {\n allowLiteral: true,\n optionalEnv: true,\n },\n );\n\n const logFormat = normalizeClaudeCodeLogFormat(logFormatSource);\n\n const systemPrompt =\n typeof systemPromptSource === 'string' && systemPromptSource.trim().length > 0\n ? systemPromptSource.trim()\n : undefined;\n\n return {\n executable,\n model,\n systemPrompt,\n args,\n cwd,\n timeoutMs,\n logDir,\n logFormat,\n };\n}\n\nfunction normalizeClaudeCodeLogFormat(value: unknown): 'summary' | 'json' | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value !== 'string') {\n throw new Error(\"claude-code log format must be 'summary' or 'json'\");\n }\n const normalized = value.trim().toLowerCase();\n if (normalized === 'json' || normalized === 'summary') {\n return normalized;\n }\n throw new Error(\"claude-code log format must be 'summary' or 'json'\");\n}\n\nfunction resolveMockConfig(target: z.infer<typeof BASE_TARGET_SCHEMA>): MockResolvedConfig {\n const response = typeof target.response === 'string' ? target.response : undefined;\n return { response };\n}\n\nfunction resolveVSCodeConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n insiders: boolean,\n): VSCodeResolvedConfig {\n const workspaceTemplateEnvVar = resolveOptionalLiteralString(\n target.workspace_template ?? target.workspaceTemplate,\n );\n const workspaceTemplate = workspaceTemplateEnvVar\n ? resolveOptionalString(\n workspaceTemplateEnvVar,\n env,\n `${target.name} workspace template path`,\n {\n allowLiteral: false,\n optionalEnv: true,\n },\n )\n : undefined;\n\n const commandSource = target.vscode_cmd ?? target.command;\n const waitSource = target.wait;\n const dryRunSource = target.dry_run ?? target.dryRun;\n const subagentRootSource = target.subagent_root ?? target.subagentRoot;\n\n const defaultCommand = insiders ? 'code-insiders' : 'code';\n const command = resolveOptionalLiteralString(commandSource) ?? defaultCommand;\n\n return {\n command,\n waitForResponse: resolveOptionalBoolean(waitSource) ?? true,\n dryRun: resolveOptionalBoolean(dryRunSource) ?? false,\n subagentRoot: resolveOptionalString(subagentRootSource, env, `${target.name} subagent root`, {\n allowLiteral: true,\n optionalEnv: true,\n }),\n workspaceTemplate,\n };\n}\n\n/**\n * Custom Zod error map for CLI provider validation.\n * Provides clear, user-friendly error messages for common validation failures.\n */\nconst cliErrorMap: z.ZodErrorMap = (issue, ctx) => {\n if (issue.code === z.ZodIssueCode.unrecognized_keys) {\n return { message: `Unknown CLI provider settings: ${issue.keys.join(', ')}` };\n }\n if (issue.code === z.ZodIssueCode.invalid_union_discriminator) {\n return { message: \"healthcheck type must be 'http' or 'command'\" };\n }\n if (issue.code === z.ZodIssueCode.invalid_type && issue.expected === 'string') {\n return { message: `${ctx.defaultError} (expected a string value)` };\n }\n return { message: ctx.defaultError };\n};\n\n/**\n * Resolves a CLI target configuration using Zod schema validation and normalization.\n *\n * This function:\n * 1. Parses the raw target with CliTargetInputSchema for structural validation\n * 2. Normalizes the input using normalizeCliTargetInput() for env var resolution and casing\n * 3. Validates CLI placeholders in the command template\n *\n * @param target - The raw target definition from YAML\n * @param env - Environment variable lookup for ${{ VAR }} resolution\n * @param evalFilePath - Optional path to eval file for relative path resolution\n * @returns Normalized CLI configuration matching CliResolvedConfig\n */\nfunction resolveCliConfig(\n target: z.infer<typeof BASE_TARGET_SCHEMA>,\n env: EnvLookup,\n evalFilePath?: string,\n): CliResolvedConfig {\n // Parse with Zod schema for structural validation with custom error messages\n const parseResult = CliTargetInputSchema.safeParse(target, { errorMap: cliErrorMap });\n if (!parseResult.success) {\n const firstError = parseResult.error.errors[0];\n const path = firstError?.path.join('.') || '';\n const prefix = path ? `${target.name} ${path}: ` : `${target.name}: `;\n throw new Error(`${prefix}${firstError?.message}`);\n }\n\n // Normalize the parsed input (handles env var resolution, casing, path resolution)\n const normalized = normalizeCliTargetInput(parseResult.data, env, evalFilePath);\n\n // Validate CLI placeholders in command template\n assertSupportedCliPlaceholders(normalized.commandTemplate, `${target.name} CLI command template`);\n\n // Validate CLI placeholders in healthcheck command template if present\n if (normalized.healthcheck?.type === 'command') {\n assertSupportedCliPlaceholders(\n normalized.healthcheck.commandTemplate,\n `${target.name} healthcheck command template`,\n );\n }\n\n return normalized;\n}\n\nfunction resolveTimeoutMs(source: unknown, description: string): number | undefined {\n const seconds = resolveOptionalNumber(source, `${description} (seconds)`);\n if (seconds === undefined) {\n return undefined;\n }\n if (seconds <= 0) {\n throw new Error(`${description} must be greater than zero seconds`);\n }\n return Math.floor(seconds * 1000);\n}\n\nfunction assertSupportedCliPlaceholders(template: string, description: string): void {\n const placeholders = extractCliPlaceholders(template);\n for (const placeholder of placeholders) {\n if (!CLI_PLACEHOLDERS.has(placeholder)) {\n throw new Error(\n `${description} includes unsupported placeholder '{${placeholder}}'. Supported placeholders: ${Array.from(CLI_PLACEHOLDERS).join(', ')}`,\n );\n }\n }\n}\n\nfunction extractCliPlaceholders(template: string): string[] {\n const matches = template.matchAll(/\\{([A-Z_]+)\\}/g);\n const results: string[] = [];\n for (const match of matches) {\n if (match[1]) {\n results.push(match[1]);\n }\n }\n return results;\n}\n\nfunction resolveString(\n source: unknown,\n env: EnvLookup,\n description: string,\n allowLiteral = false,\n): string {\n const value = resolveOptionalString(source, env, description, {\n allowLiteral,\n optionalEnv: false,\n });\n if (value === undefined) {\n throw new Error(`${description} is required`);\n }\n return value;\n}\n\nfunction resolveOptionalString(\n source: unknown,\n env: EnvLookup,\n description: string,\n options?: { allowLiteral?: boolean; optionalEnv?: boolean },\n): string | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (typeof source !== 'string') {\n throw new Error(`${description} must be a string`);\n }\n const trimmed = source.trim();\n if (trimmed.length === 0) {\n return undefined;\n }\n\n // Check for ${{ variable }} syntax\n const envVarMatch = trimmed.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\n if (envVarMatch) {\n const varName = envVarMatch[1];\n const envValue = env[varName];\n const optionalEnv = options?.optionalEnv ?? false;\n\n // Treat empty or undefined env vars the same way\n if (envValue === undefined || envValue.trim().length === 0) {\n if (optionalEnv) {\n return undefined;\n }\n const status = envValue === undefined ? 'is not set' : 'is empty';\n throw new Error(`Environment variable '${varName}' required for ${description} ${status}`);\n }\n return envValue;\n }\n\n // Return as literal value\n const allowLiteral = options?.allowLiteral ?? false;\n if (!allowLiteral) {\n throw new Error(\n `${description} must use \\${{ VARIABLE_NAME }} syntax for environment variables or be marked as allowing literals`,\n );\n }\n return trimmed;\n}\n\nfunction resolveOptionalLiteralString(source: unknown): string | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (typeof source !== 'string') {\n throw new Error('expected string value');\n }\n const trimmed = source.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction resolveOptionalNumber(source: unknown, description: string): number | undefined {\n if (source === undefined || source === null || source === '') {\n return undefined;\n }\n if (typeof source === 'number') {\n return Number.isFinite(source) ? source : undefined;\n }\n if (typeof source === 'string') {\n const numeric = Number(source);\n if (Number.isFinite(numeric)) {\n return numeric;\n }\n }\n throw new Error(`${description} must be a number`);\n}\n\nfunction resolveOptionalBoolean(source: unknown): boolean | undefined {\n if (source === undefined || source === null || source === '') {\n return undefined;\n }\n if (typeof source === 'boolean') {\n return source;\n }\n if (typeof source === 'string') {\n const lowered = source.trim().toLowerCase();\n if (lowered === 'true' || lowered === '1') {\n return true;\n }\n if (lowered === 'false' || lowered === '0') {\n return false;\n }\n }\n throw new Error('expected boolean value');\n}\n\nfunction resolveOptionalStringArray(\n source: unknown,\n env: EnvLookup,\n description: string,\n): readonly string[] | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (!Array.isArray(source)) {\n throw new Error(`${description} must be an array of strings`);\n }\n if (source.length === 0) {\n return undefined;\n }\n const resolved: string[] = [];\n for (let i = 0; i < source.length; i++) {\n const item = source[i];\n if (typeof item !== 'string') {\n throw new Error(`${description}[${i}] must be a string`);\n }\n const trimmed = item.trim();\n if (trimmed.length === 0) {\n throw new Error(`${description}[${i}] cannot be empty`);\n }\n\n // Check for ${{ variable }} syntax\n const envVarMatch = trimmed.match(/^\\$\\{\\{\\s*([A-Z0-9_]+)\\s*\\}\\}$/i);\n if (envVarMatch) {\n const varName = envVarMatch[1];\n const envValue = env[varName];\n if (envValue !== undefined) {\n if (envValue.trim().length === 0) {\n throw new Error(`Environment variable '${varName}' for ${description}[${i}] is empty`);\n }\n resolved.push(envValue);\n continue;\n }\n throw new Error(`Environment variable '${varName}' for ${description}[${i}] is not set`);\n }\n\n // Treat as literal value\n resolved.push(trimmed);\n }\n return resolved.length > 0 ? resolved : undefined;\n}\n\nfunction resolveOptionalNumberArray(\n source: unknown,\n description: string,\n): readonly number[] | undefined {\n if (source === undefined || source === null) {\n return undefined;\n }\n if (!Array.isArray(source)) {\n throw new Error(`${description} must be an array of numbers`);\n }\n if (source.length === 0) {\n return undefined;\n }\n const resolved: number[] = [];\n for (let i = 0; i < source.length; i++) {\n const item = source[i];\n if (typeof item !== 'number' || !Number.isFinite(item)) {\n throw new Error(`${description}[${i}] must be a number`);\n }\n resolved.push(item);\n }\n return resolved.length > 0 ? resolved : undefined;\n}\n","import path from 'node:path';\nimport {\n dispatchAgentSession,\n dispatchBatchAgent,\n getSubagentRoot,\n provisionSubagents,\n} from 'subagent';\n\nimport { readTextFile } from '../file-utils.js';\nimport { isGuidelineFile } from '../yaml-parser.js';\nimport type { VSCodeResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\nimport { AGENTV_BATCH_REQUEST_TEMPLATE, AGENTV_REQUEST_TEMPLATE } from './vscode-templates.js';\n\nexport class VSCodeProvider implements Provider {\n readonly id: string;\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly targetName: string;\n readonly supportsBatch = true;\n\n private readonly config: VSCodeResolvedConfig;\n\n constructor(\n targetName: string,\n config: VSCodeResolvedConfig,\n kind: 'vscode' | 'vscode-insiders',\n ) {\n this.id = `${kind}:${targetName}`;\n this.kind = kind;\n this.targetName = targetName;\n this.config = config;\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n if (request.signal?.aborted) {\n throw new Error('VS Code provider request was aborted before dispatch');\n }\n\n const inputFiles = normalizeAttachments(request.inputFiles);\n const promptContent = buildPromptDocument(request, inputFiles, request.guideline_patterns);\n\n const session = await dispatchAgentSession({\n userQuery: promptContent,\n extraAttachments: inputFiles,\n requestTemplate: AGENTV_REQUEST_TEMPLATE,\n wait: this.config.waitForResponse,\n dryRun: this.config.dryRun,\n vscodeCmd: this.config.command,\n subagentRoot: this.config.subagentRoot,\n workspaceTemplate: this.config.workspaceTemplate,\n silent: true,\n });\n\n if (session.exitCode !== 0 || !session.responseFile) {\n const failure = session.error ?? 'VS Code subagent did not produce a response';\n throw new Error(failure);\n }\n\n if (this.config.dryRun) {\n return {\n outputMessages: [],\n raw: {\n session,\n inputFiles,\n },\n };\n }\n\n const responseText = await readTextFile(session.responseFile);\n\n return {\n outputMessages: [{ role: 'assistant', content: responseText }],\n raw: {\n session,\n inputFiles,\n },\n };\n }\n\n async invokeBatch(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]> {\n if (requests.length === 0) {\n return [];\n }\n\n const normalizedRequests = requests.map((req) => ({\n request: req,\n inputFiles: normalizeAttachments(req.inputFiles),\n }));\n\n const combinedInputFiles = mergeAttachments(\n normalizedRequests.map(({ inputFiles }) => inputFiles),\n );\n const userQueries = normalizedRequests.map(({ request, inputFiles }) =>\n buildPromptDocument(request, inputFiles, request.guideline_patterns),\n );\n\n const session = await dispatchBatchAgent({\n userQueries,\n extraAttachments: combinedInputFiles,\n requestTemplate: AGENTV_BATCH_REQUEST_TEMPLATE,\n wait: this.config.waitForResponse,\n dryRun: this.config.dryRun,\n vscodeCmd: this.config.command,\n subagentRoot: this.config.subagentRoot,\n workspaceTemplate: this.config.workspaceTemplate,\n silent: true,\n });\n\n if (session.exitCode !== 0 || !session.responseFiles) {\n const failure = session.error ?? 'VS Code subagent did not produce batch responses';\n throw new Error(failure);\n }\n\n if (this.config.dryRun) {\n return normalizedRequests.map(({ inputFiles }) => ({\n outputMessages: [],\n raw: {\n session,\n inputFiles,\n allInputFiles: combinedInputFiles,\n },\n }));\n }\n\n if (session.responseFiles.length !== requests.length) {\n throw new Error(\n `VS Code batch returned ${session.responseFiles.length} responses for ${requests.length} requests`,\n );\n }\n\n const responses: ProviderResponse[] = [];\n for (const [index, responseFile] of session.responseFiles.entries()) {\n const responseText = await readTextFile(responseFile);\n responses.push({\n outputMessages: [{ role: 'assistant', content: responseText }],\n raw: {\n session,\n inputFiles: normalizedRequests[index]?.inputFiles,\n allInputFiles: combinedInputFiles,\n responseFile,\n },\n });\n }\n\n return responses;\n }\n}\n\nfunction buildPromptDocument(\n request: ProviderRequest,\n attachments: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n): string {\n const parts: string[] = [];\n\n // Agent providers incorporate systemPrompt into the question\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\n parts.push(request.systemPrompt.trim());\n }\n\n const guidelineFiles = collectGuidelineFiles(attachments, guidelinePatterns);\n const attachmentFiles = collectAttachmentFiles(attachments);\n\n const nonGuidelineAttachments = attachmentFiles.filter((file) => !guidelineFiles.includes(file));\n\n const prereadBlock = buildMandatoryPrereadBlock(guidelineFiles, nonGuidelineAttachments);\n if (prereadBlock.length > 0) {\n parts.push('\\n', prereadBlock);\n }\n\n parts.push('\\n[[ ## user_query ## ]]\\n', request.question.trim());\n\n return parts.join('\\n').trim();\n}\n\nfunction buildMandatoryPrereadBlock(\n guidelineFiles: readonly string[],\n attachmentFiles: readonly string[],\n): string {\n if (guidelineFiles.length === 0 && attachmentFiles.length === 0) {\n return '';\n }\n\n const buildList = (files: readonly string[]): string[] =>\n files.map((absolutePath) => {\n const fileName = path.basename(absolutePath);\n const fileUri = pathToFileUri(absolutePath);\n return `* [${fileName}](${fileUri})`;\n });\n\n const sections: string[] = [];\n if (guidelineFiles.length > 0) {\n sections.push(`Read all guideline files:\\n${buildList(guidelineFiles).join('\\n')}.`);\n }\n\n if (attachmentFiles.length > 0) {\n sections.push(`Read all attachment files:\\n${buildList(attachmentFiles).join('\\n')}.`);\n }\n\n sections.push(\n 'If any file is missing, fail with ERROR: missing-file <filename> and stop.',\n 'Then apply system_instructions on the user query below.',\n );\n\n return sections.join('\\n');\n}\n\nfunction collectGuidelineFiles(\n attachments: readonly string[] | undefined,\n guidelinePatterns: readonly string[] | undefined,\n): string[] {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n\n const unique = new Map<string, string>();\n for (const attachment of attachments) {\n const absolutePath = path.resolve(attachment);\n const normalized = absolutePath.split(path.sep).join('/');\n\n if (isGuidelineFile(normalized, guidelinePatterns)) {\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n }\n\n return Array.from(unique.values());\n}\n\nfunction collectAttachmentFiles(attachments: readonly string[] | undefined): string[] {\n if (!attachments || attachments.length === 0) {\n return [];\n }\n const unique = new Map<string, string>();\n for (const attachment of attachments) {\n const absolutePath = path.resolve(attachment);\n if (!unique.has(absolutePath)) {\n unique.set(absolutePath, absolutePath);\n }\n }\n return Array.from(unique.values());\n}\n\nfunction pathToFileUri(filePath: string): string {\n // Convert to absolute path if relative\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n\n // On Windows, convert backslashes to forward slashes\n const normalizedPath = absolutePath.replace(/\\\\/g, '/');\n\n // Handle Windows drive letters (e.g., C:/ becomes file:///C:/)\n if (/^[a-zA-Z]:\\//.test(normalizedPath)) {\n return `file:///${normalizedPath}`;\n }\n\n // Unix-like paths\n return `file://${normalizedPath}`;\n}\n\nfunction _composeUserQuery(request: ProviderRequest): string {\n // For VS Code, guidelines are handled via file attachments\n // Do NOT include guideline content in the user query\n return request.question.trim();\n}\n\nfunction normalizeAttachments(attachments: readonly string[] | undefined): string[] | undefined {\n if (!attachments || attachments.length === 0) {\n return undefined;\n }\n const deduped = new Set<string>();\n for (const attachment of attachments) {\n deduped.add(path.resolve(attachment));\n }\n return Array.from(deduped);\n}\n\nfunction mergeAttachments(all: readonly (readonly string[] | undefined)[]): string[] | undefined {\n const deduped = new Set<string>();\n for (const list of all) {\n if (!list) continue;\n for (const inputFile of list) {\n deduped.add(path.resolve(inputFile));\n }\n }\n return deduped.size > 0 ? Array.from(deduped) : undefined;\n}\n\nexport interface EnsureSubagentsOptions {\n readonly kind: 'vscode' | 'vscode-insiders';\n readonly count: number;\n readonly verbose?: boolean;\n}\n\nexport interface EnsureSubagentsResult {\n readonly provisioned: boolean;\n readonly message?: string;\n}\n\n/**\n * Ensures the required number of VSCode subagents are provisioned using the subagent package.\n * This guarantees version compatibility by using the same subagent package version.\n *\n * @param options - Configuration for subagent provisioning\n * @returns Information about the provisioning result\n */\nexport async function ensureVSCodeSubagents(\n options: EnsureSubagentsOptions,\n): Promise<EnsureSubagentsResult> {\n const { kind, count, verbose = false } = options;\n const vscodeCmd = kind === 'vscode-insiders' ? 'code-insiders' : 'code';\n const subagentRoot = getSubagentRoot(vscodeCmd);\n\n try {\n if (verbose) {\n console.log(`Provisioning ${count} subagent(s) via: subagent ${vscodeCmd} provision`);\n }\n\n const result = await provisionSubagents({\n targetRoot: subagentRoot,\n subagents: count,\n dryRun: false,\n });\n\n if (verbose) {\n if (result.created.length > 0) {\n console.log(`Created ${result.created.length} new subagent(s)`);\n }\n if (result.skippedExisting.length > 0) {\n console.log(`Reusing ${result.skippedExisting.length} existing unlocked subagent(s)`);\n }\n console.log(\n `\\ntotal unlocked subagents available: ${result.created.length + result.skippedExisting.length}`,\n );\n }\n\n return {\n provisioned: true,\n message: `Provisioned ${count} subagent(s): ${result.created.length} created, ${result.skippedExisting.length} reused`,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Don't fail if provisioning fails - agents might already exist\n if (verbose) {\n console.warn(`Provisioning failed (continuing anyway): ${errorMessage}`);\n }\n\n return {\n provisioned: false,\n message: `Provisioning failed: ${errorMessage}`,\n };\n }\n}\n","/**\n * Custom request templates for AgentV evaluation workflows\n * These templates are used when dispatching to VSCode via subagent\n */\n\nexport const AGENTV_REQUEST_TEMPLATE = `[[ ## task ## ]]\n\n{{userQuery}}\n\n[[ ## system_instructions ## ]]\n\n**IMPORTANT**: Follow these exact steps:\n1. Create and write your complete response to: {{responseFileTmp}}\n - Do NOT create any additional output files in the workspace.\n - All intended file outputs/changes MUST be written in your response file.\n - For each intended file, include the repo name, relative path and unified git diff following the convention \\`diff --git ...\\`.\n2. When completely finished, run these PowerShell commands to signal completion:\n\\`\\`\\`\nMove-Item -LiteralPath '{{responseFileTmp}}' -Destination '{{responseFileFinal}}'\nif (Test-Path subagent.lock) { del subagent.lock }\n\\`\\`\\`\n\nDo not proceed to step 2 until your response is completely written to the temporary file.\n`;\n\nexport const AGENTV_BATCH_REQUEST_TEMPLATE = `[[ ## task ## ]]\n\n{{userQuery}}\n\n[[ ## system_instructions ## ]]\n\n**IMPORTANT**: Follow these exact steps:\n1. Create and write your complete response to: {{responseFileTmp}}\n - Do NOT create any additional output files in the workspace.\n - All intended file outputs/changes MUST be written in your response file.\n - For each intended file, include the repo name, relative path and unified git diff following the convention \\`diff --git ...\\`.\n2. When completely finished and the response is stable, rename it to: {{responseFileFinal}}\n3. Do not unlock the workspace from this request; batch orchestration will handle unlocking after all responses are ready.\n`;\n\nexport const AGENTV_BATCH_ORCHESTRATOR_TEMPLATE = `MANDATORY: Run #runSubagent tool in your Available Actions for each request file to process them in isolated contexts.\nDO NOT read the request files yourself - only pass the file paths to each subagent:\n\n{{requestFiles}}\n\nAfter ALL queries complete, verify all responses exist and unlock:\n\n\\`\\`\\`powershell\n$responses = @({{responseList}})\n$missing = $responses | Where-Object { -not (Test-Path \"messages/$_\") }\nif ($missing.Count -eq 0) { del subagent.lock }\n\\`\\`\\`\n`;\n","import { constants } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { parse } from 'yaml';\n\nimport { TARGETS_SCHEMA_V2 } from './types.js';\nimport type { TargetDefinition } from './types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction extractTargetsArray(parsed: Record<string, unknown>, absolutePath: string): unknown[] {\n const targets = parsed.targets;\n if (!Array.isArray(targets)) {\n throw new Error(`targets.yaml at ${absolutePath} must have a 'targets' array`);\n }\n return targets;\n}\n\nfunction assertTargetDefinition(value: unknown, index: number, filePath: string): TargetDefinition {\n if (!isRecord(value)) {\n throw new Error(`targets.yaml entry at index ${index} in ${filePath} must be an object`);\n }\n\n const name = value.name;\n const provider = value.provider;\n\n if (typeof name !== 'string' || name.trim().length === 0) {\n throw new Error(\n `targets.yaml entry at index ${index} in ${filePath} is missing a valid 'name'`,\n );\n }\n\n if (typeof provider !== 'string' || provider.trim().length === 0) {\n throw new Error(`targets.yaml entry '${name}' in ${filePath} is missing a valid 'provider'`);\n }\n\n // Pass through all properties from the YAML to support the flattened schema\n // This includes all provider-specific settings at the top level\n return value as unknown as TargetDefinition;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readTargetDefinitions(\n filePath: string,\n): Promise<readonly TargetDefinition[]> {\n const absolutePath = path.resolve(filePath);\n if (!(await fileExists(absolutePath))) {\n throw new Error(`targets.yaml not found at ${absolutePath}`);\n }\n\n const raw = await readFile(absolutePath, 'utf8');\n const parsed = parse(raw) as unknown;\n\n if (!isRecord(parsed)) {\n throw new Error(`targets.yaml at ${absolutePath} must be a YAML object with a 'targets' field`);\n }\n\n const targets = extractTargetsArray(parsed, absolutePath);\n const definitions = targets.map((entry, index) =>\n assertTargetDefinition(entry, index, absolutePath),\n );\n return definitions;\n}\n\nexport function listTargetNames(definitions: readonly TargetDefinition[]): readonly string[] {\n return definitions.map((definition) => definition.name);\n}\n","import { AnthropicProvider, AzureProvider, GeminiProvider } from './ai-sdk.js';\nimport { ClaudeCodeProvider } from './claude-code.js';\nimport { CliProvider } from './cli.js';\nimport { CodexProvider } from './codex.js';\nimport { MockProvider } from './mock.js';\nimport { PiAgentSdkProvider } from './pi-agent-sdk.js';\nimport { PiCodingAgentProvider } from './pi-coding-agent.js';\nimport type { ResolvedTarget } from './targets.js';\nimport { resolveTargetDefinition } from './targets.js';\nimport type { EnvLookup, Provider, TargetDefinition } from './types.js';\nimport { VSCodeProvider } from './vscode.js';\n\nexport type {\n EnvLookup,\n Provider,\n ProviderKind,\n ProviderRequest,\n ProviderResponse,\n ProviderTokenUsage,\n TargetDefinition,\n} from './types.js';\n\nexport type {\n AnthropicResolvedConfig,\n AzureResolvedConfig,\n ClaudeCodeResolvedConfig,\n CliResolvedConfig,\n GeminiResolvedConfig,\n MockResolvedConfig,\n PiAgentSdkResolvedConfig,\n PiCodingAgentResolvedConfig,\n ResolvedTarget,\n VSCodeResolvedConfig,\n} from './targets.js';\n\nexport { resolveTargetDefinition };\nexport { readTargetDefinitions, listTargetNames } from './targets-file.js';\nexport {\n ensureVSCodeSubagents,\n type EnsureSubagentsOptions,\n type EnsureSubagentsResult,\n} from './vscode.js';\nexport { consumeCodexLogEntries, subscribeToCodexLogEntries } from './codex-log-tracker.js';\nexport { consumePiLogEntries, subscribeToPiLogEntries } from './pi-log-tracker.js';\nexport {\n consumeClaudeCodeLogEntries,\n subscribeToClaudeCodeLogEntries,\n} from './claude-code-log-tracker.js';\n\nexport function createProvider(target: ResolvedTarget): Provider {\n switch (target.kind) {\n case 'azure':\n return new AzureProvider(target.name, target.config);\n case 'anthropic':\n return new AnthropicProvider(target.name, target.config);\n case 'gemini':\n return new GeminiProvider(target.name, target.config);\n case 'cli':\n return new CliProvider(target.name, target.config);\n case 'codex':\n return new CodexProvider(target.name, target.config);\n case 'pi-coding-agent':\n return new PiCodingAgentProvider(target.name, target.config);\n case 'pi-agent-sdk':\n return new PiAgentSdkProvider(target.name, target.config);\n case 'claude-code':\n return new ClaudeCodeProvider(target.name, target.config);\n case 'mock':\n return new MockProvider(target.name, target.config);\n case 'vscode':\n case 'vscode-insiders':\n return new VSCodeProvider(target.name, target.config, target.kind);\n default: {\n // Exhaustive check\n const neverTarget: never = target;\n throw new Error(`Unsupported provider kind ${(neverTarget as { kind: string }).kind}`);\n }\n }\n}\n\nexport function resolveAndCreateProvider(\n definition: TargetDefinition,\n env: EnvLookup = process.env,\n): Provider {\n const resolved = resolveTargetDefinition(definition, env);\n return createProvider(resolved);\n}\n","import { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport { execFileWithStdin, execShellWithStdin } from '../runtime/exec.js';\nimport { toSnakeCaseDeep } from './case-conversion.js';\nimport type { ResolvedTarget } from './providers/targets.js';\nimport {\n type ChatPrompt,\n type OutputMessage,\n type Provider,\n type ProviderResponse,\n extractLastAssistantContent,\n} from './providers/types.js';\nimport { TEMPLATE_VARIABLES } from './template-variables.js';\nimport type {\n ToolTrajectoryEvaluatorConfig,\n ToolTrajectoryExpectedItem,\n TraceSummary,\n} from './trace.js';\nimport type {\n CostEvaluatorConfig,\n EvalCase,\n EvaluationVerdict,\n EvaluatorConfig,\n FieldAccuracyEvaluatorConfig,\n FieldConfig,\n JsonObject,\n LatencyEvaluatorConfig,\n RubricItem,\n TokenUsageEvaluatorConfig,\n} from './types.js';\n\nexport type { EvaluationVerdict };\n\n/**\n * Default evaluator template for the user prompt (variables will be substituted).\n * Custom evaluators can override this via evaluatorTemplate option.\n */\nconst DEFAULT_EVALUATOR_TEMPLATE = `You are an expert evaluator. Your goal is to grade the candidate_answer based on how well it achieves the expected_outcome for the original task.\n\nUse the reference_answer as a gold standard for a high-quality response (if provided). The reference_answer may be a simple text response, or it may contain a sequence of expected agent messages including tool calls. When it contains multiple messages, the last message represents the final expected answer. The candidate_answer does not need to match it verbatim, but should capture the key points and follow the same spirit.\n\nBe concise and focused in your evaluation. Provide succinct, specific feedback rather than verbose explanations.\n\n[[ ## expected_outcome ## ]]\n{{${TEMPLATE_VARIABLES.EXPECTED_OUTCOME}}}\n\n[[ ## question ## ]]\n{{${TEMPLATE_VARIABLES.QUESTION}}}\n\n[[ ## reference_answer ## ]]\n{{${TEMPLATE_VARIABLES.REFERENCE_ANSWER}}}\n\n[[ ## candidate_answer ## ]]\n{{${TEMPLATE_VARIABLES.CANDIDATE_ANSWER}}}`;\n\nexport interface EvaluationContext {\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly attempt: number;\n readonly promptInputs: {\n readonly question: string;\n readonly guidelines: string;\n readonly systemMessage?: string;\n readonly chatPrompt?: ChatPrompt;\n };\n readonly now: Date;\n readonly judgeProvider?: Provider;\n readonly evaluatorTemplateOverride?: string;\n readonly evaluator?: EvaluatorConfig;\n /** Output messages from agent execution (primary source for tool trajectory) */\n readonly outputMessages?: readonly OutputMessage[];\n /** Lightweight summary of trace events (if available) */\n readonly traceSummary?: TraceSummary;\n}\n\nexport interface EvaluationScore {\n readonly score: number;\n readonly verdict: EvaluationVerdict;\n readonly hits: readonly string[];\n readonly misses: readonly string[];\n readonly expectedAspectCount: number;\n readonly reasoning?: string;\n readonly evaluatorRawRequest?: JsonObject;\n readonly evaluatorResults?: readonly ChildEvaluatorResult[];\n}\n\nexport interface ChildEvaluatorResult {\n readonly name: string;\n readonly type: string;\n readonly score: number;\n readonly weight?: number;\n readonly verdict: EvaluationVerdict;\n readonly hits: readonly string[];\n readonly misses: readonly string[];\n readonly reasoning?: string;\n readonly evaluatorRawRequest?: JsonObject;\n readonly evaluatorResults?: readonly ChildEvaluatorResult[];\n}\n\nexport interface Evaluator {\n readonly kind: string;\n evaluate(context: EvaluationContext): Promise<EvaluationScore> | EvaluationScore;\n}\n\ntype JudgeProviderResolver = (context: EvaluationContext) => Promise<Provider | undefined>;\n\nexport interface LlmJudgeEvaluatorOptions {\n readonly resolveJudgeProvider: JudgeProviderResolver;\n readonly maxOutputTokens?: number;\n readonly temperature?: number;\n readonly evaluatorTemplate?: string;\n}\n\nconst freeformEvaluationSchema = z.object({\n score: z.number().min(0).max(1).describe('Score between 0.0 and 1.0'),\n hits: z.array(z.string()).describe('Brief specific achievements').optional(),\n misses: z.array(z.string()).describe('Brief failures or omissions').optional(),\n reasoning: z.string().describe('Concise explanation (1-2 sentences)').optional(),\n});\n\nconst rubricCheckResultSchema = z.object({\n id: z.string().describe('The ID of the rubric item being checked'),\n satisfied: z.boolean().describe('Whether this rubric requirement is met'),\n reasoning: z.string().describe('Brief explanation (1-2 sentences) for this check'),\n});\n\nconst rubricEvaluationSchema = z.object({\n checks: z.array(rubricCheckResultSchema).describe('Results for each rubric item'),\n overall_reasoning: z.string().describe('Overall assessment summary (1-2 sentences)'),\n});\n\nexport class LlmJudgeEvaluator implements Evaluator {\n readonly kind = 'llm_judge';\n\n private readonly resolveJudgeProvider: JudgeProviderResolver;\n private readonly maxOutputTokens?: number;\n private readonly temperature?: number;\n private readonly evaluatorTemplate?: string;\n\n constructor(options: LlmJudgeEvaluatorOptions) {\n this.resolveJudgeProvider = options.resolveJudgeProvider;\n this.maxOutputTokens = options.maxOutputTokens;\n this.temperature = options.temperature;\n this.evaluatorTemplate = options.evaluatorTemplate;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n const judgeProvider = await this.resolveJudgeProvider(context);\n if (!judgeProvider) {\n throw new Error('No judge provider available for LLM grading');\n }\n\n const config = context.evaluator;\n if (config?.type === 'llm_judge' && config.rubrics && config.rubrics.length > 0) {\n return this.evaluateWithRubrics(context, judgeProvider, config.rubrics);\n }\n\n return this.evaluateFreeform(context, judgeProvider);\n }\n\n private async evaluateFreeform(\n context: EvaluationContext,\n judgeProvider: Provider,\n ): Promise<EvaluationScore> {\n const formattedQuestion =\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\n ? context.promptInputs.question\n : context.evalCase.question;\n\n // Prepare template variables for substitution\n const variables = {\n [TEMPLATE_VARIABLES.INPUT_MESSAGES]: JSON.stringify(context.evalCase.input_segments, null, 2),\n [TEMPLATE_VARIABLES.EXPECTED_MESSAGES]: JSON.stringify(\n context.evalCase.expected_messages,\n null,\n 2,\n ),\n [TEMPLATE_VARIABLES.OUTPUT_MESSAGES]: JSON.stringify(context.outputMessages ?? [], null, 2),\n [TEMPLATE_VARIABLES.CANDIDATE_ANSWER]: context.candidate.trim(),\n [TEMPLATE_VARIABLES.REFERENCE_ANSWER]: (context.evalCase.reference_answer ?? '').trim(),\n [TEMPLATE_VARIABLES.EXPECTED_OUTCOME]: context.evalCase.expected_outcome.trim(),\n [TEMPLATE_VARIABLES.QUESTION]: formattedQuestion.trim(),\n };\n\n // Build system prompt (only the mandatory output schema)\n const systemPrompt = buildOutputSchema();\n\n // Build user prompt based on custom template or default template\n const evaluatorTemplate =\n context.evaluatorTemplateOverride ?? this.evaluatorTemplate ?? DEFAULT_EVALUATOR_TEMPLATE;\n const userPrompt = substituteVariables(evaluatorTemplate, variables);\n\n const evaluatorRawRequest: JsonObject = {\n userPrompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n try {\n const { data, providerResponse } = await this.runWithRetry({\n context,\n judgeProvider,\n systemPrompt,\n userPrompt,\n schema: freeformEvaluationSchema,\n });\n\n const score = clampScore(data.score);\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning;\n const expectedAspectCount = Math.max(hits.length + misses.length, 1);\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount,\n reasoning,\n evaluatorRawRequest,\n };\n } catch {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [],\n expectedAspectCount: 1,\n evaluatorRawRequest,\n };\n }\n }\n\n private async evaluateWithRubrics(\n context: EvaluationContext,\n judgeProvider: Provider,\n rubrics: readonly RubricItem[],\n ): Promise<EvaluationScore> {\n if (!rubrics || rubrics.length === 0) {\n throw new Error(\n `No rubrics found for evaluator \"${context.evaluator?.name ?? 'llm_judge'}\". Run \"agentv generate rubrics\" first.`,\n );\n }\n\n const prompt = this.buildRubricPrompt(context, rubrics);\n const systemPrompt = buildRubricOutputSchema();\n\n const evaluatorRawRequest: JsonObject = {\n userPrompt: prompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n const { data } = await this.runWithRetry({\n context,\n judgeProvider,\n systemPrompt,\n userPrompt: prompt,\n schema: rubricEvaluationSchema,\n });\n\n const { score, verdict, hits, misses } = calculateRubricScore(data, rubrics);\n\n return {\n score,\n verdict,\n hits,\n misses,\n expectedAspectCount: rubrics.length,\n reasoning: data.overall_reasoning,\n evaluatorRawRequest,\n };\n }\n\n private buildRubricPrompt(context: EvaluationContext, rubrics: readonly RubricItem[]): string {\n const formattedQuestion =\n context.promptInputs.question && context.promptInputs.question.trim().length > 0\n ? context.promptInputs.question\n : context.evalCase.question;\n\n const parts: string[] = [\n 'You are an expert evaluator. Evaluate the candidate answer against each rubric item below.',\n '',\n '[[ ## question ## ]]',\n formattedQuestion,\n '',\n '[[ ## expected_outcome ## ]]',\n context.evalCase.expected_outcome,\n '',\n ];\n\n if (context.evalCase.reference_answer && context.evalCase.reference_answer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', context.evalCase.reference_answer, '');\n }\n\n parts.push('[[ ## candidate_answer ## ]]', context.candidate, '', '[[ ## rubrics ## ]]');\n\n for (const rubric of rubrics) {\n const requiredLabel = rubric.required ? ' (REQUIRED)' : '';\n const weightLabel = rubric.weight !== 1.0 ? ` (weight: ${rubric.weight})` : '';\n parts.push(`- [${rubric.id}]${requiredLabel}${weightLabel}: ${rubric.description}`);\n }\n\n parts.push('', 'For each rubric, determine if it is satisfied and provide brief reasoning.');\n\n return parts.join('\\n');\n }\n\n private async runWithRetry<T>(options: {\n readonly context: EvaluationContext;\n readonly judgeProvider: Provider;\n readonly systemPrompt: string;\n readonly userPrompt: string;\n readonly schema: z.ZodSchema<T>;\n }): Promise<{ data: T; providerResponse?: ProviderResponse }> {\n const { context, judgeProvider, systemPrompt, userPrompt, schema } = options;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n // Prefer Vercel AI SDK language model if available.\n const model = judgeProvider.asLanguageModel?.();\n if (model) {\n const { text } = await generateText({\n model,\n system: systemPrompt,\n prompt: userPrompt,\n ...(this.maxOutputTokens ? { maxTokens: this.maxOutputTokens } : {}),\n ...(typeof this.temperature === 'number' ? { temperature: this.temperature } : {}),\n });\n\n const data = schema.parse(parseJsonFromText(text));\n return { data };\n }\n\n const response = await judgeProvider.invoke({\n question: userPrompt,\n systemPrompt,\n evalCaseId: context.evalCase.id,\n attempt: context.attempt,\n maxOutputTokens: this.maxOutputTokens,\n temperature: this.temperature,\n });\n\n const data = schema.parse(\n parseJsonFromText(extractLastAssistantContent(response.outputMessages)),\n );\n return { data, providerResponse: response };\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n }\n }\n\n throw new Error(`Failed to parse evaluator response after 3 attempts: ${lastError?.message}`);\n }\n}\n\n/**\n * Build the mandatory output schema that all evaluators must follow.\n * This schema is always appended to the evaluator template.\n */\nfunction buildOutputSchema(): string {\n return [\n 'You must respond with a single JSON object matching this schema:',\n '',\n '{',\n ' \"score\": <number between 0.0 and 1.0>,',\n ' \"hits\": [<array of strings, max 4 items, brief specific achievements>],',\n ' \"misses\": [<array of strings, max 4 items, brief specific failures or omissions, empty if none>],',\n ' \"reasoning\": \"<string, concise explanation for the score, 1-2 sentences max>\"',\n '}',\n ].join('\\n');\n}\n\nfunction buildRubricOutputSchema(): string {\n return `You are an expert evaluator. Evaluate the candidate answer against each rubric item.\nYou must return a valid JSON object matching this schema:\n{\n \"checks\": [\n {\n \"id\": \"string (rubric id)\",\n \"satisfied\": boolean,\n \"reasoning\": \"string (brief explanation)\"\n }\n ],\n \"overall_reasoning\": \"string (summary)\"\n}`;\n}\n\nfunction scoreToVerdict(score: number): EvaluationVerdict {\n if (score >= 0.8) {\n return 'pass';\n }\n if (score >= 0.6) {\n return 'borderline';\n }\n return 'fail';\n}\n\nfunction clampScore(value: number): number {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return 0;\n }\n if (value < 0) {\n return 0;\n }\n if (value > 1) {\n return 1;\n }\n return value;\n}\n\nfunction extractJsonBlob(text: string): string | undefined {\n const match = text.match(/\\{[\\s\\S]*\\}/);\n return match?.[0];\n}\n\nfunction parseJsonFromText(text: string): unknown {\n const cleaned = typeof text === 'string' ? text.replace(/```json\\n?|```/g, '').trim() : '';\n const blob = extractJsonBlob(cleaned) ?? cleaned;\n return JSON.parse(blob);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n// Code Evaluator\n\nexport interface CodeEvaluatorOptions {\n readonly script: readonly string[];\n readonly cwd?: string;\n readonly agentTimeoutMs?: number;\n /** Pass-through configuration from YAML (any unrecognized properties) */\n readonly config?: Record<string, unknown>;\n}\n\nexport class CodeEvaluator implements Evaluator {\n readonly kind = 'code';\n\n private readonly script: readonly string[];\n private readonly cwd?: string;\n private readonly agentTimeoutMs?: number;\n private readonly config?: Record<string, unknown>;\n\n constructor(options: CodeEvaluatorOptions) {\n this.script = options.script;\n this.cwd = options.cwd;\n this.agentTimeoutMs = options.agentTimeoutMs;\n this.config = options.config;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n // Build payload (camelCase internally, converted to snake_case for judges)\n const payload = {\n question: context.evalCase.question,\n expectedOutcome: context.evalCase.expected_outcome,\n expectedMessages: context.evalCase.expected_messages,\n referenceAnswer: context.evalCase.reference_answer,\n candidateAnswer: context.candidate,\n outputMessages: context.outputMessages ?? null,\n guidelineFiles: context.evalCase.guideline_paths,\n inputFiles: context.evalCase.file_paths.filter(\n (path) => !context.evalCase.guideline_paths.includes(path),\n ),\n inputMessages: context.evalCase.input_messages,\n traceSummary: context.traceSummary ?? null,\n config: this.config ?? null,\n };\n\n const inputPayload = JSON.stringify(toSnakeCaseDeep(payload), null, 2);\n\n try {\n const stdout = await executeScript(this.script, inputPayload, this.agentTimeoutMs, this.cwd);\n const parsed = parseJsonSafe(stdout);\n const score = clampScore(typeof parsed?.score === 'number' ? parsed.score : 0);\n const hits = Array.isArray(parsed?.hits) ? parsed.hits.filter(isNonEmptyString) : [];\n const misses = Array.isArray(parsed?.misses) ? parsed.misses.filter(isNonEmptyString) : [];\n const reasoning = typeof parsed?.reasoning === 'string' ? parsed.reasoning : undefined;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: hits.length + misses.length || 1,\n reasoning,\n evaluatorRawRequest: {\n script: this.script,\n ...(this.cwd ? { cwd: this.cwd } : {}),\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Code evaluator failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n evaluatorRawRequest: {\n script: this.script,\n ...(this.cwd ? { cwd: this.cwd } : {}),\n error: message,\n },\n };\n }\n }\n}\n\nfunction calculateRubricScore(\n result: z.infer<typeof rubricEvaluationSchema>,\n rubrics: readonly RubricItem[],\n): {\n score: number;\n verdict: EvaluationVerdict;\n hits: string[];\n misses: string[];\n} {\n const rubricMap = new Map(rubrics.map((rubric) => [rubric.id, rubric]));\n const hits: string[] = [];\n const misses: string[] = [];\n let totalWeight = 0;\n let earnedWeight = 0;\n let failedRequired = false;\n\n for (const check of result.checks) {\n const rubric = rubricMap.get(check.id);\n if (!rubric) {\n continue;\n }\n\n totalWeight += rubric.weight;\n\n if (check.satisfied) {\n earnedWeight += rubric.weight;\n hits.push(`[${rubric.id}] ${rubric.description}: ${check.reasoning}`);\n } else {\n misses.push(`[${rubric.id}] ${rubric.description}: ${check.reasoning}`);\n if (rubric.required) {\n failedRequired = true;\n }\n }\n }\n\n const score = totalWeight > 0 ? Math.min(1, Math.max(0, earnedWeight / totalWeight)) : 0;\n const verdict = failedRequired ? 'fail' : scoreToVerdict(score);\n return { score, verdict, hits, misses };\n}\n\n// Helper functions for CodeEvaluator\n\nasync function executeScript(\n scriptPath: readonly string[] | string,\n input: string,\n agentTimeoutMs?: number,\n cwd?: string,\n): Promise<string> {\n const { stdout, stderr, exitCode } =\n typeof scriptPath === 'string'\n ? await execShellWithStdin(scriptPath, input, { cwd, timeoutMs: agentTimeoutMs })\n : await execFileWithStdin(scriptPath, input, { cwd, timeoutMs: agentTimeoutMs });\n\n if (exitCode !== 0) {\n const trimmedErr = formatStderr(stderr);\n throw new Error(\n trimmedErr.length > 0\n ? `Code evaluator exited with code ${exitCode}: ${trimmedErr}`\n : `Code evaluator exited with code ${exitCode}`,\n );\n }\n\n return stdout.trim();\n}\n\nfunction formatStderr(stderr: string): string {\n const trimmed = stderr.trim();\n const maxLength = 2000;\n if (trimmed.length <= maxLength) {\n return trimmed;\n }\n const tail = trimmed.slice(-maxLength);\n return `...(truncated, last ${maxLength} chars)\\n${tail}`;\n}\n\nfunction parseJsonSafe(payload: string): Record<string, unknown> | undefined {\n try {\n return JSON.parse(payload) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nfunction substituteVariables(template: string, variables: Record<string, string>): string {\n return template.replace(/\\{\\{\\s*([a-zA-Z0-9_]+)\\s*\\}\\}/g, (match, varName) => {\n return variables[varName] ?? match;\n });\n}\n\n// Tool Trajectory Evaluator\n\n/** Extracted tool call with optional arguments */\ninterface ExtractedToolCall {\n readonly name: string;\n readonly args?: Record<string, unknown>;\n}\n\n/**\n * Deep equality check for two values.\n * Handles primitives, arrays, and plain objects.\n */\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null) return a === b;\n if (typeof a !== typeof b) return false;\n if (typeof a !== 'object') return a === b;\n\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((val, i) => deepEqual(val, b[i]));\n }\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) => Object.hasOwn(bObj, key) && deepEqual(aObj[key], bObj[key]));\n}\n\n/**\n * Check if actual args match expected args.\n * - 'any' → always matches\n * - object → partial match (only specified keys, deep equality)\n */\nfunction argsMatch(\n expected: ToolTrajectoryExpectedItem['args'],\n actual: Record<string, unknown> | undefined,\n): boolean {\n // No args constraint means match\n if (expected === undefined) return true;\n // 'any' means skip validation\n if (expected === 'any') return true;\n // Partial match: check only specified keys\n if (actual === undefined) return false;\n for (const key of Object.keys(expected)) {\n if (!Object.hasOwn(actual, key)) return false;\n if (!deepEqual(expected[key], actual[key])) return false;\n }\n return true;\n}\n\nexport interface ToolTrajectoryEvaluatorOptions {\n readonly config: ToolTrajectoryEvaluatorConfig;\n}\n\nexport class ToolTrajectoryEvaluator implements Evaluator {\n readonly kind = 'tool_trajectory';\n\n private readonly config: ToolTrajectoryEvaluatorConfig;\n\n constructor(options: ToolTrajectoryEvaluatorOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { outputMessages, traceSummary } = context;\n\n // Extract tool calls from outputMessages (primary source)\n const toolCalls = this.extractToolCallsFromMessages(outputMessages);\n\n // Handle missing tool calls\n if (toolCalls.length === 0 && !traceSummary) {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: ['No trace available for evaluation'],\n expectedAspectCount: 1,\n };\n }\n\n // Build summary from tool calls if available, otherwise use provided summary\n const summary = toolCalls.length > 0 ? this.buildSummary(toolCalls) : traceSummary;\n\n if (!summary) {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: ['No trace available for evaluation'],\n expectedAspectCount: 1,\n };\n }\n\n switch (this.config.mode) {\n case 'any_order':\n return this.evaluateAnyOrder(summary);\n case 'in_order':\n return this.evaluateInOrder(toolCalls);\n case 'exact':\n return this.evaluateExact(toolCalls);\n default:\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Unknown mode: ${this.config.mode}`],\n expectedAspectCount: 1,\n };\n }\n }\n\n /**\n * Extract tool calls from output messages.\n */\n private extractToolCallsFromMessages(\n messages: readonly OutputMessage[] | undefined,\n ): readonly ExtractedToolCall[] {\n if (!messages) {\n return [];\n }\n\n const toolCalls: ExtractedToolCall[] = [];\n for (const message of messages) {\n if (message.toolCalls) {\n for (const call of message.toolCalls) {\n toolCalls.push({\n name: call.tool,\n args: call.input as Record<string, unknown> | undefined,\n });\n }\n }\n }\n return toolCalls;\n }\n\n /**\n * Build a summary from extracted tool calls.\n */\n private buildSummary(toolCalls: readonly ExtractedToolCall[]): TraceSummary {\n const toolCallsByName: Record<string, number> = {};\n for (const call of toolCalls) {\n toolCallsByName[call.name] = (toolCallsByName[call.name] ?? 0) + 1;\n }\n const toolNames = Object.keys(toolCallsByName).sort();\n return {\n eventCount: toolCalls.length,\n toolNames,\n toolCallsByName,\n errorCount: 0,\n };\n }\n\n private evaluateAnyOrder(summary: TraceSummary): EvaluationScore {\n const minimums = this.config.minimums ?? {};\n const toolNames = Object.keys(minimums);\n\n if (toolNames.length === 0) {\n return {\n score: 1,\n verdict: 'pass',\n hits: ['No tool requirements specified'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\n\n for (const toolName of toolNames) {\n const required = minimums[toolName];\n const actual = summary.toolCallsByName[toolName] ?? 0;\n if (actual >= required) {\n hits.push(`${toolName}: called ${actual} times (required ≥${required})`);\n } else {\n misses.push(`${toolName}: called ${actual} times (required ≥${required})`);\n }\n }\n\n const score = hits.length / toolNames.length;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: toolNames.length,\n };\n }\n\n private evaluateInOrder(toolCalls: readonly ExtractedToolCall[]): EvaluationScore {\n const expected = this.config.expected ?? [];\n\n if (expected.length === 0) {\n return {\n score: 1,\n verdict: 'pass',\n hits: ['No tool sequence specified'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\n let actualIndex = 0;\n\n for (let i = 0; i < expected.length; i++) {\n const expectedItem = expected[i];\n const expectedTool = expectedItem.tool;\n let found = false;\n let argsMismatch = false;\n\n while (actualIndex < toolCalls.length) {\n const actualCall = toolCalls[actualIndex];\n if (actualCall.name === expectedTool) {\n // Tool name matches, check args if specified\n if (argsMatch(expectedItem.args, actualCall.args)) {\n hits.push(`Found ${expectedTool} at position ${actualIndex}`);\n actualIndex++;\n found = true;\n break;\n }\n // Tool name matches but args don't - this is a miss for this expected item\n misses.push(\n `Expected ${expectedTool} at position ${i}: tool found at ${actualIndex} but args mismatch`,\n );\n actualIndex++;\n argsMismatch = true;\n break;\n }\n actualIndex++;\n }\n\n if (!found && !argsMismatch) {\n misses.push(`Expected ${expectedTool} at position ${i}, not found in remaining trace`);\n }\n }\n\n const score = hits.length / expected.length;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: expected.length,\n };\n }\n\n private evaluateExact(toolCalls: readonly ExtractedToolCall[]): EvaluationScore {\n const expected = this.config.expected ?? [];\n\n if (expected.length === 0) {\n return {\n score: 1,\n verdict: 'pass',\n hits: ['No tool sequence specified'],\n misses: [],\n expectedAspectCount: 0,\n };\n }\n\n const hits: string[] = [];\n const misses: string[] = [];\n\n if (toolCalls.length !== expected.length) {\n misses.push(`Expected ${expected.length} tool calls, got ${toolCalls.length}`);\n }\n\n const checkLength = Math.min(expected.length, toolCalls.length);\n for (let i = 0; i < checkLength; i++) {\n const expectedItem = expected[i];\n const expectedTool = expectedItem.tool;\n const actualCall = toolCalls[i];\n const actualTool = actualCall.name;\n if (actualTool === expectedTool) {\n // Tool name matches, check args if specified\n if (argsMatch(expectedItem.args, actualCall.args)) {\n hits.push(`Position ${i}: ${expectedTool}`);\n } else {\n misses.push(`Position ${i}: ${expectedTool} args mismatch`);\n }\n } else {\n misses.push(`Position ${i}: expected ${expectedTool}, got ${actualTool}`);\n }\n }\n\n for (let i = checkLength; i < expected.length; i++) {\n misses.push(`Position ${i}: expected ${expected[i].tool}, got nothing`);\n }\n\n const score = hits.length / expected.length;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: expected.length,\n };\n }\n}\n\n// Field Accuracy Evaluator\n\nexport interface FieldAccuracyEvaluatorOptions {\n readonly config: FieldAccuracyEvaluatorConfig;\n}\n\n/** Result from evaluating a single field */\ninterface FieldResult {\n readonly path: string;\n readonly score: number;\n readonly weight: number;\n readonly hit: boolean;\n readonly message: string;\n}\n\n/**\n * Default date formats to try when parsing dates.\n * Ordered from most specific to least specific.\n */\nconst DEFAULT_DATE_FORMATS = [\n 'YYYY-MM-DDTHH:mm:ssZ', // ISO with timezone\n 'YYYY-MM-DDTHH:mm:ss', // ISO with time\n 'YYYY-MM-DD', // ISO date\n 'DD-MMM-YYYY', // Localized (e.g., \"15-JAN-2025\")\n 'MM/DD/YYYY', // US format\n 'DD/MM/YYYY', // EU format\n 'MM-DD-YYYY', // US with dashes\n 'DD-MM-YYYY', // EU with dashes\n];\n\n/**\n * Month name mappings for parsing localized dates.\n */\nconst MONTH_NAMES: Record<string, number> = {\n jan: 0,\n january: 0,\n feb: 1,\n february: 1,\n mar: 2,\n march: 2,\n apr: 3,\n april: 3,\n may: 4,\n jun: 5,\n june: 5,\n jul: 6,\n july: 6,\n aug: 7,\n august: 7,\n sep: 8,\n sept: 8,\n september: 8,\n oct: 9,\n october: 9,\n nov: 10,\n november: 10,\n dec: 11,\n december: 11,\n};\n\n/**\n * FieldAccuracyEvaluator compares extracted structured data against expected values\n * with configurable matching strategies (exact, fuzzy, numeric_tolerance, date).\n */\nexport class FieldAccuracyEvaluator implements Evaluator {\n readonly kind = 'field_accuracy';\n\n private readonly config: FieldAccuracyEvaluatorConfig;\n\n constructor(options: FieldAccuracyEvaluatorOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { evalCase, candidate } = context;\n\n // Parse candidate answer as JSON\n let candidateData: Record<string, unknown>;\n try {\n candidateData = parseJsonFromTextSafe(candidate);\n } catch {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: ['Failed to parse candidate answer as JSON'],\n expectedAspectCount: this.config.fields.length,\n reasoning: 'Candidate answer is not valid JSON',\n };\n }\n\n // Extract expected data from expected_messages\n const expectedData = this.extractExpectedData(evalCase.expected_messages);\n if (!expectedData) {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: ['No expected data found in expected_messages'],\n expectedAspectCount: this.config.fields.length,\n reasoning: 'Could not extract expected data from expected_messages',\n };\n }\n\n // Evaluate each field\n const fieldResults: FieldResult[] = [];\n for (const fieldConfig of this.config.fields) {\n const result = this.evaluateField(fieldConfig, candidateData, expectedData);\n fieldResults.push(result);\n }\n\n // Aggregate results\n return this.aggregateResults(fieldResults);\n }\n\n /**\n * Extract expected data from expected_messages array.\n * Looks for the last assistant message with content.\n */\n private extractExpectedData(\n expectedMessages: readonly JsonObject[],\n ): Record<string, unknown> | undefined {\n // Find the last assistant message with content\n for (let i = expectedMessages.length - 1; i >= 0; i--) {\n const message = expectedMessages[i];\n if (message.role === 'assistant' && message.content) {\n if (typeof message.content === 'object' && message.content !== null) {\n return message.content as Record<string, unknown>;\n }\n // If content is a string, try to parse it as JSON\n if (typeof message.content === 'string') {\n try {\n return parseJsonFromTextSafe(message.content);\n } catch {\n // Parsing failed, continue to next message\n }\n }\n }\n }\n return undefined;\n }\n\n /**\n * Evaluate a single field against the expected value.\n */\n private evaluateField(\n fieldConfig: FieldConfig,\n candidateData: Record<string, unknown>,\n expectedData: Record<string, unknown>,\n ): FieldResult {\n const { path, match, required = true, weight = 1.0 } = fieldConfig;\n\n const candidateValue = resolvePath(candidateData, path);\n const expectedValue = resolvePath(expectedData, path);\n\n // Handle missing expected value\n if (expectedValue === undefined) {\n // If the expected value is missing, we can't compare\n return {\n path,\n score: 1.0, // No expected value means no comparison needed\n weight,\n hit: true,\n message: `${path}: no expected value`,\n };\n }\n\n // Handle missing candidate value\n if (candidateValue === undefined) {\n if (required) {\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (required, missing)`,\n };\n }\n // Optional field missing - don't count in aggregation\n return {\n path,\n score: 1.0, // Don't penalize missing optional fields\n weight: 0, // Zero weight means it won't affect the score\n hit: true,\n message: `${path}: optional field missing`,\n };\n }\n\n // Compare based on match type\n switch (match) {\n case 'exact':\n return this.compareExact(path, candidateValue, expectedValue, weight);\n case 'numeric_tolerance':\n return this.compareNumericTolerance(\n path,\n candidateValue,\n expectedValue,\n fieldConfig,\n weight,\n );\n case 'date':\n return this.compareDate(path, candidateValue, expectedValue, fieldConfig, weight);\n default:\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path}: unknown match type \"${match}\"`,\n };\n }\n }\n\n /**\n * Exact equality comparison.\n */\n private compareExact(\n path: string,\n candidateValue: unknown,\n expectedValue: unknown,\n weight: number,\n ): FieldResult {\n // Deep equality for objects and arrays\n if (deepEqual(candidateValue, expectedValue)) {\n return {\n path,\n score: 1.0,\n weight,\n hit: true,\n message: path,\n };\n }\n\n // Type mismatch\n if (typeof candidateValue !== typeof expectedValue) {\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (type mismatch: got ${typeof candidateValue}, expected ${typeof expectedValue})`,\n };\n }\n\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (value mismatch)`,\n };\n }\n\n /**\n * Numeric comparison with absolute or relative tolerance.\n */\n private compareNumericTolerance(\n path: string,\n candidateValue: unknown,\n expectedValue: unknown,\n fieldConfig: FieldConfig,\n weight: number,\n ): FieldResult {\n const { tolerance = 0, relative = false } = fieldConfig;\n\n const candidateNum = toNumber(candidateValue);\n const expectedNum = toNumber(expectedValue);\n\n if (candidateNum === null || expectedNum === null) {\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (non-numeric value)`,\n };\n }\n\n if (!Number.isFinite(candidateNum) || !Number.isFinite(expectedNum)) {\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (invalid numeric value)`,\n };\n }\n\n const diff = Math.abs(candidateNum - expectedNum);\n let withinTolerance: boolean;\n\n if (relative) {\n // Relative tolerance: |actual - expected| / |expected| <= tolerance\n // Handle division by zero for expected === 0\n const relativeDiff = expectedNum === 0 ? diff : diff / Math.abs(expectedNum);\n withinTolerance = relativeDiff <= tolerance;\n } else {\n // Absolute tolerance: |actual - expected| <= tolerance\n withinTolerance = diff <= tolerance;\n }\n\n if (withinTolerance) {\n return {\n path,\n score: 1.0,\n weight,\n hit: true,\n message: `${path} (within tolerance: diff=${diff.toFixed(2)})`,\n };\n }\n\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (outside tolerance: diff=${diff.toFixed(2)}, tolerance=${tolerance})`,\n };\n }\n\n /**\n * Date comparison with format normalization.\n */\n private compareDate(\n path: string,\n candidateValue: unknown,\n expectedValue: unknown,\n fieldConfig: FieldConfig,\n weight: number,\n ): FieldResult {\n const formats = fieldConfig.formats ?? DEFAULT_DATE_FORMATS;\n\n const candidateDate = parseDate(String(candidateValue), formats);\n const expectedDate = parseDate(String(expectedValue), formats);\n\n if (candidateDate === null) {\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (unparseable candidate date)`,\n };\n }\n\n if (expectedDate === null) {\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (unparseable expected date)`,\n };\n }\n\n // Compare dates by year, month, and day (ignore time component)\n if (\n candidateDate.getFullYear() === expectedDate.getFullYear() &&\n candidateDate.getMonth() === expectedDate.getMonth() &&\n candidateDate.getDate() === expectedDate.getDate()\n ) {\n return {\n path,\n score: 1.0,\n weight,\n hit: true,\n message: path,\n };\n }\n\n return {\n path,\n score: 0,\n weight,\n hit: false,\n message: `${path} (date mismatch: got ${formatDateISO(candidateDate)}, expected ${formatDateISO(expectedDate)})`,\n };\n }\n\n /**\n * Aggregate field results using configured strategy.\n */\n private aggregateResults(results: readonly FieldResult[]): EvaluationScore {\n const aggregation = this.config.aggregation ?? 'weighted_average';\n const hits: string[] = [];\n const misses: string[] = [];\n\n for (const result of results) {\n if (result.hit) {\n hits.push(result.message);\n } else {\n misses.push(result.message);\n }\n }\n\n let score: number;\n if (aggregation === 'all_or_nothing') {\n // All fields must pass for score 1.0\n score = misses.length === 0 ? 1.0 : 0.0;\n } else {\n // weighted_average (default)\n const totalWeight = results.reduce((sum, r) => sum + r.weight, 0);\n if (totalWeight === 0) {\n score = results.length === 0 ? 1.0 : 0.0;\n } else {\n const weightedSum = results.reduce((sum, r) => sum + r.score * r.weight, 0);\n score = weightedSum / totalWeight;\n }\n }\n\n const reasoning = `${hits.length}/${results.length} fields matched`;\n\n return {\n score: clampScore(score),\n verdict: scoreToVerdict(score),\n hits: hits.slice(0, 4),\n misses: misses.slice(0, 4),\n expectedAspectCount: results.length,\n reasoning,\n };\n }\n}\n\n/**\n * Resolve a dot-notation path (with array indexing) to a value.\n * Example: \"invoice.line_items[0].amount\"\n */\nfunction resolvePath(obj: Record<string, unknown>, path: string): unknown {\n if (!path || !obj) {\n return undefined;\n }\n\n // Split on dots and array brackets\n const parts = path.split(/\\.|\\[|\\]/).filter((p) => p.length > 0);\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n\n if (typeof current !== 'object') {\n return undefined;\n }\n\n const isIndex = /^\\d+$/.test(part);\n if (isIndex && Array.isArray(current)) {\n current = current[Number.parseInt(part, 10)];\n } else {\n current = (current as Record<string, unknown>)[part];\n }\n }\n\n return current;\n}\n\n/**\n * Convert a value to a number, returning null if not possible.\n */\nfunction toNumber(value: unknown): number | null {\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'string') {\n const num = Number.parseFloat(value);\n return Number.isNaN(num) ? null : num;\n }\n return null;\n}\n\n/**\n * Parse a date string using the specified formats.\n * Returns null if parsing fails.\n *\n * Date format disambiguation:\n * - If only US formats (MM/DD/YYYY) are specified, parses as US\n * - If only EU formats (DD/MM/YYYY) are specified, parses as EU\n * - If both or neither are specified, attempts to infer from values:\n * - If first number > 12, assumes EU format (day first)\n * - If second number > 12, assumes US format (month first)\n * - If ambiguous (both <= 12), defaults to US format (MM/DD/YYYY)\n */\nfunction parseDate(dateStr: string, formats: readonly string[]): Date | null {\n if (!dateStr) return null;\n\n const trimmed = dateStr.trim();\n\n // Try ISO format first (JavaScript native)\n const isoDate = new Date(trimmed);\n if (!Number.isNaN(isoDate.getTime())) {\n return isoDate;\n }\n\n // Try localized format (DD-MMM-YYYY)\n const localizedMatch = trimmed.match(/^(\\d{1,2})-([A-Za-z]{3,9})-(\\d{4})$/);\n if (localizedMatch) {\n const day = Number.parseInt(localizedMatch[1], 10);\n const monthName = localizedMatch[2].toLowerCase();\n const year = Number.parseInt(localizedMatch[3], 10);\n const month = MONTH_NAMES[monthName];\n if (month !== undefined) {\n return new Date(year, month, day);\n }\n }\n\n // Try US format (MM/DD/YYYY or MM-DD-YYYY)\n const usMatch = trimmed.match(/^(\\d{1,2})[\\/\\-](\\d{1,2})[\\/\\-](\\d{4})$/);\n if (usMatch) {\n // Check if first or second number is likely the month\n // Assume MM/DD/YYYY for formats array containing \"MM/DD/YYYY\" or \"MM-DD-YYYY\"\n const hasUSFormat = formats.some((f) => f.includes('MM/DD') || f.includes('MM-DD'));\n const hasEUFormat = formats.some((f) => f.includes('DD/MM') || f.includes('DD-MM'));\n\n if (hasUSFormat && !hasEUFormat) {\n const month = Number.parseInt(usMatch[1], 10) - 1;\n const day = Number.parseInt(usMatch[2], 10);\n const year = Number.parseInt(usMatch[3], 10);\n if (month >= 0 && month <= 11 && day >= 1 && day <= 31) {\n return new Date(year, month, day);\n }\n } else if (hasEUFormat && !hasUSFormat) {\n const day = Number.parseInt(usMatch[1], 10);\n const month = Number.parseInt(usMatch[2], 10) - 1;\n const year = Number.parseInt(usMatch[3], 10);\n if (month >= 0 && month <= 11 && day >= 1 && day <= 31) {\n return new Date(year, month, day);\n }\n } else {\n // Ambiguous - try to infer from values\n const num1 = Number.parseInt(usMatch[1], 10);\n const num2 = Number.parseInt(usMatch[2], 10);\n const year = Number.parseInt(usMatch[3], 10);\n\n // If first number > 12, it must be day (EU format)\n if (num1 > 12 && num2 <= 12) {\n return new Date(year, num2 - 1, num1);\n }\n // If second number > 12, it must be day (US format)\n if (num2 > 12 && num1 <= 12) {\n return new Date(year, num1 - 1, num2);\n }\n // Default to US format\n if (num1 <= 12 && num2 <= 31) {\n return new Date(year, num1 - 1, num2);\n }\n }\n }\n\n return null;\n}\n\n/**\n * Format a date as ISO date string (YYYY-MM-DD).\n */\nfunction formatDateISO(date: Date): string {\n return date.toISOString().split('T')[0];\n}\n\n/**\n * Safely parse JSON from text, handling code blocks.\n */\nfunction parseJsonFromTextSafe(text: string): Record<string, unknown> {\n const cleaned = typeof text === 'string' ? text.replace(/```json\\n?|```/g, '').trim() : '';\n const match = cleaned.match(/\\{[\\s\\S]*\\}/);\n const blob = match?.[0] ?? cleaned;\n return JSON.parse(blob) as Record<string, unknown>;\n}\n\n// Composite Evaluator\n\nexport interface EvaluatorFactory {\n create(config: EvaluatorConfig, context: EvaluationContext): Evaluator;\n}\n\ninterface MemberResult {\n readonly id: string;\n readonly type: string;\n readonly result: EvaluationScore;\n}\n\nconst DEFAULT_COMPOSITE_AGGREGATOR_PROMPT = `Review the following evaluation results:\n{{EVALUATOR_RESULTS_JSON}}\n\nDecide the final score and verdict based on all evaluator results.\nReturn a JSON object with: score (0.0-1.0), verdict (pass/fail/borderline), and reasoning.`;\n\nexport interface CompositeEvaluatorOptions {\n readonly config: import('./types.js').CompositeEvaluatorConfig;\n readonly evaluatorFactory: EvaluatorFactory;\n readonly cwd?: string;\n}\n\nexport class CompositeEvaluator implements Evaluator {\n readonly kind = 'composite';\n\n private readonly config: import('./types.js').CompositeEvaluatorConfig;\n private readonly evaluatorFactory: EvaluatorFactory;\n private readonly cwd?: string;\n\n constructor(options: CompositeEvaluatorOptions) {\n this.config = options.config;\n this.evaluatorFactory = options.evaluatorFactory;\n this.cwd = options.cwd;\n }\n\n async evaluate(context: EvaluationContext): Promise<EvaluationScore> {\n // 1. Instantiate and run evaluators in parallel\n const memberResults = await Promise.all(\n this.config.evaluators.map(async (memberConfig) => {\n const evaluator = this.evaluatorFactory.create(memberConfig, context);\n return {\n id: memberConfig.name,\n type: memberConfig.type,\n result: await evaluator.evaluate(context),\n };\n }),\n );\n\n // 2. Aggregate results\n return this.aggregate(memberResults, context);\n }\n\n private async aggregate(\n results: readonly MemberResult[],\n context: EvaluationContext,\n ): Promise<EvaluationScore> {\n const aggregator = this.config.aggregator;\n\n switch (aggregator.type) {\n case 'code_judge':\n return this.runCodeAggregator(results, aggregator.path, aggregator.cwd ?? this.cwd);\n case 'llm_judge':\n return this.runLlmAggregator(results, context, aggregator);\n default:\n return this.runWeightedAverage(results, aggregator.weights);\n }\n }\n\n private runWeightedAverage(\n results: readonly MemberResult[],\n weights?: Record<string, number>,\n ): EvaluationScore {\n let totalWeight = 0;\n let weightedSum = 0;\n const allHits: string[] = [];\n const allMisses: string[] = [];\n const reasoningParts: string[] = [];\n const evaluatorResults: ChildEvaluatorResult[] = [];\n\n for (const member of results) {\n const weight = weights?.[member.id] ?? 1.0;\n totalWeight += weight;\n weightedSum += member.result.score * weight;\n allHits.push(...member.result.hits.map((h) => `[${member.id}] ${h}`));\n allMisses.push(...member.result.misses.map((m) => `[${member.id}] ${m}`));\n if (member.result.reasoning) {\n reasoningParts.push(`${member.id}: ${member.result.reasoning}`);\n }\n\n // Build child result entry\n evaluatorResults.push({\n name: member.id,\n type: member.type,\n score: member.result.score,\n weight,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n evaluatorResults: member.result.evaluatorResults,\n });\n }\n\n const finalScore = totalWeight > 0 ? weightedSum / totalWeight : 0;\n\n return {\n score: clampScore(finalScore),\n verdict: scoreToVerdict(finalScore),\n hits: allHits,\n misses: allMisses,\n expectedAspectCount: Math.max(allHits.length + allMisses.length, 1),\n reasoning: reasoningParts.length > 0 ? reasoningParts.join('; ') : undefined,\n evaluatorRawRequest: {\n aggregator: 'weighted_average',\n ...(weights ? { weights } : {}),\n },\n evaluatorResults,\n };\n }\n\n private async runCodeAggregator(\n results: readonly MemberResult[],\n scriptPath: string,\n cwd?: string,\n weights?: Record<string, number>,\n ): Promise<EvaluationScore> {\n const resultsObject = Object.fromEntries(results.map((r) => [r.id, r.result]));\n const inputPayload = JSON.stringify({ results: resultsObject }, null, 2);\n\n // Build child results for output\n const evaluatorResults: ChildEvaluatorResult[] = results.map((member) => ({\n name: member.id,\n type: member.type,\n score: member.result.score,\n weight: weights?.[member.id] ?? 1.0,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n evaluatorResults: member.result.evaluatorResults,\n }));\n\n try {\n const stdout = await executeScript(scriptPath, inputPayload, undefined, cwd);\n const parsed = parseJsonSafe(stdout);\n const score = clampScore(typeof parsed?.score === 'number' ? parsed.score : 0);\n const hits = Array.isArray(parsed?.hits) ? parsed.hits.filter(isNonEmptyString) : [];\n const misses = Array.isArray(parsed?.misses) ? parsed.misses.filter(isNonEmptyString) : [];\n const reasoning = typeof parsed?.reasoning === 'string' ? parsed.reasoning : undefined;\n const verdict =\n typeof parsed?.verdict === 'string' &&\n (parsed.verdict === 'pass' || parsed.verdict === 'fail' || parsed.verdict === 'borderline')\n ? parsed.verdict\n : scoreToVerdict(score);\n\n return {\n score,\n verdict,\n hits,\n misses,\n expectedAspectCount: hits.length + misses.length || 1,\n reasoning,\n evaluatorRawRequest: {\n aggregator: 'code_judge',\n script: scriptPath,\n },\n evaluatorResults,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Code aggregator failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n evaluatorRawRequest: {\n aggregator: 'code_judge',\n script: scriptPath,\n error: message,\n },\n evaluatorResults,\n };\n }\n }\n\n private async runLlmAggregator(\n results: readonly MemberResult[],\n context: EvaluationContext,\n config: Extract<import('./types.js').CompositeAggregatorConfig, { type: 'llm_judge' }>,\n ): Promise<EvaluationScore> {\n const judgeProvider = context.judgeProvider;\n if (!judgeProvider) {\n throw new Error('No judge provider available for LLM aggregation');\n }\n\n const resultsObject = Object.fromEntries(results.map((r) => [r.id, r.result]));\n const resultsJson = JSON.stringify(resultsObject, null, 2);\n\n // Build child results for output\n const evaluatorResults: ChildEvaluatorResult[] = results.map((member) => ({\n name: member.id,\n type: member.type,\n score: member.result.score,\n verdict: member.result.verdict,\n hits: [...member.result.hits],\n misses: [...member.result.misses],\n reasoning: member.result.reasoning,\n evaluatorRawRequest: member.result.evaluatorRawRequest,\n evaluatorResults: member.result.evaluatorResults,\n }));\n\n // Use custom prompt if provided, otherwise use default\n const promptTemplate = config.prompt ?? DEFAULT_COMPOSITE_AGGREGATOR_PROMPT;\n const userPrompt = promptTemplate.replace(/\\{\\{EVALUATOR_RESULTS_JSON\\}\\}/g, resultsJson);\n\n const systemPrompt = buildOutputSchema();\n\n const evaluatorRawRequest: JsonObject = {\n aggregator: 'llm_judge',\n userPrompt,\n systemPrompt,\n target: judgeProvider.targetName,\n };\n\n try {\n const model = judgeProvider.asLanguageModel?.();\n if (model) {\n const { text } = await generateText({\n model,\n system: systemPrompt,\n prompt: userPrompt,\n });\n\n const data = freeformEvaluationSchema.parse(parseJsonFromText(text));\n const score = clampScore(data.score);\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: Math.max(hits.length + misses.length, 1),\n reasoning,\n evaluatorRawRequest,\n evaluatorResults,\n };\n }\n\n const response = await judgeProvider.invoke({\n question: userPrompt,\n systemPrompt,\n evalCaseId: context.evalCase.id,\n attempt: context.attempt,\n });\n\n const data = freeformEvaluationSchema.parse(\n parseJsonFromText(extractLastAssistantContent(response.outputMessages)),\n );\n const score = clampScore(data.score);\n const hits = Array.isArray(data.hits) ? data.hits.filter(isNonEmptyString).slice(0, 4) : [];\n const misses = Array.isArray(data.misses)\n ? data.misses.filter(isNonEmptyString).slice(0, 4)\n : [];\n const reasoning = data.reasoning;\n\n return {\n score,\n verdict: scoreToVerdict(score),\n hits,\n misses,\n expectedAspectCount: Math.max(hits.length + misses.length, 1),\n reasoning,\n evaluatorRawRequest,\n evaluatorResults,\n };\n } catch {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [],\n expectedAspectCount: 1,\n evaluatorRawRequest,\n evaluatorResults,\n };\n }\n }\n}\n\n// ----------------------------------------------------------------------------\n// Latency Evaluator\n// ----------------------------------------------------------------------------\n\nexport interface LatencyEvaluatorOptions {\n readonly config: LatencyEvaluatorConfig;\n}\n\n/**\n * Evaluator that checks execution duration against a threshold.\n * Uses traceSummary.durationMs from the evaluation context.\n */\nexport class LatencyEvaluator implements Evaluator {\n readonly kind = 'latency';\n\n private readonly config: LatencyEvaluatorConfig;\n\n constructor(options: LatencyEvaluatorOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { threshold } = this.config;\n const durationMs = context.traceSummary?.durationMs;\n\n // If no duration data available, we can't evaluate\n if (durationMs === undefined) {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: ['No duration data available in trace'],\n expectedAspectCount: 1,\n reasoning: 'Execution duration not reported by provider',\n evaluatorRawRequest: {\n type: 'latency',\n threshold,\n durationMs: null,\n },\n };\n }\n\n const passed = durationMs <= threshold;\n const score = passed ? 1 : 0;\n\n return {\n score,\n verdict: passed ? 'pass' : 'fail',\n hits: passed ? [`Duration ${durationMs}ms <= ${threshold}ms threshold`] : [],\n misses: passed ? [] : [`Duration ${durationMs}ms > ${threshold}ms threshold`],\n expectedAspectCount: 1,\n reasoning: `Execution took ${durationMs}ms (threshold: ${threshold}ms)`,\n evaluatorRawRequest: {\n type: 'latency',\n threshold,\n durationMs,\n },\n };\n }\n}\n\n// ----------------------------------------------------------------------------\n// Cost Evaluator\n// ----------------------------------------------------------------------------\n\nexport interface CostEvaluatorOptions {\n readonly config: CostEvaluatorConfig;\n}\n\n/**\n * Evaluator that checks execution cost against a budget.\n * Uses traceSummary.costUsd from the evaluation context.\n */\nexport class CostEvaluator implements Evaluator {\n readonly kind = 'cost';\n\n private readonly config: CostEvaluatorConfig;\n\n constructor(options: CostEvaluatorOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const { budget } = this.config;\n const costUsd = context.traceSummary?.costUsd;\n\n // If no cost data available, we can't evaluate\n if (costUsd === undefined) {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: ['No cost data available in trace'],\n expectedAspectCount: 1,\n reasoning: 'Execution cost not reported by provider',\n evaluatorRawRequest: {\n type: 'cost',\n budget,\n costUsd: null,\n },\n };\n }\n\n const passed = costUsd <= budget;\n const score = passed ? 1 : 0;\n\n // Format cost for display\n const formatCost = (n: number) => `$${n.toFixed(4)}`;\n\n return {\n score,\n verdict: passed ? 'pass' : 'fail',\n hits: passed ? [`Cost ${formatCost(costUsd)} <= ${formatCost(budget)} budget`] : [],\n misses: passed ? [] : [`Cost ${formatCost(costUsd)} > ${formatCost(budget)} budget`],\n expectedAspectCount: 1,\n reasoning: `Execution cost ${formatCost(costUsd)} (budget: ${formatCost(budget)})`,\n evaluatorRawRequest: {\n type: 'cost',\n budget,\n costUsd,\n },\n };\n }\n}\n\n// ----------------------------------------------------------------------------\n// Token Usage Evaluator\n// ----------------------------------------------------------------------------\n\nexport interface TokenUsageEvaluatorOptions {\n readonly config: TokenUsageEvaluatorConfig;\n}\n\n/**\n * Evaluator that checks provider-reported token usage against configured limits.\n * Uses traceSummary.tokenUsage from the evaluation context.\n */\nexport class TokenUsageEvaluator implements Evaluator {\n readonly kind = 'token_usage';\n\n private readonly config: TokenUsageEvaluatorConfig;\n\n constructor(options: TokenUsageEvaluatorOptions) {\n this.config = options.config;\n }\n\n evaluate(context: EvaluationContext): EvaluationScore {\n const usage = context.traceSummary?.tokenUsage;\n\n const maxTotal = this.config.max_total;\n const maxInput = this.config.max_input;\n const maxOutput = this.config.max_output;\n\n const expectedAspectCount = Math.max(\n [maxTotal, maxInput, maxOutput].filter((v) => typeof v === 'number').length,\n 1,\n );\n\n if (!usage) {\n return {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: ['No token usage data available in trace'],\n expectedAspectCount,\n reasoning: 'Token usage not reported by provider',\n evaluatorRawRequest: {\n type: 'token_usage',\n max_total: maxTotal ?? null,\n max_input: maxInput ?? null,\n max_output: maxOutput ?? null,\n tokenUsage: null,\n },\n };\n }\n\n const input = usage.input;\n const output = usage.output;\n const cached = usage.cached ?? 0;\n const total = input + output + cached;\n\n const hits: string[] = [];\n const misses: string[] = [];\n\n if (typeof maxInput === 'number') {\n if (input <= maxInput) {\n hits.push(`Input tokens ${input} <= ${maxInput}`);\n } else {\n misses.push(`Input tokens ${input} > ${maxInput}`);\n }\n }\n\n if (typeof maxOutput === 'number') {\n if (output <= maxOutput) {\n hits.push(`Output tokens ${output} <= ${maxOutput}`);\n } else {\n misses.push(`Output tokens ${output} > ${maxOutput}`);\n }\n }\n\n if (typeof maxTotal === 'number') {\n if (total <= maxTotal) {\n hits.push(`Total tokens ${total} <= ${maxTotal}`);\n } else {\n misses.push(`Total tokens ${total} > ${maxTotal}`);\n }\n }\n\n const passed = misses.length === 0;\n\n return {\n score: passed ? 1 : 0,\n verdict: passed ? 'pass' : 'fail',\n hits,\n misses,\n expectedAspectCount,\n reasoning: `token_usage input=${input}, output=${output}, cached=${cached}, total=${total}`,\n evaluatorRawRequest: {\n type: 'token_usage',\n max_total: maxTotal ?? null,\n max_input: maxInput ?? null,\n max_output: maxOutput ?? null,\n tokenUsage: {\n input,\n output,\n cached,\n total,\n },\n },\n };\n }\n}\n","interface ExecOptions {\n readonly cwd?: string;\n readonly timeoutMs?: number;\n}\n\nfunction shellEscapePath(value: string): string {\n if (process.platform === 'win32') {\n // Very small escape helper for file paths in cmd.exe context.\n // Wrap in double-quotes and escape existing double-quotes.\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n }\n // POSIX: single-quote escape (close/open around embedded single quotes).\n return `'${value.replaceAll(\"'\", `'\\\"'\\\"'`)}'`;\n}\n\nexport async function execFileWithStdin(\n argv: readonly string[],\n stdinPayload: string,\n options: ExecOptions = {},\n): Promise<{\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}> {\n if (argv.length === 0) {\n throw new Error('Executable argv must include at least one entry');\n }\n\n // Use Bun.spawn if available, otherwise fall back to Node.js child_process\n if (typeof Bun !== 'undefined') {\n return execFileWithStdinBun(argv, stdinPayload, options);\n }\n return execFileWithStdinNode(argv, stdinPayload, options);\n}\n\n/**\n * Bun implementation using Bun.spawn\n */\nasync function execFileWithStdinBun(\n argv: readonly string[],\n stdinPayload: string,\n options: ExecOptions,\n): Promise<{\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}> {\n const command = [...argv];\n const encoder = new TextEncoder();\n const proc = Bun.spawn(command, {\n cwd: options.cwd,\n stdin: encoder.encode(stdinPayload),\n stdout: 'pipe',\n stderr: 'pipe',\n });\n\n let timedOut = false;\n const timeout =\n options.timeoutMs !== undefined\n ? setTimeout(() => {\n timedOut = true;\n proc.kill('SIGKILL');\n }, options.timeoutMs)\n : undefined;\n\n try {\n const stdoutPromise = proc.stdout ? new Response(proc.stdout).text() : Promise.resolve('');\n const stderrPromise = proc.stderr ? new Response(proc.stderr).text() : Promise.resolve('');\n\n const [stdout, stderr, exitCode] = await Promise.all([\n stdoutPromise,\n stderrPromise,\n proc.exited,\n ]);\n\n if (timedOut) {\n throw new Error(`Process timed out after ${options.timeoutMs}ms`);\n }\n\n return {\n stdout: stdout.replace(/\\r\\n/g, '\\n'),\n stderr: stderr.replace(/\\r\\n/g, '\\n'),\n exitCode,\n };\n } finally {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n }\n}\n\n/**\n * Node.js implementation using child_process.spawn\n */\nasync function execFileWithStdinNode(\n argv: readonly string[],\n stdinPayload: string,\n options: ExecOptions,\n): Promise<{\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}> {\n const { spawn } = await import('node:child_process');\n\n return new Promise((resolve, reject) => {\n const [cmd, ...args] = argv;\n const child = spawn(cmd, args, {\n cwd: options.cwd,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n child.stdout?.on('data', (chunk: Buffer) => stdoutChunks.push(chunk));\n child.stderr?.on('data', (chunk: Buffer) => stderrChunks.push(chunk));\n\n let timedOut = false;\n const timeout =\n options.timeoutMs !== undefined\n ? setTimeout(() => {\n timedOut = true;\n child.kill('SIGKILL');\n }, options.timeoutMs)\n : undefined;\n\n child.on('error', (error) => {\n if (timeout !== undefined) clearTimeout(timeout);\n reject(error);\n });\n\n child.on('close', (code) => {\n if (timeout !== undefined) clearTimeout(timeout);\n\n if (timedOut) {\n reject(new Error(`Process timed out after ${options.timeoutMs}ms`));\n return;\n }\n\n const stdout = Buffer.concat(stdoutChunks).toString('utf8').replace(/\\r\\n/g, '\\n');\n const stderr = Buffer.concat(stderrChunks).toString('utf8').replace(/\\r\\n/g, '\\n');\n\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 0,\n });\n });\n\n // Write stdin and close\n if (child.stdin) {\n child.stdin.write(stdinPayload);\n child.stdin.end();\n }\n });\n}\n\n/**\n * Execute a shell command with the given stdin payload.\n *\n * Why this exists:\n * - Some providers/scripts (notably Node.js) must receive stdin reliably.\n * - In some Bun environments, `Bun.spawn` does not forward stdin to Node correctly.\n * - Capture stdout/stderr via temp files to avoid pipe incompatibilities.\n */\nexport async function execShellWithStdin(\n command: string,\n stdinPayload: string,\n options: ExecOptions = {},\n): Promise<{\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}> {\n const { mkdir, readFile, rm, writeFile } = await import('node:fs/promises');\n const { tmpdir } = await import('node:os');\n const path = await import('node:path');\n const { randomUUID } = await import('node:crypto');\n\n const dir = path.join(tmpdir(), `agentv-exec-${randomUUID()}`);\n await mkdir(dir, { recursive: true });\n\n const stdinPath = path.join(dir, 'stdin.txt');\n const stdoutPath = path.join(dir, 'stdout.txt');\n const stderrPath = path.join(dir, 'stderr.txt');\n\n await writeFile(stdinPath, stdinPayload, 'utf8');\n\n const wrappedCommand =\n process.platform === 'win32'\n ? `(${command}) < ${shellEscapePath(stdinPath)} > ${shellEscapePath(stdoutPath)} 2> ${shellEscapePath(stderrPath)}`\n : `(${command}) < ${shellEscapePath(stdinPath)} > ${shellEscapePath(stdoutPath)} 2> ${shellEscapePath(stderrPath)}`;\n\n const { spawn } = await import('node:child_process');\n try {\n const exitCode = await new Promise<number>((resolve, reject) => {\n const child = spawn(wrappedCommand, {\n shell: true,\n cwd: options.cwd,\n stdio: ['ignore', 'ignore', 'ignore'],\n });\n\n const timeout = options.timeoutMs\n ? setTimeout(() => {\n child.kill();\n reject(new Error(`Process timed out after ${options.timeoutMs}ms`));\n }, options.timeoutMs)\n : undefined;\n\n child.on('error', (error) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n reject(error);\n });\n\n child.on('exit', (code) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n resolve(code ?? 0);\n });\n });\n\n const stdout = (await readFile(stdoutPath, 'utf8')).replace(/\\r\\n/g, '\\n');\n const stderr = (await readFile(stderrPath, 'utf8')).replace(/\\r\\n/g, '\\n');\n return { stdout, stderr, exitCode };\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n}\n","/**\n * Converts a camelCase string to snake_case.\n * Examples:\n * evalId -> eval_id\n * candidateAnswer -> candidate_answer\n * conversationId -> conversation_id\n *\n * Note: Keys that start with an uppercase letter are treated as proper nouns\n * and returned unchanged (e.g., \"Read\", \"Edit\" for tool names).\n */\nfunction toSnakeCase(str: string): string {\n // Don't convert keys that start with uppercase (proper nouns/tool names)\n if (/^[A-Z]/.test(str)) {\n return str;\n }\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\nfunction toCamelCase(str: string): string {\n if (/^[A-Z]/.test(str)) {\n return str;\n }\n return str.replace(/_([a-z0-9])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Recursively converts all keys in an object from camelCase to snake_case.\n * This is used to convert TypeScript internal representations to snake_case\n * for Python ecosystem compatibility in JSON payloads.\n *\n * Conversion rules:\n * - Object keys: camelCase -> snake_case\n * - Array elements: recursively converted\n * - Primitives: returned unchanged\n * - null/undefined: returned unchanged\n *\n * @param obj - The object to convert (can be any JSON-serializable value)\n * @returns A new object with all keys converted to snake_case\n */\nexport function toSnakeCaseDeep(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => toSnakeCaseDeep(item));\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const snakeKey = toSnakeCase(key);\n result[snakeKey] = toSnakeCaseDeep(value);\n }\n return result;\n }\n\n return obj;\n}\n\n/**\n * Recursively converts all keys in an object from snake_case to camelCase.\n * This is used by optional SDK helpers to map wire payloads into TypeScript-friendly\n * shapes.\n *\n * @param obj - The object to convert (can be any JSON-serializable value)\n * @returns A new object with all keys converted to camelCase\n */\nexport function toCamelCaseDeep(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => toCamelCaseDeep(item));\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const camelKey = toCamelCase(key);\n result[camelKey] = toCamelCaseDeep(value);\n }\n return result;\n }\n\n return obj;\n}\n","import type { JsonObject } from '../types.js';\n\nexport type ChatMessageRole = 'system' | 'user' | 'assistant' | 'tool' | 'function';\n\nexport interface ChatMessage {\n readonly role: ChatMessageRole;\n readonly content: string;\n readonly name?: string;\n}\n\nexport type ChatPrompt = readonly ChatMessage[];\n\nexport type ProviderKind =\n | 'azure'\n | 'anthropic'\n | 'gemini'\n | 'codex'\n | 'pi-coding-agent'\n | 'pi-agent-sdk'\n | 'claude-code'\n | 'cli'\n | 'mock'\n | 'vscode'\n | 'vscode-insiders';\n\n/**\n * Agent providers that have filesystem access and don't need unwrapped guidelines.\n * These providers read files directly from the filesystem using file:// URIs.\n */\nexport const AGENT_PROVIDER_KINDS: readonly ProviderKind[] = [\n 'codex',\n 'pi-coding-agent',\n 'claude-code',\n 'vscode',\n 'vscode-insiders',\n] as const;\n\n/**\n * List of all supported provider kinds.\n * This is the source of truth for provider validation.\n */\nexport const KNOWN_PROVIDERS: readonly ProviderKind[] = [\n 'azure',\n 'anthropic',\n 'gemini',\n 'codex',\n 'pi-coding-agent',\n 'pi-agent-sdk',\n 'claude-code',\n 'cli',\n 'mock',\n 'vscode',\n 'vscode-insiders',\n] as const;\n\n/**\n * Provider aliases that are accepted in target definitions.\n * These map to the canonical ProviderKind values.\n */\nexport const PROVIDER_ALIASES: readonly string[] = [\n 'azure-openai', // alias for \"azure\"\n 'google', // alias for \"gemini\"\n 'google-gemini', // alias for \"gemini\"\n 'codex-cli', // alias for \"codex\"\n 'pi', // alias for \"pi-coding-agent\"\n 'openai', // legacy/future support\n 'bedrock', // legacy/future support\n 'vertex', // legacy/future support\n] as const;\n\n/**\n * Schema identifier for targets.yaml files (version 2).\n */\nexport const TARGETS_SCHEMA_V2 = 'agentv-targets-v2.2';\n\nexport interface ProviderRequest {\n readonly question: string;\n readonly systemPrompt?: string;\n readonly guidelines?: string;\n readonly guideline_patterns?: readonly string[];\n readonly chatPrompt?: ChatPrompt;\n readonly inputFiles?: readonly string[];\n readonly evalCaseId?: string;\n readonly attempt?: number;\n readonly maxOutputTokens?: number;\n readonly temperature?: number;\n readonly metadata?: JsonObject;\n readonly signal?: AbortSignal;\n}\n\n/**\n * A tool call within an output message.\n * Represents a single tool invocation with its input and optional output.\n */\nexport interface ToolCall {\n /** Tool name */\n readonly tool: string;\n /** Tool input arguments */\n readonly input?: unknown;\n /** Tool output result */\n readonly output?: unknown;\n /** Stable identifier for pairing tool calls */\n readonly id?: string;\n /** ISO 8601 timestamp */\n readonly timestamp?: string;\n}\n\n/**\n * An output message from agent execution.\n * Represents a single message in the conversation with optional tool calls.\n */\nexport interface OutputMessage {\n /** Message role (e.g., 'assistant', 'user', 'tool') */\n readonly role: string;\n /** Optional name for the message sender */\n readonly name?: string;\n /** Message content */\n readonly content?: unknown;\n /** Tool calls made in this message */\n readonly toolCalls?: readonly ToolCall[];\n /** ISO 8601 timestamp */\n readonly timestamp?: string;\n /** Provider-specific metadata */\n readonly metadata?: Record<string, unknown>;\n}\n\n/**\n * Token usage metrics reported by provider.\n */\nexport interface ProviderTokenUsage {\n /** Input/prompt tokens consumed */\n readonly input: number;\n /** Output/completion tokens generated */\n readonly output: number;\n /** Cached tokens (optional, provider-specific) */\n readonly cached?: number;\n}\n\nexport interface ProviderResponse {\n readonly raw?: unknown;\n readonly usage?: JsonObject;\n /** Output messages from agent execution (primary source for tool trajectory) */\n readonly outputMessages?: readonly OutputMessage[];\n /** Token usage metrics (optional) */\n readonly tokenUsage?: ProviderTokenUsage;\n /** Total cost in USD (optional) */\n readonly costUsd?: number;\n /** Execution duration in milliseconds (optional) */\n readonly durationMs?: number;\n}\n\n/**\n * Extract the content from the last assistant message in an output message array.\n * Returns empty string if no assistant message found.\n */\nexport function extractLastAssistantContent(\n messages: readonly OutputMessage[] | undefined,\n): string {\n if (!messages || messages.length === 0) {\n return '';\n }\n\n // Find the last assistant message (reverse search)\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === 'assistant' && msg.content !== undefined) {\n if (typeof msg.content === 'string') {\n return msg.content;\n }\n return JSON.stringify(msg.content);\n }\n }\n\n return '';\n}\n\n/**\n * Type guard to check if a provider is an agent provider with filesystem access.\n * Agent providers read files directly and don't need unwrapped guideline content.\n */\nexport function isAgentProvider(provider: Provider | undefined): boolean {\n return provider ? AGENT_PROVIDER_KINDS.includes(provider.kind) : false;\n}\n\nexport interface Provider {\n readonly id: string;\n readonly kind: ProviderKind;\n readonly targetName: string;\n invoke(request: ProviderRequest): Promise<ProviderResponse>;\n /**\n * Optional capability marker for provider-managed batching (single session handling multiple requests).\n */\n readonly supportsBatch?: boolean;\n /**\n * Optional batch invocation hook. When defined alongside supportsBatch=true,\n * the orchestrator may send multiple requests in a single provider session.\n */\n invokeBatch?(requests: readonly ProviderRequest[]): Promise<readonly ProviderResponse[]>;\n /**\n * Optional method to get a Vercel AI SDK LanguageModel instance for structured output generation.\n * Used by evaluators that need generateObject/generateText from the AI SDK.\n */\n asLanguageModel?(): import('ai').LanguageModel;\n}\n\nexport type EnvLookup = Readonly<Record<string, string | undefined>>;\n\nexport interface TargetDefinition {\n readonly name: string;\n readonly provider: ProviderKind | string;\n readonly judge_target?: string | undefined;\n readonly workers?: number | undefined;\n // Provider batching\n readonly provider_batching?: boolean | undefined;\n readonly providerBatching?: boolean | undefined;\n // Azure fields\n readonly endpoint?: string | unknown | undefined;\n readonly resource?: string | unknown | undefined;\n readonly resourceName?: string | unknown | undefined;\n readonly api_key?: string | unknown | undefined;\n readonly apiKey?: string | unknown | undefined;\n readonly deployment?: string | unknown | undefined;\n readonly deploymentName?: string | unknown | undefined;\n readonly model?: string | unknown | undefined;\n readonly version?: string | unknown | undefined;\n readonly api_version?: string | unknown | undefined;\n // Anthropic fields\n readonly variant?: string | unknown | undefined;\n readonly thinking_budget?: number | unknown | undefined;\n readonly thinkingBudget?: number | unknown | undefined;\n // Common fields\n readonly temperature?: number | unknown | undefined;\n readonly max_output_tokens?: number | unknown | undefined;\n readonly maxTokens?: number | unknown | undefined;\n // Codex fields\n readonly executable?: string | unknown | undefined;\n readonly command?: string | unknown | undefined;\n readonly binary?: string | unknown | undefined;\n readonly args?: unknown | undefined;\n readonly arguments?: unknown | undefined;\n readonly cwd?: string | unknown | undefined;\n readonly timeout_seconds?: number | unknown | undefined;\n readonly timeoutSeconds?: number | unknown | undefined;\n readonly log_dir?: string | unknown | undefined;\n readonly logDir?: string | unknown | undefined;\n readonly log_directory?: string | unknown | undefined;\n readonly logDirectory?: string | unknown | undefined;\n readonly log_format?: string | unknown | undefined;\n readonly logFormat?: string | unknown | undefined;\n readonly log_output_format?: string | unknown | undefined;\n readonly logOutputFormat?: string | unknown | undefined;\n // Mock fields\n readonly response?: string | unknown | undefined;\n readonly delayMs?: number | unknown | undefined;\n readonly delayMinMs?: number | unknown | undefined;\n readonly delayMaxMs?: number | unknown | undefined;\n // VSCode fields\n readonly vscode_cmd?: string | unknown | undefined;\n readonly wait?: boolean | unknown | undefined;\n readonly dry_run?: boolean | unknown | undefined;\n readonly dryRun?: boolean | unknown | undefined;\n readonly subagent_root?: string | unknown | undefined;\n readonly subagentRoot?: string | unknown | undefined;\n readonly workspace_template?: string | unknown | undefined;\n readonly workspaceTemplate?: string | unknown | undefined;\n // CLI fields\n readonly command_template?: string | unknown | undefined;\n readonly commandTemplate?: string | unknown | undefined;\n readonly files_format?: string | unknown | undefined;\n readonly filesFormat?: string | unknown | undefined;\n readonly attachments_format?: string | unknown | undefined;\n readonly attachmentsFormat?: string | unknown | undefined;\n readonly env?: unknown | undefined;\n readonly healthcheck?: unknown | undefined;\n // Retry configuration fields\n readonly max_retries?: number | unknown | undefined;\n readonly maxRetries?: number | unknown | undefined;\n readonly retry_initial_delay_ms?: number | unknown | undefined;\n readonly retryInitialDelayMs?: number | unknown | undefined;\n readonly retry_max_delay_ms?: number | unknown | undefined;\n readonly retryMaxDelayMs?: number | unknown | undefined;\n readonly retry_backoff_factor?: number | unknown | undefined;\n readonly retryBackoffFactor?: number | unknown | undefined;\n readonly retry_status_codes?: unknown | undefined;\n readonly retryStatusCodes?: unknown | undefined;\n}\n","import { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport pLimit from 'p-limit';\n\nimport {\n type ChildEvaluatorResult,\n CodeEvaluator,\n CompositeEvaluator,\n CostEvaluator,\n type EvaluationScore,\n type Evaluator,\n FieldAccuracyEvaluator,\n LatencyEvaluator,\n LlmJudgeEvaluator,\n TokenUsageEvaluator,\n ToolTrajectoryEvaluator,\n} from './evaluators.js';\nimport { readJsonFile, readTextFile } from './file-utils.js';\nimport { createProvider } from './providers/index.js';\nimport { type ResolvedTarget, resolveTargetDefinition } from './providers/targets.js';\nimport type {\n EnvLookup,\n OutputMessage,\n Provider,\n ProviderRequest,\n ProviderResponse,\n TargetDefinition,\n} from './providers/types.js';\nimport { extractLastAssistantContent, isAgentProvider } from './providers/types.js';\nimport {\n type ToolTrajectoryEvaluatorConfig,\n type TraceSummary,\n computeTraceSummary,\n mergeExecutionMetrics,\n} from './trace.js';\nimport type {\n CostEvaluatorConfig,\n EvalCase,\n EvaluationResult,\n EvaluationVerdict,\n EvaluatorConfig,\n EvaluatorKind,\n EvaluatorResult,\n FieldAccuracyEvaluatorConfig,\n JsonObject,\n JsonValue,\n LatencyEvaluatorConfig,\n TokenUsageEvaluatorConfig,\n} from './types.js';\nimport { type PromptInputs, buildPromptInputs, loadEvalCases } from './yaml-parser.js';\n\ntype MaybePromise<T> = T | Promise<T>;\n\nfunction usesFileReferencePrompt(provider: Provider): boolean {\n return isAgentProvider(provider) || provider.kind === 'cli';\n}\n\nexport interface EvaluationCache {\n get(key: string): MaybePromise<ProviderResponse | undefined>;\n set(key: string, value: ProviderResponse): MaybePromise<void>;\n}\n\nexport interface RunEvalCaseOptions {\n readonly evalCase: EvalCase;\n readonly provider: Provider;\n readonly target: ResolvedTarget;\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\n readonly now?: () => Date;\n readonly maxRetries?: number;\n readonly agentTimeoutMs?: number;\n readonly cache?: EvaluationCache;\n readonly useCache?: boolean;\n readonly signal?: AbortSignal;\n readonly judgeProvider?: Provider;\n}\n\nexport interface ProgressEvent {\n readonly workerId: number;\n readonly evalId: string;\n readonly status: 'pending' | 'running' | 'completed' | 'failed';\n readonly startedAt?: number;\n readonly completedAt?: number;\n readonly error?: string;\n}\n\nexport interface RunEvaluationOptions {\n readonly testFilePath: string;\n readonly repoRoot: URL | string;\n readonly target: ResolvedTarget;\n readonly targets?: readonly TargetDefinition[];\n readonly env?: EnvLookup;\n readonly providerFactory?: (target: ResolvedTarget) => Provider;\n readonly evaluators?: Partial<Record<string, Evaluator>>;\n readonly maxRetries?: number;\n readonly agentTimeoutMs?: number;\n readonly cache?: EvaluationCache;\n readonly useCache?: boolean;\n readonly now?: () => Date;\n readonly evalId?: string;\n readonly verbose?: boolean;\n readonly maxConcurrency?: number;\n readonly evalCases?: readonly EvalCase[];\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\n}\n\nexport async function runEvaluation(\n options: RunEvaluationOptions,\n): Promise<readonly EvaluationResult[]> {\n const {\n testFilePath: evalFilePath,\n repoRoot,\n target,\n targets,\n env,\n providerFactory,\n evaluators,\n maxRetries,\n agentTimeoutMs,\n cache,\n useCache,\n now,\n evalId,\n verbose,\n evalCases: preloadedEvalCases,\n onResult,\n onProgress,\n } = options;\n\n // Use pre-loaded eval cases if provided, otherwise load them\n const evalCases =\n preloadedEvalCases ?? (await loadEvalCases(evalFilePath, repoRoot, { verbose, evalId }));\n\n const filteredEvalCases = filterEvalCases(evalCases, evalId);\n if (filteredEvalCases.length === 0) {\n if (evalId) {\n throw new Error(`Eval case with id '${evalId}' not found in ${evalFilePath}`);\n }\n return [];\n }\n\n const resolvedTargetsByName = new Map<string, ResolvedTarget>();\n resolvedTargetsByName.set(target.name, target);\n\n const targetDefinitions = new Map<string, TargetDefinition>();\n for (const definition of targets ?? []) {\n targetDefinitions.set(definition.name, definition);\n }\n\n const envLookup: EnvLookup = env ?? process.env;\n const providerCache = new Map<string, Provider>();\n\n const getOrCreateProvider = (resolved: ResolvedTarget): Provider => {\n const existing = providerCache.get(resolved.name);\n if (existing) {\n return existing;\n }\n const factory = providerFactory ?? createProvider;\n const instance = factory(resolved);\n providerCache.set(resolved.name, instance);\n return instance;\n };\n\n const resolveTargetByName = (name: string): ResolvedTarget | undefined => {\n if (resolvedTargetsByName.has(name)) {\n return resolvedTargetsByName.get(name);\n }\n const definition = targetDefinitions.get(name);\n if (!definition) {\n return undefined;\n }\n const resolved = resolveTargetDefinition(definition, envLookup, evalFilePath);\n resolvedTargetsByName.set(name, resolved);\n return resolved;\n };\n\n const resolveJudgeProvider = async (\n targetContext: ResolvedTarget,\n ): Promise<Provider | undefined> => {\n const judgeName = targetContext.judgeTarget ?? targetContext.name;\n const resolvedJudge = resolveTargetByName(judgeName);\n if (!resolvedJudge) {\n return getOrCreateProvider(targetContext);\n }\n return getOrCreateProvider(resolvedJudge);\n };\n\n const evaluatorRegistry = buildEvaluatorRegistry(evaluators, resolveJudgeProvider);\n\n const primaryProvider = getOrCreateProvider(target);\n const providerSupportsBatch =\n target.providerBatching === true &&\n primaryProvider.supportsBatch === true &&\n typeof primaryProvider.invokeBatch === 'function';\n if (target.providerBatching && !providerSupportsBatch && verbose) {\n console.warn(\n `Provider batching requested for target '${target.name}', but provider does not advertise batch support. Using per-case dispatch.`,\n );\n }\n\n // Notify about total test count before starting\n if (onProgress && filteredEvalCases.length > 0) {\n // Emit initial pending events for all tests\n for (let i = 0; i < filteredEvalCases.length; i++) {\n await onProgress({\n workerId: i + 1,\n evalId: filteredEvalCases[i].id,\n status: 'pending',\n });\n }\n }\n\n if (providerSupportsBatch) {\n try {\n return await runBatchEvaluation({\n evalCases: filteredEvalCases,\n provider: primaryProvider,\n target,\n evaluatorRegistry,\n nowFn: now ?? (() => new Date()),\n onProgress,\n onResult,\n verbose,\n resolveJudgeProvider,\n agentTimeoutMs,\n });\n } catch (error) {\n if (verbose) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(\n `Provider batch execution failed, falling back to per-case dispatch: ${message}`,\n );\n }\n }\n }\n\n // Resolve worker count: CLI option > target setting > default (1)\n const workers = options.maxConcurrency ?? target.workers ?? 1;\n const limit = pLimit(workers);\n\n // Track worker assignments for progress reporting\n let nextWorkerId = 1;\n const workerIdByEvalId = new Map<string, number>();\n\n // Map test cases to limited promises for parallel execution\n const promises = filteredEvalCases.map((evalCase) =>\n limit(async () => {\n // Assign worker ID when test starts executing\n const workerId = nextWorkerId++;\n workerIdByEvalId.set(evalCase.id, workerId);\n\n if (onProgress) {\n await onProgress({\n workerId,\n evalId: evalCase.id,\n status: 'running',\n startedAt: Date.now(),\n });\n }\n\n try {\n const judgeProvider = await resolveJudgeProvider(target);\n const result = await runEvalCase({\n evalCase: evalCase,\n provider: primaryProvider,\n target,\n evaluators: evaluatorRegistry,\n maxRetries,\n agentTimeoutMs,\n cache,\n useCache,\n now,\n judgeProvider,\n });\n\n if (onProgress) {\n await onProgress({\n workerId,\n evalId: evalCase.id,\n status: result.error ? 'failed' : 'completed',\n startedAt: 0, // Not used for completed status\n completedAt: Date.now(),\n error: result.error,\n });\n }\n\n if (onResult) {\n await onResult(result);\n }\n return result;\n } catch (error) {\n if (onProgress) {\n await onProgress({\n workerId,\n evalId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: error instanceof Error ? error.message : String(error),\n });\n }\n throw error;\n }\n }),\n );\n\n // Wait for all workers to complete\n const settled = await Promise.allSettled(promises);\n\n // Extract results, handling both fulfilled and rejected promises\n const results: EvaluationResult[] = [];\n for (let i = 0; i < settled.length; i++) {\n const outcome = settled[i];\n if (outcome.status === 'fulfilled') {\n results.push(outcome.value);\n } else {\n // Build error result for rejected promise\n const evalCase = filteredEvalCases[i];\n const formattingMode = usesFileReferencePrompt(primaryProvider) ? 'agent' : 'lm';\n const promptInputs = await buildPromptInputs(evalCase, formattingMode);\n const errorResult = buildErrorResult(\n evalCase,\n target.name,\n (now ?? (() => new Date()))(),\n outcome.reason,\n promptInputs,\n primaryProvider,\n );\n results.push(errorResult);\n if (onResult) {\n await onResult(errorResult);\n }\n }\n }\n\n return results;\n}\n\nasync function runBatchEvaluation(options: {\n readonly evalCases: readonly EvalCase[];\n readonly provider: Provider;\n readonly target: ResolvedTarget;\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\n readonly llm_judge: Evaluator;\n };\n readonly nowFn: () => Date;\n readonly onProgress?: (event: ProgressEvent) => MaybePromise<void>;\n readonly onResult?: (result: EvaluationResult) => MaybePromise<void>;\n readonly verbose?: boolean;\n readonly resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>;\n readonly agentTimeoutMs?: number;\n}): Promise<readonly EvaluationResult[]> {\n const {\n evalCases,\n provider,\n target,\n evaluatorRegistry,\n nowFn,\n onProgress,\n onResult,\n resolveJudgeProvider,\n agentTimeoutMs,\n } = options;\n\n // Prepare prompt inputs up front so we can reuse them for grading.\n const promptInputsList: PromptInputs[] = [];\n const formattingMode = usesFileReferencePrompt(provider) ? 'agent' : 'lm';\n\n for (const evalCase of evalCases) {\n const promptInputs = await buildPromptInputs(evalCase, formattingMode);\n promptInputsList.push(promptInputs);\n }\n\n const batchRequests: ProviderRequest[] = evalCases.map((evalCase, index) => {\n const promptInputs = promptInputsList[index];\n return {\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_patterns: evalCase.guideline_patterns,\n inputFiles: evalCase.file_paths,\n evalCaseId: evalCase.id,\n metadata: {\n systemPrompt: promptInputs.systemMessage ?? '',\n },\n };\n });\n\n const batchResponse = await provider.invokeBatch?.(batchRequests);\n if (!Array.isArray(batchResponse)) {\n throw new Error('Provider batching failed: invokeBatch did not return an array');\n }\n if (batchResponse.length !== evalCases.length) {\n throw new Error(\n `Provider batching failed: expected ${evalCases.length} responses, received ${batchResponse.length}`,\n );\n }\n\n if (onProgress) {\n const startedAt = Date.now();\n for (let i = 0; i < evalCases.length; i++) {\n await onProgress({\n workerId: 1,\n evalId: evalCases[i].id,\n status: 'running',\n startedAt,\n });\n }\n }\n\n const results: EvaluationResult[] = [];\n for (let i = 0; i < evalCases.length; i++) {\n const evalCase = evalCases[i];\n const promptInputs = promptInputsList[i];\n const providerResponse = batchResponse[i];\n\n // Extract outputMessages from batch response\n const outputMessages = providerResponse.outputMessages;\n const hasExecutionMetrics =\n providerResponse.tokenUsage !== undefined ||\n providerResponse.costUsd !== undefined ||\n providerResponse.durationMs !== undefined;\n\n const baseSummary = outputMessages\n ? computeTraceSummary(outputMessages)\n : hasExecutionMetrics\n ? {\n eventCount: 0,\n toolNames: [],\n toolCallsByName: {},\n errorCount: 0,\n }\n : undefined;\n // Merge execution metrics from provider response\n const traceSummary = baseSummary\n ? mergeExecutionMetrics(baseSummary, {\n tokenUsage: providerResponse.tokenUsage,\n costUsd: providerResponse.costUsd,\n durationMs: providerResponse.durationMs,\n })\n : undefined;\n\n // Extract candidate from last assistant message in output_messages\n const candidate = extractLastAssistantContent(outputMessages);\n\n const providerError = extractProviderError(providerResponse);\n\n let result: EvaluationResult;\n try {\n result = await evaluateCandidate({\n evalCase,\n candidate,\n target,\n provider,\n evaluators: evaluatorRegistry,\n promptInputs,\n nowFn,\n attempt: 0,\n judgeProvider: await resolveJudgeProvider(target),\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n });\n\n if (providerError) {\n result = { ...result, error: providerError };\n }\n } catch (error) {\n const errorResult = buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n error,\n promptInputs,\n provider,\n );\n results.push(errorResult);\n if (onResult) {\n await onResult(errorResult);\n }\n if (onProgress) {\n await onProgress({\n workerId: 1,\n evalId: evalCase.id,\n status: 'failed',\n completedAt: Date.now(),\n error: error instanceof Error ? error.message : String(error),\n });\n }\n continue;\n }\n\n results.push(result);\n if (onResult) {\n await onResult(result);\n }\n\n if (onProgress) {\n await onProgress({\n workerId: 1,\n evalId: evalCase.id,\n status: result.error ? 'failed' : 'completed',\n startedAt: 0,\n completedAt: Date.now(),\n error: result.error,\n });\n }\n }\n\n return results;\n}\n\nexport async function runEvalCase(options: RunEvalCaseOptions): Promise<EvaluationResult> {\n const {\n evalCase,\n provider,\n target,\n evaluators,\n now,\n maxRetries,\n agentTimeoutMs,\n cache,\n useCache,\n signal,\n judgeProvider,\n } = options;\n\n const formattingMode = usesFileReferencePrompt(provider) ? 'agent' : 'lm';\n const promptInputs = await buildPromptInputs(evalCase, formattingMode);\n\n const cacheKey = useCache ? createCacheKey(provider, target, evalCase, promptInputs) : undefined;\n let cachedResponse: ProviderResponse | undefined;\n if (cacheKey && cache) {\n cachedResponse = await cache.get(cacheKey);\n }\n\n const nowFn = now ?? (() => new Date());\n\n const attemptBudget = (maxRetries ?? 0) + 1;\n let attempt = 0;\n let providerResponse: ProviderResponse | undefined = cachedResponse;\n let lastError: unknown;\n\n while (!providerResponse && attempt < attemptBudget) {\n try {\n providerResponse = await invokeProvider(provider, {\n evalCase: evalCase,\n target,\n promptInputs,\n attempt,\n agentTimeoutMs,\n signal,\n });\n } catch (error) {\n lastError = error;\n if (isTimeoutLike(error) && attempt + 1 < attemptBudget) {\n attempt += 1;\n continue;\n }\n return buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs, provider);\n }\n }\n\n if (!providerResponse) {\n return buildErrorResult(\n evalCase,\n target.name,\n nowFn(),\n lastError ?? new Error('Provider did not return a response'),\n promptInputs,\n provider,\n );\n }\n\n if (cacheKey && cache && !cachedResponse) {\n await cache.set(cacheKey, providerResponse);\n }\n\n // Extract outputMessages from provider response\n const outputMessages = providerResponse.outputMessages;\n\n const hasExecutionMetrics =\n providerResponse.tokenUsage !== undefined ||\n providerResponse.costUsd !== undefined ||\n providerResponse.durationMs !== undefined;\n\n // Compute trace summary if outputMessages available. If not, still preserve execution metrics.\n const baseSummary = outputMessages\n ? computeTraceSummary(outputMessages)\n : hasExecutionMetrics\n ? {\n eventCount: 0,\n toolNames: [],\n toolCallsByName: {},\n errorCount: 0,\n }\n : undefined;\n // Merge execution metrics from provider response\n const traceSummary = baseSummary\n ? mergeExecutionMetrics(baseSummary, {\n tokenUsage: providerResponse.tokenUsage,\n costUsd: providerResponse.costUsd,\n durationMs: providerResponse.durationMs,\n })\n : undefined;\n\n // Extract candidate from last assistant message in output_messages\n const candidate = extractLastAssistantContent(outputMessages);\n\n const providerError = extractProviderError(providerResponse);\n\n try {\n const result = await evaluateCandidate({\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n promptInputs,\n nowFn,\n attempt,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n });\n\n return providerError ? { ...result, error: providerError } : result;\n } catch (error) {\n return buildErrorResult(evalCase, target.name, nowFn(), error, promptInputs, provider);\n }\n}\n\nasync function evaluateCandidate(options: {\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\n readonly promptInputs: PromptInputs;\n readonly nowFn: () => Date;\n readonly attempt: number;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly outputMessages?: readonly OutputMessage[];\n readonly traceSummary?: TraceSummary;\n}): Promise<EvaluationResult> {\n const {\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n promptInputs,\n nowFn,\n attempt,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n } = options;\n\n const gradeTimestamp = nowFn();\n const { score, evaluatorResults } = await runEvaluatorsForCase({\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n attempt,\n promptInputs,\n now: gradeTimestamp,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n });\n\n const completedAt = nowFn();\n\n let agentProviderRequest: JsonObject | undefined;\n let lmProviderRequest: JsonObject | undefined;\n\n if (isAgentProvider(provider)) {\n agentProviderRequest = {\n question: promptInputs.question,\n guideline_paths: evalCase.guideline_paths,\n } as JsonObject;\n } else {\n if (promptInputs.chatPrompt) {\n lmProviderRequest = {\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\n } as JsonObject;\n } else {\n lmProviderRequest = {\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n } as JsonObject;\n }\n }\n\n return {\n timestamp: completedAt.toISOString(),\n evalId: evalCase.id,\n dataset: evalCase.dataset,\n conversationId: evalCase.conversation_id,\n score: score.score,\n hits: score.hits,\n misses: score.misses,\n candidateAnswer: candidate,\n target: target.name,\n reasoning: score.reasoning,\n agentProviderRequest: agentProviderRequest,\n lmProviderRequest: lmProviderRequest,\n evaluatorProviderRequest: evaluatorResults ? undefined : score.evaluatorRawRequest,\n evaluatorResults: evaluatorResults,\n traceSummary: traceSummary,\n };\n}\n\nasync function runEvaluatorsForCase(options: {\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluators: Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator };\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly outputMessages?: readonly OutputMessage[];\n readonly traceSummary?: TraceSummary;\n}): Promise<{ score: EvaluationScore; evaluatorResults?: EvaluatorResult[] }> {\n const {\n evalCase,\n candidate,\n target,\n provider,\n evaluators,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n } = options;\n\n if (evalCase.evaluators && evalCase.evaluators.length > 0) {\n return runEvaluatorList({\n evalCase,\n evaluators: evalCase.evaluators,\n candidate,\n target,\n provider,\n evaluatorRegistry: evaluators,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n });\n }\n\n const evaluatorKind = evalCase.evaluator ?? 'llm_judge';\n const activeEvaluator = evaluators[evaluatorKind] ?? evaluators.llm_judge;\n if (!activeEvaluator) {\n throw new Error(`No evaluator registered for kind '${evaluatorKind}'`);\n }\n\n const score = await activeEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n outputMessages,\n traceSummary,\n });\n\n return { score };\n}\n\nasync function runEvaluatorList(options: {\n readonly evalCase: EvalCase;\n readonly evaluators: readonly EvaluatorConfig[];\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\n readonly llm_judge: Evaluator;\n };\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly judgeProvider?: Provider;\n readonly agentTimeoutMs?: number;\n readonly outputMessages?: readonly OutputMessage[];\n readonly traceSummary?: TraceSummary;\n}): Promise<{ score: EvaluationScore; evaluatorResults: EvaluatorResult[] }> {\n const {\n evalCase,\n evaluators,\n candidate,\n target,\n provider,\n evaluatorRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n agentTimeoutMs,\n outputMessages,\n traceSummary,\n } = options;\n\n const scored: Array<{\n readonly score: EvaluationScore;\n readonly name: string;\n readonly type: string;\n readonly weight?: number;\n }> = [];\n const evaluatorResults: EvaluatorResult[] = [];\n\n for (const evaluator of evaluators ?? []) {\n try {\n if (evaluator.type === 'llm_judge') {\n const score = await runLlmJudgeEvaluator({\n config: evaluator,\n evalCase,\n candidate,\n target,\n provider,\n evaluatorRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n evaluatorProviderRequest: score.evaluatorRawRequest,\n });\n }\n\n if (evaluator.type === 'code') {\n const codeEvaluator = new CodeEvaluator({\n script: evaluator.script,\n cwd: evaluator.resolvedCwd ?? evaluator.cwd,\n agentTimeoutMs,\n config: evaluator.config,\n });\n const score = await codeEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n outputMessages,\n traceSummary,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: 'code_judge', weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: 'code_judge',\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n evaluatorProviderRequest: score.evaluatorRawRequest,\n });\n }\n\n if (evaluator.type === 'composite') {\n const evalFileDir = evalCase.guideline_paths[0]\n ? path.dirname(evalCase.guideline_paths[0])\n : process.cwd();\n\n const createEvaluator = (memberConfig: import('./types.js').EvaluatorConfig): Evaluator => {\n switch (memberConfig.type) {\n case 'llm_judge':\n return evaluatorRegistry.llm_judge;\n case 'code':\n return new CodeEvaluator({\n script: memberConfig.script,\n cwd: memberConfig.resolvedCwd ?? memberConfig.cwd,\n agentTimeoutMs,\n config: memberConfig.config,\n });\n case 'composite':\n return new CompositeEvaluator({\n config: memberConfig,\n cwd: evalFileDir,\n evaluatorFactory: { create: createEvaluator },\n });\n case 'tool_trajectory':\n return new ToolTrajectoryEvaluator({\n config: memberConfig as ToolTrajectoryEvaluatorConfig,\n });\n case 'field_accuracy':\n return new FieldAccuracyEvaluator({\n config: memberConfig as FieldAccuracyEvaluatorConfig,\n });\n case 'latency':\n return new LatencyEvaluator({\n config: memberConfig as LatencyEvaluatorConfig,\n });\n case 'cost':\n return new CostEvaluator({\n config: memberConfig as CostEvaluatorConfig,\n });\n case 'token_usage':\n return new TokenUsageEvaluator({\n config: memberConfig as TokenUsageEvaluatorConfig,\n });\n default: {\n const unknownConfig = memberConfig as { type: string };\n throw new Error(`Unsupported evaluator type in composite: ${unknownConfig.type}`);\n }\n }\n };\n\n const compositeEvaluator = new CompositeEvaluator({\n config: evaluator,\n cwd: evalFileDir,\n evaluatorFactory: { create: createEvaluator },\n });\n const score = await compositeEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n outputMessages,\n traceSummary,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n evaluatorProviderRequest: score.evaluatorRawRequest,\n evaluatorResults: mapChildResults(score.evaluatorResults),\n });\n }\n\n if (evaluator.type === 'tool_trajectory') {\n const trajectoryEvaluator = new ToolTrajectoryEvaluator({\n config: evaluator as ToolTrajectoryEvaluatorConfig,\n });\n const score = trajectoryEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n outputMessages,\n traceSummary,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n });\n }\n\n if (evaluator.type === 'field_accuracy') {\n const fieldAccuracyEvaluator = new FieldAccuracyEvaluator({\n config: evaluator as FieldAccuracyEvaluatorConfig,\n });\n const score = fieldAccuracyEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n outputMessages,\n traceSummary,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n });\n }\n\n if (evaluator.type === 'latency') {\n const latencyEvaluator = new LatencyEvaluator({\n config: evaluator as LatencyEvaluatorConfig,\n });\n const score = latencyEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n outputMessages,\n traceSummary,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n });\n }\n\n if (evaluator.type === 'cost') {\n const costEvaluator = new CostEvaluator({\n config: evaluator as CostEvaluatorConfig,\n });\n const score = costEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n outputMessages,\n traceSummary,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n });\n }\n\n if (evaluator.type === 'token_usage') {\n const tokenUsageEvaluator = new TokenUsageEvaluator({\n config: evaluator as TokenUsageEvaluatorConfig,\n });\n const score = tokenUsageEvaluator.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n outputMessages,\n traceSummary,\n });\n const weight = evaluator.weight ?? 1.0;\n scored.push({ score, name: evaluator.name, type: evaluator.type, weight });\n evaluatorResults.push({\n name: evaluator.name,\n type: evaluator.type,\n score: score.score,\n weight,\n verdict: score.verdict,\n hits: score.hits,\n misses: score.misses,\n reasoning: score.reasoning,\n });\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const fallbackScore: EvaluationScore = {\n score: 0,\n verdict: 'fail',\n hits: [],\n misses: [`Evaluator '${evaluator.name}' failed: ${message}`],\n expectedAspectCount: 1,\n reasoning: message,\n };\n const resultType = evaluator.type === 'code' ? 'code_judge' : evaluator.type;\n const weight = evaluator.weight ?? 1.0;\n scored.push({\n score: fallbackScore,\n name: evaluator.name ?? 'unknown',\n type: resultType ?? 'llm_judge',\n weight,\n });\n evaluatorResults.push({\n name: evaluator.name ?? 'unknown',\n type: resultType ?? 'llm_judge',\n score: 0,\n weight,\n verdict: 'fail',\n hits: [],\n misses: [`Evaluator '${evaluator.name ?? 'unknown'}' failed: ${message}`],\n reasoning: message,\n });\n }\n }\n\n const aggregateScore =\n scored.length > 0\n ? computeWeightedMean(\n scored.map((entry) => ({ score: entry.score.score, weight: entry.weight })),\n )\n : 0;\n const hits = scored.flatMap((entry) => entry.score.hits);\n const misses = scored.flatMap((entry) => entry.score.misses);\n const expectedAspectCount = scored.reduce(\n (total, entry) => total + (entry.score.expectedAspectCount ?? 0),\n 0,\n );\n const reasoningParts = scored\n .map((entry) => (entry.score.reasoning ? `${entry.name}: ${entry.score.reasoning}` : undefined))\n .filter(isNonEmptyString);\n const reasoning = reasoningParts.length > 0 ? reasoningParts.join(' | ') : undefined;\n\n const score: EvaluationScore = {\n score: aggregateScore,\n verdict: scoreToVerdict(aggregateScore),\n hits,\n misses,\n expectedAspectCount,\n reasoning,\n };\n\n return { score, evaluatorResults };\n}\n\nasync function runLlmJudgeEvaluator(options: {\n readonly config: import('./types.js').LlmJudgeEvaluatorConfig;\n readonly evalCase: EvalCase;\n readonly candidate: string;\n readonly target: ResolvedTarget;\n readonly provider: Provider;\n readonly evaluatorRegistry: Partial<Record<string, Evaluator>> & {\n readonly llm_judge: Evaluator;\n };\n readonly attempt: number;\n readonly promptInputs: PromptInputs;\n readonly now: Date;\n readonly judgeProvider?: Provider;\n}): Promise<EvaluationScore> {\n const {\n config,\n evalCase,\n candidate,\n target,\n provider,\n evaluatorRegistry,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n } = options;\n const customPrompt = await resolveCustomPrompt(config);\n\n return evaluatorRegistry.llm_judge.evaluate({\n evalCase,\n candidate,\n target,\n provider,\n attempt,\n promptInputs,\n now,\n judgeProvider,\n evaluatorTemplateOverride: customPrompt,\n evaluator: config,\n });\n}\n\nasync function resolveCustomPrompt(config: {\n readonly prompt?: string;\n readonly promptPath?: string;\n}): Promise<string | undefined> {\n if (config.promptPath) {\n try {\n const content = await readTextFile(config.promptPath);\n return content;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Could not read custom prompt at ${config.promptPath}: ${message}`);\n }\n }\n return config.prompt;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction scoreToVerdict(score: number): EvaluationVerdict {\n if (score >= 0.8) {\n return 'pass';\n }\n if (score >= 0.6) {\n return 'borderline';\n }\n return 'fail';\n}\n\nfunction filterEvalCases(evalCases: readonly EvalCase[], evalId?: string): readonly EvalCase[] {\n if (!evalId) {\n return evalCases;\n }\n return evalCases.filter((evalCase) => evalCase.id === evalId);\n}\n\nfunction buildEvaluatorRegistry(\n overrides: Partial<Record<string, Evaluator>> | undefined,\n resolveJudgeProvider: (target: ResolvedTarget) => Promise<Provider | undefined>,\n): Partial<Record<string, Evaluator>> & { readonly llm_judge: Evaluator } {\n const llmJudge =\n overrides?.llm_judge ??\n new LlmJudgeEvaluator({\n resolveJudgeProvider: async (context) => {\n if (context.judgeProvider) {\n return context.judgeProvider;\n }\n return resolveJudgeProvider(context.target);\n },\n });\n\n return {\n ...overrides,\n llm_judge: llmJudge,\n };\n}\n\nasync function invokeProvider(\n provider: Provider,\n options: {\n readonly evalCase: EvalCase;\n readonly target: ResolvedTarget;\n readonly promptInputs: PromptInputs;\n readonly attempt: number;\n readonly agentTimeoutMs?: number;\n readonly signal?: AbortSignal;\n },\n): Promise<ProviderResponse> {\n const { evalCase, promptInputs, attempt, agentTimeoutMs, signal } = options;\n\n const controller = new AbortController();\n const timeout = agentTimeoutMs ? setTimeout(() => controller.abort(), agentTimeoutMs) : undefined;\n\n if (signal) {\n signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n return await provider.invoke({\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_patterns: evalCase.guideline_patterns,\n chatPrompt: promptInputs.chatPrompt,\n inputFiles: evalCase.file_paths,\n evalCaseId: evalCase.id,\n attempt,\n metadata: {\n systemPrompt: promptInputs.systemMessage ?? '',\n },\n signal: controller.signal,\n });\n } finally {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n }\n}\n\nfunction buildErrorResult(\n evalCase: EvalCase,\n targetName: string,\n timestamp: Date,\n error: unknown,\n promptInputs: PromptInputs,\n provider?: Provider,\n): EvaluationResult {\n const message = error instanceof Error ? error.message : String(error);\n\n let agentProviderRequest: JsonObject | undefined;\n let lmProviderRequest: JsonObject | undefined;\n\n if (isAgentProvider(provider)) {\n agentProviderRequest = {\n question: promptInputs.question,\n guideline_paths: evalCase.guideline_paths,\n error: message,\n } as JsonObject;\n } else {\n if (promptInputs.chatPrompt) {\n lmProviderRequest = {\n chat_prompt: promptInputs.chatPrompt as unknown as JsonValue,\n guideline_paths: evalCase.guideline_paths,\n error: message,\n } as JsonObject;\n } else {\n lmProviderRequest = {\n question: promptInputs.question,\n guidelines: promptInputs.guidelines,\n guideline_paths: evalCase.guideline_paths,\n error: message,\n } as JsonObject;\n }\n }\n\n return {\n timestamp: timestamp.toISOString(),\n evalId: evalCase.id,\n dataset: evalCase.dataset,\n conversationId: evalCase.conversation_id,\n score: 0,\n hits: [],\n misses: [`Error: ${message}`],\n candidateAnswer: `Error occurred: ${message}`,\n target: targetName,\n agentProviderRequest: agentProviderRequest,\n lmProviderRequest: lmProviderRequest,\n error: message,\n } satisfies EvaluationResult;\n}\n\nfunction extractProviderError(response: ProviderResponse): string | undefined {\n const raw = response.raw;\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return undefined;\n }\n\n const error = (raw as Record<string, unknown>).error;\n if (typeof error !== 'string') {\n return undefined;\n }\n\n const trimmed = error.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction createCacheKey(\n provider: Provider,\n target: ResolvedTarget,\n evalCase: EvalCase,\n promptInputs: PromptInputs,\n): string {\n const hash = createHash('sha256');\n hash.update(provider.id);\n hash.update(target.name);\n hash.update(evalCase.id);\n hash.update(promptInputs.question);\n hash.update(promptInputs.guidelines);\n hash.update(promptInputs.systemMessage ?? '');\n if (promptInputs.chatPrompt) {\n hash.update(JSON.stringify(promptInputs.chatPrompt));\n }\n return hash.digest('hex');\n}\n\nfunction isTimeoutLike(error: unknown): boolean {\n if (!error) {\n return false;\n }\n if (\n typeof DOMException !== 'undefined' &&\n error instanceof DOMException &&\n error.name === 'AbortError'\n ) {\n return true;\n }\n if (error instanceof Error) {\n const name = error.name?.toLowerCase();\n const message = error.message?.toLowerCase();\n return name.includes('timeout') || message.includes('timeout');\n }\n const value = String(error).toLowerCase();\n return value.includes('timeout');\n}\n\nfunction mapChildResults(\n children?: readonly ChildEvaluatorResult[],\n): readonly EvaluatorResult[] | undefined {\n if (!children || children.length === 0) {\n return undefined;\n }\n\n return children.map((child) => ({\n name: child.name,\n type: child.type as EvaluatorKind,\n score: child.score,\n weight: child.weight,\n verdict: child.verdict,\n hits: child.hits,\n misses: child.misses,\n reasoning: child.reasoning,\n evaluatorProviderRequest: child.evaluatorRawRequest,\n evaluatorResults: mapChildResults(child.evaluatorResults),\n }));\n}\n\n/**\n * Compute weighted mean of scores, defaulting missing weights to 1.0.\n * Returns 0 if total weight is 0.\n */\nfunction computeWeightedMean(\n entries: readonly { readonly score: number; readonly weight?: number }[],\n): number {\n let totalWeight = 0;\n let weightedSum = 0;\n\n for (const entry of entries) {\n const weight = entry.weight ?? 1.0;\n totalWeight += weight;\n weightedSum += entry.score * weight;\n }\n\n return totalWeight > 0 ? weightedSum / totalWeight : 0;\n}\n","/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\n\t\t// Clean up tail reference when queue becomes empty\n\t\tif (!this.#head) {\n\t\t\tthis.#tail = undefined;\n\t\t}\n\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t\t// Since `pendingCount` has been decreased by one, increase `activeCount` by one.\n\t\t\tactiveCount++;\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue `internalResolve` instead of the `run` function\n\t\t// to preserve asynchronous context.\n\t\tnew Promise(internalResolve => {\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(\n\t\t\trun.bind(undefined, function_, resolve, arguments_),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// after the `internalResolve` function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency) {\n\t\t\t\tresumeNext();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nexport function limitFunction(function_, option) {\n\tconst {concurrency} = option;\n\tconst limit = pLimit(concurrency);\n\n\treturn (...arguments_) => limit(() => function_(...arguments_));\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n","import { generateText } from 'ai';\nimport { z } from 'zod';\n\nimport type { Provider } from '../providers/types.js';\nimport type { RubricItem } from '../types.js';\n\nconst rubricItemSchema = z.object({\n id: z.string().describe('Short identifier for this rubric (e.g., clarity, completeness)'),\n description: z.string().describe('What this rubric checks for'),\n weight: z.number().default(1.0).describe('Relative importance (default 1.0)'),\n required: z.boolean().default(true).describe('Whether this is a mandatory requirement'),\n});\n\nconst rubricGenerationSchema = z.object({\n rubrics: z.array(rubricItemSchema).describe('List of evaluation rubrics'),\n});\n\nexport interface GenerateRubricsOptions {\n readonly expectedOutcome: string;\n readonly question?: string;\n readonly referenceAnswer?: string;\n readonly provider: Provider;\n}\n\n/**\n * Generate rubrics from expected outcome using an LLM.\n */\nexport async function generateRubrics(\n options: GenerateRubricsOptions,\n): Promise<readonly RubricItem[]> {\n const { expectedOutcome, question, referenceAnswer, provider } = options;\n\n const prompt = buildPrompt(expectedOutcome, question, referenceAnswer);\n\n const model = provider.asLanguageModel?.();\n if (!model) {\n throw new Error('Provider does not support language model interface');\n }\n\n const system = `You are an expert at creating evaluation rubrics.\nYou must return a valid JSON object matching this schema:\n{\n \"rubrics\": [\n {\n \"id\": \"string (short identifier)\",\n \"description\": \"string (what to check)\",\n \"weight\": number (default 1.0),\n \"required\": boolean (default true)\n }\n ]\n}`;\n\n let result: z.infer<typeof rubricGenerationSchema> | undefined;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const { text } = await generateText({\n model,\n system,\n prompt,\n });\n\n const cleaned = text.replace(/```json\\n?|```/g, '').trim();\n result = rubricGenerationSchema.parse(JSON.parse(cleaned));\n break;\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n // Continue to next attempt\n }\n }\n\n if (!result) {\n throw new Error(`Failed to parse generated rubrics after 3 attempts: ${lastError?.message}`);\n }\n\n return result.rubrics;\n}\n\nfunction buildPrompt(expectedOutcome: string, question?: string, referenceAnswer?: string): string {\n const parts: string[] = [\n 'You are an expert at creating evaluation rubrics.',\n 'Given the expected outcome (and optionally the question and reference answer),',\n 'generate a list of specific, measurable rubric items to evaluate whether an answer meets the expected outcome.',\n '',\n 'Each rubric should:',\n '- Be specific and testable',\n '- Have a short, descriptive ID',\n '- Include a clear description of what to check',\n '- Indicate if it is required (mandatory) or optional',\n '- Have an appropriate weight (default 1.0, use higher values for more important aspects)',\n '',\n 'Generate 3-7 rubric items that comprehensively cover the expected outcome.',\n '',\n '[[ ## expected_outcome ## ]]',\n expectedOutcome,\n '',\n ];\n\n if (question && question.trim().length > 0) {\n parts.push('[[ ## question ## ]]', question, '');\n }\n\n if (referenceAnswer && referenceAnswer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', referenceAnswer, '');\n }\n\n return parts.join('\\n');\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAAA;AAAA,EAAA;AAAA,0BAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACmBA,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;AAQO,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;AAEA,MAAI,OAAO,UAAU,YAAY,UAAU;AACzC,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,UAAU,OAAO,KAAK,UAAU,QAAQ,MAAM,YAAY,GAAG;AAC7E,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,UAAU,UAAU,KAAK,UAAU,WAAW,SAAS,GAAG;AAC1E,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,UAAU,OAAO,GAAG;AACnC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIA,IAAM,qBAA0C,IAAI,IAAI,qBAAqB;AAEtE,SAAS,gBAAgB,OAAwC;AACtE,SAAO,OAAO,UAAU,YAAY,mBAAmB,IAAI,KAAK;AAClE;AA8MO,SAAS,YAAY,QAAgD;AAC1E,SAAO,OAAO,KAAK;AACrB;;;ACxSO,SAAS,oBAAoB,UAAsD;AACxF,QAAM,iBAAyC,CAAC;AAChD,MAAI,iBAAiB;AAErB,aAAW,WAAW,UAAU;AAC9B,QAAI,CAAC,QAAQ,UAAW;AAExB,eAAW,YAAY,QAAQ,WAAW;AACxC,qBAAe,SAAS,IAAI,KAAK,eAAe,SAAS,IAAI,KAAK,KAAK;AACvE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,OAAO,KAAK,cAAc,EAAE,KAAK;AAEnD,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA,iBAAiB;AAAA,IACjB,YAAY;AAAA,EACd;AACF;AAMO,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUO,SAAS,iBACd,SACA,mBAAsC,2BAClB;AACpB,MAAI,QAAQ,eAAe,EAAG,QAAO;AAErC,QAAM,mBAAmB,iBAAiB;AAAA,IACxC,CAAC,KAAK,SAAS,OAAO,QAAQ,gBAAgB,IAAI,KAAK;AAAA,IACvD;AAAA,EACF;AAEA,SAAO,mBAAmB,QAAQ;AACpC;AASO,SAAS,cAAc,SAA2C;AACvE,MAAI,CAAC,QAAQ,cAAc,QAAQ,eAAe,EAAG,QAAO;AAE5D,QAAM,cAAc,QAAQ,WAAW,QAAQ,QAAQ,WAAW;AAClE,SAAO,cAAc,QAAQ;AAC/B;AASO,SAAS,kBAAkB,SAA2C;AAC3E,MAAI,CAAC,QAAQ,cAAe,QAAO;AAEnC,MAAI,gBAAgB;AACpB,MAAI,aAAa;AAEjB,aAAW,aAAa,OAAO,OAAO,QAAQ,aAAa,GAAG;AAC5D,eAAW,YAAY,WAAW;AAChC,uBAAiB;AACjB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe,EAAG,QAAO;AAC7B,SAAO,gBAAgB;AACzB;AAmBO,SAAS,sBACd,SACA,SACc;AACd,MAAI,CAAC,QAAS,QAAO;AAErB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,QAAQ;AAAA,IACpB,SAAS,QAAQ;AAAA,IACjB,YAAY,QAAQ;AAAA,EACtB;AACF;;;AChNA,IAAAC,mBAAyB;AACzB,IAAAC,oBAAiB;AACjB,IAAAC,eAAsB;;;ACUf,SAAS,kBAAkB,UAAoD;AACpF,QAAM,qBAAqB;AAC3B,QAAM,aAAuB,CAAC;AAC9B,aAAW,WAAW,UAAU;AAC9B,UAAM,YAAY,QAAQ;AAC1B,QAAI,OAAO,cAAc,YAAY,cAAc,QAAQ;AACzD;AAAA,IACF;AACA,UAAM,YAAY,QAAQ;AAC1B,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,CAAC,MAAM,EAAE,MAAM,EAAE;AAGhD,MAAI,YAAY,GAAG;AACjB,WAAO,MACJ,IAAI,CAAC,SAAS;AACb,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,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG;AAC7C;AASO,SAAS,cACd,SACA,OAAuB,MACH;AACpB,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,WAAW,SAAS,QAAQ,IAAI;AACtC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAGA,QAAI,SAAS,SAAS;AACpB,aAAO,gBAAgB,QAAQ;AAAA,IACjC;AAGA,UAAM,OAAO,SAAS,QAAQ,IAAI;AAClC,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;;;AC/HA,IAAAC,mBAAyB;AACzB,IAAAC,oBAAiB;AACjB,wBAAuB;AACvB,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,WACpB,cACA,UAC8B;AAC9B,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,UACJ,OAAO,WAAW,WACd,0BAA0B,MAAM,QAAQ,UAAU,eAAe,gBAAgB,MACjF,uCAAuC,UAAU;AAAA,uBAA2B,gBAAgB;AAClG,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,UACE,MAAM,QAAQ,iBAAiB,KAC/B,CAAC,kBAAkB,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ,GACrD;AACA,mBAAW,iCAAiC,UAAU,+BAA+B;AACrF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,oBAAoB;AAAA,MACtB;AAAA,IACF,SAAS,OAAO;AACd;AAAA,QACE,yCAAyC,UAAU,KAAM,MAAgB,OAAO;AAAA,MAClF;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;;;AEvHA,IAAAC,oBAAiB;;;ACAjB,IAAAC,mBAAyB;;;ACIlB,IAAM,qBAAqB;AAAA,EAChC,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,iBAAiB;AACnB;AAUO,IAAM,2BAA2B,IAAI,IAAY,OAAO,OAAO,kBAAkB,CAAC;AAMlF,IAAM,8BAA8B,oBAAI,IAAY;AAAA,EACzD,mBAAmB;AAAA,EACnB,mBAAmB;AACrB,CAAC;;;AD3BD,IAAMC,eAAc;AACpB,IAAMC,cAAa;AAOnB,eAAsB,4BAA4B,YAAmC;AACnF,QAAM,UAAU,UAAM,2BAAS,YAAY,MAAM;AACjD,4BAA0B,SAAS,UAAU;AAC/C;AAOO,SAAS,0BAA0B,SAAiB,QAAsB;AAE/E,QAAM,kBAAkB;AACxB,QAAM,iBAAiB,oBAAI,IAAY;AACvC,QAAM,mBAA6B,CAAC;AAEpC,MAAI,QAAgC,gBAAgB,KAAK,OAAO;AAChE,SAAO,UAAU,MAAM;AACrB,UAAM,UAAU,MAAM,CAAC;AACvB,mBAAe,IAAI,OAAO;AAC1B,QAAI,CAAC,yBAAyB,IAAI,OAAO,GAAG;AAC1C,uBAAiB,KAAK,OAAO;AAAA,IAC/B;AACA,YAAQ,gBAAgB,KAAK,OAAO;AAAA,EACtC;AAGA,QAAM,qBAAqB,eAAe,IAAI,mBAAmB,gBAAgB;AACjF,QAAM,sBAAsB,eAAe,IAAI,mBAAmB,iBAAiB;AACnF,QAAM,oBAAoB,sBAAsB;AAGhD,MAAI,CAAC,mBAAmB;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,SAAkE,mBAAmB,gBAAgB;AAAA,SAAe,mBAAmB,iBAAiB;AAAA,IAC1J;AAAA,EACF;AAGA,MAAI,iBAAiB,SAAS,GAAG;AAC/B,UAAM,iBAAiB,GAAGD,YAAW,yCAAyC,MAAM;AAAA,gCACxD,iBAAiB,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC;AAAA,qBAC/D,MAAM,KAAK,wBAAwB,EACnD,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,EACvB,KAAK,IAAI,CAAC,GAAGC,WAAU;AAExB,YAAQ,KAAK,cAAc;AAAA,EAC7B;AACF;;;ADpDA,IAAMC,eAAc;AACpB,IAAMC,cAAa;AAKnB,eAAsB,gBACpB,aAIA,iBACA,aACA,QACiD;AACjD,QAAM,YAAY,YAAY;AAE9B,QAAM,sBAAsBC,cAAa,SAAS,IAC7C,UAAU,cAAc,YAAY,aACpC,YAAY,cAAc,iBAAiB;AAChD,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,cAAc;AAC9B,UAAI;AACJ,YAAM,YAAY,aAAa;AAE/B,UAAI,OAAO,cAAc,UAAU;AACjC,cAAM,UAAU,UAAU,KAAK;AAC/B,YAAI,QAAQ,WAAW,GAAG;AACxB,gBAAM,IAAI;AAAA,YACR,4CAA4C,IAAI,SAAS,MAAM;AAAA,UACjE;AAAA,QACF;AACA,iBAAS,mBAAmB,OAAO;AAAA,MACrC,OAAO;AACL,iBAAS;AAAA,UACP;AAAA,UACA,oCAAoC,IAAI,SAAS,MAAM;AAAA,QACzD;AAAA,MACF;AAEA,UAAI,CAAC,QAAQ;AACX,QAAAA,YAAW,kCAAkC,IAAI,SAAS,MAAM,mBAAmB;AACnF;AAAA,MACF;AAEA,YAAME,UAAS,eAAe,aAAa,QAAQ,MAAM,MAAM;AAE/D,YAAM,MAAMD,UAAS,aAAa,GAAG;AACrC,UAAI;AAEJ,UAAI,KAAK;AACP,cAAM,WAAW,MAAM,qBAAqB,KAAK,WAAW;AAC5D,YAAI,SAAS,cAAc;AACzB,wBAAc,kBAAAE,QAAK,QAAQ,SAAS,YAAY;AAAA,QAClD,OAAO;AACL,UAAAH;AAAA,YACE,yBAAyB,IAAI,SAAS,MAAM,qBAAqB,SAAS,WAAW;AAAA,YACrF,SAAS,UAAU,SAAS,IACxB,SAAS,UAAU,IAAI,CAAC,YAAY,YAAY,OAAO,EAAE,IACzD;AAAA,UACN;AAAA,QACF;AAAA,MACF,OAAO;AACL,sBAAc,YAAY,CAAC;AAAA,MAC7B;AAGA,YAAM,aAAa,oBAAI,IAAI,CAAC,QAAQ,QAAQ,UAAU,OAAO,QAAQ,CAAC;AACtE,YAAM,SAAoC,CAAC;AAC3C,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,YAAI,CAAC,WAAW,IAAI,GAAG,KAAK,UAAU,QAAW;AAC/C,iBAAO,GAAG,IAAI;AAAA,QAChB;AAAA,MACF;AAEA,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAIE,YAAW,SAAY,EAAE,QAAAA,QAAO,IAAI,CAAC;AAAA,QACzC,GAAI,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,MACrD,CAAC;AACD;AAAA,IACF;AAEA,QAAI,cAAc,aAAa;AAC7B,YAAM,aAAa,aAAa;AAChC,UAAI,CAAC,MAAM,QAAQ,UAAU,GAAG;AAC9B,QAAAF;AAAA,UACE,iCAAiC,IAAI,SAAS,MAAM;AAAA,QACtD;AACA;AAAA,MACF;AAEA,YAAM,gBAAgB,aAAa;AACnC,UAAI,CAACD,cAAa,aAAa,GAAG;AAChC,QAAAC,YAAW,iCAAiC,IAAI,SAAS,MAAM,uBAAuB;AACtF;AAAA,MACF;AAEA,YAAM,iBAAiBC,UAAS,cAAc,IAAI;AAClD,UACE,mBAAmB,sBACnB,mBAAmB,gBACnB,mBAAmB,aACnB;AACA,QAAAD;AAAA,UACE,iCAAiC,IAAI,SAAS,MAAM,+BAA+B,cAAc;AAAA,QACnG;AACA;AAAA,MACF;AAGA,YAAM,mBAAsC,CAAC;AAC7C,iBAAW,aAAa,YAAY;AAClC,YAAI,CAACD,cAAa,SAAS,GAAG;AAC5B,UAAAC,YAAW,mDAAmD,IAAI,qBAAqB;AACvF;AAAA,QACF;AAEA,cAAM,aAAaC,UAAS,UAAU,IAAI;AAC1C,cAAM,aAAa,UAAU;AAE7B,YAAI,CAAC,cAAc,CAAC,gBAAgB,UAAU,GAAG;AAC/C,UAAAD,YAAW,kEAAkE,IAAI,GAAG;AACpF;AAAA,QACF;AAGA,cAAM,gBAAgB,MAAM;AAAA,UAC1B,EAAE,YAAY,CAAC,SAAS,EAAE;AAAA,UAC1B;AAAA,UACA;AAAA,UACA,GAAG,MAAM,IAAI,IAAI,IAAI,UAAU;AAAA,QACjC;AAEA,YAAI,iBAAiB,cAAc,SAAS,GAAG;AAC7C,2BAAiB,KAAK,cAAc,CAAC,CAAC;AAAA,QACxC;AAAA,MACF;AAEA,UAAI,iBAAiB,WAAW,GAAG;AACjC,QAAAA;AAAA,UACE,iCAAiC,IAAI,SAAS,MAAM;AAAA,QACtD;AACA;AAAA,MACF;AAGA,UAAI;AAEJ,UAAI,mBAAmB,oBAAoB;AACzC,cAAM,UAAUD,cAAa,cAAc,OAAO,IAC7C,cAAc,UACf;AACJ,cAAM,gBAAwC,CAAC;AAC/C,YAAI,SAAS;AACX,qBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,gBAAI,OAAO,UAAU,UAAU;AAC7B,4BAAc,GAAG,IAAI;AAAA,YACvB;AAAA,UACF;AAAA,QACF;AACA,qBAAa;AAAA,UACX,MAAM;AAAA,UACN,GAAI,OAAO,KAAK,aAAa,EAAE,SAAS,IAAI,EAAE,SAAS,cAAc,IAAI,CAAC;AAAA,QAC5E;AAAA,MACF,WAAW,mBAAmB,cAAc;AAC1C,cAAM,iBAAiBE,UAAS,cAAc,IAAI;AAClD,YAAI,CAAC,gBAAgB;AACnB,UAAAD;AAAA,YACE,iCAAiC,IAAI,SAAS,MAAM;AAAA,UACtD;AACA;AAAA,QACF;AAIA,qBAAa;AAAA,UACX,MAAM;AAAA,UACN,MAAM;AAAA,UACN,KAAK,YAAY,CAAC;AAAA,QACpB;AAAA,MACF,OAAO;AAEL,cAAM,mBAAmBC,UAAS,cAAc,MAAM;AACtD,YAAIG;AAEJ,YAAI,kBAAkB;AACpB,gBAAM,WAAW,MAAM,qBAAqB,kBAAkB,WAAW;AACzE,cAAI,SAAS,cAAc;AACzB,YAAAA,cAAa,kBAAAD,QAAK,QAAQ,SAAS,YAAY;AAAA,UACjD;AAAA,QACF;AAEA,qBAAa;AAAA,UACX,MAAM;AAAA,UACN,GAAI,mBAAmB,EAAE,QAAQ,iBAAiB,IAAI,CAAC;AAAA,UACvD,GAAIC,cAAa,EAAE,YAAAA,YAAW,IAAI,CAAC;AAAA,QACrC;AAAA,MACF;AAEA,YAAMF,UAAS,eAAe,aAAa,QAAQ,MAAM,MAAM;AAE/D,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,MAAM;AAAA,QACN,YAAY;AAAA,QACZ;AAAA,QACA,GAAIA,YAAW,SAAY,EAAE,QAAAA,QAAO,IAAI,CAAC;AAAA,MAC3C,CAAC;AACD;AAAA,IACF;AAEA,QAAI,cAAc,mBAAmB;AACnC,YAAM,OAAOD,UAAS,aAAa,IAAI;AACvC,UAAI,SAAS,eAAe,SAAS,cAAc,SAAS,SAAS;AACnE,QAAAD;AAAA,UACE,uCAAuC,IAAI,SAAS,MAAM,oBAAoB,IAAI;AAAA,QACpF;AACA;AAAA,MACF;AAEA,YAAM,cAAc,aAAa;AACjC,UAAI;AACJ,UAAI,gBAAgB,QAAW;AAC7B,YAAI,CAACD,cAAa,WAAW,GAAG;AAC9B,UAAAC;AAAA,YACE,uCAAuC,IAAI,SAAS,MAAM;AAAA,UAC5D;AACA;AAAA,QACF;AACA,mBAAW,CAAC;AACZ,mBAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AAC3D,cAAI,OAAO,UAAU,YAAY,SAAS,GAAG;AAC3C,qBAAS,QAAQ,IAAI;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,cAAc,aAAa;AACjC,UAAI;AACJ,UAAI,gBAAgB,QAAW;AAC7B,YAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B,UAAAA;AAAA,YACE,uCAAuC,IAAI,SAAS,MAAM;AAAA,UAC5D;AACA;AAAA,QACF;AACA,mBAAW,CAAC;AACZ,mBAAW,QAAQ,aAAa;AAC9B,cAAID,cAAa,IAAI,KAAK,OAAO,KAAK,SAAS,UAAU;AAEvD,gBAAI;AACJ,gBAAI,KAAK,SAAS,OAAO;AACvB,qBAAO;AAAA,YACT,WAAWA,cAAa,KAAK,IAAI,GAAG;AAClC,qBAAO,KAAK;AAAA,YACd;AACA,qBAAS,KAAK,EAAE,MAAM,KAAK,MAAM,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC,EAAG,CAAC;AAAA,UAC5E;AAAA,QACF;AAAA,MACF;AAGA,UAAI,SAAS,eAAe,CAAC,UAAU;AACrC,QAAAC;AAAA,UACE,uCAAuC,IAAI,SAAS,MAAM;AAAA,QAC5D;AACA;AAAA,MACF;AAEA,WAAK,SAAS,cAAc,SAAS,YAAY,CAAC,UAAU;AAC1D,QAAAA;AAAA,UACE,uCAAuC,IAAI,SAAS,MAAM,MAAM,IAAI;AAAA,QACtE;AACA;AAAA,MACF;AAEA,YAAME,UAAS,eAAe,aAAa,QAAQ,MAAM,MAAM;AAE/D,YAAM,SAAwC;AAAA,QAC5C;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,QAC/B,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,QAC/B,GAAIA,YAAW,SAAY,EAAE,QAAAA,QAAO,IAAI,CAAC;AAAA,MAC3C;AAEA,iBAAW,KAAK,MAAM;AACtB;AAAA,IACF;AAEA,QAAI,cAAc,kBAAkB;AAClC,YAAM,YAAY,aAAa;AAC/B,UAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC7B,QAAAF;AAAA,UACE,sCAAsC,IAAI,SAAS,MAAM;AAAA,QAC3D;AACA;AAAA,MACF;AAEA,UAAI,UAAU,WAAW,GAAG;AAC1B,QAAAA;AAAA,UACE,sCAAsC,IAAI,SAAS,MAAM;AAAA,QAC3D;AACA;AAAA,MACF;AAEA,YAAM,SAA8C,CAAC;AACrD,iBAAW,YAAY,WAAW;AAChC,YAAI,CAACD,cAAa,QAAQ,GAAG;AAC3B,UAAAC;AAAA,YACE,6DAA6D,IAAI;AAAA,UACnE;AACA;AAAA,QACF;AAEA,cAAM,YAAYC,UAAS,SAAS,IAAI;AACxC,cAAM,QAAQA,UAAS,SAAS,KAAK;AAErC,YAAI,CAAC,WAAW;AACd,UAAAD;AAAA,YACE,4DAA4D,IAAI,SAAS,MAAM;AAAA,UACjF;AACA;AAAA,QACF;AAEA,YAAI,CAAC,SAAS,CAAC,sBAAsB,KAAK,GAAG;AAC3C,UAAAA;AAAA,YACE,mBAAmB,SAAS,8BAA8B,KAAK,mBAAmB,IAAI;AAAA,UACxF;AACA;AAAA,QACF;AAEA,cAAM,cAAiD;AAAA,UACrD,MAAM;AAAA,UACN;AAAA,UACA,GAAI,OAAO,SAAS,aAAa,YAAY,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,UAChF,GAAI,OAAO,SAAS,WAAW,WAAW,EAAE,QAAQ,SAAS,OAAO,IAAI,CAAC;AAAA,UACzE,GAAI,OAAO,SAAS,cAAc,WAAW,EAAE,WAAW,SAAS,UAAU,IAAI,CAAC;AAAA,UAClF,GAAI,OAAO,SAAS,aAAa,YAAY,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,UAChF,GAAI,MAAM,QAAQ,SAAS,OAAO,IAC9B,EAAE,SAAS,SAAS,QAAQ,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,EAAE,IAC9E,CAAC;AAAA,QACP;AAEA,eAAO,KAAK,WAAW;AAAA,MACzB;AAEA,UAAI,OAAO,WAAW,GAAG;AACvB,QAAAA;AAAA,UACE,sCAAsC,IAAI,SAAS,MAAM;AAAA,QAC3D;AACA;AAAA,MACF;AAEA,YAAM,cAAcC,UAAS,aAAa,WAAW;AACrD,YAAM,mBAAmB,4BAA4B,WAAW,IAAI,cAAc;AAElF,YAAMC,UAAS,eAAe,aAAa,QAAQ,MAAM,MAAM;AAE/D,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA,GAAI,mBAAmB,EAAE,aAAa,iBAAiB,IAAI,CAAC;AAAA,QAC5D,GAAIA,YAAW,SAAY,EAAE,QAAAA,QAAO,IAAI,CAAC;AAAA,MAC3C,CAAC;AACD;AAAA,IACF;AAEA,QAAI,cAAc,WAAW;AAC3B,YAAM,YAAY,aAAa;AAC/B,UAAI,OAAO,cAAc,YAAY,YAAY,GAAG;AAClD,QAAAF;AAAA,UACE,+BAA+B,IAAI,SAAS,MAAM;AAAA,QACpD;AACA;AAAA,MACF;AAEA,YAAME,UAAS,eAAe,aAAa,QAAQ,MAAM,MAAM;AAE/D,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA,GAAIA,YAAW,SAAY,EAAE,QAAAA,QAAO,IAAI,CAAC;AAAA,MAC3C,CAAC;AACD;AAAA,IACF;AAEA,QAAI,cAAc,QAAQ;AACxB,YAAM,SAAS,aAAa;AAC5B,UAAI,OAAO,WAAW,YAAY,SAAS,GAAG;AAC5C,QAAAF;AAAA,UACE,4BAA4B,IAAI,SAAS,MAAM;AAAA,QACjD;AACA;AAAA,MACF;AAEA,YAAME,UAAS,eAAe,aAAa,QAAQ,MAAM,MAAM;AAE/D,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA,GAAIA,YAAW,SAAY,EAAE,QAAAA,QAAO,IAAI,CAAC;AAAA,MAC3C,CAAC;AACD;AAAA,IACF;AAEA,QAAI,cAAc,eAAe;AAC/B,YAAM,WAAW,aAAa,aAAa,aAAa;AACxD,YAAM,WAAW,aAAa,aAAa,aAAa;AACxD,YAAM,YAAY,aAAa,cAAc,aAAa;AAE1D,YAAM,SAAS;AAAA,QACb,CAAC,aAAa,QAAQ;AAAA,QACtB,CAAC,aAAa,QAAQ;AAAA,QACtB,CAAC,cAAc,SAAS;AAAA,MAC1B;AAEA,YAAM,cAAiF,CAAC;AAExF,iBAAW,CAAC,KAAK,GAAG,KAAK,QAAQ;AAC/B,YAAI,QAAQ,OAAW;AACvB,YAAI,OAAO,QAAQ,YAAY,CAAC,OAAO,SAAS,GAAG,KAAK,MAAM,GAAG;AAC/D,UAAAF;AAAA,YACE,mCAAmC,IAAI,SAAS,MAAM,MAAM,GAAG;AAAA,UACjE;AACA;AAAA,QACF;AACA,oBAAY,GAAG,IAAI;AAAA,MACrB;AAEA,UACE,YAAY,cAAc,UAC1B,YAAY,cAAc,UAC1B,YAAY,eAAe,QAC3B;AACA,QAAAA;AAAA,UACE,mCAAmC,IAAI,SAAS,MAAM;AAAA,QACxD;AACA;AAAA,MACF;AAEA,YAAME,UAAS,eAAe,aAAa,QAAQ,MAAM,MAAM;AAE/D,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,MAAM;AAAA,QACN,GAAG;AAAA,QACH,GAAIA,YAAW,SAAY,EAAE,QAAAA,QAAO,IAAI,CAAC;AAAA,MAC3C,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAASD,UAAS,aAAa,MAAM;AAC3C,QAAI;AACJ,QAAI,QAAQ;AACV,YAAM,WAAW,MAAM,qBAAqB,QAAQ,WAAW;AAC/D,UAAI,SAAS,cAAc;AACzB,qBAAa,kBAAAE,QAAK,QAAQ,SAAS,YAAY;AAE/C,YAAI;AACF,gBAAM,4BAA4B,UAAU;AAAA,QAC9C,SAAS,OAAO;AACd,gBAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAErE,gBAAM,IAAI,MAAM,cAAc,IAAI,eAAe,UAAU,MAAM,OAAO,EAAE;AAAA,QAC5E;AAAA,MACF,OAAO;AACL,QAAAH;AAAA,UACE,qCAAqC,IAAI,SAAS,MAAM,sBAAsB,SAAS,WAAW;AAAA,UAClG,SAAS,UAAU,SAAS,IACxB,SAAS,UAAU,IAAI,CAAC,YAAY,YAAY,OAAO,EAAE,IACzD;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAASC,UAAS,aAAa,KAAK;AAE1C,UAAM,aAAa,aAAa;AAChC,UAAM,gBAAgB,MAAM,QAAQ,UAAU,IAC1C,WACG,OAAO,CAAC,MAAuBF,cAAa,CAAC,CAAC,EAC9C,IAAI,CAAC,QAAQ,WAAW;AAAA,MACvB,IAAIE,UAAS,OAAO,EAAE,KAAK,UAAU,QAAQ,CAAC;AAAA,MAC9C,aAAaA,UAAS,OAAO,WAAW,KAAK;AAAA,MAC7C,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AAAA,MAC5D,UAAU,OAAO,OAAO,aAAa,YAAY,OAAO,WAAW;AAAA,IACrE,EAAE,EACD,OAAO,CAAC,MAAM,EAAE,YAAY,SAAS,CAAC,IACzC;AAEJ,QAAI,cAAc,UAAU;AAC1B,UAAI,CAAC,eAAe;AAClB,QAAAD,YAAW,8BAA8B,IAAI,SAAS,MAAM,0BAA0B;AACtF;AAAA,MACF;AACA,UAAI,cAAc,WAAW,GAAG;AAC9B,QAAAA,YAAW,8BAA8B,IAAI,SAAS,MAAM,2BAA2B;AACvF;AAAA,MACF;AAEA,YAAME,UAAS,eAAe,aAAa,QAAQ,MAAM,MAAM;AAG/D,iBAAW,KAAK;AAAA,QACd;AAAA,QACA,MAAM;AAAA,QACN,SAAS;AAAA,QACT,GAAIA,YAAW,SAAY,EAAE,QAAAA,QAAO,IAAI,CAAC;AAAA,MAC3C,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAAS,eAAe,aAAa,QAAQ,MAAM,MAAM;AAE/D,eAAW,KAAK;AAAA,MACd;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,GAAI,iBAAiB,cAAc,SAAS,IAAI,EAAE,SAAS,cAAc,IAAI,CAAC;AAAA,MAC9E,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,IAC3C,CAAC;AAAA,EACH;AAEA,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AAKO,SAAS,gBACd,WACA,WAC2B;AAC3B,MAAI,OAAO,cAAc,UAAU;AACjC,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,EAAAF,YAAW,sBAAsB,SAAS,QAAQ,SAAS,2BAA2B;AACtF,SAAO;AACT;AAEA,SAASC,UAAS,OAAoC;AACpD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,cAAc,OAAgB,aAA2C;AAChF,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAM,IAAI,MAAM,GAAG,WAAW,4CAA4C;AAAA,EAC5E;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,MAAM,GAAG,WAAW,kBAAkB;AAAA,EAClD;AAEA,QAAM,SAAmB,CAAC;AAC1B,aAAW,CAAC,OAAO,KAAK,KAAK,MAAM,QAAQ,GAAG;AAC5C,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,IAAI,MAAM,GAAG,WAAW,IAAI,KAAK,oBAAoB;AAAA,IAC7D;AACA,QAAI,MAAM,KAAK,EAAE,WAAW,GAAG;AAC7B,YAAM,IAAI,MAAM,GAAG,WAAW,IAAI,KAAK,mBAAmB;AAAA,IAC5D;AACA,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAA2B;AACrD,MAAI,QAAQ,aAAa,SAAS;AAChC,WAAO,CAAC,WAAW,MAAM,OAAO;AAAA,EAClC;AACA,SAAO,CAAC,MAAM,OAAO,OAAO;AAC9B;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;AAOA,SAAS,eACP,WACA,eACA,QACoB;AACpB,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,cAAc,UAAU;AACjC,UAAM,IAAI;AAAA,MACR,iCAAiC,aAAa,SAAS,MAAM;AAAA,IAC/D;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,SAAS,SAAS,GAAG;AAC/B,UAAM,IAAI;AAAA,MACR,iCAAiC,aAAa,SAAS,MAAM,0BAA0B,SAAS;AAAA,IAClG;AAAA,EACF;AAEA,MAAI,YAAY,GAAG;AACjB,UAAM,IAAI;AAAA,MACR,iCAAiC,aAAa,SAAS,MAAM,gCAAgC,SAAS;AAAA,IACxG;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,0BAA0B,oBAAI,IAAI,CAAC,SAAS,qBAAqB,MAAM,CAAC;AAE9E,SAAS,sBAAsB,OAA+D;AAC5F,SAAO,OAAO,UAAU,YAAY,wBAAwB,IAAI,KAAK;AACvE;AAEA,IAAM,gCAAgC,oBAAI,IAAI,CAAC,oBAAoB,gBAAgB,CAAC;AAEpF,SAAS,4BACP,OACqD;AACrD,SAAO,OAAO,UAAU,YAAY,8BAA8B,IAAI,KAAK;AAC7E;;;AG5qBA,IAAAO,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;AAKA,QAAI,aAAa,OAAO,GAAG;AACzB,YAAM,WAAW,KAAK,UAAU,SAAS,MAAM,CAAC;AAChD,eAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,SAAS,CAAC;AAC/C,UAAI,WAAW;AACb,kBAAU,KAAK,QAAQ;AAAA,MACzB;AACA;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B;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;AAyFA,SAASE,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,GAAGC,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;AAqBA,eAAsB,wBACpB,SACuB;AACvB,QAAM,EAAE,UAAU,aAAa,QAAQ,IAAI;AAC3C,QAAM,WAAyB,CAAC;AAEhC,aAAW,WAAW,UAAU;AAC9B,UAAM,kBAAkB;AACxB,UAAM,UAAmC;AAAA,MACvC,MAAM,QAAQ;AAAA,IAChB;AAGA,QAAI,gBAAgB,MAAM;AACxB,cAAQ,OAAO,gBAAgB;AAAA,IACjC;AAGA,UAAM,UAAU,QAAQ;AACxB,QAAI,OAAO,YAAY,UAAU;AAC/B,cAAQ,UAAU;AAAA,IACpB,WAAW,MAAM,QAAQ,OAAO,GAAG;AAEjC,YAAM,mBAAiC,CAAC;AACxC,iBAAW,cAAc,SAAS;AAChC,YAAI,CAAC,aAAa,UAAU,GAAG;AAC7B;AAAA,QACF;AAEA,cAAM,cAAcH,UAAS,WAAW,IAAI;AAC5C,YAAI,gBAAgB,QAAQ;AAC1B,gBAAM,WAAWA,UAAS,WAAW,KAAK;AAC1C,cAAI,CAAC,UAAU;AACb;AAAA,UACF;AAEA,gBAAM,EAAE,aAAa,cAAc,UAAU,IAAI,MAAM;AAAA,YACrD;AAAA,YACA;AAAA,UACF;AAEA,cAAI,CAAC,cAAc;AACjB,kBAAM,WAAW,UAAU,SACvB,CAAC,YAAY,GAAG,UAAU,IAAI,CAAC,cAAc,OAAO,SAAS,EAAE,CAAC,IAChE;AACJ,YAAAC,YAAW,wCAAwC,WAAW,IAAI,QAAQ;AAC1E;AAAA,UACF;AAEA,cAAI;AACF,kBAAM,eAAe,UAAM,2BAAS,cAAc,MAAM,GAAG,QAAQ,SAAS,IAAI;AAChF,6BAAiB,KAAK;AAAA,cACpB,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM;AAAA,cACN,cAAc,kBAAAG,QAAK,QAAQ,YAAY;AAAA,YACzC,CAAC;AAED,gBAAI,SAAS;AACX,sBAAQ,IAAI,mCAAmC,WAAW,EAAE;AAC5D,sBAAQ,IAAI,oBAAoB,YAAY,EAAE;AAAA,YAChD;AAAA,UACF,SAAS,OAAO;AACd,YAAAH;AAAA,cACE,uCAAuC,YAAY,KAAM,MAAgB,OAAO;AAAA,YAClF;AAAA,UACF;AACA;AAAA,QACF;AAEA,yBAAiB,KAAK,gBAAgB,UAAU,CAAC;AAAA,MACnD;AACA,cAAQ,UAAU;AAAA,IACpB,WAAW,aAAa,OAAO,GAAG;AAEhC,cAAQ,UAAU,gBAAgB,OAAO;AAAA,IAC3C;AAGA,QAAI,gBAAgB,cAAc,MAAM,QAAQ,gBAAgB,UAAU,GAAG;AAC3E,cAAQ,aAAa,gBAAgB,WAAW;AAAA,QAAI,CAAC,OACnD,aAAa,EAAE,IAAI,gBAAgB,EAAE,IAAI;AAAA,MAC3C;AAAA,IACF;AAEA,aAAS,KAAK,OAAqB;AAAA,EACrC;AAEA,SAAO;AACT;;;ACjXA,IAAAI,mBAAyB;AACzB,IAAAC,oBAAiB;AAcjB,IAAMC,eAAc;AACpB,IAAMC,cAAa;AAkBnB,eAAsB,kBACpB,UACA,OAAuB,MACA;AACvB,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,QACE,QAAQ,SAAS,UACjB,OAAO,QAAQ,SAAS,YACxB,OAAO,QAAQ,SAAS,UACxB;AACA,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,gBACE,SAAS,sBACT,gBAAgB,OAAO,SAAS,kBAAkB,GAClD;AAEA,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,WAAW,aAAa,QAAQ,OAAO,GAAG;AACxC,YAAM,WAAW,KAAK,UAAU,QAAQ,SAAS,MAAM,CAAC;AACxD,UAAI,SAAS,KAAK,EAAE,SAAS,GAAG;AAC9B,wBAAgB,KAAK,EAAE,MAAM,QAAQ,OAAO,SAAS,CAAC;AAAA,MACxD;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,SAAS,IAAI;AACpD,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;AAE7C,UACE,QAAQ,SAAS,UACjB,OAAO,QAAQ,SAAS,YACxB,SAAS,sBACT,gBAAgB,QAAQ,MAAM,SAAS,kBAAkB,GACzD;AAEA,sBAAc,KAAK,cAAc,QAAQ,IAAI,GAAG;AAChD;AAAA,MACF;AAEA,YAAM,mBAAmB,cAAc,SAAS,IAAI;AACpD,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,IAClB;AAAA,EACF,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,SAOV;AACzB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT,IAAI;AAEJ,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,SAAS,IAAI;AAC7C,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,aAAwC,CAAC;AAE/C,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,OAAwB,QAAQ;AAEpC,QAAI,SAAS,UAAU;AACrB,aAAO;AACP,mBAAa,KAAK,YAAY;AAAA,IAChC,WAAW,SAAS,QAAQ;AAC1B,aAAO;AACP,mBAAa,KAAK,UAAU;AAAA,IAC9B;AAEA,eAAW,WAAW,UAAU;AAC9B,UAAI,QAAQ,SAAS,iBAAiB;AACpC;AAAA,MACF;AACA,YAAM,YAAY,cAAc,SAAS,IAAI;AAC7C,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,UAAM,UAAU,aAAa,KAAK,IAAI;AAEtC,eAAW,KAAK;AAAA,MACd;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,WAAW,SAAS,IAAK,aAA4B;AAC9D;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;;;AR5UA,IAAMI,eAAc;AACpB,IAAM,WAAW;AACjB,IAAMC,cAAa;AA8BnB,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,IAClD,uBACA;AAEN,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;AAExD,UAAM,UAAUA,UAAS,SAAS,gBAAgB,KAAKA,UAAS,SAAS,OAAO;AAEhF,UAAM,qBAAqB,SAAS;AACpC,UAAM,wBAAwB,SAAS;AAEvC,QAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,QAAQ,kBAAkB,GAAG;AACzD;AAAA,QACE,kCAAkC,MAAM,SAAS;AAAA,MACnD;AACA;AAAA,IACF;AAGA,UAAM,sBACJ,MAAM,QAAQ,qBAAqB,KAAK,sBAAsB,SAAS;AAGzE,UAAM,gBAAgB,mBAAmB;AAAA,MAAO,CAAC,QAC/C,cAAc,GAAG;AAAA,IACnB;AACA,UAAM,mBAAmB,sBACrB,sBAAsB,OAAO,CAAC,QAA4B,cAAc,GAAG,CAAC,IAC5E,CAAC;AAEL,QAAI,uBAAuB,iBAAiB,WAAW,GAAG;AACxD,eAAS,kDAAkD,EAAE,EAAE;AAC/D;AAAA,IACF;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;AAID,UAAM,iBAAiB,sBACnB,MAAM,wBAAwB;AAAA,MAC5B,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC,IACD,CAAC;AAEL,UAAM,eAAe,kBAAkB,aAAa;AAIpD,QAAI,kBAAkB;AACtB,QAAI,eAAe,SAAS,GAAG;AAE7B,YAAM,cAAc,eAAe,eAAe,SAAS,CAAC;AAC5D,YAAM,UAAU,YAAY;AAC5B,YAAM,YAAY,YAAY;AAE9B,UAAI,OAAO,YAAY,UAAU;AAC/B,0BAAkB;AAAA,MACpB,WAAW,YAAY,UAAa,YAAY,MAAM;AAEpD,0BAAkB,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,MACnD,WAAW,cAAc,UAAa,cAAc,MAAM;AAExD,0BAAkB,KAAK,UAAU,WAAW,MAAM,CAAC;AAAA,MACrD;AAAA,IACF;AACA,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,QAAI;AACJ,QAAI;AACF,mBAAa,MAAM,gBAAgB,UAAU,iBAAiB,aAAa,MAAM,SAAS;AAAA,IAC5F,SAAS,OAAO;AAEd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,eAAS,uBAAuB,EAAE,MAAM,OAAO,EAAE;AACjD;AAAA,IACF;AAGA,UAAM,gBAAgB,SAAS;AAC/B,QAAI,kBAAkB,UAAa,MAAM,QAAQ,aAAa,GAAG;AAC/D,YAAM,cAAc,cACjB,OAAO,CAAC,MAAgC,aAAa,CAAC,KAAK,OAAO,MAAM,QAAQ,EAChF,IAAI,CAAC,QAAQ,UAAU;AACtB,YAAI,OAAO,WAAW,UAAU;AAC9B,iBAAO;AAAA,YACL,IAAI,UAAU,QAAQ,CAAC;AAAA,YACvB,aAAa;AAAA,YACb,QAAQ;AAAA,YACR,UAAU;AAAA,UACZ;AAAA,QACF;AACA,eAAO;AAAA,UACL,IAAIA,UAAS,OAAO,EAAE,KAAK,UAAU,QAAQ,CAAC;AAAA,UAC9C,aAAaA,UAAS,OAAO,WAAW,KAAK;AAAA,UAC7C,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AAAA,UAC5D,UAAU,OAAO,OAAO,aAAa,YAAY,OAAO,WAAW;AAAA,QACrE;AAAA,MACF,CAAC,EACA,OAAO,CAAC,MAAM,EAAE,YAAY,SAAS,CAAC;AAEzC,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,kBAAgE;AAAA,UACpE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAEA,qBAAa,aAAa,CAAC,iBAAiB,GAAG,UAAU,IAAI,CAAC,eAAe;AAAA,MAC/E;AAAA,IACF;AAGA,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,kBAAAD,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,mBAAmB;AAAA,MACnB,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;AAEA,SAAS,SAAS,SAAiB,SAAmC;AACpE,MAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,UAAM,cAAc,QAAQ,KAAK,IAAI;AACrC,YAAQ,MAAM,GAAG,QAAQ,UAAU,OAAO;AAAA,EAAK,WAAW,GAAGA,WAAU,EAAE;AAAA,EAC3E,OAAO;AACL,YAAQ,MAAM,GAAG,QAAQ,UAAU,OAAO,GAAGA,WAAU,EAAE;AAAA,EAC3D;AACF;;;ASnUA,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,aAA0B,UAA8B;AAC5E,QAAM,UAAU,UAAM,2BAAS,UAAU,MAAM;AAC/C,SAAO,KAAK,MAAM,OAAO;AAC3B;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;;;ACxKA,uBAAgC;AAChC,mBAA8D;AAC9D,oBAAyC;AACzC,gBAAoE;AAWpE,IAAM,wBACJ;AAWK,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,UAAM,YAAQ,0BAAY,kBAAkB,MAAM,CAAC;AACnD,SAAK,QAAQ,MAAM,OAAO,cAAc;AAAA,EAC1C;AAAA,EAtBS;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EAEQ;AAAA,EACA;AAAA,EACA;AAAA,EAkBjB,MAAM,OAAO,SAAqD;AAChE,WAAO,YAAY;AAAA,MACjB,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,UAAU,KAAK;AAAA,MACf,aAAa,KAAK;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEA,kBAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AACF;AAEO,IAAM,oBAAN,MAA4C;AAAA,EASjD,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,UAAM,gBAAY,kCAAgB;AAAA,MAChC,QAAQ,OAAO;AAAA,IACjB,CAAC;AACD,SAAK,QAAQ,UAAU,OAAO,KAAK;AAAA,EACrC;AAAA,EAzBS;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EAEQ;AAAA,EACA;AAAA,EACA;AAAA,EAqBjB,MAAM,OAAO,SAAqD;AAChE,UAAM,kBAAkB,8BAA8B,KAAK,QAAQ;AAEnE,WAAO,YAAY;AAAA,MACjB,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,UAAU,KAAK;AAAA,MACf,aAAa,KAAK;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,kBAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AACF;AAEO,IAAM,iBAAN,MAAyC;AAAA,EAS9C,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,UAAM,aAAS,wCAAyB;AAAA,MACtC,QAAQ,OAAO;AAAA,IACjB,CAAC;AACD,SAAK,QAAQ,OAAO,OAAO,KAAK;AAAA,EAClC;AAAA,EAxBS;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EAEQ;AAAA,EACA;AAAA,EACA;AAAA,EAoBjB,MAAM,OAAO,SAAqD;AAChE,WAAO,YAAY;AAAA,MACjB,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,UAAU,KAAK;AAAA,MACf,aAAa,KAAK;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEA,kBAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AACF;AAEA,SAAS,kBAAkB,QAA0D;AACnF,QAAM,UAAuC;AAAA,IAC3C,QAAQ,OAAO;AAAA,IACf,YAAY,OAAO;AAAA,IACnB,wBAAwB;AAAA,EAC1B;AAEA,QAAM,UAAU,sBAAsB,OAAO,YAAY;AACzD,MAAI,SAAS;AACX,YAAQ,UAAU;AAAA,EACpB,OAAO;AACL,YAAQ,eAAe,OAAO;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,cAA0C;AACvE,QAAM,UAAU,aAAa,KAAK;AAClC,MAAI,CAAC,gBAAgB,KAAK,OAAO,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,QAAQ,QAAQ,QAAQ,EAAE;AAC/C,QAAM,aAAa,aAAa,SAAS,SAAS,IAAI,eAAe,GAAG,YAAY;AACpF,SAAO;AACT;AAEA,SAAS,8BACP,UACoD;AACpD,MAAI,SAAS,mBAAmB,QAAW;AACzC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,MACT,UAAU;AAAA,QACR,MAAM;AAAA,QACN,cAAc,SAAS;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,SAAsC;AAC7D,QAAM,WAAW,QAAQ,YAAY,SAAS,QAAQ,aAAa;AACnE,MAAI,UAAU;AACZ,UAAM,mBAAmB,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,QAAQ;AAC7E,QAAI,kBAAkB;AACpB,aAAO;AAAA,IACT;AAEA,UAAMM,iBAAgB,qBAAqB,SAAS,KAAK;AACzD,WAAO,CAAC,EAAE,MAAM,UAAU,SAASA,eAAc,GAAG,GAAG,QAAQ;AAAA,EACjE;AAEA,QAAM,gBAAgB,qBAAqB,SAAS,IAAI;AACxD,QAAM,cAAc,QAAQ,SAAS,KAAK;AAE1C,QAAM,SAAqB;AAAA,IACzB,EAAE,MAAM,UAAU,SAAS,cAAc;AAAA,IACzC,EAAE,MAAM,QAAQ,SAAS,YAAY;AAAA,EACvC;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAA0B,mBAAoC;AAC1F,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,qBAAqB,QAAQ,cAAc,QAAQ,WAAW,KAAK,EAAE,SAAS,GAAG;AACnF,mBAAe,KAAK;AAAA;AAAA,EAA6B,QAAQ,WAAW,KAAK,CAAC,EAAE;AAAA,EAC9E;AAEA,SAAO,eAAe,KAAK,MAAM;AACnC;AAEA,SAAS,gBAAgB,YAAwC;AAC/D,SAAO,WAAW,IAAI,CAAC,YAAY;AACjC,QAAI,QAAQ,SAAS,UAAU,QAAQ,SAAS,YAAY;AAC1D,YAAM,SAAS,QAAQ,OAAO,KAAK,QAAQ,IAAI,QAAQ;AACvD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,GAAG,MAAM,GAAG,QAAQ,OAAO;AAAA,MACtC;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,eAAe,QAAQ,SAAS,YAAY,QAAQ,SAAS,QAAQ;AACxF,aAAO;AAAA,QACL,MAAM,QAAQ;AAAA,QACd,SAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,QAAQ;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qBACP,SACA,UACoD;AACpD,QAAM,cAAc,QAAQ,eAAe,SAAS;AACpD,QAAM,kBAAkB,QAAQ,mBAAmB,SAAS;AAC5D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,YAAY,SAMG;AAC5B,QAAM,EAAE,OAAO,SAAS,UAAU,aAAa,gBAAgB,IAAI;AACnE,QAAM,aAAa,gBAAgB,OAAO;AAC1C,QAAM,EAAE,aAAa,gBAAgB,IAAI,qBAAqB,SAAS,QAAQ;AAE/E,QAAM,SAAS,MAAM;AAAA,IACnB,UACE,wBAAa;AAAA,MACX;AAAA,MACA,UAAU,gBAAgB,UAAU;AAAA,MACpC;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,aAAa,QAAQ;AAAA,MACrB,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC/C,CAAC;AAAA,IACH;AAAA,IACA,QAAQ;AAAA,EACV;AAEA,SAAO,YAAY,MAAM;AAC3B;AAEA,SAAS,YAAY,QAAsC;AACzD,QAAM,UAAU,OAAO,QAAQ;AAC/B,SAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,aAAa,OAAO,cAAc,OAAO,KAAK;AAAA,IACrD,gBAAgB,CAAC,EAAE,MAAM,aAAsB,QAAQ,CAAC;AAAA,EAC1D;AACF;AAEA,SAAS,aAAa,OAAwC;AAC5D,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,OAAoC;AACzD,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,QAAM,eAAe,UAAU,UAAU,UAAU;AACnD,MAAI,OAAO,iBAAiB,YAAY,OAAO,SAAS,YAAY,GAAG;AACrE,WAAO;AAAA,EACT;AAEA,QAAM,iBACJ,OAAO,UAAU,aAAa,YAAY,UAAU,WAC/C,UAAU,SAAkC,SAC7C;AACN,MAAI,OAAO,mBAAmB,YAAY,OAAO,SAAS,cAAc,GAAG;AACzE,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,UAAU,YAAY,WAAW,UAAU,UAAU;AAC5E,MAAI,SAAS;AACX,UAAM,QAAQ,QAAQ,MAAM,iBAAiB;AAC7C,QAAI,OAAO;AACT,YAAM,SAAS,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE;AAC3C,UAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAAyB;AAC/C,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,MAAI,UAAU,SAAS,cAAc;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,UAAU;AACvB,MAAI,OAAO,SAAS,YAAY,gDAAgD,KAAK,IAAI,GAAG;AAC1F,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,UAAU,YAAY,WAAW,UAAU,UAAU;AAC5E,MACE,WACA,gFAAgF,KAAK,OAAO,GAC5F;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAgB,sBAAkD;AAC1F,QAAM,SAAS,cAAc,KAAK;AAClC,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,qBAAqB,SAAS,MAAM;AAAA,EAC7C;AAEA,SAAO,eAAe,KAAK;AAC7B;AAEA,SAAS,oBAAoB,SAAiB,QAAuC;AACnF,QAAM,QAAQ,KAAK;AAAA,IACjB,OAAO;AAAA,IACP,OAAO,iBAAiB,OAAO,iBAAiB;AAAA,EAClD;AACA,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;AACZ,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;AAC7D,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;AAEZ,UAAI,WAAW,OAAO,YAAY;AAChC;AAAA,MACF;AAEA,UAAI,CAAC,iBAAiB,OAAO,OAAO,oBAAoB,GAAG;AACzD,cAAM;AAAA,MACR;AAEA,YAAM,QAAQ,oBAAoB,SAAS,MAAM;AACjD,YAAM,MAAM,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,QAAM;AACR;;;AC3bA,gCAAsB;AACtB,yBAA2B;AAC3B,IAAAC,kBAAkC;AAElC,IAAAC,mBAA8C;AAC9C,qBAAuB;AACvB,IAAAC,oBAAiB;;;ACCjB,IAAM,kBAAkB,OAAO,IAAI,uBAAuB;AAC1D,IAAM,yBAAyB,OAAO,IAAI,iCAAiC;AAS3E,SAAS,wBAA8C;AACrD,QAAM,eAAe;AACrB,QAAM,WAAW,aAAa,eAAe;AAC7C,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,QAAM,UAAgC,CAAC;AACvC,eAAa,eAAe,IAAI;AAChC,SAAO;AACT;AAEA,SAAS,qBAAiD;AACxD,QAAM,eAAe;AACrB,QAAM,WAAW,aAAa,sBAAsB;AACpD,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,QAAM,UAAU,oBAAI,IAA2B;AAC/C,eAAa,sBAAsB,IAAI;AACvC,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAiC;AAC1D,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,sCAAsC,OAAO,EAAE;AAAA,IAC9D;AAAA,EACF;AACF;AAEO,SAAS,yBAAyB,OAAiC;AACxE,wBAAsB,EAAE,KAAK,KAAK;AAClC,oBAAkB,KAAK;AACzB;AAEO,SAAS,8BAAoD;AAClE,QAAM,QAAQ,sBAAsB;AACpC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,MAAM,OAAO,GAAG,MAAM,MAAM;AACrC;AAEO,SAAS,gCAAgC,UAA6C;AAC3F,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,OAAO,CAAC,SAAS,CAAC,eAAe,SAAS,IAAI,CAAC;AAE7F,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,SAAS,oBACd,YACsB;AACtB,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;;;AFnHA,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AAMxB,IAAMC,yBAAwB;AAAA;AAAA;AAAA;AAAA;AA0BvB,IAAM,qBAAN,MAA6C;AAAA,EACzC;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,gBAAgB;AAAA,EAER;AAAA,EACA;AAAA,EAEjB,YACE,YACA,QACA,SAA2B,yBAC3B;AACA,SAAK,KAAK,eAAe,UAAU;AACnC,SAAK,aAAa;AAClB,SAAK,SAAS;AACd,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,MAAM,OAAO,SAAqD;AAChE,QAAI,QAAQ,QAAQ,SAAS;AAC3B,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACpE;AAEA,UAAM,aAAa,oBAAoB,QAAQ,UAAU;AAEzD,UAAM,gBAAgB,MAAM,KAAK,gBAAgB;AACjD,UAAM,SAAS,MAAM,KAAK,mBAAmB,OAAO,EAAE,MAAM,MAAM,MAAS;AAC3E,QAAI;AAEF,YAAM,aAAa,kBAAAC,QAAK,KAAK,eAAe,eAAe;AAC3D,gBAAM,4BAAU,YAAY,QAAQ,UAAU,MAAM;AAEpD,YAAM,OAAO,KAAK,oBAAoB,QAAQ,UAAU,UAAU;AAClE,YAAM,MAAM,KAAK,WAAW;AAE5B,YAAM,SAAS,MAAM,KAAK,kBAAkB,MAAM,KAAK,QAAQ,QAAQ,MAAM;AAE7E,UAAI,OAAO,UAAU;AACnB,cAAM,IAAI;AAAA,UACR,4BAA4B,oBAAoB,KAAK,OAAO,aAAa,MAAS,CAAC;AAAA,QACrF;AAAA,MACF;AAEA,UAAI,OAAO,aAAa,GAAG;AACzB,cAAM,SAAS,WAAW,OAAO,QAAQ,OAAO,MAAM;AACtD,cAAM,SAAS,oCAAoC,OAAO,QAAQ;AAKlE,YAAI,4BAA4B,OAAO,MAAM,GAAG;AAC9C,gBAAM,IAAI;AAAA,YACR,GAAG,MAAM;AAAA,UACX;AAAA,QACF;AAEA,cAAM,IAAI,MAAM,SAAS,GAAG,MAAM,KAAK,MAAM,KAAK,MAAM;AAAA,MAC1D;AAEA,YAAM,SAAS,qBAAqB,OAAO,MAAM;AACjD,YAAM,iBAAiB,sBAAsB,MAAM;AACnD,YAAM,QAAQ,aAAa,MAAM;AAEjC,aAAO;AAAA,QACL,KAAK;AAAA,UACH,UAAU;AAAA,UACV,QAAQ,OAAO;AAAA,UACf,QAAQ,OAAO;AAAA,UACf,UAAU,OAAO;AAAA,UACjB;AAAA,UACA,YAAY,KAAK,OAAO;AAAA,UACxB;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA,SAAS,QAAQ;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,UAAE;AACA,YAAM,QAAQ,MAAM;AACpB,YAAM,KAAK,iBAAiB,aAAa;AAAA,IAC3C;AAAA,EACF;AAAA,EAEQ,aAAqB;AAC3B,QAAI,CAAC,KAAK,OAAO,KAAK;AAGpB,aAAO,QAAQ,IAAI;AAAA,IACrB;AACA,WAAO,kBAAAA,QAAK,QAAQ,KAAK,OAAO,GAAG;AAAA,EACrC;AAAA,EAEQ,oBAAoB,QAAgB,YAAqD;AAC/F,UAAM,OAAiB,CAAC;AAGxB,SAAK,KAAK,mBAAmB,aAAa;AAG1C,SAAK,KAAK,WAAW;AAGrB,SAAK,KAAK,IAAI;AAGd,QAAI,KAAK,OAAO,OAAO;AACrB,WAAK,KAAK,WAAW,KAAK,OAAO,KAAK;AAAA,IACxC;AAGA,QAAI,KAAK,OAAO,QAAQ,KAAK,OAAO,KAAK,SAAS,GAAG;AACnD,WAAK,KAAK,GAAG,KAAK,OAAO,IAAI;AAAA,IAC/B;AAGA,UAAM,eAAe,KAAK,OAAO,gBAAgBD;AACjD,UAAM,aAAa,GAAG,YAAY;AAAA;AAAA,EAAO,MAAM;AAG/C,QAAI,cAAc;AAClB,QAAI,cAAc,WAAW,SAAS,GAAG;AACvC,YAAM,eAAe,WAAW,IAAI,CAAC,MAAM,UAAU,CAAC,GAAG,EAAE,KAAK,IAAI;AACpE,oBAAc,GAAG,UAAU;AAAA;AAAA;AAAA,EAAuB,YAAY;AAAA,IAChE;AAGA,SAAK,KAAK,WAAW;AAErB,WAAO;AAAA,EACT;AAAA,EAEQ,WAA8B;AACpC,UAAM,MAAM,EAAE,GAAG,QAAQ,IAAI;AAI7B,QAAI,aAAa;AACjB,QAAI,yBAAyB;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,kBACZ,MACA,KACA,QACA,QAC8B;AAC9B,QAAI;AACF,aAAO,MAAM,KAAK,cAAc;AAAA,QAC9B,YAAY,KAAK,OAAO;AAAA,QACxB;AAAA,QACA;AAAA,QACA,WAAW,KAAK,OAAO;AAAA,QACvB,KAAK,KAAK,SAAS;AAAA,QACnB;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,2BAA2B,KAAK,OAAO,UAAU;AAAA,QACnD;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,kBAAmC;AAC/C,WAAO,UAAM,0BAAQ,kBAAAC,QAAK,SAAK,uBAAO,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,iCAAiC;AAClD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AACA,QAAI,KAAK,OAAO,QAAQ;AACtB,aAAO,kBAAAA,QAAK,QAAQ,KAAK,OAAO,MAAM;AAAA,IACxC;AACA,WAAO,kBAAAA,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,QAAQ,aAAa;AAAA,EAClE;AAAA,EAEA,MAAc,mBACZ,SAC6C;AAC7C,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,yDAAyD,MAAM,MAAM,OAAO,EAAE;AAC3F,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,kBAAAA,QAAK,KAAK,QAAQ,iBAAiB,SAAS,KAAK,UAAU,CAAC;AAE7E,QAAI;AACF,YAAM,SAAS,MAAM,uBAAuB,OAAO;AAAA,QACjD;AAAA,QACA,YAAY,KAAK;AAAA,QACjB,YAAY,QAAQ;AAAA,QACpB,SAAS,QAAQ;AAAA,QACjB,QAAQ,KAAK,OAAO,aAAa;AAAA,MACnC,CAAC;AACD,+BAAyB;AAAA,QACvB;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,2CAA2C,QAAQ,KAAK,OAAO,EAAE;AAC9E,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAM,yBAAN,MAAM,wBAAuB;AAAA,EAClB;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,SAMgB;AAClC,UAAM,SAAS,IAAI,wBAAuB,QAAQ,UAAU,QAAQ,MAAM;AAC1E,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,wBAAwB,OAAO,IAC/B,2BAA2B,SAAS,MAAM;AAChD,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,mCAA4C;AACnD,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,aAAa;AACtE,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,2BAA2B,SAAiB,QAAqC;AACxF,QAAM,SAAS,kBAAkB,OAAO;AACxC,MAAI,QAAQ;AACV,UAAM,UAAU,yBAAyB,MAAM;AAC/C,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,WAAW,UAAU;AACvB,WAAO,WAAW,OAAO;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,SAAyB;AACxD,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,yBAAyB,OAAoC;AACpE,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AACA,QAAM,SAAS;AACf,QAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAE7D,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAGA,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK,aAAa;AAChB,YAAM,UAAU,OAAO;AACvB,UAAI,SAAS;AACX,cAAM,UAAU,QAAQ;AACxB,YAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAAG;AAChD,gBAAM,QAAQ,QAAQ,CAAC;AACvB,cAAI,OAAO,SAAS,YAAY;AAC9B,mBAAO,wBAAwB,MAAM,IAAI;AAAA,UAC3C;AACA,cAAI,OAAO,SAAS,QAAQ;AAC1B,kBAAM,OAAO,MAAM;AACnB,gBAAI,OAAO,SAAS,UAAU;AAC5B,oBAAM,UAAU,KAAK,SAAS,KAAK,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,QAAQ;AAC/D,qBAAO,cAAc,OAAO;AAAA,YAC9B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,UAAU,OAAO;AACvB,UAAI,SAAS;AACX,cAAM,UAAU,QAAQ;AACxB,YAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAAG;AAChD,gBAAM,QAAQ,QAAQ,CAAC;AACvB,cAAI,OAAO,SAAS,eAAe;AACjC,mBAAO,sBAAsB,MAAM,WAAW;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,UAAU;AACb,YAAM,OAAO,OAAO;AACpB,YAAM,WAAW,OAAO;AACxB,UAAI,OAAO,SAAS,YAAY,OAAO,aAAa,UAAU;AAC5D,eAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM,QAAQ,CAAC;AAAA,MAC7D;AACA,aAAO;AAAA,IACT;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,kBAAkB,SAAsC;AAC/D,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,SAAS,qBAAqB,QAA2B;AACvD,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAEA,QAAM,QAAQ,QACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAEnC,QAAM,SAAoB,CAAC;AAC3B,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,aAAO,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,IAC9B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,SAAO;AACT;AAMA,SAAS,sBAAsB,QAA6C;AAC1E,QAAM,iBAAkC,CAAC;AAEzC,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC;AAAA,IACF;AACA,UAAM,SAAS;AACf,UAAM,OAAO,OAAO;AAEpB,QAAI,SAAS,eAAe,SAAS,QAAQ;AAC3C,YAAM,UAAU,OAAO;AACvB,UAAI,SAAS;AACX,cAAM,YAAY,yBAAyB,SAAS,IAAc;AAClE,YAAI,WAAW;AACb,yBAAe,KAAK,SAAS;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,yBACP,SACA,MAC2B;AAC3B,QAAM,OAAO,SAAS,cAAc,cAAc;AAClD,QAAM,UAAU,mBAAmB,QAAQ,OAAO;AAClD,QAAM,YAAY,iBAAiB,QAAQ,OAAO;AAElD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,UAAU,SAAS,IAAI,YAAY;AAAA,EAChD;AACF;AAMA,SAAS,mBAAmB,SAAsC;AAChE,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,YAAsB,CAAC;AAC7B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC;AAAA,IACF;AACA,UAAM,IAAI;AACV,QAAI,EAAE,SAAS,UAAU,OAAO,EAAE,SAAS,UAAU;AACnD,gBAAU,KAAK,EAAE,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,SAAO,UAAU,SAAS,IAAI,UAAU,KAAK,IAAI,IAAI;AACvD;AAMA,SAAS,iBAAiB,SAAuC;AAC/D,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,YAAwB,CAAC;AAC/B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC;AAAA,IACF;AACA,UAAM,IAAI;AACV,QAAI,EAAE,SAAS,cAAc,OAAO,EAAE,SAAS,UAAU;AACvD,gBAAU,KAAK;AAAA,QACb,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,QACT,IAAI,OAAO,EAAE,OAAO,WAAW,EAAE,KAAK;AAAA,MACxC,CAAC;AAAA,IACH;AAEA,QAAI,EAAE,SAAS,iBAAiB,OAAO,EAAE,gBAAgB,UAAU;AACjE,gBAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,QAAQ,EAAE;AAAA,QACV,IAAI,EAAE;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,aAAa,QAA2C;AAC/D,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,UAAM,QAAQ,OAAO,CAAC;AACtB,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC;AAAA,IACF;AACA,UAAM,SAAS;AACf,QAAI,OAAO,SAAS,UAAU;AAC5B;AAAA,IACF;AAEA,UAAM,QAA0D,CAAC;AACjE,QAAI,OAAO,OAAO,aAAa,UAAU;AACvC,YAAM,WAAW,OAAO;AAAA,IAC1B;AACA,QAAI,OAAO,OAAO,gBAAgB,UAAU;AAC1C,YAAM,cAAc,OAAO;AAAA,IAC7B;AACA,QAAI,OAAO,OAAO,oBAAoB,UAAU;AAC9C,YAAM,kBAAkB,OAAO;AAAA,IACjC;AACA,QAAI,OAAO,OAAO,iBAAiB,UAAU;AAC3C,YAAM,eAAe,OAAO;AAAA,IAC9B;AACA,QAAI,OAAO,OAAO,kBAAkB,UAAU;AAC5C,YAAM,gBAAgB,OAAO;AAAA,IAC/B;AACA,QAAI,OAAO,OAAO,eAAe,UAAU;AACzC,YAAM,aAAa,OAAO;AAAA,IAC5B;AAEA,WAAO,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,QAAQ;AAAA,EACjD;AAEA,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,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;AAOA,SAAS,4BAA4B,QAAyB;AAC5D,MAAI;AAEF,UAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,QAAI,kBAAkB;AACtB,QAAI,eAAe;AAEnB,eAAW,QAAQ,OAAO;AACxB,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,QAAS;AACd,UAAI;AACF,cAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,YAAI,MAAM,SAAS,YAAY,MAAM,iBAAiB,qBAAqB;AACzE,4BAAkB;AAAA,QACpB;AACA,YACE,MAAM,UAAU,2BACf,MAAM,SAAS,YAAY,MAAM,UAClC;AACA,yBAAe;AAAA,QACjB;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO,mBAAmB;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,SAAS,eAAe,KAAqB;AAG3C,SAAO,IAAI,IAAI,QAAQ,MAAM,OAAO,CAAC;AACvC;AAEA,eAAe,wBACb,SAC8B;AAI9B,QAAM,aAAS,+BAAW;AAC1B,QAAM,aAAa,kBAAAA,QAAK,SAAK,uBAAO,GAAG,aAAa,MAAM,SAAS;AACnE,QAAM,aAAa,kBAAAA,QAAK,SAAK,uBAAO,GAAG,aAAa,MAAM,SAAS;AACnE,QAAM,WAAW,kBAAAA,QAAK,SAAK,uBAAO,GAAG,aAAa,MAAM,OAAO;AAC/D,QAAM,UAAU,kBAAAA,QAAK,SAAK,uBAAO,GAAG,aAAa,MAAM,MAAM;AAE7D,MAAI;AACF,WAAO,MAAM,2BAA2B,SAAS,YAAY,YAAY,UAAU,OAAO;AAAA,EAC5F,UAAE;AAEA,eAAW,QAAQ,CAAC,YAAY,YAAY,UAAU,OAAO,GAAG;AAC9D,UAAI;AACF,kBAAM,qBAAG,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,MAChC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,2BACb,SACA,YACA,YACA,UACA,SAC8B;AAE9B,QAAM,QAAQ,QAAQ,WAAW,MAAM,KAAK;AAC5C,QAAM,aAAa,MAAM,CAAC;AAC1B,QAAM,iBAAiB,MAAM,MAAM,CAAC;AACpC,QAAM,UAAU,CAAC,GAAG,gBAAgB,GAAG,QAAQ,IAAI;AAOnD,QAAM,cAAc,QAAQ,IAAI,CAAC,QAAQ,eAAe,GAAG,CAAC;AAC5D,QAAM,cAAc,CAAC,eAAe,UAAU,GAAG,GAAG,WAAW,EAAE,KAAK,GAAG;AAOzE,QAAM,aAAa;AAAA;AAAA,MAEf,WAAW,KAAK,eAAe,UAAU,CAAC,MAAM,eAAe,UAAU,CAAC;AAAA;AAAA,wBAExD,eAAe,OAAO,CAAC;AAAA;AAAA,gBAE/B,eAAe,QAAQ,CAAC;AAAA;AAItC,QAAM,YAAQ,iCAAM,UAAU,CAAC,QAAQ,MAAM,UAAU,GAAG;AAAA,IACxD,KAAK,QAAQ;AAAA,IACb,KAAK,QAAQ;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,MAAM;AAGZ,QAAM,eAAe;AACrB,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI,WAAW;AACf,MAAI,iBAAiB;AAErB,QAAM,mBAAmB,OAAO,aAAsC;AACpE,QAAI;AACF,YAAM,EAAE,UAAAC,UAAS,IAAI,MAAM,OAAO,aAAkB;AACpD,aAAO,MAAMA,UAAS,UAAU,MAAM;AAAA,IACxC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAMC,cAAa,OAAO,aAAuC;AAC/D,QAAI;AACF,YAAM,EAAE,QAAAC,QAAO,IAAI,MAAM,OAAO,aAAkB;AAClD,YAAMA,QAAO,QAAQ;AACrB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,cAAc,YAA2B;AAC7C,QAAI;AACF,YAAM,MAAM,MAAM,iBAAiB,OAAO;AAC1C,UAAI,IAAI,KAAK,GAAG;AACd,gBAAQ,KAAK,OAAO,SAAS,IAAI,KAAK,GAAG,EAAE,GAAG,SAAS;AAAA,MACzD;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,MAAI,QAAQ,QAAQ,SAAS;AAC3B,UAAM,YAAY;AAClB,WAAO,EAAE,QAAQ,IAAI,QAAQ,WAAW,UAAU,IAAI,UAAU,MAAM;AAAA,EACxE;AAEA,QAAM,eAAe,MAAY;AAC/B,gBAAY,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC9B;AACA,UAAQ,QAAQ,iBAAiB,SAAS,cAAc,EAAE,MAAM,KAAK,CAAC;AAEtE,MAAI;AACF,WAAO,MAAM;AAEX,UAAI,QAAQ,aAAa,KAAK,IAAI,IAAI,YAAY,QAAQ,WAAW;AACnE,mBAAW;AACX,cAAM,YAAY;AAClB;AAAA,MACF;AAGA,UAAI,QAAQ,QAAQ,SAAS;AAC3B,cAAM,YAAY;AAClB;AAAA,MACF;AAGA,UAAI,QAAQ,eAAe;AACzB,cAAM,gBAAgB,MAAM,iBAAiB,UAAU;AACvD,YAAI,cAAc,SAAS,gBAAgB;AACzC,kBAAQ,cAAc,cAAc,MAAM,cAAc,CAAC;AACzD,2BAAiB,cAAc;AAAA,QACjC;AAAA,MACF;AAGA,UAAI,MAAMD,YAAW,QAAQ,GAAG;AAC9B;AAAA,MACF;AAEA,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,YAAY,CAAC;AAAA,IAClE;AAGA,UAAM,SAAS,MAAM,iBAAiB,UAAU;AAChD,UAAM,SAAS,MAAM,iBAAiB,UAAU;AAChD,UAAM,cAAc,MAAM,iBAAiB,QAAQ;AACnD,UAAM,WAAW,YAAY,KAAK,IAAI,OAAO,SAAS,YAAY,KAAK,GAAG,EAAE,IAAI;AAGhF,QAAI,QAAQ,iBAAiB,OAAO,SAAS,gBAAgB;AAC3D,cAAQ,cAAc,OAAO,MAAM,cAAc,CAAC;AAAA,IACpD;AACA,QAAI,QAAQ,iBAAiB,QAAQ;AACnC,cAAQ,cAAc,MAAM;AAAA,IAC9B;AAEA,WAAO,EAAE,QAAQ,QAAQ,UAAU,SAAS;AAAA,EAC9C,UAAE;AACA,YAAQ,QAAQ,oBAAoB,SAAS,YAAY;AAAA,EAC3D;AACF;;;AG36BA,IAAAE,6BAA+E;AAC/E,IAAAC,mBAAe;AACf,IAAAC,kBAAe;AACf,IAAAC,qBAAiB;AACjB,uBAA0B;AAE1B,iBAAkB;AAoBlB,IAAM,iBAAiB,aAAE,OAAO;AAAA,EAC9B,MAAM,aAAE,OAAO;AAAA,EACf,OAAO,aAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,QAAQ,aAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,IAAI,aAAE,OAAO,EAAE,SAAS;AAAA,EACxB,WAAW,aAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAOD,IAAM,2BAA2B,aAAE,OAAO;AAAA,EACxC,MAAM,aAAE,OAAO;AAAA,EACf,MAAM,aAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,SAAS,aAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,YAAY,aAAE,MAAM,cAAc,EAAE,SAAS;AAAA,EAC7C,WAAW,aAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,UAAU,aAAE,OAAO,aAAE,QAAQ,CAAC,EAAE,SAAS;AAC3C,CAAC;AAMD,IAAM,mBAAmB,aAAE,OAAO;AAAA,EAChC,OAAO,aAAE,OAAO;AAAA,EAChB,QAAQ,aAAE,OAAO;AAAA,EACjB,QAAQ,aAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAOD,IAAM,kBAAkB,aAAE,OAAO;AAAA,EAC/B,MAAM,aAAE,QAAQ,EAAE,SAAS;AAAA,EAC3B,iBAAiB,aAAE,MAAM,wBAAwB,EAAE,SAAS;AAAA,EAC5D,aAAa,iBAAiB,SAAS;AAAA,EACvC,UAAU,aAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,aAAa,aAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAMD,IAAM,uBAAuB,gBAAgB,OAAO;AAAA,EAClD,IAAI,aAAE,OAAO,EAAE,IAAI,CAAC;AACtB,CAAC;AASD,SAAS,gBACP,SACA,YACA,SACiE;AACjE,MAAI,eAAe;AACnB,MAAI,kBAAkB;AAEtB,MAAI,YAAY,UAAa,UAAU,GAAG;AACxC,YAAQ,KAAK,kBAAkB,OAAO,uCAAuC,OAAO,GAAG;AACvF,mBAAe;AAAA,EACjB;AAEA,MAAI,eAAe,UAAa,aAAa,GAAG;AAC9C,YAAQ,KAAK,kBAAkB,OAAO,0CAA0C,UAAU,GAAG;AAC7F,sBAAkB;AAAA,EACpB;AAEA,SAAO,EAAE,SAAS,cAAc,YAAY,gBAAgB;AAC9D;AAMA,SAAS,sBACP,UACsC;AACtC,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,IAAI,CAAC,SAAS;AAAA,IAC5B,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,SAAS,IAAI;AAAA,IACb,WAAW,IAAI;AAAA,IACf,WAAW,IAAI;AAAA,IACf,UAAU,IAAI;AAAA,EAChB,EAAE;AACJ;AAEA,IAAM,gBAAY,4BAAU,2BAAAC,IAAgB;AAC5C,IAAM,qBAAqB,KAAK,OAAO;AAuBvC,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,EACA;AAAA,EACA;AAAA,EACT;AAAA,EAER,YACE,YACA,QACA,SAAwB,sBACxB;AACA,SAAK,aAAa;AAClB,SAAK,KAAK,OAAO,UAAU;AAC3B,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,UAAU,OAAO,WAAW;AACjC,SAAK,gBAAgB,OAAO,iBAAiB;AAAA,EAC/C;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,QAAI,KAAK,SAAS;AAChB,cAAQ;AAAA,QACN,iBAAiB,KAAK,UAAU,SAAS,KAAK,OAAO,OAAO,EAAE,YAAY,eAAe;AAAA,MAC3F;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,IAAI;AAC3B,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;AACD,UAAM,qBAAqB,KAAK,IAAI,IAAI;AAExC,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,yBAAyBC,qBAAoB,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,SACZ,GAAG,MAAM,eAAe,QAAQ,MAChC,wBAAwB,QAAQ;AACpC,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AAGA,UAAM,kBAAkB,MAAM,KAAK,yBAAyB,cAAc;AAC1E,UAAM,SAAS,KAAK,mBAAmB,eAAe;AAEtD,WAAO;AAAA,MACL,gBAAgB,OAAO;AAAA,MACvB,YAAY,OAAO;AAAA,MACnB,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO,cAAc;AAAA,MACjC,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,MAAM,YAAY,UAA4E;AAC5F,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,CAAC;AAAA,IACV;AAEA,eAAW,WAAW,UAAU;AAC9B,UAAI,QAAQ,QAAQ,SAAS;AAC3B,cAAM,IAAI,MAAM,yDAAyD;AAAA,MAC3E;AAAA,IACF;AAEA,UAAM,aAAa,IAAI,gBAAgB;AACvC,eAAW,WAAW,UAAU;AAC9B,cAAQ,QAAQ,iBAAiB,SAAS,MAAM,WAAW,MAAM,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,IACpF;AAEA,UAAM,KAAK,cAAc,WAAW,MAAM;AAE1C,UAAM,iBAAiB,uBAAuB,SAAS,QAAQ;AAE/D,UAAM,kBAA4B,CAAC;AACnC,eAAW,WAAW,UAAU;AAC9B,UAAI,QAAQ,cAAc,QAAQ,WAAW,SAAS,GAAG;AACvD,wBAAgB,KAAK,GAAG,QAAQ,UAAU;AAAA,MAC5C;AAAA,IACF;AAEA,UAAM,iBAAiB;AAAA,MACrB;AAAA,QACE,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AACA,UAAM,kBAAkB,eAAe,KAAK,OAAO,iBAAiB,cAAc;AAElF,QAAI,KAAK,SAAS;AAChB,cAAQ;AAAA,QACN,iBAAiB,KAAK,UAAU,iBAAiB,SAAS,MAAM,SAAS,KAAK,OAAO,OAAO,EAAE,YAAY,eAAe;AAAA,MAC3H;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,SAAS,MAAM,KAAK,WAAW,iBAAiB;AAAA,MACpD,KAAK,KAAK,OAAO;AAAA,MACjB,KAAK,QAAQ;AAAA,MACb,WAAW,KAAK,OAAO;AAAA,MACvB,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,UAAM,qBAAqB,KAAK,IAAI,IAAI;AAExC,QAAI,OAAO,WAAW,OAAO,YAAY,OAAO,GAAG;AACjD,UAAI,WAAW,OAAO,SAAS;AAC7B,cAAM,IAAI,MAAM,kCAAkC;AAAA,MACpD;AACA,UAAI,OAAO,UAAU;AACnB,cAAM,IAAI;AAAA,UACR,yBAAyBA,qBAAoB,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,SACZ,GAAG,MAAM,eAAe,QAAQ,MAChC,wBAAwB,QAAQ;AACpC,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AAEA,UAAM,kBAAkB,MAAM,KAAK,yBAAyB,cAAc;AAC1E,UAAM,cAAc,KAAK,sBAAsB,eAAe;AAG9D,UAAM,uBAAuB,KAAK,MAAM,qBAAqB,SAAS,MAAM;AAE5E,UAAM,YAAgC,SAAS,IAAI,CAAC,YAAY;AAC9D,YAAM,aAAa,QAAQ;AAC3B,UAAI,CAAC,YAAY;AACf,eAAO;AAAA,UACL,gBAAgB,CAAC;AAAA,UACjB,YAAY;AAAA,UACZ,KAAK;AAAA,YACH,SAAS;AAAA,YACT,QAAQ,OAAO;AAAA,YACf,UAAU,OAAO,YAAY;AAAA,YAC7B,KAAK,KAAK,OAAO;AAAA,YACjB,YAAY;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,YAAY,IAAI,UAAU;AACzC,UAAI,CAAC,QAAQ;AAGX,cAAM,eAAe,4BAA4B,UAAU;AAC3D,YAAI,KAAK,SAAS;AAChB,kBAAQ,KAAK,iBAAiB,KAAK,UAAU,KAAK,YAAY,EAAE;AAAA,QAClE;AACA,eAAO;AAAA,UACL,gBAAgB,CAAC,EAAE,MAAM,aAAa,SAAS,UAAU,YAAY,GAAG,CAAC;AAAA,UACzE,YAAY;AAAA,UACZ,KAAK;AAAA,YACH,SAAS;AAAA,YACT,QAAQ,OAAO;AAAA,YACf,UAAU,OAAO,YAAY;AAAA,YAC7B,KAAK,KAAK,OAAO;AAAA,YACjB,YAAY;AAAA,YACZ,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,gBAAgB,OAAO;AAAA,QACvB,YAAY,OAAO;AAAA,QACnB,SAAS,OAAO;AAAA,QAChB,YAAY,OAAO,cAAc;AAAA,QACjC,KAAK;AAAA,UACH,SAAS;AAAA,UACT,QAAQ,OAAO;AAAA,UACf,UAAU,OAAO,YAAY;AAAA,UAC7B,KAAK,KAAK,OAAO;AAAA,UACjB,YAAY;AAAA,UACZ,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,mBAAmB,SAKzB;AACA,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,OAAO;AAAA,IAC7B,QAAQ;AAEN,aAAO,EAAE,gBAAgB,CAAC,EAAE,MAAM,aAAa,QAAQ,CAAC,EAAE;AAAA,IAC5D;AAGA,UAAM,SAAS,gBAAgB,UAAU,MAAM;AAC/C,QAAI,CAAC,OAAO,SAAS;AAEnB,aAAO,EAAE,gBAAgB,CAAC,EAAE,MAAM,aAAa,QAAQ,CAAC,EAAE;AAAA,IAC5D;AAEA,UAAM,MAAM,OAAO;AAGnB,UAAM,UAAU,gBAAgB,IAAI,UAAU,IAAI,aAAa,gBAAgB;AAG/E,UAAM,iBAAiB,sBAAsB,IAAI,eAAe;AAGhE,QAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,aAAO;AAAA,QACL;AAAA,QACA,YAAY,IAAI;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAGA,QAAI,IAAI,SAAS,QAAW;AAC1B,YAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO,OAAO,IAAI,IAAI;AACtE,aAAO;AAAA,QACL,gBAAgB,CAAC,EAAE,MAAM,aAAa,SAAS,KAAK,CAAC;AAAA,QACrD,YAAY,IAAI;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAGA,WAAO,EAAE,gBAAgB,CAAC,EAAE,MAAM,aAAa,QAAQ,CAAC,EAAE;AAAA,EAC5D;AAAA,EAEQ,sBAAsB,SAQ5B;AACA,UAAM,UAAU,oBAAI,IAQlB;AAEF,UAAM,QAAQ,QACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAEnC,eAAW,QAAQ,OAAO;AACxB,UAAI;AACJ,UAAI;AACF,iBAAS,KAAK,MAAM,IAAI;AAAA,MAC1B,SAAS,OAAO;AACd,cAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACpE,cAAM,IAAI,MAAM,iDAAiD,MAAM,EAAE;AAAA,MAC3E;AAGA,YAAM,SAAS,qBAAqB,UAAU,MAAM;AACpD,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,aAAa,OAAO,MAAM,OAAO,CAAC;AACxC,YAAI,YAAY,KAAK,SAAS,IAAI,GAAG;AACnC,gBAAM,IAAI,MAAM,+DAA+D;AAAA,QACjF;AACA,cAAM,IAAI,MAAM,+CAA+C;AAAA,MACjE;AAEA,YAAM,MAAM,OAAO;AAEnB,UAAI,QAAQ,IAAI,IAAI,EAAE,GAAG;AACvB,cAAM,IAAI,MAAM,2CAA2C,IAAI,EAAE,EAAE;AAAA,MACrE;AAGA,YAAM,iBAAiB,sBAAsB,IAAI,eAAe;AAChE,UAAI;AACJ,UAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,8BAAsB;AAAA,MACxB,OAAO;AAEL,cAAM,OACJ,OAAO,IAAI,SAAS,WAChB,IAAI,OACJ,IAAI,SAAS,SACX,KACA,KAAK,UAAU,IAAI,IAAI;AAC/B,8BAAsB,OAAO,CAAC,EAAE,MAAM,aAAa,SAAS,KAAK,CAAC,IAAI,CAAC;AAAA,MACzE;AAGA,YAAM,UAAU,gBAAgB,IAAI,UAAU,IAAI,aAAa,iBAAiB,IAAI,EAAE,GAAG;AAEzF,cAAQ,IAAI,IAAI,IAAI;AAAA,QAClB,gBAAgB;AAAA,QAChB,YAAY,IAAI;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,YAAY,QAAQ;AAAA,MACtB,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;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,UAAI,CAAC,KAAK,eAAe;AACvB,cAAM,iBAAAC,QAAG,OAAO,QAAQ,EAAE,MAAM,MAAM;AAAA,QAEtC,CAAC;AAAA,MACH;AAAA,IACF;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;AACA,QAAI,KAAK,SAAS;AAChB,cAAQ;AAAA,QACN,iBAAiB,KAAK,UAAU,uBAAuB,YAAY,OAAO,KAAK,OAAO,OAAO,EAAE,YAAY,eAAe;AAAA,MAC5H;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,aAAaC,qBAAoB,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,SAASA,qBACP,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,mBAAAC,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,mBAAAA,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,YAAqB,YAAY,SAAiB;AAChF,QAAM,aAAa,cAAc;AACjC,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AACxD,SAAO,mBAAAA,QAAK,KAAK,gBAAAC,QAAG,OAAO,GAAG,UAAU,UAAU,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,EAAE;AACzF;AAEA,SAASJ,qBAAoB,WAAuC;AAClE,MAAI,CAAC,aAAa,aAAa,GAAG;AAChC,WAAO;AAAA,EACT;AACA,QAAM,UAAU,KAAK,KAAK,YAAY,GAAI;AAC1C,SAAO,UAAU,OAAO;AAC1B;;;AC9uBA,IAAAK,6BAA4C;AAC5C,IAAAC,sBAA2B;AAC3B,IAAAC,kBAA6C;AAE7C,IAAAC,oBAAsD;AACtD,IAAAC,kBAAuB;AACvB,IAAAC,qBAAiB;AACjB,IAAAC,oBAA0B;;;ACA1B,IAAMC,mBAAkB,OAAO,IAAI,kBAAkB;AACrD,IAAMC,0BAAyB,OAAO,IAAI,4BAA4B;AAStE,SAAS,mBAAoC;AAC3C,QAAM,eAAe;AACrB,QAAM,WAAW,aAAaD,gBAAe;AAC7C,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,QAAM,UAA2B,CAAC;AAClC,eAAaA,gBAAe,IAAI;AAChC,SAAO;AACT;AAEA,SAASE,sBAA4C;AACnD,QAAM,eAAe;AACrB,QAAM,WAAW,aAAaD,uBAAsB;AACpD,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,QAAM,UAAU,oBAAI,IAAsB;AAC1C,eAAaA,uBAAsB,IAAI;AACvC,SAAO;AACT;AAEA,SAASE,mBAAkB,OAA4B;AACrD,QAAM,cAAc,MAAM,KAAKD,oBAAmB,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,EAAAC,mBAAkB,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,QAAQD,oBAAmB;AACjC,QAAM,IAAI,QAAQ;AAClB,SAAO,MAAM;AACX,UAAM,OAAO,QAAQ;AAAA,EACvB;AACF;;;ADzDA,IAAME,iBAAY,6BAAU,2BAAAC,IAAY;AACxC,IAAMC,oBAAmB;AACzB,IAAMC,mBAAkB;AACxB,IAAM,4BAA4B;AAMlC,IAAMC,yBAAwB;AAAA;AAAA;AAAA;AAAA;AA2BvB,IAAM,gBAAN,MAAwC;AAAA,EACpC;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,gBAAgB;AAAA,EAER;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EAER,YACE,YACA,QACA,SAAsB,oBACtB;AACA,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,aAAa,oBAAoB,QAAQ,UAAU;AAEzD,UAAM,gBAAgB,MAAM,KAAK,gBAAgB;AACjD,UAAM,SAAS,MAAM,KAAK,mBAAmB,OAAO,EAAE,MAAM,MAAM,MAAS;AAC3E,QAAI;AACF,YAAM,aAAa,oBAAoB,SAAS,UAAU;AAC1D,YAAM,eAAe,KAAK,OAAO,gBAAgBA;AACjD,YAAM,gBAAgB,GAAG,YAAY;AAAA;AAAA,EAAO,UAAU;AACtD,YAAM,aAAa,mBAAAC,QAAK,KAAK,eAAeF,gBAAe;AAC3D,gBAAM,6BAAU,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,sBAAsBG,qBAAoB,KAAK,OAAO,aAAa,MAAS,CAAC;AAAA,QAC/E;AAAA,MACF;AAEA,UAAI,OAAO,aAAa,GAAG;AACzB,cAAM,SAASC,YAAW,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,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,QACA,gBAAgB,CAAC,EAAE,MAAM,aAAsB,SAAS,cAAc,CAAC;AAAA,MACzE;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,mBAAAF,QAAK,QAAQ,KAAK,OAAO,GAAG;AAAA,EACrC;AAAA,EAEQ,iBAA2B;AAEjC,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,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,2BAAQ,mBAAAA,QAAK,SAAK,wBAAO,GAAGH,iBAAgB,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAc,iBAAiB,eAAsC;AACnE,QAAI;AACF,gBAAM,sBAAG,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,mBAAAG,QAAK,QAAQ,KAAK,OAAO,MAAM;AAAA,IACxC;AACA,WAAO,mBAAAA,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,QAAQ,OAAO;AAAA,EAC5D;AAAA,EAEA,MAAc,mBACZ,SACwC;AACxC,UAAM,SAAS,KAAK,oBAAoB;AACxC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,QAAI;AACF,gBAAM,yBAAM,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,QAAQG,kBAAiB,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,SAAS,mBAAmB,OAAO,IAAI,sBAAsB,SAAS,MAAM;AAC9F,WAAO,KAAKC,eAAc,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,SAASD,kBAAiB,SAA0B,YAA4B;AAC9E,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,SAASE,qBAAoB,QAAQ,cAAc,OAAO;AAChE,QAAM,gBAAgB,QAAQ,YAAY,SAAY,YAAY,QAAQ,UAAU,CAAC,KAAK;AAC1F,QAAM,SAASA,qBAAoB,UAAU;AAC7C,SAAO,GAAG,SAAS,IAAI,MAAM,IAAI,MAAM,GAAG,aAAa,QAAI,gCAAW,EAAE,MAAM,GAAG,CAAC,CAAC;AACrF;AAEA,SAASA,qBAAoB,OAAuB;AAClD,QAAM,YAAY,MAAM,QAAQ,qBAAqB,GAAG;AACxD,SAAO,UAAU,SAAS,IAAI,YAAY;AAC5C;AAEA,SAASD,eAAc,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,SAASE,mBAAkB,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,SAASA,mBAAkB,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,UACF,iBAAiB,KAAK,KACtB,gBAAgB,OAAO,IAAI,KAC3B,eAAe,OAAO,UAAU,OAAO,OAAO;AAChD,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,SAASA,mBAAkB,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,mBAAAN,QAAK,WAAW,SAAS,IAAI,YAAY,mBAAAA,QAAK,QAAQ,SAAS;AAChF,UAAM,iBAAiB,MAAM,+BAA+B,QAAQ;AACpE,cAAM,0BAAO,gBAAgB,0BAAU,IAAI;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,aAAa,UAAU,UAAU;AACzD,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAML,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,0BAAO,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,0BAAO,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,SAASO,YAAW,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,SAASD,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;;;AEh0BA,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,gBAAgB,CAAC,EAAE,MAAM,aAAsB,SAAS,KAAK,eAAe,CAAC;AAAA,MAC7E,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;;;AC9BA,IAAI,gBAAgE;AACpE,IAAI,aAA0D;AAE9D,eAAe,gBAKZ;AACD,MAAI,CAAC,iBAAiB,CAAC,YAAY;AACjC,QAAI;AACF,OAAC,eAAe,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC9C,OAAO,wBAAwB;AAAA,QAC/B,OAAO,qBAAqB;AAAA,MAC9B,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR;AAAA;AAAA;AAAA,kBAA+I,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACvM;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO,cAAc;AAAA,IACrB,mBAAmB,cAAc;AAAA,IACjC,UAAU,WAAW;AAAA,IACrB,cAAc,WAAW;AAAA,EAC3B;AACF;AASO,IAAM,qBAAN,MAA6C;AAAA,EACzC;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,gBAAgB;AAAA,EAER;AAAA,EAEjB,YAAY,YAAoB,QAAkC;AAChE,SAAK,KAAK,gBAAgB,UAAU;AACpC,SAAK,aAAa;AAClB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,OAAO,SAAqD;AAChE,QAAI,QAAQ,QAAQ,SAAS;AAC3B,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAGA,UAAM,EAAE,OAAO,mBAAmB,UAAU,aAAa,IAAI,MAAM,cAAc;AAEjF,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,eAAe,KAAK,OAAO,YAAY;AAC7C,UAAM,UAAU,KAAK,OAAO,SAAS;AAIrC,UAAM,QAAS,SAAiB,cAAc,OAAO;AAGrD,UAAM,eAAe,KAAK,OAAO,gBAAgB;AAGjD,UAAM,YAAY,IAAI,kBAAkB;AAAA,MACtC,WAAW,OAAO,aAAa;AAE7B,eAAO,KAAK,OAAO,UAAU,aAAa,QAAsB,KAAK;AAAA,MACvE;AAAA,IACF,CAAC;AAED,UAAM,QAAQ,IAAI,MAAM;AAAA,MACtB,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,QACA,OAAO,CAAC;AAAA;AAAA,QACR,UAAU,CAAC;AAAA,MACb;AAAA,MACA;AAAA,IACF,CAAC;AAGD,UAAM,iBAAkC,CAAC;AACzC,QAAI,wBAAwB;AAG5B,UAAM,cAAc,MAAM,UAAU,CAAC,UAAU;AAC7C,UAAI,MAAM,SAAS,eAAe;AAChC,cAAM,MAAM,MAAM;AAClB,YAAI,IAAI,SAAS,aAAa;AAC5B,gBAAM,UAAUM,oBAAmB,IAAI,OAAO;AAC9C,cAAI,SAAS;AACX,oCAAwB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI;AAEF,YAAM,YAAY,KAAK,OAAO,aAAa;AAC3C,YAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD;AAAA,UACE,MAAM,OAAO,IAAI,MAAM,gCAAgC,SAAS,IAAI,CAAC;AAAA,UACrE;AAAA,QACF;AAAA,MACF,CAAC;AAGD,YAAM,QAAQ,KAAK,CAAC,MAAM,OAAO,QAAQ,QAAQ,GAAG,cAAc,CAAC;AAGnE,YAAM,MAAM,YAAY;AAGxB,YAAM,gBAAgB,MAAM,MAAM;AAClC,iBAAW,OAAO,eAAe;AAC/B,uBAAe,KAAK,oBAAoB,GAAG,CAAC;AAAA,MAC9C;AAEA,YAAM,aAAa,KAAK,IAAI,IAAI;AAEhC,aAAO;AAAA,QACL,KAAK;AAAA,UACH,UAAU;AAAA,UACV;AAAA,UACA,OAAO,KAAK,OAAO;AAAA,UACnB,UAAU,KAAK,OAAO;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,UAAE;AACA,kBAAY;AAAA,IACd;AAAA,EACF;AACF;AAKA,SAASA,oBAAmB,SAAsC;AAChE,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,YAAsB,CAAC;AAC7B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC;AAAA,IACF;AACA,UAAM,IAAI;AACV,QAAI,EAAE,SAAS,UAAU,OAAO,EAAE,SAAS,UAAU;AACnD,gBAAU,KAAK,EAAE,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,SAAO,UAAU,SAAS,IAAI,UAAU,KAAK,IAAI,IAAI;AACvD;AAKA,SAAS,oBAAoB,SAAiC;AAC5D,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,WAAO,EAAE,MAAM,WAAW,SAAS,OAAO,OAAO,EAAE;AAAA,EACrD;AAEA,QAAM,MAAM;AACZ,QAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AACvD,QAAM,UAAUA,oBAAmB,IAAI,OAAO;AAC9C,QAAM,YAAYC,kBAAiB,IAAI,OAAO;AAC9C,QAAM,YACJ,OAAO,IAAI,cAAc,WACrB,IAAI,KAAK,IAAI,SAAS,EAAE,YAAY,IACpC,OAAO,IAAI,cAAc,WACvB,IAAI,YACJ;AAER,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,UAAU,SAAS,IAAI,YAAY;AAAA,IAC9C;AAAA,EACF;AACF;AAKA,SAASA,kBAAiB,SAAuC;AAC/D,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,YAAwB,CAAC;AAC/B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC;AAAA,IACF;AACA,UAAM,IAAI;AACV,QAAI,EAAE,SAAS,cAAc,OAAO,EAAE,SAAS,UAAU;AACvD,gBAAU,KAAK;AAAA,QACb,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,QACT,IAAI,OAAO,EAAE,OAAO,WAAW,EAAE,KAAK;AAAA,MACxC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;ACjPA,IAAAC,6BAAsB;AACtB,IAAAC,sBAA2B;AAC3B,IAAAC,kBAAkC;AAElC,IAAAC,oBAA8C;AAC9C,IAAAC,kBAAuB;AACvB,IAAAC,qBAAiB;;;ACCjB,IAAMC,mBAAkB,OAAO,IAAI,eAAe;AAClD,IAAMC,0BAAyB,OAAO,IAAI,yBAAyB;AASnE,SAAS,gBAA8B;AACrC,QAAM,eAAe;AACrB,QAAM,WAAW,aAAaD,gBAAe;AAC7C,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,QAAM,UAAwB,CAAC;AAC/B,eAAaA,gBAAe,IAAI;AAChC,SAAO;AACT;AAEA,SAASE,sBAAyC;AAChD,QAAM,eAAe;AACrB,QAAM,WAAW,aAAaD,uBAAsB;AACpD,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,QAAM,UAAU,oBAAI,IAAmB;AACvC,eAAaA,uBAAsB,IAAI;AACvC,SAAO;AACT;AAEA,SAASE,mBAAkB,OAAyB;AAClD,QAAM,cAAc,MAAM,KAAKD,oBAAmB,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,6BAA6B,OAAO,EAAE;AAAA,IACrD;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,OAAyB;AACxD,gBAAc,EAAE,KAAK,KAAK;AAC1B,EAAAC,mBAAkB,KAAK;AACzB;AAEO,SAAS,sBAAoC;AAClD,QAAM,QAAQ,cAAc;AAC5B,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,CAAC;AAAA,EACV;AACA,SAAO,MAAM,OAAO,GAAG,MAAM,MAAM;AACrC;AAEO,SAAS,wBAAwB,UAAqC;AAC3E,QAAM,QAAQD,oBAAmB;AACjC,QAAM,IAAI,QAAQ;AAClB,SAAO,MAAM;AACX,UAAM,OAAO,QAAQ;AAAA,EACvB;AACF;;;ADpDA,IAAME,oBAAmB;AACzB,IAAMC,mBAAkB;AAMxB,IAAMC,yBAAwB;AAAA;AAAA;AAAA;AAAA;AA0BvB,IAAM,wBAAN,MAAgD;AAAA,EAC5C;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,gBAAgB;AAAA,EAER;AAAA,EACA;AAAA,EAEjB,YACE,YACA,QACA,SAAmB,iBACnB;AACA,SAAK,KAAK,mBAAmB,UAAU;AACvC,SAAK,aAAa;AAClB,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,MAAM,OAAO,SAAqD;AAChE,QAAI,QAAQ,QAAQ,SAAS;AAC3B,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAEA,UAAM,aAAa,oBAAoB,QAAQ,UAAU;AAEzD,UAAM,gBAAgB,MAAM,KAAK,gBAAgB;AACjD,UAAM,SAAS,MAAM,KAAK,mBAAmB,OAAO,EAAE,MAAM,MAAM,MAAS;AAC3E,QAAI;AAEF,YAAM,aAAa,mBAAAC,QAAK,KAAK,eAAeF,gBAAe;AAC3D,gBAAM,6BAAU,YAAY,QAAQ,UAAU,MAAM;AAEpD,YAAM,OAAO,KAAK,YAAY,QAAQ,UAAU,UAAU;AAC1D,YAAM,MAAM,KAAK,WAAW,aAAa;AAEzC,YAAM,SAAS,MAAM,KAAK,UAAU,MAAM,KAAK,QAAQ,QAAQ,MAAM;AAErE,UAAI,OAAO,UAAU;AACnB,cAAM,IAAI;AAAA,UACR,4BAA4BG,qBAAoB,KAAK,OAAO,aAAa,MAAS,CAAC;AAAA,QACrF;AAAA,MACF;AAEA,UAAI,OAAO,aAAa,GAAG;AACzB,cAAM,SAASC,YAAW,OAAO,QAAQ,OAAO,MAAM;AACtD,cAAM,SAAS,oCAAoC,OAAO,QAAQ;AAClE,cAAM,IAAI,MAAM,SAAS,GAAG,MAAM,KAAK,MAAM,KAAK,MAAM;AAAA,MAC1D;AAEA,YAAM,SAAS,aAAa,OAAO,MAAM;AACzC,YAAM,iBAAiBC,uBAAsB,MAAM;AACnD,YAAM,gBAAgBC,sBAAqB,cAAc;AAEzD,aAAO;AAAA,QACL,KAAK;AAAA,UACH,UAAU;AAAA,UACV,QAAQ,OAAO;AAAA,UACf,QAAQ,OAAO;AAAA,UACf,UAAU,OAAO;AAAA,UACjB;AAAA,UACA,YAAY,KAAK,OAAO;AAAA,UACxB;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA,SAAS,QAAQ;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AAAA,IACF,UAAE;AACA,YAAM,QAAQ,MAAM;AACpB,YAAM,KAAK,iBAAiB,aAAa;AAAA,IAC3C;AAAA,EACF;AAAA,EAEQ,WAAW,eAA+B;AAChD,QAAI,CAAC,KAAK,OAAO,KAAK;AACpB,aAAO;AAAA,IACT;AACA,WAAO,mBAAAJ,QAAK,QAAQ,KAAK,OAAO,GAAG;AAAA,EACrC;AAAA,EAEQ,YAAY,QAAgB,YAAqD;AACvF,UAAM,OAAiB,CAAC;AAGxB,QAAI,KAAK,OAAO,UAAU;AACxB,WAAK,KAAK,cAAc,KAAK,OAAO,QAAQ;AAAA,IAC9C;AACA,QAAI,KAAK,OAAO,OAAO;AACrB,WAAK,KAAK,WAAW,KAAK,OAAO,KAAK;AAAA,IACxC;AACA,QAAI,KAAK,OAAO,QAAQ;AACtB,WAAK,KAAK,aAAa,KAAK,OAAO,MAAM;AAAA,IAC3C;AAGA,SAAK,KAAK,UAAU,MAAM;AAG1B,SAAK,KAAK,SAAS;AAGnB,SAAK,KAAK,cAAc;AAGxB,QAAI,KAAK,OAAO,OAAO;AACrB,WAAK,KAAK,WAAW,KAAK,OAAO,KAAK;AAAA,IACxC;AAGA,QAAI,KAAK,OAAO,UAAU;AACxB,WAAK,KAAK,cAAc,KAAK,OAAO,QAAQ;AAAA,IAC9C;AAGA,QAAI,KAAK,OAAO,QAAQ,KAAK,OAAO,KAAK,SAAS,GAAG;AACnD,WAAK,KAAK,GAAG,KAAK,OAAO,IAAI;AAAA,IAC/B;AAGA,QAAI,cAAc,WAAW,SAAS,GAAG;AACvC,iBAAW,QAAQ,YAAY;AAC7B,aAAK,KAAK,IAAI,IAAI,EAAE;AAAA,MACtB;AAAA,IACF;AAGA,UAAM,eAAe,KAAK,OAAO,gBAAgBD;AACjD,UAAM,aAAa,GAAG,YAAY;AAAA;AAAA,EAAO,MAAM;AAI/C,UAAM,gBAAgB,gBAAgB,UAAU;AAGhD,SAAK,KAAK,aAAa;AAEvB,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,UACZ,MACA,KACA,QACA,QACsB;AACtB,QAAI;AACF,aAAO,MAAM,KAAK,MAAM;AAAA,QACtB,YAAY,KAAK,OAAO;AAAA,QACxB;AAAA,QACA;AAAA,QACA,WAAW,KAAK,OAAO;AAAA,QACvB,KAAK,KAAK,SAAS;AAAA,QACnB;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,+BAA+B,KAAK,OAAO,UAAU;AAAA,QACvD;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,WAA8B;AACpC,UAAM,MAAM,EAAE,GAAG,QAAQ,IAAI;AAG7B,QAAI,KAAK,OAAO,QAAQ;AACtB,YAAM,WAAW,KAAK,OAAO,UAAU,YAAY,KAAK;AACxD,cAAQ,UAAU;AAAA,QAChB,KAAK;AAAA,QACL,KAAK;AACH,cAAI,iBAAiB,KAAK,OAAO;AACjC;AAAA,QACF,KAAK;AACH,cAAI,oBAAoB,KAAK,OAAO;AACpC;AAAA,QACF,KAAK;AACH,cAAI,iBAAiB,KAAK,OAAO;AACjC;AAAA,QACF,KAAK;AACH,cAAI,eAAe,KAAK,OAAO;AAC/B;AAAA,QACF,KAAK;AACH,cAAI,cAAc,KAAK,OAAO;AAC9B;AAAA,QACF,KAAK;AACH,cAAI,qBAAqB,KAAK,OAAO;AACrC;AAAA,MACJ;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,kBAAmC;AAC/C,WAAO,UAAM,2BAAQ,mBAAAC,QAAK,SAAK,wBAAO,GAAGH,iBAAgB,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAc,iBAAiB,eAAsC;AACnE,QAAI;AACF,gBAAM,sBAAG,eAAe,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAC1D,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,sBAA0C;AAChD,QAAI,KAAK,OAAO,QAAQ;AACtB,aAAO,mBAAAG,QAAK,QAAQ,KAAK,OAAO,MAAM;AAAA,IACxC;AACA,WAAO,mBAAAA,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,QAAQ,iBAAiB;AAAA,EACtE;AAAA,EAEA,MAAc,mBAAmB,SAA+D;AAC9F,UAAM,SAAS,KAAK,oBAAoB;AACxC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,QAAI;AACF,gBAAM,yBAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,IACzC,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,KAAK,gDAAgD,MAAM,MAAM,OAAO,EAAE;AAClF,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,mBAAAA,QAAK,KAAK,QAAQK,kBAAiB,SAAS,KAAK,UAAU,CAAC;AAE7E,QAAI;AACF,YAAM,SAAS,MAAM,eAAe,OAAO;AAAA,QACzC;AAAA,QACA,YAAY,KAAK;AAAA,QACjB,YAAY,QAAQ;AAAA,QACpB,SAAS,QAAQ;AAAA,QACjB,QAAQ,KAAK,OAAO,aAAa;AAAA,MACnC,CAAC;AACD,uBAAiB;AAAA,QACf;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,kCAAkC,QAAQ,KAAK,OAAO,EAAE;AACrE,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAM,iBAAN,MAAM,gBAAe;AAAA,EACV;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,SAMQ;AAC1B,UAAM,SAAS,IAAI,gBAAe,QAAQ,UAAU,QAAQ,MAAM;AAClE,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,SAAS,gBAAgB,OAAO,IAAI,mBAAmB,SAAS,MAAM;AACxF,WAAO,KAAKC,eAAc,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,SAASD,kBAAiB,SAA0B,YAA4B;AAC9E,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,SAASE,qBAAoB,QAAQ,cAAc,IAAI;AAC7D,QAAM,gBAAgB,QAAQ,YAAY,SAAY,YAAY,QAAQ,UAAU,CAAC,KAAK;AAC1F,QAAM,SAASA,qBAAoB,UAAU;AAC7C,SAAO,GAAG,SAAS,IAAI,MAAM,IAAI,MAAM,GAAG,aAAa,QAAI,gCAAW,EAAE,MAAM,GAAG,CAAC,CAAC;AACrF;AAEA,SAASA,qBAAoB,OAAuB;AAClD,QAAM,YAAY,MAAM,QAAQ,qBAAqB,GAAG;AACxD,SAAO,UAAU,SAAS,IAAI,YAAY;AAC5C;AAEA,SAASD,eAAc,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,mBAAmB,SAAiB,QAAqC;AAChF,QAAM,SAASE,mBAAkB,OAAO;AACxC,MAAI,QAAQ;AACV,UAAM,UAAU,iBAAiB,MAAM;AACvC,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,WAAW,UAAU;AACvB,WAAO,WAAW,OAAO;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAAyB;AAChD,QAAM,SAASA,mBAAkB,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,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;AAE7D,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAGA,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK,eAAe;AAClB,YAAM,UAAU,OAAO;AACvB,YAAM,OAAO,SAAS;AACtB,aAAO,GAAG,IAAI,KAAK,IAAI;AAAA,IACzB;AAAA,IACA,KAAK,kBAAkB;AACrB,YAAMC,SAAQ,OAAO;AACrB,YAAM,YAAYA,QAAO;AACzB,UAAI,cAAc,cAAc;AAC9B,cAAM,QAAQA,QAAO;AACrB,YAAI,OAAO,UAAU,UAAU;AAC7B,gBAAM,UAAU,MAAM,SAAS,KAAK,GAAG,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ;AACjE,iBAAO,eAAe,OAAO;AAAA,QAC/B;AAAA,MACF;AACA,aAAO,mBAAmB,SAAS;AAAA,IACrC;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAASD,mBAAkB,SAAsC;AAC/D,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,SAAS,aAAa,QAA2B;AAC/C,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAEA,QAAM,QAAQ,QACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAEnC,QAAM,SAAoB,CAAC;AAC3B,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,aAAO,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,IAC9B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,SAAO;AACT;AAMA,SAASL,uBAAsB,QAA6C;AAE1E,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,UAAM,QAAQ,OAAO,CAAC;AACtB,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC;AAAA,IACF;AACA,UAAM,SAAS;AACf,QAAI,OAAO,SAAS,aAAa;AAC/B;AAAA,IACF;AAEA,UAAM,WAAW,OAAO;AACxB,QAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC5B;AAAA,IACF;AAEA,WAAO,SAAS,IAAI,gBAAgB,EAAE,OAAO,CAAC,MAA0B,MAAM,MAAS;AAAA,EACzF;AAGA,QAAM,iBAAkC,CAAC;AACzC,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC;AAAA,IACF;AACA,UAAM,SAAS;AACf,QAAI,OAAO,SAAS,YAAY;AAC9B,YAAM,UAAU,OAAO;AACvB,YAAM,YAAY,iBAAiB,OAAO;AAC1C,UAAI,WAAW;AACb,uBAAe,KAAK,SAAS;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,iBAAiB,SAA6C;AACrE,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,MAAM;AACZ,QAAM,OAAO,IAAI;AACjB,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AAGA,QAAM,UAAUO,oBAAmB,IAAI,OAAO;AAG9C,QAAM,YAAYC,kBAAiB,IAAI,OAAO;AAG9C,QAAM,YACJ,OAAO,IAAI,cAAc,WACrB,IAAI,KAAK,IAAI,SAAS,EAAE,YAAY,IACpC,OAAO,IAAI,cAAc,WACvB,IAAI,YACJ;AAGR,QAAM,WAAoC,CAAC;AAC3C,MAAI,IAAI,IAAK,UAAS,MAAM,IAAI;AAChC,MAAI,IAAI,SAAU,UAAS,WAAW,IAAI;AAC1C,MAAI,IAAI,MAAO,UAAS,QAAQ,IAAI;AACpC,MAAI,IAAI,MAAO,UAAS,QAAQ,IAAI;AACpC,MAAI,IAAI,WAAY,UAAS,aAAa,IAAI;AAE9C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,UAAU,SAAS,IAAI,YAAY;AAAA,IAC9C;AAAA,IACA,UAAU,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,WAAW;AAAA,EAC1D;AACF;AAMA,SAASD,oBAAmB,SAAsC;AAChE,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,YAAsB,CAAC;AAC7B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC;AAAA,IACF;AACA,UAAM,IAAI;AACV,QAAI,EAAE,SAAS,UAAU,OAAO,EAAE,SAAS,UAAU;AACnD,gBAAU,KAAK,EAAE,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,SAAO,UAAU,SAAS,IAAI,UAAU,KAAK,IAAI,IAAI;AACvD;AAMA,SAASC,kBAAiB,SAAuC;AAC/D,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,YAAwB,CAAC;AAC/B,aAAW,QAAQ,SAAS;AAC1B,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC;AAAA,IACF;AACA,UAAM,IAAI;AACV,QAAI,EAAE,SAAS,cAAc,OAAO,EAAE,SAAS,UAAU;AACvD,gBAAU,KAAK;AAAA,QACb,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,QACT,IAAI,OAAO,EAAE,OAAO,WAAW,EAAE,KAAK;AAAA,MACxC,CAAC;AAAA,IACH;AAEA,QAAI,EAAE,SAAS,iBAAiB,OAAO,EAAE,gBAAgB,UAAU;AAEjE,YAAM,WAAW,UAAU,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE,WAAW;AAC/D,UAAI,UAAU;AAEZ,cAAM,MAAM,UAAU,QAAQ,QAAQ;AACtC,kBAAU,GAAG,IAAI;AAAA,UACf,GAAG;AAAA,UACH,QAAQ,EAAE;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAASP,sBAAqB,UAA4C;AACxE,WAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,IAAI,SAAS,eAAe,IAAI,SAAS;AAC3C,UAAI,OAAO,IAAI,YAAY,UAAU;AACnC,eAAO,IAAI;AAAA,MACb;AACA,aAAO,KAAK,UAAU,IAAI,OAAO;AAAA,IACnC;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,gBAAgB,QAAwB;AAG/C,SAAO,OAAO,QAAQ,mBAAmB,SAAS;AACpD;AAEA,SAASF,YAAW,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,SAASD,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,gBAAgB,SAA6C;AAC1E,SAAO,MAAM,IAAI,QAAqB,CAAC,SAAS,WAAW;AAEzD,UAAM,QAAQ,QAAQ,WAAW,MAAM,KAAK;AAC5C,UAAM,aAAa,MAAM,CAAC;AAC1B,UAAM,iBAAiB,MAAM,MAAM,CAAC;AACpC,UAAM,UAAU,CAAC,GAAG,gBAAgB,GAAG,QAAQ,IAAI;AAEnD,UAAM,YAAQ,kCAAM,YAAY,SAAS;AAAA,MACvC,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,MACb,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,OAAO;AAAA,IACT,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;AAGD,UAAM,MAAM,IAAI;AAEhB,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;;;AEh0BA,IAAAW,qBAAiB;AACjB,IAAAC,cAAkB;AAqBX,IAAM,gCAAgC,cAAE,OAAO;AAAA,EACpD,MAAM,cAAE,QAAQ,MAAM;AAAA,EACtB,KAAK,cAAE,OAAO,EAAE,IAAI,GAAG,6BAA6B;AAAA,EACpD,iBAAiB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,gBAAgB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AACjD,CAAC;AAmBM,IAAM,mCAAmC,cAAE,OAAO;AAAA,EACvD,MAAM,cAAE,QAAQ,SAAS;AAAA,EACzB,kBAAkB,cAAE,OAAO,EAAE,SAAS;AAAA,EACtC,iBAAiB,cAAE,OAAO,EAAE,SAAS;AAAA,EACrC,KAAK,cAAE,OAAO,EAAE,SAAS;AAAA,EACzB,iBAAiB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,gBAAgB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AACjD,CAAC;AASM,IAAM,4BAA4B,cAAE,mBAAmB,QAAQ;AAAA,EACpE;AAAA,EACA;AACF,CAAC;AAuBM,IAAM,uBAAuB,cACjC,OAAO;AAAA,EACN,MAAM,cAAE,OAAO,EAAE,IAAI,GAAG,yBAAyB;AAAA,EACjD,UAAU,cACP,OAAO,EACP,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,OAAO,EAAE,SAAS,yBAAyB,CAAC;AAAA;AAAA,EAGjF,kBAAkB,cAAE,OAAO,EAAE,SAAS;AAAA,EACtC,iBAAiB,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAGrC,cAAc,cAAE,OAAO,EAAE,SAAS;AAAA,EAClC,aAAa,cAAE,OAAO,EAAE,SAAS;AAAA,EACjC,oBAAoB,cAAE,OAAO,EAAE,SAAS;AAAA,EACxC,mBAAmB,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAGvC,KAAK,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAGzB,iBAAiB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,gBAAgB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA;AAAA,EAG/C,aAAa,0BAA0B,SAAS;AAAA;AAAA,EAGhD,SAAS,cAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,aAAa,cAAE,QAAQ,EAAE,SAAS;AAAA,EAClC,YAAY,cAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAGjC,iBAAiB,cAAE,QAAQ,EAAE,SAAS;AAAA,EACtC,eAAe,cAAE,QAAQ,EAAE,SAAS;AAAA,EACpC,mBAAmB,cAAE,QAAQ,EAAE,SAAS;AAAA,EACxC,iBAAiB,cAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAGtC,cAAc,cAAE,OAAO,EAAE,SAAS;AAAA,EAClC,SAAS,cAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC1C,mBAAmB,cAAE,QAAQ,EAAE,SAAS;AAAA,EACxC,kBAAkB,cAAE,QAAQ,EAAE,SAAS;AACzC,CAAC,EACA,OAAO,CAAC,SAAS,KAAK,qBAAqB,UAAa,KAAK,oBAAoB,QAAW;AAAA,EAC3F,SAAS;AACX,CAAC;AAOH,IAAM,2BAA2B,cAC9B,OAAO;AAAA,EACN,MAAM,cAAE,QAAQ,MAAM;AAAA,EACtB,KAAK,cAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACrB,WAAW,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAC5C,CAAC,EACA,OAAO;AAOV,IAAM,8BAA8B,cACjC,OAAO;AAAA,EACN,MAAM,cAAE,QAAQ,SAAS;AAAA,EACzB,iBAAiB,cAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACjC,KAAK,cAAE,OAAO,EAAE,SAAS;AAAA,EACzB,WAAW,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAC5C,CAAC,EACA,OAAO;AAUH,IAAM,uBAAuB,cAAE,mBAAmB,QAAQ;AAAA,EAC/D;AAAA,EACA;AACF,CAAC;AAoBM,IAAM,wBAAwB,cAClC,OAAO;AAAA,EACN,iBAAiB,cAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACjC,aAAa,cAAE,OAAO,EAAE,SAAS;AAAA,EACjC,KAAK,cAAE,OAAO,EAAE,SAAS;AAAA,EACzB,WAAW,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,aAAa,qBAAqB,SAAS;AAAA,EAC3C,SAAS,cAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,eAAe,cAAE,QAAQ,EAAE,SAAS;AACtC,CAAC,EACA,OAAO;AAyBH,SAAS,wBACd,OACA,KACA,YACA,cAC0B;AAC1B,QAAM,iBAAiB,MAAM,mBAAmB,MAAM;AACtD,QAAM,YAAY,mBAAmB,SAAY,KAAK,MAAM,iBAAiB,GAAI,IAAI;AAErF,MAAI,MAAM,SAAS,QAAQ;AACzB,UAAM,MAAM,cAAc,MAAM,KAAK,KAAK,GAAG,UAAU,kBAAkB;AACzE,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,wBAAwB,MAAM,oBAAoB,MAAM;AAC9D,MAAI,0BAA0B,QAAW;AACvC,UAAM,IAAI;AAAA,MACR,GAAG,UAAU;AAAA,IACf;AAAA,EACF;AACA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,GAAG,UAAU;AAAA,IACb;AAAA,EACF;AAEA,MAAI,MAAM,sBAAsB,MAAM,KAAK,KAAK,GAAG,UAAU,oBAAoB;AAAA,IAC/E,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AAGD,MAAI,OAAO,gBAAgB,CAAC,mBAAAC,QAAK,WAAW,GAAG,GAAG;AAChD,UAAM,mBAAAA,QAAK,QAAQ,mBAAAA,QAAK,QAAQ,mBAAAA,QAAK,QAAQ,YAAY,CAAC,GAAG,GAAG;AAAA,EAClE;AAEA,MAAI,CAAC,OAAO,cAAc;AACxB,UAAM,mBAAAA,QAAK,QAAQ,mBAAAA,QAAK,QAAQ,YAAY,CAAC;AAAA,EAC/C;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAcO,SAAS,wBACd,OACA,KACA,cACqB;AACrB,QAAM,aAAa,MAAM;AAGzB,QAAM,wBAAwB,MAAM,oBAAoB,MAAM;AAC9D,MAAI,0BAA0B,QAAW;AACvC,UAAM,IAAI,MAAM,GAAG,UAAU,0DAA0D;AAAA,EACzF;AACA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,GAAG,UAAU;AAAA,IACb;AAAA,EACF;AAGA,QAAM,oBACJ,MAAM,gBAAgB,MAAM,eAAe,MAAM,sBAAsB,MAAM;AAC/E,QAAM,cAAc,6BAA6B,iBAAiB;AAGlE,MAAI,MAAM,sBAAsB,MAAM,KAAK,KAAK,GAAG,UAAU,sBAAsB;AAAA,IACjF,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AAGD,MAAI,OAAO,gBAAgB,CAAC,mBAAAA,QAAK,WAAW,GAAG,GAAG;AAChD,UAAM,mBAAAA,QAAK,QAAQ,mBAAAA,QAAK,QAAQ,mBAAAA,QAAK,QAAQ,YAAY,CAAC,GAAG,GAAG;AAAA,EAClE;AAEA,MAAI,CAAC,OAAO,cAAc;AACxB,UAAM,mBAAAA,QAAK,QAAQ,mBAAAA,QAAK,QAAQ,YAAY,CAAC;AAAA,EAC/C;AAGA,QAAM,iBAAiB,MAAM,mBAAmB,MAAM;AACtD,QAAM,YAAY,mBAAmB,SAAY,KAAK,MAAM,iBAAiB,GAAI,IAAI;AAGrF,QAAM,UAAU,uBAAuB,MAAM,WAAW,MAAM,eAAe,MAAM,UAAU;AAG7F,QAAM,gBAAgB;AAAA,IACpB,MAAM,mBACJ,MAAM,iBACN,MAAM,qBACN,MAAM;AAAA,EACV;AAGA,QAAM,cAAc,MAAM,cACtB,wBAAwB,MAAM,aAAa,KAAK,YAAY,YAAY,IACxE;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAUO,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAoMD,IAAM,qBAAqB,cACxB,OAAO;AAAA,EACN,MAAM,cAAE,OAAO,EAAE,IAAI,GAAG,yBAAyB;AAAA,EACjD,UAAU,cAAE,OAAO,EAAE,IAAI,GAAG,sBAAsB;AAAA,EAClD,cAAc,cAAE,OAAO,EAAE,SAAS;AAAA,EAClC,SAAS,cAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAC5C,CAAC,EACA,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,KACzB,cACgB;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;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,2BAA2B,QAAQ,GAAG;AAAA,MAChD;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,wBAAwB,QAAQ,GAAG;AAAA,MAC7C;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,wBAAwB,QAAQ,GAAG;AAAA,MAC7C;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,KAAK,YAAY;AAAA,MACpD;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,gBAAgB;AAAA,MACtE,cAAc;AAAA,MACd,aAAa;AAAA,IACf,CAAC;AAAA,EACH;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,eACJ,OAAO,WAAW,OAAO,UAAU,OAAO,iBAAiB,OAAO;AACpE,QAAM,kBACJ,OAAO,cACP,OAAO,aACP,OAAO,qBACP,OAAO,mBACP,IAAI;AACN,QAAM,qBAAqB,OAAO,iBAAiB,OAAO;AAE1D,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,QAAM,eACJ,OAAO,uBAAuB,YAAY,mBAAmB,KAAK,EAAE,SAAS,IACzE,mBAAmB,KAAK,IACxB;AAEN,SAAO;AAAA,IACL;AAAA,IACA;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,2BACP,QACA,KAC6B;AAC7B,QAAM,mBAAmB,OAAO,cAAc,OAAO,WAAW,OAAO;AACvE,QAAM,iBAAiB,OAAO,eAAe,OAAO,cAAc,OAAO;AACzE,QAAM,cAAc,OAAO,SAAS,OAAO,YAAY,OAAO;AAC9D,QAAM,eAAe,OAAO,WAAW,OAAO;AAC9C,QAAM,cAAc,OAAO,SAAS,OAAO,YAAY,OAAO;AAC9D,QAAM,iBAAiB,OAAO,YAAY,OAAO,eAAe,OAAO;AACvE,QAAM,aAAa,OAAO,QAAQ,OAAO;AACzC,QAAM,YAAY,OAAO;AACzB,QAAM,gBAAgB,OAAO,mBAAmB,OAAO;AACvD,QAAM,eACJ,OAAO,WAAW,OAAO,UAAU,OAAO,iBAAiB,OAAO;AACpE,QAAM,kBAAkB,OAAO,cAAc,OAAO;AACpD,QAAM,qBAAqB,OAAO,iBAAiB,OAAO;AAE1D,QAAM,aACJ,sBAAsB,kBAAkB,KAAK,GAAG,OAAO,IAAI,kBAAkB;AAAA,IAC3E,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC,KAAK;AAER,QAAM,WAAW,sBAAsB,gBAAgB,KAAK,GAAG,OAAO,IAAI,gBAAgB;AAAA,IACxF,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AAED,QAAM,QAAQ,sBAAsB,aAAa,KAAK,GAAG,OAAO,IAAI,aAAa;AAAA,IAC/E,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AAED,QAAM,SAAS,sBAAsB,cAAc,KAAK,GAAG,OAAO,IAAI,eAAe;AAAA,IACnF,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AAED,QAAM,QAAQ,sBAAsB,aAAa,KAAK,GAAG,OAAO,IAAI,aAAa;AAAA,IAC/E,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AAED,QAAM,WAAW,sBAAsB,gBAAgB,KAAK,GAAG,OAAO,IAAI,gBAAgB;AAAA,IACxF,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AAED,QAAM,OAAO,2BAA2B,YAAY,KAAK,GAAG,OAAO,IAAI,UAAU;AAEjF,QAAM,MAAM,sBAAsB,WAAW,KAAK,GAAG,OAAO,IAAI,WAAW;AAAA,IACzE,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AAED,QAAM,YAAY,iBAAiB,eAAe,GAAG,OAAO,IAAI,aAAa;AAE7E,QAAM,SAAS,sBAAsB,cAAc,KAAK,GAAG,OAAO,IAAI,qBAAqB;AAAA,IACzF,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AAED,QAAM,YACJ,oBAAoB,UAAU,oBAAoB,YAAY,kBAAkB;AAElF,QAAM,eACJ,OAAO,uBAAuB,YAAY,mBAAmB,KAAK,EAAE,SAAS,IACzE,mBAAmB,KAAK,IACxB;AAEN,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,wBACP,QACA,KAC0B;AAC1B,QAAM,iBAAiB,OAAO,eAAe,OAAO,cAAc,OAAO;AACzE,QAAM,cAAc,OAAO,SAAS,OAAO,YAAY,OAAO;AAC9D,QAAM,eAAe,OAAO,WAAW,OAAO;AAC9C,QAAM,gBAAgB,OAAO,mBAAmB,OAAO;AACvD,QAAM,qBAAqB,OAAO,iBAAiB,OAAO;AAE1D,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA,GAAG,OAAO,IAAI;AAAA,IACd;AAAA,MACE,cAAc;AAAA,MACd,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,QAAQ,sBAAsB,aAAa,KAAK,GAAG,OAAO,IAAI,uBAAuB;AAAA,IACzF,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AAED,QAAM,SAAS,sBAAsB,cAAc,KAAK,GAAG,OAAO,IAAI,yBAAyB;AAAA,IAC7F,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AAED,QAAM,YAAY,iBAAiB,eAAe,GAAG,OAAO,IAAI,uBAAuB;AAEvF,QAAM,eACJ,OAAO,uBAAuB,YAAY,mBAAmB,KAAK,EAAE,SAAS,IACzE,mBAAmB,KAAK,IACxB;AAEN,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,wBACP,QACA,KAC0B;AAC1B,QAAM,mBAAmB,OAAO,cAAc,OAAO,WAAW,OAAO;AACvE,QAAM,cAAc,OAAO;AAC3B,QAAM,aAAa,OAAO,QAAQ,OAAO;AACzC,QAAM,YAAY,OAAO;AACzB,QAAM,gBAAgB,OAAO,mBAAmB,OAAO;AACvD,QAAM,eACJ,OAAO,WAAW,OAAO,UAAU,OAAO,iBAAiB,OAAO;AACpE,QAAM,kBACJ,OAAO,cACP,OAAO,aACP,OAAO,qBACP,OAAO,mBACP,IAAI;AACN,QAAM,qBAAqB,OAAO,iBAAiB,OAAO;AAE1D,QAAM,aACJ,sBAAsB,kBAAkB,KAAK,GAAG,OAAO,IAAI,2BAA2B;AAAA,IACpF,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC,KAAK;AAER,QAAM,QAAQ,sBAAsB,aAAa,KAAK,GAAG,OAAO,IAAI,sBAAsB;AAAA,IACxF,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AAED,QAAM,OAAO,2BAA2B,YAAY,KAAK,GAAG,OAAO,IAAI,mBAAmB;AAE1F,QAAM,MAAM,sBAAsB,WAAW,KAAK,GAAG,OAAO,IAAI,oBAAoB;AAAA,IAClF,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AAED,QAAM,YAAY,iBAAiB,eAAe,GAAG,OAAO,IAAI,sBAAsB;AAEtF,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA,GAAG,OAAO,IAAI;AAAA,IACd;AAAA,MACE,cAAc;AAAA,MACd,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,YAAY,6BAA6B,eAAe;AAE9D,QAAM,eACJ,OAAO,uBAAuB,YAAY,mBAAmB,KAAK,EAAE,SAAS,IACzE,mBAAmB,KAAK,IACxB;AAEN,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,6BAA6B,OAAgD;AACpF,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACA,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,MAAI,eAAe,UAAU,eAAe,WAAW;AACrD,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,oDAAoD;AACtE;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;AAAA,IAC9B,OAAO,sBAAsB,OAAO;AAAA,EACtC;AACA,QAAM,oBAAoB,0BACtB;AAAA,IACE;AAAA,IACA;AAAA,IACA,GAAG,OAAO,IAAI;AAAA,IACd;AAAA,MACE,cAAc;AAAA,MACd,aAAa;AAAA,IACf;AAAA,EACF,IACA;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;AAMA,IAAM,cAA6B,CAAC,OAAO,QAAQ;AACjD,MAAI,MAAM,SAAS,cAAE,aAAa,mBAAmB;AACnD,WAAO,EAAE,SAAS,kCAAkC,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG;AAAA,EAC9E;AACA,MAAI,MAAM,SAAS,cAAE,aAAa,6BAA6B;AAC7D,WAAO,EAAE,SAAS,+CAA+C;AAAA,EACnE;AACA,MAAI,MAAM,SAAS,cAAE,aAAa,gBAAgB,MAAM,aAAa,UAAU;AAC7E,WAAO,EAAE,SAAS,GAAG,IAAI,YAAY,6BAA6B;AAAA,EACpE;AACA,SAAO,EAAE,SAAS,IAAI,aAAa;AACrC;AAeA,SAAS,iBACP,QACA,KACA,cACmB;AAEnB,QAAM,cAAc,qBAAqB,UAAU,QAAQ,EAAE,UAAU,YAAY,CAAC;AACpF,MAAI,CAAC,YAAY,SAAS;AACxB,UAAM,aAAa,YAAY,MAAM,OAAO,CAAC;AAC7C,UAAMA,SAAO,YAAY,KAAK,KAAK,GAAG,KAAK;AAC3C,UAAM,SAASA,SAAO,GAAG,OAAO,IAAI,IAAIA,MAAI,OAAO,GAAG,OAAO,IAAI;AACjE,UAAM,IAAI,MAAM,GAAG,MAAM,GAAG,YAAY,OAAO,EAAE;AAAA,EACnD;AAGA,QAAM,aAAa,wBAAwB,YAAY,MAAM,KAAK,YAAY;AAG9E,iCAA+B,WAAW,iBAAiB,GAAG,OAAO,IAAI,uBAAuB;AAGhG,MAAI,WAAW,aAAa,SAAS,WAAW;AAC9C;AAAA,MACE,WAAW,YAAY;AAAA,MACvB,GAAG,OAAO,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;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,+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,UAAM,cAAc,SAAS,eAAe;AAG5C,QAAI,aAAa,UAAa,SAAS,KAAK,EAAE,WAAW,GAAG;AAC1D,UAAI,aAAa;AACf,eAAO;AAAA,MACT;AACA,YAAM,SAAS,aAAa,SAAY,eAAe;AACvD,YAAM,IAAI,MAAM,yBAAyB,OAAO,kBAAkB,WAAW,IAAI,MAAM,EAAE;AAAA,IAC3F;AACA,WAAO;AAAA,EACT;AAGA,QAAM,eAAe,SAAS,gBAAgB;AAC9C,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI;AAAA,MACR,GAAG,WAAW;AAAA,IAChB;AAAA,EACF;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;;;ACh6CA,IAAAC,qBAAiB;AACjB,sBAKO;;;ACDA,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBhC,IAAM,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADXtC,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,iBAAiB;AAAA,MACjB,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,gBAAgB,CAAC;AAAA,QACjB,KAAK;AAAA,UACH;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,aAAa,QAAQ,YAAY;AAE5D,WAAO;AAAA,MACL,gBAAgB,CAAC,EAAE,MAAM,aAAa,SAAS,aAAa,CAAC;AAAA,MAC7D,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,iBAAiB;AAAA,MACjB,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,gBAAgB,CAAC;AAAA,QACjB,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,gBAAgB,CAAC,EAAE,MAAM,aAAa,SAAS,aAAa,CAAC;AAAA,QAC7D,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,OAAO,CAAC,SAAS,CAAC,eAAe,SAAS,IAAI,CAAC;AAE/F,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,uBAAuB,aAAsD;AACpF,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;AAAA,QACN;AAAA,sCAAyC,OAAO,QAAQ,SAAS,OAAO,gBAAgB,MAAM;AAAA,MAChG;AAAA,IACF;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;AACF;;;AEjWA,IAAAC,kBAA0B;AAC1B,IAAAC,oBAAiC;AACjC,IAAAC,qBAAiB;AACjB,IAAAC,eAAsB;AAKtB,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;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;AAAA,MACR,+BAA+B,KAAK,OAAO,QAAQ;AAAA,IACrD;AAAA,EACF;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,0BAAO,UAAU,0BAAU,IAAI;AACrC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,sBACpB,UACsC;AACtC,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,4BAAS,cAAc,MAAM;AAC/C,QAAM,aAAS,oBAAM,GAAG;AAExB,MAAI,CAAC,SAAS,MAAM,GAAG;AACrB,UAAM,IAAI,MAAM,mBAAmB,YAAY,+CAA+C;AAAA,EAChG;AAEA,QAAM,UAAU,oBAAoB,QAAQ,YAAY;AACxD,QAAM,cAAc,QAAQ;AAAA,IAAI,CAAC,OAAO,UACtC,uBAAuB,OAAO,OAAO,YAAY;AAAA,EACnD;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,aAA6D;AAC3F,SAAO,YAAY,IAAI,CAAC,eAAe,WAAW,IAAI;AACxD;;;AC3BO,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,sBAAsB,OAAO,MAAM,OAAO,MAAM;AAAA,IAC7D,KAAK;AACH,aAAO,IAAI,mBAAmB,OAAO,MAAM,OAAO,MAAM;AAAA,IAC1D,KAAK;AACH,aAAO,IAAI,mBAAmB,OAAO,MAAM,OAAO,MAAM;AAAA,IAC1D,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;;;ACtFA,IAAAE,aAA6B;AAC7B,IAAAC,cAAkB;;;ACIlB,SAAS,gBAAgB,OAAuB;AAC9C,MAAI,QAAQ,aAAa,SAAS;AAGhC,WAAO,IAAI,MAAM,WAAW,KAAK,IAAI,CAAC;AAAA,EACxC;AAEA,SAAO,IAAI,MAAM,WAAW,KAAK,OAAS,CAAC;AAC7C;AAEA,eAAsB,kBACpB,MACA,cACA,UAAuB,CAAC,GAKvB;AACD,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AAGA,MAAI,OAAO,QAAQ,aAAa;AAC9B,WAAO,qBAAqB,MAAM,cAAc,OAAO;AAAA,EACzD;AACA,SAAO,sBAAsB,MAAM,cAAc,OAAO;AAC1D;AAKA,eAAe,qBACb,MACA,cACA,SAKC;AACD,QAAM,UAAU,CAAC,GAAG,IAAI;AACxB,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,OAAO,IAAI,MAAM,SAAS;AAAA,IAC9B,KAAK,QAAQ;AAAA,IACb,OAAO,QAAQ,OAAO,YAAY;AAAA,IAClC,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAED,MAAI,WAAW;AACf,QAAM,UACJ,QAAQ,cAAc,SAClB,WAAW,MAAM;AACf,eAAW;AACX,SAAK,KAAK,SAAS;AAAA,EACrB,GAAG,QAAQ,SAAS,IACpB;AAEN,MAAI;AACF,UAAM,gBAAgB,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM,EAAE,KAAK,IAAI,QAAQ,QAAQ,EAAE;AACzF,UAAM,gBAAgB,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM,EAAE,KAAK,IAAI,QAAQ,QAAQ,EAAE;AAEzF,UAAM,CAAC,QAAQ,QAAQ,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,MACnD;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP,CAAC;AAED,QAAI,UAAU;AACZ,YAAM,IAAI,MAAM,2BAA2B,QAAQ,SAAS,IAAI;AAAA,IAClE;AAEA,WAAO;AAAA,MACL,QAAQ,OAAO,QAAQ,SAAS,IAAI;AAAA,MACpC,QAAQ,OAAO,QAAQ,SAAS,IAAI;AAAA,MACpC;AAAA,IACF;AAAA,EACF,UAAE;AACA,QAAI,YAAY,QAAW;AACzB,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF;AACF;AAKA,eAAe,sBACb,MACA,cACA,SAKC;AACD,QAAM,EAAE,OAAAC,OAAM,IAAI,MAAM,OAAO,eAAoB;AAEnD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,CAAC,KAAK,GAAG,IAAI,IAAI;AACvB,UAAM,QAAQA,OAAM,KAAK,MAAM;AAAA,MAC7B,KAAK,QAAQ;AAAA,MACb,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC;AAED,UAAM,eAAyB,CAAC;AAChC,UAAM,eAAyB,CAAC;AAEhC,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB,aAAa,KAAK,KAAK,CAAC;AACpE,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB,aAAa,KAAK,KAAK,CAAC;AAEpE,QAAI,WAAW;AACf,UAAM,UACJ,QAAQ,cAAc,SAClB,WAAW,MAAM;AACf,iBAAW;AACX,YAAM,KAAK,SAAS;AAAA,IACtB,GAAG,QAAQ,SAAS,IACpB;AAEN,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,UAAI,YAAY,OAAW,cAAa,OAAO;AAC/C,aAAO,KAAK;AAAA,IACd,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,YAAY,OAAW,cAAa,OAAO;AAE/C,UAAI,UAAU;AACZ,eAAO,IAAI,MAAM,2BAA2B,QAAQ,SAAS,IAAI,CAAC;AAClE;AAAA,MACF;AAEA,YAAM,SAAS,OAAO,OAAO,YAAY,EAAE,SAAS,MAAM,EAAE,QAAQ,SAAS,IAAI;AACjF,YAAM,SAAS,OAAO,OAAO,YAAY,EAAE,SAAS,MAAM,EAAE,QAAQ,SAAS,IAAI;AAEjF,cAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA,UAAU,QAAQ;AAAA,MACpB,CAAC;AAAA,IACH,CAAC;AAGD,QAAI,MAAM,OAAO;AACf,YAAM,MAAM,MAAM,YAAY;AAC9B,YAAM,MAAM,IAAI;AAAA,IAClB;AAAA,EACF,CAAC;AACH;AAUA,eAAsB,mBACpB,SACA,cACA,UAAuB,CAAC,GAKvB;AACD,QAAM,EAAE,OAAAC,QAAO,UAAAC,WAAU,IAAAC,KAAI,WAAAC,WAAU,IAAI,MAAM,OAAO,aAAkB;AAC1E,QAAM,EAAE,QAAAC,QAAO,IAAI,MAAM,OAAO,IAAS;AACzC,QAAMC,SAAO,MAAM,OAAO,MAAW;AACrC,QAAM,EAAE,YAAAC,YAAW,IAAI,MAAM,OAAO,QAAa;AAEjD,QAAM,MAAMD,OAAK,KAAKD,QAAO,GAAG,eAAeE,YAAW,CAAC,EAAE;AAC7D,QAAMN,OAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAEpC,QAAM,YAAYK,OAAK,KAAK,KAAK,WAAW;AAC5C,QAAM,aAAaA,OAAK,KAAK,KAAK,YAAY;AAC9C,QAAM,aAAaA,OAAK,KAAK,KAAK,YAAY;AAE9C,QAAMF,WAAU,WAAW,cAAc,MAAM;AAE/C,QAAM,iBACJ,QAAQ,aAAa,UACjB,IAAI,OAAO,OAAO,gBAAgB,SAAS,CAAC,MAAM,gBAAgB,UAAU,CAAC,OAAO,gBAAgB,UAAU,CAAC,KAC/G,IAAI,OAAO,OAAO,gBAAgB,SAAS,CAAC,MAAM,gBAAgB,UAAU,CAAC,OAAO,gBAAgB,UAAU,CAAC;AAErH,QAAM,EAAE,OAAAJ,OAAM,IAAI,MAAM,OAAO,eAAoB;AACnD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9D,YAAM,QAAQA,OAAM,gBAAgB;AAAA,QAClC,OAAO;AAAA,QACP,KAAK,QAAQ;AAAA,QACb,OAAO,CAAC,UAAU,UAAU,QAAQ;AAAA,MACtC,CAAC;AAED,YAAM,UAAU,QAAQ,YACpB,WAAW,MAAM;AACf,cAAM,KAAK;AACX,eAAO,IAAI,MAAM,2BAA2B,QAAQ,SAAS,IAAI,CAAC;AAAA,MACpE,GAAG,QAAQ,SAAS,IACpB;AAEJ,YAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,YAAI,YAAY,QAAW;AACzB,uBAAa,OAAO;AAAA,QACtB;AACA,eAAO,KAAK;AAAA,MACd,CAAC;AAED,YAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,YAAI,YAAY,QAAW;AACzB,uBAAa,OAAO;AAAA,QACtB;AACA,gBAAQ,QAAQ,CAAC;AAAA,MACnB,CAAC;AAAA,IACH,CAAC;AAED,UAAM,UAAU,MAAME,UAAS,YAAY,MAAM,GAAG,QAAQ,SAAS,IAAI;AACzE,UAAM,UAAU,MAAMA,UAAS,YAAY,MAAM,GAAG,QAAQ,SAAS,IAAI;AACzE,WAAO,EAAE,QAAQ,QAAQ,SAAS;AAAA,EACpC,UAAE;AACA,UAAMC,IAAG,KAAK,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAChD;AACF;;;AC7NA,SAAS,YAAY,KAAqB;AAExC,MAAI,SAAS,KAAK,GAAG,GAAG;AACtB,WAAO;AAAA,EACT;AACA,SAAO,IAAI,QAAQ,UAAU,CAAC,WAAW,IAAI,OAAO,YAAY,CAAC,EAAE;AACrE;AAuBO,SAAS,gBAAgB,KAAuB;AACrD,MAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IAAI,IAAI,CAAC,SAAS,gBAAgB,IAAI,CAAC;AAAA,EAChD;AAEA,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,YAAM,WAAW,YAAY,GAAG;AAChC,aAAO,QAAQ,IAAI,gBAAgB,KAAK;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AC7BO,IAAM,uBAAgD;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAwHO,SAAS,4BACd,UACQ;AACR,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO;AAAA,EACT;AAGA,WAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,IAAI,SAAS,eAAe,IAAI,YAAY,QAAW;AACzD,UAAI,OAAO,IAAI,YAAY,UAAU;AACnC,eAAO,IAAI;AAAA,MACb;AACA,aAAO,KAAK,UAAU,IAAI,OAAO;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,gBAAgB,UAAyC;AACvE,SAAO,WAAW,qBAAqB,SAAS,SAAS,IAAI,IAAI;AACnE;;;AHhJA,IAAM,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO/B,mBAAmB,gBAAgB;AAAA;AAAA;AAAA,IAGnC,mBAAmB,QAAQ;AAAA;AAAA;AAAA,IAG3B,mBAAmB,gBAAgB;AAAA;AAAA;AAAA,IAGnC,mBAAmB,gBAAgB;AA8DvC,IAAM,2BAA2B,cAAE,OAAO;AAAA,EACxC,OAAO,cAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,2BAA2B;AAAA,EACpE,MAAM,cAAE,MAAM,cAAE,OAAO,CAAC,EAAE,SAAS,6BAA6B,EAAE,SAAS;AAAA,EAC3E,QAAQ,cAAE,MAAM,cAAE,OAAO,CAAC,EAAE,SAAS,6BAA6B,EAAE,SAAS;AAAA,EAC7E,WAAW,cAAE,OAAO,EAAE,SAAS,qCAAqC,EAAE,SAAS;AACjF,CAAC;AAED,IAAM,0BAA0B,cAAE,OAAO;AAAA,EACvC,IAAI,cAAE,OAAO,EAAE,SAAS,yCAAyC;AAAA,EACjE,WAAW,cAAE,QAAQ,EAAE,SAAS,wCAAwC;AAAA,EACxE,WAAW,cAAE,OAAO,EAAE,SAAS,kDAAkD;AACnF,CAAC;AAED,IAAM,yBAAyB,cAAE,OAAO;AAAA,EACtC,QAAQ,cAAE,MAAM,uBAAuB,EAAE,SAAS,8BAA8B;AAAA,EAChF,mBAAmB,cAAE,OAAO,EAAE,SAAS,4CAA4C;AACrF,CAAC;AAEM,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,UAAM,SAAS,QAAQ;AACvB,QAAI,QAAQ,SAAS,eAAe,OAAO,WAAW,OAAO,QAAQ,SAAS,GAAG;AAC/E,aAAO,KAAK,oBAAoB,SAAS,eAAe,OAAO,OAAO;AAAA,IACxE;AAEA,WAAO,KAAK,iBAAiB,SAAS,aAAa;AAAA,EACrD;AAAA,EAEA,MAAc,iBACZ,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,CAAC,mBAAmB,cAAc,GAAG,KAAK,UAAU,QAAQ,SAAS,gBAAgB,MAAM,CAAC;AAAA,MAC5F,CAAC,mBAAmB,iBAAiB,GAAG,KAAK;AAAA,QAC3C,QAAQ,SAAS;AAAA,QACjB;AAAA,QACA;AAAA,MACF;AAAA,MACA,CAAC,mBAAmB,eAAe,GAAG,KAAK,UAAU,QAAQ,kBAAkB,CAAC,GAAG,MAAM,CAAC;AAAA,MAC1F,CAAC,mBAAmB,gBAAgB,GAAG,QAAQ,UAAU,KAAK;AAAA,MAC9D,CAAC,mBAAmB,gBAAgB,IAAI,QAAQ,SAAS,oBAAoB,IAAI,KAAK;AAAA,MACtF,CAAC,mBAAmB,gBAAgB,GAAG,QAAQ,SAAS,iBAAiB,KAAK;AAAA,MAC9E,CAAC,mBAAmB,QAAQ,GAAG,kBAAkB,KAAK;AAAA,IACxD;AAGA,UAAM,eAAe,kBAAkB;AAGvC,UAAM,oBACJ,QAAQ,6BAA6B,KAAK,qBAAqB;AACjE,UAAM,aAAa,oBAAoB,mBAAmB,SAAS;AAEnE,UAAM,sBAAkC;AAAA,MACtC;AAAA,MACA;AAAA,MACA,QAAQ,cAAc;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,EAAE,MAAM,iBAAiB,IAAI,MAAM,KAAK,aAAa;AAAA,QACzD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAED,YAAM,QAAQ,WAAW,KAAK,KAAK;AACnC,YAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO,gBAAgB,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC;AAC1F,YAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,IACpC,KAAK,OAAO,OAAO,gBAAgB,EAAE,MAAM,GAAG,CAAC,IAC/C,CAAC;AACL,YAAM,YAAY,KAAK;AACvB,YAAM,sBAAsB,KAAK,IAAI,KAAK,SAAS,OAAO,QAAQ,CAAC;AAEnE,aAAO;AAAA,QACL;AAAA,QACA,SAAS,eAAe,KAAK;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,QACP,QAAQ,CAAC;AAAA,QACT,qBAAqB;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,oBACZ,SACA,eACA,SAC0B;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AACpC,YAAM,IAAI;AAAA,QACR,mCAAmC,QAAQ,WAAW,QAAQ,WAAW;AAAA,MAC3E;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,kBAAkB,SAAS,OAAO;AACtD,UAAM,eAAe,wBAAwB;AAE7C,UAAM,sBAAkC;AAAA,MACtC,YAAY;AAAA,MACZ;AAAA,MACA,QAAQ,cAAc;AAAA,IACxB;AAEA,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,aAAa;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,EAAE,OAAO,SAAS,MAAM,OAAO,IAAI,qBAAqB,MAAM,OAAO;AAE3E,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,qBAAqB,QAAQ;AAAA,MAC7B,WAAW,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAkB,SAA4B,SAAwC;AAC5F,UAAM,oBACJ,QAAQ,aAAa,YAAY,QAAQ,aAAa,SAAS,KAAK,EAAE,SAAS,IAC3E,QAAQ,aAAa,WACrB,QAAQ,SAAS;AAEvB,UAAM,QAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,SAAS;AAAA,MACjB;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,oBAAoB,QAAQ,SAAS,iBAAiB,KAAK,EAAE,SAAS,GAAG;AAC5F,YAAM,KAAK,gCAAgC,QAAQ,SAAS,kBAAkB,EAAE;AAAA,IAClF;AAEA,UAAM,KAAK,gCAAgC,QAAQ,WAAW,IAAI,qBAAqB;AAEvF,eAAW,UAAU,SAAS;AAC5B,YAAM,gBAAgB,OAAO,WAAW,gBAAgB;AACxD,YAAM,cAAc,OAAO,WAAW,IAAM,aAAa,OAAO,MAAM,MAAM;AAC5E,YAAM,KAAK,MAAM,OAAO,EAAE,IAAI,aAAa,GAAG,WAAW,KAAK,OAAO,WAAW,EAAE;AAAA,IACpF;AAEA,UAAM,KAAK,IAAI,4EAA4E;AAE3F,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,MAAc,aAAgB,SAMgC;AAC5D,UAAM,EAAE,SAAS,eAAe,cAAc,YAAY,OAAO,IAAI;AAErE,QAAI;AAEJ,aAAS,UAAU,GAAG,WAAW,GAAG,WAAW;AAC7C,UAAI;AAEF,cAAM,QAAQ,cAAc,kBAAkB;AAC9C,YAAI,OAAO;AACT,gBAAM,EAAE,KAAK,IAAI,UAAM,yBAAa;AAAA,YAClC;AAAA,YACA,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,GAAI,KAAK,kBAAkB,EAAE,WAAW,KAAK,gBAAgB,IAAI,CAAC;AAAA,YAClE,GAAI,OAAO,KAAK,gBAAgB,WAAW,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,UAClF,CAAC;AAED,gBAAMK,QAAO,OAAO,MAAM,kBAAkB,IAAI,CAAC;AACjD,iBAAO,EAAE,MAAAA,MAAK;AAAA,QAChB;AAEA,cAAM,WAAW,MAAM,cAAc,OAAO;AAAA,UAC1C,UAAU;AAAA,UACV;AAAA,UACA,YAAY,QAAQ,SAAS;AAAA,UAC7B,SAAS,QAAQ;AAAA,UACjB,iBAAiB,KAAK;AAAA,UACtB,aAAa,KAAK;AAAA,QACpB,CAAC;AAED,cAAM,OAAO,OAAO;AAAA,UAClB,kBAAkB,4BAA4B,SAAS,cAAc,CAAC;AAAA,QACxE;AACA,eAAO,EAAE,MAAM,kBAAkB,SAAS;AAAA,MAC5C,SAAS,GAAY;AACnB,oBAAY,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AAAA,MAC1D;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,wDAAwD,WAAW,OAAO,EAAE;AAAA,EAC9F;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;AAEA,SAAS,0BAAkC;AACzC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYT;AAEA,SAAS,eAAe,OAAkC;AACxD,MAAI,SAAS,KAAK;AAChB,WAAO;AAAA,EACT;AACA,MAAI,SAAS,KAAK;AAChB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,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,gBAAgB,MAAkC;AACzD,QAAM,QAAQ,KAAK,MAAM,aAAa;AACtC,SAAO,QAAQ,CAAC;AAClB;AAEA,SAAS,kBAAkB,MAAuB;AAChD,QAAM,UAAU,OAAO,SAAS,WAAW,KAAK,QAAQ,mBAAmB,EAAE,EAAE,KAAK,IAAI;AACxF,QAAM,OAAO,gBAAgB,OAAO,KAAK;AACzC,SAAO,KAAK,MAAM,IAAI;AACxB;AAEA,SAAS,iBAAiB,OAAiC;AACzD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAC5D;AAYO,IAAM,gBAAN,MAAyC;AAAA,EACrC,OAAO;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAA+B;AACzC,SAAK,SAAS,QAAQ;AACtB,SAAK,MAAM,QAAQ;AACnB,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,MAAM,SAAS,SAAsD;AAEnE,UAAM,UAAU;AAAA,MACd,UAAU,QAAQ,SAAS;AAAA,MAC3B,iBAAiB,QAAQ,SAAS;AAAA,MAClC,kBAAkB,QAAQ,SAAS;AAAA,MACnC,iBAAiB,QAAQ,SAAS;AAAA,MAClC,iBAAiB,QAAQ;AAAA,MACzB,gBAAgB,QAAQ,kBAAkB;AAAA,MAC1C,gBAAgB,QAAQ,SAAS;AAAA,MACjC,YAAY,QAAQ,SAAS,WAAW;AAAA,QACtC,CAACC,WAAS,CAAC,QAAQ,SAAS,gBAAgB,SAASA,MAAI;AAAA,MAC3D;AAAA,MACA,eAAe,QAAQ,SAAS;AAAA,MAChC,cAAc,QAAQ,gBAAgB;AAAA,MACtC,QAAQ,KAAK,UAAU;AAAA,IACzB;AAEA,UAAM,eAAe,KAAK,UAAU,gBAAgB,OAAO,GAAG,MAAM,CAAC;AAErE,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,SAAS,eAAe,KAAK;AAAA,QAC7B;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,SAAS;AAAA,QACT,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;AAEA,SAAS,qBACP,QACA,SAMA;AACA,QAAM,YAAY,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;AACtE,QAAM,OAAiB,CAAC;AACxB,QAAM,SAAmB,CAAC;AAC1B,MAAI,cAAc;AAClB,MAAI,eAAe;AACnB,MAAI,iBAAiB;AAErB,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,SAAS,UAAU,IAAI,MAAM,EAAE;AACrC,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,mBAAe,OAAO;AAEtB,QAAI,MAAM,WAAW;AACnB,sBAAgB,OAAO;AACvB,WAAK,KAAK,IAAI,OAAO,EAAE,KAAK,OAAO,WAAW,KAAK,MAAM,SAAS,EAAE;AAAA,IACtE,OAAO;AACL,aAAO,KAAK,IAAI,OAAO,EAAE,KAAK,OAAO,WAAW,KAAK,MAAM,SAAS,EAAE;AACtE,UAAI,OAAO,UAAU;AACnB,yBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,cAAc,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,eAAe,WAAW,CAAC,IAAI;AACvF,QAAM,UAAU,iBAAiB,SAAS,eAAe,KAAK;AAC9D,SAAO,EAAE,OAAO,SAAS,MAAM,OAAO;AACxC;AAIA,eAAe,cACb,YACA,OACA,gBACA,KACiB;AACjB,QAAM,EAAE,QAAQ,QAAQ,SAAS,IAC/B,OAAO,eAAe,WAClB,MAAM,mBAAmB,YAAY,OAAO,EAAE,KAAK,WAAW,eAAe,CAAC,IAC9E,MAAM,kBAAkB,YAAY,OAAO,EAAE,KAAK,WAAW,eAAe,CAAC;AAEnF,MAAI,aAAa,GAAG;AAClB,UAAM,aAAa,aAAa,MAAM;AACtC,UAAM,IAAI;AAAA,MACR,WAAW,SAAS,IAChB,mCAAmC,QAAQ,KAAK,UAAU,KAC1D,mCAAmC,QAAQ;AAAA,IACjD;AAAA,EACF;AAEA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,aAAa,QAAwB;AAC5C,QAAM,UAAU,OAAO,KAAK;AAC5B,QAAM,YAAY;AAClB,MAAI,QAAQ,UAAU,WAAW;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,OAAO,QAAQ,MAAM,CAAC,SAAS;AACrC,SAAO,uBAAuB,SAAS;AAAA,EAAY,IAAI;AACzD;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,kCAAkC,CAAC,OAAO,YAAY;AAC5E,WAAO,UAAU,OAAO,KAAK;AAAA,EAC/B,CAAC;AACH;AAcA,SAAS,UAAU,GAAY,GAAqB;AAClD,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,QAAQ,MAAM,KAAM,QAAO,MAAM;AAC3C,MAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAClC,MAAI,OAAO,MAAM,SAAU,QAAO,MAAM;AAExC,MAAI,MAAM,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,EAAG,QAAO;AAClD,MAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,GAAG;AACxC,QAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,WAAO,EAAE,MAAM,CAAC,KAAK,MAAM,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC;AAAA,EACjD;AAEA,QAAM,OAAO;AACb,QAAM,OAAO;AACb,QAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,QAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC1C,SAAO,MAAM,MAAM,CAAC,QAAQ,OAAO,OAAO,MAAM,GAAG,KAAK,UAAU,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;AACzF;AAOA,SAAS,UACP,UACA,QACS;AAET,MAAI,aAAa,OAAW,QAAO;AAEnC,MAAI,aAAa,MAAO,QAAO;AAE/B,MAAI,WAAW,OAAW,QAAO;AACjC,aAAW,OAAO,OAAO,KAAK,QAAQ,GAAG;AACvC,QAAI,CAAC,OAAO,OAAO,QAAQ,GAAG,EAAG,QAAO;AACxC,QAAI,CAAC,UAAU,SAAS,GAAG,GAAG,OAAO,GAAG,CAAC,EAAG,QAAO;AAAA,EACrD;AACA,SAAO;AACT;AAMO,IAAM,0BAAN,MAAmD;AAAA,EAC/C,OAAO;AAAA,EAEC;AAAA,EAEjB,YAAY,SAAyC;AACnD,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,SAAS,SAA6C;AACpD,UAAM,EAAE,gBAAgB,aAAa,IAAI;AAGzC,UAAM,YAAY,KAAK,6BAA6B,cAAc;AAGlE,QAAI,UAAU,WAAW,KAAK,CAAC,cAAc;AAC3C,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,QACP,QAAQ,CAAC,mCAAmC;AAAA,QAC5C,qBAAqB;AAAA,MACvB;AAAA,IACF;AAGA,UAAM,UAAU,UAAU,SAAS,IAAI,KAAK,aAAa,SAAS,IAAI;AAEtE,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,QACP,QAAQ,CAAC,mCAAmC;AAAA,QAC5C,qBAAqB;AAAA,MACvB;AAAA,IACF;AAEA,YAAQ,KAAK,OAAO,MAAM;AAAA,MACxB,KAAK;AACH,eAAO,KAAK,iBAAiB,OAAO;AAAA,MACtC,KAAK;AACH,eAAO,KAAK,gBAAgB,SAAS;AAAA,MACvC,KAAK;AACH,eAAO,KAAK,cAAc,SAAS;AAAA,MACrC;AACE,eAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,MAAM,CAAC;AAAA,UACP,QAAQ,CAAC,iBAAiB,KAAK,OAAO,IAAI,EAAE;AAAA,UAC5C,qBAAqB;AAAA,QACvB;AAAA,IACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,6BACN,UAC8B;AAC9B,QAAI,CAAC,UAAU;AACb,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,YAAiC,CAAC;AACxC,eAAW,WAAW,UAAU;AAC9B,UAAI,QAAQ,WAAW;AACrB,mBAAW,QAAQ,QAAQ,WAAW;AACpC,oBAAU,KAAK;AAAA,YACb,MAAM,KAAK;AAAA,YACX,MAAM,KAAK;AAAA,UACb,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,WAAuD;AAC1E,UAAM,kBAA0C,CAAC;AACjD,eAAW,QAAQ,WAAW;AAC5B,sBAAgB,KAAK,IAAI,KAAK,gBAAgB,KAAK,IAAI,KAAK,KAAK;AAAA,IACnE;AACA,UAAM,YAAY,OAAO,KAAK,eAAe,EAAE,KAAK;AACpD,WAAO;AAAA,MACL,YAAY,UAAU;AAAA,MACtB;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EAEQ,iBAAiB,SAAwC;AAC/D,UAAM,WAAW,KAAK,OAAO,YAAY,CAAC;AAC1C,UAAM,YAAY,OAAO,KAAK,QAAQ;AAEtC,QAAI,UAAU,WAAW,GAAG;AAC1B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM,CAAC,gCAAgC;AAAA,QACvC,QAAQ,CAAC;AAAA,QACT,qBAAqB;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,OAAiB,CAAC;AACxB,UAAM,SAAmB,CAAC;AAE1B,eAAW,YAAY,WAAW;AAChC,YAAM,WAAW,SAAS,QAAQ;AAClC,YAAM,SAAS,QAAQ,gBAAgB,QAAQ,KAAK;AACpD,UAAI,UAAU,UAAU;AACtB,aAAK,KAAK,GAAG,QAAQ,YAAY,MAAM,0BAAqB,QAAQ,GAAG;AAAA,MACzE,OAAO;AACL,eAAO,KAAK,GAAG,QAAQ,YAAY,MAAM,0BAAqB,QAAQ,GAAG;AAAA,MAC3E;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,SAAS,UAAU;AAEtC,WAAO;AAAA,MACL;AAAA,MACA,SAAS,eAAe,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,qBAAqB,UAAU;AAAA,IACjC;AAAA,EACF;AAAA,EAEQ,gBAAgB,WAA0D;AAChF,UAAM,WAAW,KAAK,OAAO,YAAY,CAAC;AAE1C,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM,CAAC,4BAA4B;AAAA,QACnC,QAAQ,CAAC;AAAA,QACT,qBAAqB;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,OAAiB,CAAC;AACxB,UAAM,SAAmB,CAAC;AAC1B,QAAI,cAAc;AAElB,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,eAAe,SAAS,CAAC;AAC/B,YAAM,eAAe,aAAa;AAClC,UAAI,QAAQ;AACZ,UAAI,eAAe;AAEnB,aAAO,cAAc,UAAU,QAAQ;AACrC,cAAM,aAAa,UAAU,WAAW;AACxC,YAAI,WAAW,SAAS,cAAc;AAEpC,cAAI,UAAU,aAAa,MAAM,WAAW,IAAI,GAAG;AACjD,iBAAK,KAAK,SAAS,YAAY,gBAAgB,WAAW,EAAE;AAC5D;AACA,oBAAQ;AACR;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,YAAY,YAAY,gBAAgB,CAAC,mBAAmB,WAAW;AAAA,UACzE;AACA;AACA,yBAAe;AACf;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,CAAC,cAAc;AAC3B,eAAO,KAAK,YAAY,YAAY,gBAAgB,CAAC,gCAAgC;AAAA,MACvF;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,SAAS,SAAS;AAErC,WAAO;AAAA,MACL;AAAA,MACA,SAAS,eAAe,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,qBAAqB,SAAS;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,cAAc,WAA0D;AAC9E,UAAM,WAAW,KAAK,OAAO,YAAY,CAAC;AAE1C,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM,CAAC,4BAA4B;AAAA,QACnC,QAAQ,CAAC;AAAA,QACT,qBAAqB;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,OAAiB,CAAC;AACxB,UAAM,SAAmB,CAAC;AAE1B,QAAI,UAAU,WAAW,SAAS,QAAQ;AACxC,aAAO,KAAK,YAAY,SAAS,MAAM,oBAAoB,UAAU,MAAM,EAAE;AAAA,IAC/E;AAEA,UAAM,cAAc,KAAK,IAAI,SAAS,QAAQ,UAAU,MAAM;AAC9D,aAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,YAAM,eAAe,SAAS,CAAC;AAC/B,YAAM,eAAe,aAAa;AAClC,YAAM,aAAa,UAAU,CAAC;AAC9B,YAAM,aAAa,WAAW;AAC9B,UAAI,eAAe,cAAc;AAE/B,YAAI,UAAU,aAAa,MAAM,WAAW,IAAI,GAAG;AACjD,eAAK,KAAK,YAAY,CAAC,KAAK,YAAY,EAAE;AAAA,QAC5C,OAAO;AACL,iBAAO,KAAK,YAAY,CAAC,KAAK,YAAY,gBAAgB;AAAA,QAC5D;AAAA,MACF,OAAO;AACL,eAAO,KAAK,YAAY,CAAC,cAAc,YAAY,SAAS,UAAU,EAAE;AAAA,MAC1E;AAAA,IACF;AAEA,aAAS,IAAI,aAAa,IAAI,SAAS,QAAQ,KAAK;AAClD,aAAO,KAAK,YAAY,CAAC,cAAc,SAAS,CAAC,EAAE,IAAI,eAAe;AAAA,IACxE;AAEA,UAAM,QAAQ,KAAK,SAAS,SAAS;AAErC,WAAO;AAAA,MACL;AAAA,MACA,SAAS,eAAe,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,qBAAqB,SAAS;AAAA,IAChC;AAAA,EACF;AACF;AAqBA,IAAM,uBAAuB;AAAA,EAC3B;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAKA,IAAM,cAAsC;AAAA,EAC1C,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,UAAU;AAAA,EACV,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,WAAW;AAAA,EACX,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,UAAU;AAAA,EACV,KAAK;AAAA,EACL,UAAU;AACZ;AAMO,IAAM,yBAAN,MAAkD;AAAA,EAC9C,OAAO;AAAA,EAEC;AAAA,EAEjB,YAAY,SAAwC;AAClD,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,SAAS,SAA6C;AACpD,UAAM,EAAE,UAAU,UAAU,IAAI;AAGhC,QAAI;AACJ,QAAI;AACF,sBAAgB,sBAAsB,SAAS;AAAA,IACjD,QAAQ;AACN,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,QACP,QAAQ,CAAC,0CAA0C;AAAA,QACnD,qBAAqB,KAAK,OAAO,OAAO;AAAA,QACxC,WAAW;AAAA,MACb;AAAA,IACF;AAGA,UAAM,eAAe,KAAK,oBAAoB,SAAS,iBAAiB;AACxE,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,QACP,QAAQ,CAAC,6CAA6C;AAAA,QACtD,qBAAqB,KAAK,OAAO,OAAO;AAAA,QACxC,WAAW;AAAA,MACb;AAAA,IACF;AAGA,UAAM,eAA8B,CAAC;AACrC,eAAW,eAAe,KAAK,OAAO,QAAQ;AAC5C,YAAM,SAAS,KAAK,cAAc,aAAa,eAAe,YAAY;AAC1E,mBAAa,KAAK,MAAM;AAAA,IAC1B;AAGA,WAAO,KAAK,iBAAiB,YAAY;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBACN,kBACqC;AAErC,aAAS,IAAI,iBAAiB,SAAS,GAAG,KAAK,GAAG,KAAK;AACrD,YAAM,UAAU,iBAAiB,CAAC;AAClC,UAAI,QAAQ,SAAS,eAAe,QAAQ,SAAS;AACnD,YAAI,OAAO,QAAQ,YAAY,YAAY,QAAQ,YAAY,MAAM;AACnE,iBAAO,QAAQ;AAAA,QACjB;AAEA,YAAI,OAAO,QAAQ,YAAY,UAAU;AACvC,cAAI;AACF,mBAAO,sBAAsB,QAAQ,OAAO;AAAA,UAC9C,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,cACN,aACA,eACA,cACa;AACb,UAAM,EAAE,MAAAA,QAAM,OAAO,WAAW,MAAM,SAAS,EAAI,IAAI;AAEvD,UAAM,iBAAiB,YAAY,eAAeA,MAAI;AACtD,UAAM,gBAAgB,YAAY,cAAcA,MAAI;AAGpD,QAAI,kBAAkB,QAAW;AAE/B,aAAO;AAAA,QACL,MAAAA;AAAA,QACA,OAAO;AAAA;AAAA,QACP;AAAA,QACA,KAAK;AAAA,QACL,SAAS,GAAGA,MAAI;AAAA,MAClB;AAAA,IACF;AAGA,QAAI,mBAAmB,QAAW;AAChC,UAAI,UAAU;AACZ,eAAO;AAAA,UACL,MAAAA;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA,KAAK;AAAA,UACL,SAAS,GAAGA,MAAI;AAAA,QAClB;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAAA;AAAA,QACA,OAAO;AAAA;AAAA,QACP,QAAQ;AAAA;AAAA,QACR,KAAK;AAAA,QACL,SAAS,GAAGA,MAAI;AAAA,MAClB;AAAA,IACF;AAGA,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,eAAO,KAAK,aAAaA,QAAM,gBAAgB,eAAe,MAAM;AAAA,MACtE,KAAK;AACH,eAAO,KAAK;AAAA,UACVA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,KAAK;AACH,eAAO,KAAK,YAAYA,QAAM,gBAAgB,eAAe,aAAa,MAAM;AAAA,MAClF;AACE,eAAO;AAAA,UACL,MAAAA;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA,KAAK;AAAA,UACL,SAAS,GAAGA,MAAI,yBAAyB,KAAK;AAAA,QAChD;AAAA,IACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aACNA,QACA,gBACA,eACA,QACa;AAEb,QAAI,UAAU,gBAAgB,aAAa,GAAG;AAC5C,aAAO;AAAA,QACL,MAAAA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,KAAK;AAAA,QACL,SAASA;AAAA,MACX;AAAA,IACF;AAGA,QAAI,OAAO,mBAAmB,OAAO,eAAe;AAClD,aAAO;AAAA,QACL,MAAAA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,KAAK;AAAA,QACL,SAAS,GAAGA,MAAI,wBAAwB,OAAO,cAAc,cAAc,OAAO,aAAa;AAAA,MACjG;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAAA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,KAAK;AAAA,MACL,SAAS,GAAGA,MAAI;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,wBACNA,QACA,gBACA,eACA,aACA,QACa;AACb,UAAM,EAAE,YAAY,GAAG,WAAW,MAAM,IAAI;AAE5C,UAAM,eAAe,SAAS,cAAc;AAC5C,UAAM,cAAc,SAAS,aAAa;AAE1C,QAAI,iBAAiB,QAAQ,gBAAgB,MAAM;AACjD,aAAO;AAAA,QACL,MAAAA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,KAAK;AAAA,QACL,SAAS,GAAGA,MAAI;AAAA,MAClB;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,SAAS,YAAY,KAAK,CAAC,OAAO,SAAS,WAAW,GAAG;AACnE,aAAO;AAAA,QACL,MAAAA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,KAAK;AAAA,QACL,SAAS,GAAGA,MAAI;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,IAAI,eAAe,WAAW;AAChD,QAAI;AAEJ,QAAI,UAAU;AAGZ,YAAM,eAAe,gBAAgB,IAAI,OAAO,OAAO,KAAK,IAAI,WAAW;AAC3E,wBAAkB,gBAAgB;AAAA,IACpC,OAAO;AAEL,wBAAkB,QAAQ;AAAA,IAC5B;AAEA,QAAI,iBAAiB;AACnB,aAAO;AAAA,QACL,MAAAA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,KAAK;AAAA,QACL,SAAS,GAAGA,MAAI,4BAA4B,KAAK,QAAQ,CAAC,CAAC;AAAA,MAC7D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAAA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,KAAK;AAAA,MACL,SAAS,GAAGA,MAAI,6BAA6B,KAAK,QAAQ,CAAC,CAAC,eAAe,SAAS;AAAA,IACtF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YACNA,QACA,gBACA,eACA,aACA,QACa;AACb,UAAM,UAAU,YAAY,WAAW;AAEvC,UAAM,gBAAgB,UAAU,OAAO,cAAc,GAAG,OAAO;AAC/D,UAAM,eAAe,UAAU,OAAO,aAAa,GAAG,OAAO;AAE7D,QAAI,kBAAkB,MAAM;AAC1B,aAAO;AAAA,QACL,MAAAA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,KAAK;AAAA,QACL,SAAS,GAAGA,MAAI;AAAA,MAClB;AAAA,IACF;AAEA,QAAI,iBAAiB,MAAM;AACzB,aAAO;AAAA,QACL,MAAAA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,KAAK;AAAA,QACL,SAAS,GAAGA,MAAI;AAAA,MAClB;AAAA,IACF;AAGA,QACE,cAAc,YAAY,MAAM,aAAa,YAAY,KACzD,cAAc,SAAS,MAAM,aAAa,SAAS,KACnD,cAAc,QAAQ,MAAM,aAAa,QAAQ,GACjD;AACA,aAAO;AAAA,QACL,MAAAA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,KAAK;AAAA,QACL,SAASA;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAAA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,KAAK;AAAA,MACL,SAAS,GAAGA,MAAI,wBAAwB,cAAc,aAAa,CAAC,cAAc,cAAc,YAAY,CAAC;AAAA,IAC/G;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,SAAkD;AACzE,UAAM,cAAc,KAAK,OAAO,eAAe;AAC/C,UAAM,OAAiB,CAAC;AACxB,UAAM,SAAmB,CAAC;AAE1B,eAAW,UAAU,SAAS;AAC5B,UAAI,OAAO,KAAK;AACd,aAAK,KAAK,OAAO,OAAO;AAAA,MAC1B,OAAO;AACL,eAAO,KAAK,OAAO,OAAO;AAAA,MAC5B;AAAA,IACF;AAEA,QAAI;AACJ,QAAI,gBAAgB,kBAAkB;AAEpC,cAAQ,OAAO,WAAW,IAAI,IAAM;AAAA,IACtC,OAAO;AAEL,YAAM,cAAc,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;AAChE,UAAI,gBAAgB,GAAG;AACrB,gBAAQ,QAAQ,WAAW,IAAI,IAAM;AAAA,MACvC,OAAO;AACL,cAAM,cAAc,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC;AAC1E,gBAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,YAAY,GAAG,KAAK,MAAM,IAAI,QAAQ,MAAM;AAElD,WAAO;AAAA,MACL,OAAO,WAAW,KAAK;AAAA,MACvB,SAAS,eAAe,KAAK;AAAA,MAC7B,MAAM,KAAK,MAAM,GAAG,CAAC;AAAA,MACrB,QAAQ,OAAO,MAAM,GAAG,CAAC;AAAA,MACzB,qBAAqB,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,YAAY,KAA8BA,QAAuB;AACxE,MAAI,CAACA,UAAQ,CAAC,KAAK;AACjB,WAAO;AAAA,EACT;AAGA,QAAM,QAAQA,OAAK,MAAM,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC/D,MAAI,UAAmB;AAEvB,aAAW,QAAQ,OAAO;AACxB,QAAI,YAAY,QAAQ,YAAY,QAAW;AAC7C,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,QAAQ,KAAK,IAAI;AACjC,QAAI,WAAW,MAAM,QAAQ,OAAO,GAAG;AACrC,gBAAU,QAAQ,OAAO,SAAS,MAAM,EAAE,CAAC;AAAA,IAC7C,OAAO;AACL,gBAAW,QAAoC,IAAI;AAAA,IACrD;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,SAAS,OAA+B;AAC/C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,MAAM,OAAO,WAAW,KAAK;AACnC,WAAO,OAAO,MAAM,GAAG,IAAI,OAAO;AAAA,EACpC;AACA,SAAO;AACT;AAcA,SAAS,UAAU,SAAiB,SAAyC;AAC3E,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,UAAU,QAAQ,KAAK;AAG7B,QAAM,UAAU,IAAI,KAAK,OAAO;AAChC,MAAI,CAAC,OAAO,MAAM,QAAQ,QAAQ,CAAC,GAAG;AACpC,WAAO;AAAA,EACT;AAGA,QAAM,iBAAiB,QAAQ,MAAM,qCAAqC;AAC1E,MAAI,gBAAgB;AAClB,UAAM,MAAM,OAAO,SAAS,eAAe,CAAC,GAAG,EAAE;AACjD,UAAM,YAAY,eAAe,CAAC,EAAE,YAAY;AAChD,UAAM,OAAO,OAAO,SAAS,eAAe,CAAC,GAAG,EAAE;AAClD,UAAM,QAAQ,YAAY,SAAS;AACnC,QAAI,UAAU,QAAW;AACvB,aAAO,IAAI,KAAK,MAAM,OAAO,GAAG;AAAA,IAClC;AAAA,EACF;AAGA,QAAM,UAAU,QAAQ,MAAM,yCAAyC;AACvE,MAAI,SAAS;AAGX,UAAM,cAAc,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,KAAK,EAAE,SAAS,OAAO,CAAC;AAClF,UAAM,cAAc,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,KAAK,EAAE,SAAS,OAAO,CAAC;AAElF,QAAI,eAAe,CAAC,aAAa;AAC/B,YAAM,QAAQ,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE,IAAI;AAChD,YAAM,MAAM,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE;AAC1C,YAAM,OAAO,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE;AAC3C,UAAI,SAAS,KAAK,SAAS,MAAM,OAAO,KAAK,OAAO,IAAI;AACtD,eAAO,IAAI,KAAK,MAAM,OAAO,GAAG;AAAA,MAClC;AAAA,IACF,WAAW,eAAe,CAAC,aAAa;AACtC,YAAM,MAAM,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE;AAC1C,YAAM,QAAQ,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE,IAAI;AAChD,YAAM,OAAO,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE;AAC3C,UAAI,SAAS,KAAK,SAAS,MAAM,OAAO,KAAK,OAAO,IAAI;AACtD,eAAO,IAAI,KAAK,MAAM,OAAO,GAAG;AAAA,MAClC;AAAA,IACF,OAAO;AAEL,YAAM,OAAO,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE;AAC3C,YAAM,OAAO,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE;AAC3C,YAAM,OAAO,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE;AAG3C,UAAI,OAAO,MAAM,QAAQ,IAAI;AAC3B,eAAO,IAAI,KAAK,MAAM,OAAO,GAAG,IAAI;AAAA,MACtC;AAEA,UAAI,OAAO,MAAM,QAAQ,IAAI;AAC3B,eAAO,IAAI,KAAK,MAAM,OAAO,GAAG,IAAI;AAAA,MACtC;AAEA,UAAI,QAAQ,MAAM,QAAQ,IAAI;AAC5B,eAAO,IAAI,KAAK,MAAM,OAAO,GAAG,IAAI;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,cAAc,MAAoB;AACzC,SAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AACxC;AAKA,SAAS,sBAAsB,MAAuC;AACpE,QAAM,UAAU,OAAO,SAAS,WAAW,KAAK,QAAQ,mBAAmB,EAAE,EAAE,KAAK,IAAI;AACxF,QAAM,QAAQ,QAAQ,MAAM,aAAa;AACzC,QAAM,OAAO,QAAQ,CAAC,KAAK;AAC3B,SAAO,KAAK,MAAM,IAAI;AACxB;AAcA,IAAM,sCAAsC;AAAA;AAAA;AAAA;AAAA;AAYrC,IAAM,qBAAN,MAA8C;AAAA,EAC1C,OAAO;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAoC;AAC9C,SAAK,SAAS,QAAQ;AACtB,SAAK,mBAAmB,QAAQ;AAChC,SAAK,MAAM,QAAQ;AAAA,EACrB;AAAA,EAEA,MAAM,SAAS,SAAsD;AAEnE,UAAM,gBAAgB,MAAM,QAAQ;AAAA,MAClC,KAAK,OAAO,WAAW,IAAI,OAAO,iBAAiB;AACjD,cAAM,YAAY,KAAK,iBAAiB,OAAO,cAAc,OAAO;AACpE,eAAO;AAAA,UACL,IAAI,aAAa;AAAA,UACjB,MAAM,aAAa;AAAA,UACnB,QAAQ,MAAM,UAAU,SAAS,OAAO;AAAA,QAC1C;AAAA,MACF,CAAC;AAAA,IACH;AAGA,WAAO,KAAK,UAAU,eAAe,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAc,UACZ,SACA,SAC0B;AAC1B,UAAM,aAAa,KAAK,OAAO;AAE/B,YAAQ,WAAW,MAAM;AAAA,MACvB,KAAK;AACH,eAAO,KAAK,kBAAkB,SAAS,WAAW,MAAM,WAAW,OAAO,KAAK,GAAG;AAAA,MACpF,KAAK;AACH,eAAO,KAAK,iBAAiB,SAAS,SAAS,UAAU;AAAA,MAC3D;AACE,eAAO,KAAK,mBAAmB,SAAS,WAAW,OAAO;AAAA,IAC9D;AAAA,EACF;AAAA,EAEQ,mBACN,SACA,SACiB;AACjB,QAAI,cAAc;AAClB,QAAI,cAAc;AAClB,UAAM,UAAoB,CAAC;AAC3B,UAAM,YAAsB,CAAC;AAC7B,UAAM,iBAA2B,CAAC;AAClC,UAAM,mBAA2C,CAAC;AAElD,eAAW,UAAU,SAAS;AAC5B,YAAM,SAAS,UAAU,OAAO,EAAE,KAAK;AACvC,qBAAe;AACf,qBAAe,OAAO,OAAO,QAAQ;AACrC,cAAQ,KAAK,GAAG,OAAO,OAAO,KAAK,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;AACpE,gBAAU,KAAK,GAAG,OAAO,OAAO,OAAO,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;AACxE,UAAI,OAAO,OAAO,WAAW;AAC3B,uBAAe,KAAK,GAAG,OAAO,EAAE,KAAK,OAAO,OAAO,SAAS,EAAE;AAAA,MAChE;AAGA,uBAAiB,KAAK;AAAA,QACpB,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,QACb,OAAO,OAAO,OAAO;AAAA,QACrB;AAAA,QACA,SAAS,OAAO,OAAO;AAAA,QACvB,MAAM,CAAC,GAAG,OAAO,OAAO,IAAI;AAAA,QAC5B,QAAQ,CAAC,GAAG,OAAO,OAAO,MAAM;AAAA,QAChC,WAAW,OAAO,OAAO;AAAA,QACzB,qBAAqB,OAAO,OAAO;AAAA,QACnC,kBAAkB,OAAO,OAAO;AAAA,MAClC,CAAC;AAAA,IACH;AAEA,UAAM,aAAa,cAAc,IAAI,cAAc,cAAc;AAEjE,WAAO;AAAA,MACL,OAAO,WAAW,UAAU;AAAA,MAC5B,SAAS,eAAe,UAAU;AAAA,MAClC,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,qBAAqB,KAAK,IAAI,QAAQ,SAAS,UAAU,QAAQ,CAAC;AAAA,MAClE,WAAW,eAAe,SAAS,IAAI,eAAe,KAAK,IAAI,IAAI;AAAA,MACnE,qBAAqB;AAAA,QACnB,YAAY;AAAA,QACZ,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,kBACZ,SACA,YACA,KACA,SAC0B;AAC1B,UAAM,gBAAgB,OAAO,YAAY,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7E,UAAM,eAAe,KAAK,UAAU,EAAE,SAAS,cAAc,GAAG,MAAM,CAAC;AAGvE,UAAM,mBAA2C,QAAQ,IAAI,CAAC,YAAY;AAAA,MACxE,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,MACb,OAAO,OAAO,OAAO;AAAA,MACrB,QAAQ,UAAU,OAAO,EAAE,KAAK;AAAA,MAChC,SAAS,OAAO,OAAO;AAAA,MACvB,MAAM,CAAC,GAAG,OAAO,OAAO,IAAI;AAAA,MAC5B,QAAQ,CAAC,GAAG,OAAO,OAAO,MAAM;AAAA,MAChC,WAAW,OAAO,OAAO;AAAA,MACzB,qBAAqB,OAAO,OAAO;AAAA,MACnC,kBAAkB,OAAO,OAAO;AAAA,IAClC,EAAE;AAEF,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,YAAY,cAAc,QAAW,GAAG;AAC3E,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;AAC7E,YAAM,UACJ,OAAO,QAAQ,YAAY,aAC1B,OAAO,YAAY,UAAU,OAAO,YAAY,UAAU,OAAO,YAAY,gBAC1E,OAAO,UACP,eAAe,KAAK;AAE1B,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,qBAAqB,KAAK,SAAS,OAAO,UAAU;AAAA,QACpD;AAAA,QACA,qBAAqB;AAAA,UACnB,YAAY;AAAA,UACZ,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,QACP,QAAQ,CAAC,2BAA2B,OAAO,EAAE;AAAA,QAC7C,qBAAqB;AAAA,QACrB,WAAW;AAAA,QACX,qBAAqB;AAAA,UACnB,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iBACZ,SACA,SACA,QAC0B;AAC1B,UAAM,gBAAgB,QAAQ;AAC9B,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,iDAAiD;AAAA,IACnE;AAEA,UAAM,gBAAgB,OAAO,YAAY,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7E,UAAM,cAAc,KAAK,UAAU,eAAe,MAAM,CAAC;AAGzD,UAAM,mBAA2C,QAAQ,IAAI,CAAC,YAAY;AAAA,MACxE,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,MACb,OAAO,OAAO,OAAO;AAAA,MACrB,SAAS,OAAO,OAAO;AAAA,MACvB,MAAM,CAAC,GAAG,OAAO,OAAO,IAAI;AAAA,MAC5B,QAAQ,CAAC,GAAG,OAAO,OAAO,MAAM;AAAA,MAChC,WAAW,OAAO,OAAO;AAAA,MACzB,qBAAqB,OAAO,OAAO;AAAA,MACnC,kBAAkB,OAAO,OAAO;AAAA,IAClC,EAAE;AAGF,UAAM,iBAAiB,OAAO,UAAU;AACxC,UAAM,aAAa,eAAe,QAAQ,mCAAmC,WAAW;AAExF,UAAM,eAAe,kBAAkB;AAEvC,UAAM,sBAAkC;AAAA,MACtC,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,QAAQ,cAAc;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,QAAQ,cAAc,kBAAkB;AAC9C,UAAI,OAAO;AACT,cAAM,EAAE,KAAK,IAAI,UAAM,yBAAa;AAAA,UAClC;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAED,cAAMD,QAAO,yBAAyB,MAAM,kBAAkB,IAAI,CAAC;AACnE,cAAME,SAAQ,WAAWF,MAAK,KAAK;AACnC,cAAMG,QAAO,MAAM,QAAQH,MAAK,IAAI,IAAIA,MAAK,KAAK,OAAO,gBAAgB,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC;AAC1F,cAAMI,UAAS,MAAM,QAAQJ,MAAK,MAAM,IACpCA,MAAK,OAAO,OAAO,gBAAgB,EAAE,MAAM,GAAG,CAAC,IAC/C,CAAC;AACL,cAAMK,aAAYL,MAAK;AAEvB,eAAO;AAAA,UACL,OAAAE;AAAA,UACA,SAAS,eAAeA,MAAK;AAAA,UAC7B,MAAAC;AAAA,UACA,QAAAC;AAAA,UACA,qBAAqB,KAAK,IAAID,MAAK,SAASC,QAAO,QAAQ,CAAC;AAAA,UAC5D,WAAAC;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,cAAc,OAAO;AAAA,QAC1C,UAAU;AAAA,QACV;AAAA,QACA,YAAY,QAAQ,SAAS;AAAA,QAC7B,SAAS,QAAQ;AAAA,MACnB,CAAC;AAED,YAAM,OAAO,yBAAyB;AAAA,QACpC,kBAAkB,4BAA4B,SAAS,cAAc,CAAC;AAAA,MACxE;AACA,YAAM,QAAQ,WAAW,KAAK,KAAK;AACnC,YAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO,gBAAgB,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC;AAC1F,YAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,IACpC,KAAK,OAAO,OAAO,gBAAgB,EAAE,MAAM,GAAG,CAAC,IAC/C,CAAC;AACL,YAAM,YAAY,KAAK;AAEvB,aAAO;AAAA,QACL;AAAA,QACA,SAAS,eAAe,KAAK;AAAA,QAC7B;AAAA,QACA;AAAA,QACA,qBAAqB,KAAK,IAAI,KAAK,SAAS,OAAO,QAAQ,CAAC;AAAA,QAC5D;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,QACP,QAAQ,CAAC;AAAA,QACT,qBAAqB;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAcO,IAAM,mBAAN,MAA4C;AAAA,EACxC,OAAO;AAAA,EAEC;AAAA,EAEjB,YAAY,SAAkC;AAC5C,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,SAAS,SAA6C;AACpD,UAAM,EAAE,UAAU,IAAI,KAAK;AAC3B,UAAM,aAAa,QAAQ,cAAc;AAGzC,QAAI,eAAe,QAAW;AAC5B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,QACP,QAAQ,CAAC,qCAAqC;AAAA,QAC9C,qBAAqB;AAAA,QACrB,WAAW;AAAA,QACX,qBAAqB;AAAA,UACnB,MAAM;AAAA,UACN;AAAA,UACA,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,cAAc;AAC7B,UAAM,QAAQ,SAAS,IAAI;AAE3B,WAAO;AAAA,MACL;AAAA,MACA,SAAS,SAAS,SAAS;AAAA,MAC3B,MAAM,SAAS,CAAC,YAAY,UAAU,SAAS,SAAS,cAAc,IAAI,CAAC;AAAA,MAC3E,QAAQ,SAAS,CAAC,IAAI,CAAC,YAAY,UAAU,QAAQ,SAAS,cAAc;AAAA,MAC5E,qBAAqB;AAAA,MACrB,WAAW,kBAAkB,UAAU,kBAAkB,SAAS;AAAA,MAClE,qBAAqB;AAAA,QACnB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAcO,IAAM,gBAAN,MAAyC;AAAA,EACrC,OAAO;AAAA,EAEC;AAAA,EAEjB,YAAY,SAA+B;AACzC,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,SAAS,SAA6C;AACpD,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,UAAM,UAAU,QAAQ,cAAc;AAGtC,QAAI,YAAY,QAAW;AACzB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,QACP,QAAQ,CAAC,iCAAiC;AAAA,QAC1C,qBAAqB;AAAA,QACrB,WAAW;AAAA,QACX,qBAAqB;AAAA,UACnB,MAAM;AAAA,UACN;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,WAAW;AAC1B,UAAM,QAAQ,SAAS,IAAI;AAG3B,UAAM,aAAa,CAAC,MAAc,IAAI,EAAE,QAAQ,CAAC,CAAC;AAElD,WAAO;AAAA,MACL;AAAA,MACA,SAAS,SAAS,SAAS;AAAA,MAC3B,MAAM,SAAS,CAAC,QAAQ,WAAW,OAAO,CAAC,OAAO,WAAW,MAAM,CAAC,SAAS,IAAI,CAAC;AAAA,MAClF,QAAQ,SAAS,CAAC,IAAI,CAAC,QAAQ,WAAW,OAAO,CAAC,MAAM,WAAW,MAAM,CAAC,SAAS;AAAA,MACnF,qBAAqB;AAAA,MACrB,WAAW,kBAAkB,WAAW,OAAO,CAAC,aAAa,WAAW,MAAM,CAAC;AAAA,MAC/E,qBAAqB;AAAA,QACnB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAcO,IAAM,sBAAN,MAA+C;AAAA,EAC3C,OAAO;AAAA,EAEC;AAAA,EAEjB,YAAY,SAAqC;AAC/C,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEA,SAAS,SAA6C;AACpD,UAAM,QAAQ,QAAQ,cAAc;AAEpC,UAAM,WAAW,KAAK,OAAO;AAC7B,UAAM,WAAW,KAAK,OAAO;AAC7B,UAAM,YAAY,KAAK,OAAO;AAE9B,UAAM,sBAAsB,KAAK;AAAA,MAC/B,CAAC,UAAU,UAAU,SAAS,EAAE,OAAO,CAAC,MAAM,OAAO,MAAM,QAAQ,EAAE;AAAA,MACrE;AAAA,IACF;AAEA,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,QACP,QAAQ,CAAC,wCAAwC;AAAA,QACjD;AAAA,QACA,WAAW;AAAA,QACX,qBAAqB;AAAA,UACnB,MAAM;AAAA,UACN,WAAW,YAAY;AAAA,UACvB,WAAW,YAAY;AAAA,UACvB,YAAY,aAAa;AAAA,UACzB,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM;AACpB,UAAM,SAAS,MAAM;AACrB,UAAM,SAAS,MAAM,UAAU;AAC/B,UAAM,QAAQ,QAAQ,SAAS;AAE/B,UAAM,OAAiB,CAAC;AACxB,UAAM,SAAmB,CAAC;AAE1B,QAAI,OAAO,aAAa,UAAU;AAChC,UAAI,SAAS,UAAU;AACrB,aAAK,KAAK,gBAAgB,KAAK,OAAO,QAAQ,EAAE;AAAA,MAClD,OAAO;AACL,eAAO,KAAK,gBAAgB,KAAK,MAAM,QAAQ,EAAE;AAAA,MACnD;AAAA,IACF;AAEA,QAAI,OAAO,cAAc,UAAU;AACjC,UAAI,UAAU,WAAW;AACvB,aAAK,KAAK,iBAAiB,MAAM,OAAO,SAAS,EAAE;AAAA,MACrD,OAAO;AACL,eAAO,KAAK,iBAAiB,MAAM,MAAM,SAAS,EAAE;AAAA,MACtD;AAAA,IACF;AAEA,QAAI,OAAO,aAAa,UAAU;AAChC,UAAI,SAAS,UAAU;AACrB,aAAK,KAAK,gBAAgB,KAAK,OAAO,QAAQ,EAAE;AAAA,MAClD,OAAO;AACL,eAAO,KAAK,gBAAgB,KAAK,MAAM,QAAQ,EAAE;AAAA,MACnD;AAAA,IACF;AAEA,UAAM,SAAS,OAAO,WAAW;AAEjC,WAAO;AAAA,MACL,OAAO,SAAS,IAAI;AAAA,MACpB,SAAS,SAAS,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,qBAAqB,KAAK,YAAY,MAAM,YAAY,MAAM,WAAW,KAAK;AAAA,MACzF,qBAAqB;AAAA,QACnB,MAAM;AAAA,QACN,WAAW,YAAY;AAAA,QACvB,WAAW,YAAY;AAAA,QACvB,YAAY,aAAa;AAAA,QACzB,YAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AI99DA,IAAAC,sBAA2B;AAC3B,IAAAC,qBAAiB;;;ACIjB,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;AAGL,QAAI,CAAC,KAAK,OAAO;AAChB,WAAK,QAAQ;AAAA,IACd;AAEA,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;;;ACvFe,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;;;AFlDA,SAAS,wBAAwB,UAA6B;AAC5D,SAAO,gBAAgB,QAAQ,KAAK,SAAS,SAAS;AACxD;AAmDA,eAAsB,cACpB,SACsC;AACtC,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,WAAW;AAAA,IACX;AAAA,IACA;AAAA,EACF,IAAI;AAGJ,QAAM,YACJ,sBAAuB,MAAM,cAAc,cAAc,UAAU,EAAE,SAAS,OAAO,CAAC;AAExF,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,WAAW,YAAY;AAC5E,0BAAsB,IAAI,MAAM,QAAQ;AACxC,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,OAC3B,kBACkC;AAClC,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,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;AAAA,UACN,uEAAuE,OAAO;AAAA,QAChF;AAAA,MACF;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,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,iBAAiB,wBAAwB,eAAe,IAAI,UAAU;AAC5E,YAAM,eAAe,MAAM,kBAAkB,UAAU,cAAc;AACrE,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,SAaO;AACvC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAGJ,QAAM,mBAAmC,CAAC;AAC1C,QAAM,iBAAiB,wBAAwB,QAAQ,IAAI,UAAU;AAErE,aAAW,YAAY,WAAW;AAChC,UAAM,eAAe,MAAM,kBAAkB,UAAU,cAAc;AACrE,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;AAGxC,UAAM,iBAAiB,iBAAiB;AACxC,UAAM,sBACJ,iBAAiB,eAAe,UAChC,iBAAiB,YAAY,UAC7B,iBAAiB,eAAe;AAElC,UAAM,cAAc,iBAChB,oBAAoB,cAAc,IAClC,sBACE;AAAA,MACE,YAAY;AAAA,MACZ,WAAW,CAAC;AAAA,MACZ,iBAAiB,CAAC;AAAA,MAClB,YAAY;AAAA,IACd,IACA;AAEN,UAAM,eAAe,cACjB,sBAAsB,aAAa;AAAA,MACjC,YAAY,iBAAiB;AAAA,MAC7B,SAAS,iBAAiB;AAAA,MAC1B,YAAY,iBAAiB;AAAA,IAC/B,CAAC,IACD;AAGJ,UAAM,YAAY,4BAA4B,cAAc;AAE5D,UAAM,gBAAgB,qBAAqB,gBAAgB;AAE3D,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,kBAAkB;AAAA,QAC/B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,eAAe,MAAM,qBAAqB,MAAM;AAAA,QAChD;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,UAAI,eAAe;AACjB,iBAAS,EAAE,GAAG,QAAQ,OAAO,cAAc;AAAA,MAC7C;AAAA,IACF,SAAS,OAAO;AACd,YAAM,cAAc;AAAA,QAClB;AAAA,QACA,OAAO;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,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,OAAO,QAAQ,WAAW;AAAA,QAClC,WAAW;AAAA,QACX,aAAa,KAAK,IAAI;AAAA,QACtB,OAAO,OAAO;AAAA,MAChB,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,EACF,IAAI;AAEJ,QAAM,iBAAiB,wBAAwB,QAAQ,IAAI,UAAU;AACrE,QAAM,eAAe,MAAM,kBAAkB,UAAU,cAAc;AAErE,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;AAGA,QAAM,iBAAiB,iBAAiB;AAExC,QAAM,sBACJ,iBAAiB,eAAe,UAChC,iBAAiB,YAAY,UAC7B,iBAAiB,eAAe;AAGlC,QAAM,cAAc,iBAChB,oBAAoB,cAAc,IAClC,sBACE;AAAA,IACE,YAAY;AAAA,IACZ,WAAW,CAAC;AAAA,IACZ,iBAAiB,CAAC;AAAA,IAClB,YAAY;AAAA,EACd,IACA;AAEN,QAAM,eAAe,cACjB,sBAAsB,aAAa;AAAA,IACjC,YAAY,iBAAiB;AAAA,IAC7B,SAAS,iBAAiB;AAAA,IAC1B,YAAY,iBAAiB;AAAA,EAC/B,CAAC,IACD;AAGJ,QAAM,YAAY,4BAA4B,cAAc;AAE5D,QAAM,gBAAgB,qBAAqB,gBAAgB;AAE3D,MAAI;AACF,UAAM,SAAS,MAAM,kBAAkB;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO,gBAAgB,EAAE,GAAG,QAAQ,OAAO,cAAc,IAAI;AAAA,EAC/D,SAAS,OAAO;AACd,WAAO,iBAAiB,UAAU,OAAO,MAAM,MAAM,GAAG,OAAO,cAAc,QAAQ;AAAA,EACvF;AACF;AAEA,eAAe,kBAAkB,SAaH;AAC5B,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,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,IACA;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,MAC5B;AAAA,IACF,OAAO;AACL,0BAAoB;AAAA,QAClB,UAAU,aAAa;AAAA,QACvB,YAAY,aAAa;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW,YAAY,YAAY;AAAA,IACnC,QAAQ,SAAS;AAAA,IACjB,SAAS,SAAS;AAAA,IAClB,gBAAgB,SAAS;AAAA,IACzB,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM;AAAA,IACd,iBAAiB;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,WAAW,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA,0BAA0B,mBAAmB,SAAY,MAAM;AAAA,IAC/D;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,qBAAqB,SAa0C;AAC5E,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,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,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,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,EAAE,MAAM;AACjB;AAEA,eAAe,iBAAiB,SAgB6C;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,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,SAKD,CAAC;AACN,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,cAAM,SAAS,UAAU,UAAU;AACnC,eAAO,KAAK,EAAE,OAAAA,QAAO,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,OAAO,CAAC;AACzE,yBAAiB,KAAK;AAAA,UACpB,MAAM,UAAU;AAAA,UAChB,MAAM,UAAU;AAAA,UAChB,OAAOA,OAAM;AAAA,UACb;AAAA,UACA,SAASA,OAAM;AAAA,UACf,MAAMA,OAAM;AAAA,UACZ,QAAQA,OAAM;AAAA,UACd,WAAWA,OAAM;AAAA,UACjB,0BAA0BA,OAAM;AAAA,QAClC,CAAC;AAAA,MACH;AAEA,UAAI,UAAU,SAAS,QAAQ;AAC7B,cAAM,gBAAgB,IAAI,cAAc;AAAA,UACtC,QAAQ,UAAU;AAAA,UAClB,KAAK,UAAU,eAAe,UAAU;AAAA,UACxC;AAAA,UACA,QAAQ,UAAU;AAAA,QACpB,CAAC;AACD,cAAMA,SAAQ,MAAM,cAAc,SAAS;AAAA,UACzC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,SAAS,UAAU,UAAU;AACnC,eAAO,KAAK,EAAE,OAAAA,QAAO,MAAM,UAAU,MAAM,MAAM,cAAc,OAAO,CAAC;AACvE,yBAAiB,KAAK;AAAA,UACpB,MAAM,UAAU;AAAA,UAChB,MAAM;AAAA,UACN,OAAOA,OAAM;AAAA,UACb;AAAA,UACA,SAASA,OAAM;AAAA,UACf,MAAMA,OAAM;AAAA,UACZ,QAAQA,OAAM;AAAA,UACd,WAAWA,OAAM;AAAA,UACjB,0BAA0BA,OAAM;AAAA,QAClC,CAAC;AAAA,MACH;AAEA,UAAI,UAAU,SAAS,aAAa;AAClC,cAAM,cAAc,SAAS,gBAAgB,CAAC,IAC1C,mBAAAC,QAAK,QAAQ,SAAS,gBAAgB,CAAC,CAAC,IACxC,QAAQ,IAAI;AAEhB,cAAM,kBAAkB,CAAC,iBAAkE;AACzF,kBAAQ,aAAa,MAAM;AAAA,YACzB,KAAK;AACH,qBAAO,kBAAkB;AAAA,YAC3B,KAAK;AACH,qBAAO,IAAI,cAAc;AAAA,gBACvB,QAAQ,aAAa;AAAA,gBACrB,KAAK,aAAa,eAAe,aAAa;AAAA,gBAC9C;AAAA,gBACA,QAAQ,aAAa;AAAA,cACvB,CAAC;AAAA,YACH,KAAK;AACH,qBAAO,IAAI,mBAAmB;AAAA,gBAC5B,QAAQ;AAAA,gBACR,KAAK;AAAA,gBACL,kBAAkB,EAAE,QAAQ,gBAAgB;AAAA,cAC9C,CAAC;AAAA,YACH,KAAK;AACH,qBAAO,IAAI,wBAAwB;AAAA,gBACjC,QAAQ;AAAA,cACV,CAAC;AAAA,YACH,KAAK;AACH,qBAAO,IAAI,uBAAuB;AAAA,gBAChC,QAAQ;AAAA,cACV,CAAC;AAAA,YACH,KAAK;AACH,qBAAO,IAAI,iBAAiB;AAAA,gBAC1B,QAAQ;AAAA,cACV,CAAC;AAAA,YACH,KAAK;AACH,qBAAO,IAAI,cAAc;AAAA,gBACvB,QAAQ;AAAA,cACV,CAAC;AAAA,YACH,KAAK;AACH,qBAAO,IAAI,oBAAoB;AAAA,gBAC7B,QAAQ;AAAA,cACV,CAAC;AAAA,YACH,SAAS;AACP,oBAAM,gBAAgB;AACtB,oBAAM,IAAI,MAAM,4CAA4C,cAAc,IAAI,EAAE;AAAA,YAClF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,qBAAqB,IAAI,mBAAmB;AAAA,UAChD,QAAQ;AAAA,UACR,KAAK;AAAA,UACL,kBAAkB,EAAE,QAAQ,gBAAgB;AAAA,QAC9C,CAAC;AACD,cAAMD,SAAQ,MAAM,mBAAmB,SAAS;AAAA,UAC9C;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,SAAS,UAAU,UAAU;AACnC,eAAO,KAAK,EAAE,OAAAA,QAAO,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,OAAO,CAAC;AACzE,yBAAiB,KAAK;AAAA,UACpB,MAAM,UAAU;AAAA,UAChB,MAAM,UAAU;AAAA,UAChB,OAAOA,OAAM;AAAA,UACb;AAAA,UACA,SAASA,OAAM;AAAA,UACf,MAAMA,OAAM;AAAA,UACZ,QAAQA,OAAM;AAAA,UACd,WAAWA,OAAM;AAAA,UACjB,0BAA0BA,OAAM;AAAA,UAChC,kBAAkB,gBAAgBA,OAAM,gBAAgB;AAAA,QAC1D,CAAC;AAAA,MACH;AAEA,UAAI,UAAU,SAAS,mBAAmB;AACxC,cAAM,sBAAsB,IAAI,wBAAwB;AAAA,UACtD,QAAQ;AAAA,QACV,CAAC;AACD,cAAMA,SAAQ,oBAAoB,SAAS;AAAA,UACzC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,SAAS,UAAU,UAAU;AACnC,eAAO,KAAK,EAAE,OAAAA,QAAO,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,OAAO,CAAC;AACzE,yBAAiB,KAAK;AAAA,UACpB,MAAM,UAAU;AAAA,UAChB,MAAM,UAAU;AAAA,UAChB,OAAOA,OAAM;AAAA,UACb;AAAA,UACA,SAASA,OAAM;AAAA,UACf,MAAMA,OAAM;AAAA,UACZ,QAAQA,OAAM;AAAA,UACd,WAAWA,OAAM;AAAA,QACnB,CAAC;AAAA,MACH;AAEA,UAAI,UAAU,SAAS,kBAAkB;AACvC,cAAM,yBAAyB,IAAI,uBAAuB;AAAA,UACxD,QAAQ;AAAA,QACV,CAAC;AACD,cAAMA,SAAQ,uBAAuB,SAAS;AAAA,UAC5C;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,SAAS,UAAU,UAAU;AACnC,eAAO,KAAK,EAAE,OAAAA,QAAO,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,OAAO,CAAC;AACzE,yBAAiB,KAAK;AAAA,UACpB,MAAM,UAAU;AAAA,UAChB,MAAM,UAAU;AAAA,UAChB,OAAOA,OAAM;AAAA,UACb;AAAA,UACA,SAASA,OAAM;AAAA,UACf,MAAMA,OAAM;AAAA,UACZ,QAAQA,OAAM;AAAA,UACd,WAAWA,OAAM;AAAA,QACnB,CAAC;AAAA,MACH;AAEA,UAAI,UAAU,SAAS,WAAW;AAChC,cAAM,mBAAmB,IAAI,iBAAiB;AAAA,UAC5C,QAAQ;AAAA,QACV,CAAC;AACD,cAAMA,SAAQ,iBAAiB,SAAS;AAAA,UACtC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,SAAS,UAAU,UAAU;AACnC,eAAO,KAAK,EAAE,OAAAA,QAAO,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,OAAO,CAAC;AACzE,yBAAiB,KAAK;AAAA,UACpB,MAAM,UAAU;AAAA,UAChB,MAAM,UAAU;AAAA,UAChB,OAAOA,OAAM;AAAA,UACb;AAAA,UACA,SAASA,OAAM;AAAA,UACf,MAAMA,OAAM;AAAA,UACZ,QAAQA,OAAM;AAAA,UACd,WAAWA,OAAM;AAAA,QACnB,CAAC;AAAA,MACH;AAEA,UAAI,UAAU,SAAS,QAAQ;AAC7B,cAAM,gBAAgB,IAAI,cAAc;AAAA,UACtC,QAAQ;AAAA,QACV,CAAC;AACD,cAAMA,SAAQ,cAAc,SAAS;AAAA,UACnC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,SAAS,UAAU,UAAU;AACnC,eAAO,KAAK,EAAE,OAAAA,QAAO,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,OAAO,CAAC;AACzE,yBAAiB,KAAK;AAAA,UACpB,MAAM,UAAU;AAAA,UAChB,MAAM,UAAU;AAAA,UAChB,OAAOA,OAAM;AAAA,UACb;AAAA,UACA,SAASA,OAAM;AAAA,UACf,MAAMA,OAAM;AAAA,UACZ,QAAQA,OAAM;AAAA,UACd,WAAWA,OAAM;AAAA,QACnB,CAAC;AAAA,MACH;AAEA,UAAI,UAAU,SAAS,eAAe;AACpC,cAAM,sBAAsB,IAAI,oBAAoB;AAAA,UAClD,QAAQ;AAAA,QACV,CAAC;AACD,cAAMA,SAAQ,oBAAoB,SAAS;AAAA,UACzC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,SAAS,UAAU,UAAU;AACnC,eAAO,KAAK,EAAE,OAAAA,QAAO,MAAM,UAAU,MAAM,MAAM,UAAU,MAAM,OAAO,CAAC;AACzE,yBAAiB,KAAK;AAAA,UACpB,MAAM,UAAU;AAAA,UAChB,MAAM,UAAU;AAAA,UAChB,OAAOA,OAAM;AAAA,UACb;AAAA,UACA,SAASA,OAAM;AAAA,UACf,MAAMA,OAAM;AAAA,UACZ,QAAQA,OAAM;AAAA,UACd,WAAWA,OAAM;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAM,gBAAiC;AAAA,QACrC,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM,CAAC;AAAA,QACP,QAAQ,CAAC,cAAc,UAAU,IAAI,aAAa,OAAO,EAAE;AAAA,QAC3D,qBAAqB;AAAA,QACrB,WAAW;AAAA,MACb;AACA,YAAM,aAAa,UAAU,SAAS,SAAS,eAAe,UAAU;AACxE,YAAM,SAAS,UAAU,UAAU;AACnC,aAAO,KAAK;AAAA,QACV,OAAO;AAAA,QACP,MAAM,UAAU,QAAQ;AAAA,QACxB,MAAM,cAAc;AAAA,QACpB;AAAA,MACF,CAAC;AACD,uBAAiB,KAAK;AAAA,QACpB,MAAM,UAAU,QAAQ;AAAA,QACxB,MAAM,cAAc;AAAA,QACpB,OAAO;AAAA,QACP;AAAA,QACA,SAAS;AAAA,QACT,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,IACZ;AAAA,IACE,OAAO,IAAI,CAAC,WAAW,EAAE,OAAO,MAAM,MAAM,OAAO,QAAQ,MAAM,OAAO,EAAE;AAAA,EAC5E,IACA;AACN,QAAM,OAAO,OAAO,QAAQ,CAAC,UAAU,MAAM,MAAM,IAAI;AACvD,QAAM,SAAS,OAAO,QAAQ,CAAC,UAAU,MAAM,MAAM,MAAM;AAC3D,QAAM,sBAAsB,OAAO;AAAA,IACjC,CAAC,OAAO,UAAU,SAAS,MAAM,MAAM,uBAAuB;AAAA,IAC9D;AAAA,EACF;AACA,QAAM,iBAAiB,OACpB,IAAI,CAAC,UAAW,MAAM,MAAM,YAAY,GAAG,MAAM,IAAI,KAAK,MAAM,MAAM,SAAS,KAAK,MAAU,EAC9F,OAAOE,iBAAgB;AAC1B,QAAM,YAAY,eAAe,SAAS,IAAI,eAAe,KAAK,KAAK,IAAI;AAE3E,QAAM,QAAyB;AAAA,IAC7B,OAAO;AAAA,IACP,SAASC,gBAAe,cAAc;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,iBAAiB;AACnC;AAEA,eAAe,qBAAqB,SAaP;AAC3B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,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,QAGH;AAC9B,MAAI,OAAO,YAAY;AACrB,QAAI;AACF,YAAM,UAAU,MAAM,aAAa,OAAO,UAAU;AACpD,aAAO;AAAA,IACT,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,SAASD,kBAAiB,OAAiC;AACzD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAC5D;AAEA,SAASC,gBAAe,OAAkC;AACxD,MAAI,SAAS,KAAK;AAChB,WAAO;AAAA,EACT;AACA,MAAI,SAAS,KAAK;AAChB,WAAO;AAAA,EACT;AACA,SAAO;AACT;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,eACb,UACA,SAQ2B;AAC3B,QAAM,EAAE,UAAU,cAAc,SAAS,gBAAgB,OAAO,IAAI;AAEpE,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,iBAAiB,WAAW,MAAM,WAAW,MAAM,GAAG,cAAc,IAAI;AAExF,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,QAAQ,SAAS;AAAA,IACjB,SAAS,SAAS;AAAA,IAClB,gBAAgB,SAAS;AAAA,IACzB,OAAO;AAAA,IACP,MAAM,CAAC;AAAA,IACP,QAAQ,CAAC,UAAU,OAAO,EAAE;AAAA,IAC5B,iBAAiB,mBAAmB,OAAO;AAAA,IAC3C,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,UAAgD;AAC5E,QAAM,MAAM,SAAS;AACrB,MAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG;AACzD,WAAO;AAAA,EACT;AAEA,QAAM,QAAS,IAAgC;AAC/C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;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,MACE,OAAO,iBAAiB,eACxB,iBAAiB,gBACjB,MAAM,SAAS,cACf;AACA,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;AAEA,SAAS,gBACP,UACwC;AACxC,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,IAAI,CAAC,WAAW;AAAA,IAC9B,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM;AAAA,IACd,WAAW,MAAM;AAAA,IACjB,0BAA0B,MAAM;AAAA,IAChC,kBAAkB,gBAAgB,MAAM,gBAAgB;AAAA,EAC1D,EAAE;AACJ;AAMA,SAAS,oBACP,SACQ;AACR,MAAI,cAAc;AAClB,MAAI,cAAc;AAElB,aAAW,SAAS,SAAS;AAC3B,UAAM,SAAS,MAAM,UAAU;AAC/B,mBAAe;AACf,mBAAe,MAAM,QAAQ;AAAA,EAC/B;AAEA,SAAO,cAAc,IAAI,cAAc,cAAc;AACvD;;;AGt7CA,IAAAC,aAA6B;AAC7B,IAAAC,cAAkB;AAKlB,IAAM,mBAAmB,cAAE,OAAO;AAAA,EAChC,IAAI,cAAE,OAAO,EAAE,SAAS,gEAAgE;AAAA,EACxF,aAAa,cAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,EAC9D,QAAQ,cAAE,OAAO,EAAE,QAAQ,CAAG,EAAE,SAAS,mCAAmC;AAAA,EAC5E,UAAU,cAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,yCAAyC;AACxF,CAAC;AAED,IAAM,yBAAyB,cAAE,OAAO;AAAA,EACtC,SAAS,cAAE,MAAM,gBAAgB,EAAE,SAAS,4BAA4B;AAC1E,CAAC;AAYD,eAAsB,gBACpB,SACgC;AAChC,QAAM,EAAE,iBAAiB,UAAU,iBAAiB,SAAS,IAAI;AAEjE,QAAM,SAAS,YAAY,iBAAiB,UAAU,eAAe;AAErE,QAAM,QAAQ,SAAS,kBAAkB;AACzC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,QAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaf,MAAI;AACJ,MAAI;AAEJ,WAAS,UAAU,GAAG,WAAW,GAAG,WAAW;AAC7C,QAAI;AACF,YAAM,EAAE,KAAK,IAAI,UAAM,yBAAa;AAAA,QAClC;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,UAAU,KAAK,QAAQ,mBAAmB,EAAE,EAAE,KAAK;AACzD,eAAS,uBAAuB,MAAM,KAAK,MAAM,OAAO,CAAC;AACzD;AAAA,IACF,SAAS,GAAY;AACnB,kBAAY,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AAAA,IAE1D;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,uDAAuD,WAAW,OAAO,EAAE;AAAA,EAC7F;AAEA,SAAO,OAAO;AAChB;AAEA,SAAS,YAAY,iBAAyB,UAAmB,iBAAkC;AACjG,QAAM,QAAkB;AAAA,IACtB;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;AAEA,MAAI,YAAY,SAAS,KAAK,EAAE,SAAS,GAAG;AAC1C,UAAM,KAAK,wBAAwB,UAAU,EAAE;AAAA,EACjD;AAEA,MAAI,mBAAmB,gBAAgB,KAAK,EAAE,SAAS,GAAG;AACxD,UAAM,KAAK,gCAAgC,iBAAiB,EAAE;AAAA,EAChE;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ApC/FO,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","import_promises","ANSI_YELLOW","ANSI_RESET","ANSI_YELLOW","ANSI_RESET","isJsonObject","logWarning","asString","weight","path","promptPath","import_promises","import_node_path","ANSI_YELLOW","ANSI_RESET","asString","logWarning","path","asString","logWarning","ANSI_YELLOW","ANSI_RESET","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_node_fs","import_promises","import_node_path","import_node_path","path","DEFAULT_SYSTEM_PROMPT","path","readFile","fileExists","access","import_node_child_process","import_promises","import_node_os","import_node_path","execWithCallback","formatTimeoutSuffix","fs","normalizeInputFiles","path","os","import_node_child_process","import_node_crypto","import_node_fs","import_promises","import_node_os","import_node_path","import_node_util","GLOBAL_LOGS_KEY","GLOBAL_SUBSCRIBERS_KEY","getSubscriberStore","notifySubscribers","execAsync","execCallback","WORKSPACE_PREFIX","PROMPT_FILENAME","DEFAULT_SYSTEM_PROMPT","path","formatTimeoutSuffix","pickDetail","buildLogFilename","formatElapsed","sanitizeForFilename","tryParseJsonValue","extractTextContent","extractToolCalls","import_node_child_process","import_node_crypto","import_node_fs","import_promises","import_node_os","import_node_path","GLOBAL_LOGS_KEY","GLOBAL_SUBSCRIBERS_KEY","getSubscriberStore","notifySubscribers","WORKSPACE_PREFIX","PROMPT_FILENAME","DEFAULT_SYSTEM_PROMPT","path","formatTimeoutSuffix","pickDetail","extractOutputMessages","extractAssistantText","buildLogFilename","formatElapsed","sanitizeForFilename","tryParseJsonValue","event","extractTextContent","extractToolCalls","import_node_path","import_zod","path","import_node_path","buildPromptDocument","collectGuidelineFiles","buildMandatoryPrereadBlock","path","pathToFileUri","path","import_node_fs","import_promises","import_node_path","import_yaml","fileExists","path","import_ai","import_zod","spawn","mkdir","readFile","rm","writeFile","tmpdir","path","randomUUID","data","path","score","hits","misses","reasoning","import_node_crypto","import_node_path","score","path","isNonEmptyString","scoreToVerdict","import_ai","import_zod"]}
|