agentv 4.37.0-next.1 → 4.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{artifact-writer-GFNKYREE.js → artifact-writer-MK5X5MSO.js} +4 -4
- package/dist/{chunk-P4LSNFZR.js → chunk-3G4BK6Z5.js} +21 -20
- package/dist/{chunk-P4LSNFZR.js.map → chunk-3G4BK6Z5.js.map} +1 -1
- package/dist/{chunk-N6E5XFOM.js → chunk-DKUAETXE.js} +3 -3
- package/dist/{chunk-M7AMFWBZ.js → chunk-EKMMIULD.js} +42 -37
- package/dist/chunk-EKMMIULD.js.map +1 -0
- package/dist/{chunk-OYI35QFW.js → chunk-NLTIK3LV.js} +32 -250
- package/dist/chunk-NLTIK3LV.js.map +1 -0
- package/dist/{chunk-RL4S2FBZ.js → chunk-VBHHZQS6.js} +902 -488
- package/dist/chunk-VBHHZQS6.js.map +1 -0
- package/dist/cli.js +5 -5
- package/dist/dashboard/assets/index-BpnllKET.css +1 -0
- package/dist/dashboard/assets/index-Cm9SUopp.js +118 -0
- package/dist/dashboard/assets/{index-BDRYJsGF.js → index-SIl6NbIJ.js} +1 -1
- package/dist/dashboard/index.html +2 -2
- package/dist/{dist-OY3JSP6Z.js → dist-HVLBDG5F.js} +17 -13
- package/dist/index.js +5 -5
- package/dist/{interactive-CQELHITQ.js → interactive-QFAAM4SI.js} +5 -5
- package/dist/skills/agentv-eval-writer/SKILL.md +28 -36
- package/dist/skills/agentv-eval-writer/references/eval-schema.json +57 -210
- package/dist/{ts-eval-loader-RBTB2HG2-H5TRXZLO.js → ts-eval-loader-TJT6BGFF-DI7XNSO4.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-M7AMFWBZ.js.map +0 -1
- package/dist/chunk-OYI35QFW.js.map +0 -1
- package/dist/chunk-RL4S2FBZ.js.map +0 -1
- package/dist/dashboard/assets/index-9tV-u4HJ.css +0 -1
- package/dist/dashboard/assets/index-DuESU7zZ.js +0 -118
- /package/dist/{artifact-writer-GFNKYREE.js.map → artifact-writer-MK5X5MSO.js.map} +0 -0
- /package/dist/{chunk-N6E5XFOM.js.map → chunk-DKUAETXE.js.map} +0 -0
- /package/dist/{dist-OY3JSP6Z.js.map → dist-HVLBDG5F.js.map} +0 -0
- /package/dist/{interactive-CQELHITQ.js.map → interactive-QFAAM4SI.js.map} +0 -0
- /package/dist/{ts-eval-loader-RBTB2HG2-H5TRXZLO.js.map → ts-eval-loader-TJT6BGFF-DI7XNSO4.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/src/evaluation/loaders/eval-yaml-transpiler.ts","../../../packages/core/src/evaluation/config.ts","../../../packages/core/src/evaluation/generators/rubric-generator.ts","../../../packages/core/src/evaluation/workspace/deps-scanner.ts","../../../packages/core/src/evaluation/results-repo.ts","../../../packages/core/src/project-sync.ts","../../../packages/core/src/evaluation/baseline.ts","../../../packages/core/src/evaluation/category.ts","../../../packages/core/src/observability/otel-exporter.ts","../../../packages/core/src/evaluation/run-budget-tracker.ts","../../../packages/core/src/evaluation/hooks.ts","../../../packages/core/src/import/claude-parser.ts","../../../packages/core/src/import/codex-parser.ts","../../../packages/core/src/import/codex-session-discovery.ts","../../../packages/core/src/import/session-discovery.ts","../../../packages/core/src/import/types.ts","../../../packages/core/src/import/transcript-provider.ts","../../../packages/core/src/index.ts"],"sourcesContent":["/**\n * EVAL.yaml → evals.json transpiler.\n *\n * Converts an AgentV EVAL.yaml file into Agent Skills evals.json format\n * for consumption by the skill-creator pipeline.\n *\n * Handles both `assertions:` (current) and `assert:` (deprecated alias).\n */\n\nimport { readFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { parseYamlValue } from '../yaml-loader.js';\n\n// ---------------------------------------------------------------------------\n// evals.json output types\n// ---------------------------------------------------------------------------\n\nexport interface EvalsJsonCase {\n id: number;\n prompt: string;\n expected_output?: string;\n files?: string[];\n should_trigger?: boolean;\n assertions: string[];\n}\n\nexport interface EvalsJsonFile {\n skill_name: string;\n evals: EvalsJsonCase[];\n}\n\n// ---------------------------------------------------------------------------\n// Raw YAML input types (unvalidated)\n// ---------------------------------------------------------------------------\n\ntype RawContent =\n | string\n | Array<{ type?: string; value?: string; [key: string]: unknown }>\n | unknown;\n\ninterface RawMessage {\n role?: string;\n content?: RawContent;\n [key: string]: unknown;\n}\n\ninterface RawAssertEntry {\n type?: string;\n skill?: string;\n should_trigger?: boolean;\n criteria?: string;\n value?: string;\n name?: string;\n description?: string;\n command?: unknown;\n prompt?: string;\n rubrics?: unknown[];\n expected?: unknown[];\n fields?: unknown[];\n threshold?: number;\n budget?: number;\n [key: string]: unknown;\n}\n\ninterface RawTestCase {\n id?: string | number;\n criteria?: string;\n input?: string | RawMessage[] | { [key: string]: unknown };\n input_files?: string[];\n expected_output?: string | RawMessage[] | unknown;\n assertions?: RawAssertEntry[];\n /** @deprecated Use `assertions` instead */\n assert?: RawAssertEntry[];\n [key: string]: unknown;\n}\n\ninterface RawSuite {\n tests?: RawTestCase[];\n assertions?: RawAssertEntry[];\n /** @deprecated Use `assertions` instead */\n assert?: RawAssertEntry[];\n [key: string]: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Assertion → natural language conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Build an NL instruction string for a code grader that tells the grading agent\n * how to execute it via `agentv eval assert`.\n *\n * The `<agent_output>` and `<original_prompt>` placeholders are substituted\n * by the grading agent at evaluation time.\n */\nfunction codeGraderInstruction(graderName: string, description?: string): string {\n const desc = description ? ` This grader: ${description}.` : '';\n return `Run \\`agentv eval assert ${graderName} --agent-output <agent_output> --agent-input <original_prompt>\\` and check the result.${desc} The command accepts --agent-output (the agent's full response text) and --agent-input (the original user prompt). It returns JSON on stdout: {\"score\": 0-1, \"reasoning\": \"...\"}. A score >= 0.5 means pass (exit 0); below 0.5 means fail (exit 1).`;\n}\n\n/**\n * Derive a grader name from a command array by finding the first argument\n * with a recognised script extension (e.g. `['bun', 'run', '.agentv/graders/format-checker.ts']` → `'format-checker'`).\n */\nfunction deriveGraderNameFromCommand(command: unknown): string | undefined {\n if (!Array.isArray(command) || command.length === 0) return undefined;\n for (const arg of command) {\n if (typeof arg !== 'string') continue;\n const match = arg.match(/([^/]+)\\.(ts|js|mts|mjs)$/);\n if (match) return match[1] || undefined;\n }\n return undefined;\n}\n\nfunction assertionToNaturalLanguage(entry: RawAssertEntry): string | null {\n const type = entry.type;\n\n switch (type) {\n case 'skill-trigger':\n // Handled separately — not an NL assertion\n return null;\n\n case 'rubrics': {\n // criteria may be a string (NL) or array of rubric items\n if (typeof entry.criteria === 'string') {\n return entry.criteria;\n }\n return null;\n }\n\n case 'contains':\n return `Output contains '${entry.value}'`;\n\n case 'contains-any':\n case 'contains_any': {\n const values = Array.isArray(entry.value)\n ? (entry.value as string[]).join(\"', '\")\n : entry.value;\n return `Output contains any of: '${values}'`;\n }\n\n case 'contains-all':\n case 'contains_all': {\n const values = Array.isArray(entry.value)\n ? (entry.value as string[]).join(\"', '\")\n : entry.value;\n return `Output contains all of: '${values}'`;\n }\n\n case 'icontains':\n return `Output contains (case-insensitive) '${entry.value}'`;\n\n case 'regex':\n return `Output matches regex: ${entry.value}`;\n\n case 'equals':\n return `Output exactly equals: ${entry.value}`;\n\n case 'is-json':\n case 'is_json':\n return 'Output is valid JSON';\n\n case 'starts-with':\n case 'starts_with':\n return `Output starts with '${entry.value}'`;\n\n case 'ends-with':\n case 'ends_with':\n return `Output ends with '${entry.value}'`;\n\n case 'llm-grader':\n case 'llm_grader': {\n // Expand each rubric item to its own assertion string\n // Return the first one — callers handle arrays via assertionToNaturalLanguageList\n if (Array.isArray(entry.rubrics) && entry.rubrics.length > 0) {\n return null; // handled by list expansion below\n }\n return typeof entry.prompt === 'string' ? entry.prompt : null;\n }\n\n case 'tool-trajectory':\n case 'tool_trajectory': {\n const expectedArr = Array.isArray(entry.expected) ? entry.expected : [];\n const tools = (expectedArr as Array<{ tool?: string }>)\n .map((e) => e.tool)\n .filter(Boolean)\n .join(', ');\n return tools\n ? `Agent called tools in order: ${tools}`\n : 'Agent followed expected tool trajectory';\n }\n\n case 'code-grader':\n case 'code_grader': {\n const graderName = entry.name ?? deriveGraderNameFromCommand(entry.command) ?? 'code-grader';\n const desc = typeof entry.description === 'string' ? entry.description : undefined;\n return codeGraderInstruction(graderName, desc);\n }\n\n case 'field-accuracy':\n case 'field_accuracy': {\n const fieldPaths = Array.isArray(entry.fields)\n ? (entry.fields as Array<{ path?: string }>)\n .map((f) => f.path)\n .filter(Boolean)\n .join(', ')\n : '';\n return fieldPaths\n ? `Fields ${fieldPaths} match expected values`\n : 'Fields match expected values';\n }\n\n case 'latency':\n return typeof entry.threshold === 'number'\n ? `Response time under ${entry.threshold}ms`\n : 'Response time within threshold';\n\n case 'cost':\n return typeof entry.budget === 'number'\n ? `Cost under $${entry.budget}`\n : 'Cost within budget';\n\n case 'token-usage':\n case 'token_usage':\n return 'Token usage within limits';\n\n case 'execution-metrics':\n case 'execution_metrics':\n return 'Execution within metric bounds';\n\n default: {\n // Unknown type with a command → treat as code grader\n if (entry.command !== undefined && type) {\n return codeGraderInstruction(deriveGraderNameFromCommand(entry.command) ?? type);\n }\n // Fallback: try to produce something readable\n if (typeof entry.criteria === 'string') return entry.criteria;\n if (typeof entry.prompt === 'string') return entry.prompt;\n return type ? `${type} assertion` : null;\n }\n }\n}\n\n/**\n * Expand a single assertion entry into zero or more NL strings.\n * Most assertions produce exactly one string; llm-grader with rubrics expands to many.\n */\nfunction assertionToNaturalLanguageList(entry: RawAssertEntry): string[] {\n if (entry.type === 'llm-grader' || entry.type === 'llm_grader') {\n if (Array.isArray(entry.rubrics) && entry.rubrics.length > 0) {\n return (entry.rubrics as Array<{ outcome?: string; criteria?: string; id?: string }>)\n .map((r) => r.outcome ?? r.criteria ?? r.id)\n .filter((s): s is string => typeof s === 'string');\n }\n }\n const nl = assertionToNaturalLanguage(entry);\n return nl !== null ? [nl] : [];\n}\n\n/**\n * Extract skill-trigger entries from an assertion list.\n * Returns entries with type === 'skill-trigger'.\n */\nfunction extractTriggerAssertions(assertions: RawAssertEntry[]): RawAssertEntry[] {\n return assertions.filter((a) => a.type === 'skill-trigger');\n}\n\n/**\n * Collect all assertion entries for a test case, accepting both\n * `assertions` and deprecated `assert` key.\n */\nfunction resolveAssertions(rawCase: RawTestCase): RawAssertEntry[] {\n if (Array.isArray(rawCase.assertions)) return rawCase.assertions;\n if (Array.isArray(rawCase.assert)) return rawCase.assert;\n return [];\n}\n\n/**\n * Collect suite-level assertions (applied to every test).\n */\nfunction resolveSuiteAssertions(suite: RawSuite): RawAssertEntry[] {\n if (Array.isArray(suite.assertions)) return suite.assertions;\n if (Array.isArray(suite.assert)) return suite.assert;\n return [];\n}\n\n// ---------------------------------------------------------------------------\n// Input extraction\n// ---------------------------------------------------------------------------\n\ninterface ExtractedInput {\n prompt: string;\n files: string[];\n}\n\n/**\n * Extract prompt text and file paths from a test case input.\n *\n * Supports:\n * - String input → prompt, no files\n * - Message array with role: user and content blocks\n * - input_files shorthand (alongside string or message-array input)\n */\nfunction extractInput(rawCase: RawTestCase): ExtractedInput {\n const files: string[] = Array.isArray(rawCase.input_files)\n ? (rawCase.input_files as string[]).filter((f) => typeof f === 'string')\n : [];\n\n const input = rawCase.input;\n\n if (typeof input === 'string') {\n return { prompt: input, files };\n }\n\n if (Array.isArray(input)) {\n let prompt = '';\n for (const msg of input as RawMessage[]) {\n if (msg.role !== 'user') continue;\n if (typeof msg.content === 'string') {\n prompt = msg.content;\n } else if (Array.isArray(msg.content)) {\n for (const block of msg.content as Array<{ type?: string; value?: string }>) {\n if (block.type === 'text' && typeof block.value === 'string') prompt = block.value;\n else if (block.type === 'file' && typeof block.value === 'string')\n files.push(block.value);\n }\n }\n }\n return { prompt, files };\n }\n\n return { prompt: '', files };\n}\n\n/**\n * Flatten expected_output to a string.\n * Accepts string, message array (takes last assistant message content),\n * or any other value serialized to JSON.\n */\nfunction extractExpectedOutput(raw: unknown): string | undefined {\n if (raw === undefined || raw === null) return undefined;\n if (typeof raw === 'string') return raw;\n\n if (Array.isArray(raw)) {\n // Take the last assistant message content\n for (let i = raw.length - 1; i >= 0; i--) {\n const msg = raw[i] as RawMessage;\n if (typeof msg.content === 'string') return msg.content;\n }\n return undefined;\n }\n\n return JSON.stringify(raw);\n}\n\n// ---------------------------------------------------------------------------\n// Transpiler core\n// ---------------------------------------------------------------------------\n\n/**\n * Result of transpiling a single EVAL.yaml.\n * May produce multiple evals.json files (one per skill).\n */\nexport interface TranspileResult {\n /** Map from skill_name → EvalsJsonFile */\n files: Map<string, EvalsJsonFile>;\n /** Warning messages accumulated during transpilation */\n warnings: string[];\n}\n\n/**\n * Transpile a parsed EVAL.yaml object into one or more evals.json objects.\n *\n * @param suite Parsed YAML object (already loaded, no file I/O here)\n * @param source Source identifier for error messages (e.g. file path)\n */\nexport function transpileEvalYaml(suite: unknown, source = 'EVAL.yaml'): TranspileResult {\n const warnings: string[] = [];\n const files = new Map<string, EvalsJsonFile>();\n\n if (typeof suite !== 'object' || suite === null) {\n throw new Error(`Invalid EVAL.yaml: expected an object in '${source}'`);\n }\n\n const rawSuite = suite as RawSuite;\n\n if (!Array.isArray(rawSuite.tests)) {\n throw new Error(`Invalid EVAL.yaml: missing 'tests' array in '${source}'`);\n }\n\n if (rawSuite.assert !== undefined && rawSuite.assertions === undefined) {\n warnings.push(\"'assert' is deprecated at the suite level. Use 'assertions' instead.\");\n }\n\n const suiteAssertions = resolveSuiteAssertions(rawSuite);\n\n // Suite-level NL assertions (appended to every test)\n const suiteNlAssertions: string[] = suiteAssertions\n .filter((a) => a.type !== 'skill-trigger')\n .flatMap(assertionToNaturalLanguageList);\n\n /**\n * Helper: get or create the EvalsJsonFile for a skill.\n */\n function getSkillFile(skillName: string): EvalsJsonFile {\n const existing = files.get(skillName);\n if (existing) return existing;\n const created: EvalsJsonFile = { skill_name: skillName, evals: [] };\n files.set(skillName, created);\n return created;\n }\n\n const tests = rawSuite.tests as RawTestCase[];\n\n for (let idx = 0; idx < tests.length; idx++) {\n const rawCase = tests[idx];\n const caseAssertions = resolveAssertions(rawCase);\n\n if (rawCase.assert !== undefined && rawCase.assertions === undefined) {\n const caseId = rawCase.id ?? idx + 1;\n warnings.push(`Test '${caseId}': 'assert' is deprecated. Use 'assertions' instead.`);\n }\n\n // Collect NL assertions (not skill-trigger)\n const nlAssertions: string[] = [];\n\n // Prepend test-level criteria as NL assertion\n if (typeof rawCase.criteria === 'string' && rawCase.criteria.trim()) {\n nlAssertions.push(rawCase.criteria.trim());\n }\n\n for (const entry of caseAssertions) {\n if (entry.type !== 'skill-trigger') {\n nlAssertions.push(...assertionToNaturalLanguageList(entry));\n }\n }\n\n // Append suite-level NL assertions\n nlAssertions.push(...suiteNlAssertions);\n\n const triggerJudges = extractTriggerAssertions(caseAssertions);\n const { prompt, files: inputFiles } = extractInput(rawCase);\n const expectedOutput = extractExpectedOutput(rawCase.expected_output);\n\n // Build the numeric id (1-based index)\n const numericId = idx + 1;\n\n // Build the base case (without should_trigger — added per-skill below)\n const baseCase: Omit<EvalsJsonCase, 'should_trigger'> & { should_trigger?: boolean } = {\n id: numericId,\n prompt,\n ...(expectedOutput !== undefined && { expected_output: expectedOutput }),\n ...(inputFiles.length > 0 && { files: inputFiles }),\n assertions: nlAssertions,\n };\n\n if (triggerJudges.length === 0) {\n // No skill-trigger: place in dominant skill (or _no-skill)\n // Determine dominant skill by scanning all tests (first occurrence wins)\n // We defer this: record with a sentinel and resolve after all tests are processed.\n // For now, push to _no-skill; we'll re-assign at the end.\n const noSkillFile = getSkillFile('_no-skill');\n noSkillFile.evals.push({ ...baseCase });\n } else {\n // Place in each skill with the correct should_trigger value\n for (const tj of triggerJudges) {\n const skillName = typeof tj.skill === 'string' ? tj.skill : '_no-skill';\n const shouldTrigger = tj.should_trigger !== false; // default true\n const skillFile = getSkillFile(skillName);\n skillFile.evals.push({ ...baseCase, should_trigger: shouldTrigger });\n }\n }\n }\n\n // Re-assign _no-skill tests to the dominant skill (if one exists)\n const noSkillFile = files.get('_no-skill');\n if (noSkillFile && noSkillFile.evals.length > 0) {\n // Find the skill with the most tests (among real skills)\n let dominantSkill: string | null = null;\n let maxCount = 0;\n for (const [name, f] of files) {\n if (name !== '_no-skill' && f.evals.length > maxCount) {\n maxCount = f.evals.length;\n dominantSkill = name;\n }\n }\n\n if (dominantSkill) {\n const targetFile = getSkillFile(dominantSkill);\n for (const evalCase of noSkillFile.evals) {\n targetFile.evals.push(evalCase);\n }\n files.delete('_no-skill');\n }\n // else: keep _no-skill if there are no other skills\n }\n\n return { files, warnings };\n}\n\n// ---------------------------------------------------------------------------\n// File-level API\n// ---------------------------------------------------------------------------\n\n/**\n * Transpile an EVAL.yaml file into one or more evals.json objects.\n * Returns a map from output filename → JSON content.\n *\n * @param evalYamlPath Absolute path to the EVAL.yaml file\n */\nexport function transpileEvalYamlFile(evalYamlPath: string): TranspileResult {\n const content = readFileSync(evalYamlPath, 'utf8');\n const parsed = parseYamlValue(content);\n return transpileEvalYaml(parsed, path.basename(evalYamlPath));\n}\n\n/**\n * Determine the output filename(s) for a transpile result.\n * Single skill → \"evals.json\"\n * Multiple skills → \"<skill>.evals.json\"\n */\nexport function getOutputFilenames(result: TranspileResult): Map<string, string> {\n const names = new Map<string, string>();\n if (result.files.size === 1) {\n for (const [skill] of result.files) {\n names.set(skill, 'evals.json');\n }\n } else {\n for (const [skill] of result.files) {\n const safeName = skill.replace(/[^a-zA-Z0-9_-]/g, '_');\n names.set(skill, `${safeName}.evals.json`);\n }\n }\n return names;\n}\n","/**\n * Typed configuration file support for AgentV.\n *\n * Provides `defineConfig()` for use in `agentv.config.ts` files. Supports\n * auto-discovery, Zod validation, and IDE autocomplete.\n *\n * @example\n * ```typescript\n * // agentv.config.ts\n * import { defineConfig } from '@agentv/core';\n *\n * export default defineConfig({\n * execution: {\n * workers: 5,\n * maxRetries: 2,\n * agentTimeoutMs: 120_000,\n * },\n * output: {\n * dir: './results',\n * },\n * });\n * ```\n *\n * @module\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema for AgentV project-level configuration.\n */\nconst AgentVConfigSchema = z.object({\n /** Default execution settings */\n execution: z\n .object({\n /** Number of parallel workers (default: 3) */\n workers: z.number().int().min(1).max(50).optional(),\n /** Maximum retries on failure (default: 2) */\n maxRetries: z.number().int().min(0).optional(),\n /** Agent timeout in milliseconds. No timeout if not set. */\n agentTimeoutMs: z.number().int().min(0).optional(),\n /** Enable verbose logging */\n verbose: z.boolean().optional(),\n /** Always keep temp workspaces after eval */\n keepWorkspaces: z.boolean().optional(),\n /** Write OTLP JSON trace to this path (supports {timestamp} placeholder) */\n otelFile: z.string().optional(),\n })\n .optional(),\n\n /** Output settings */\n output: z\n .object({\n /** Default eval run artifact directory */\n dir: z.string().optional(),\n })\n .strict()\n .optional(),\n\n /** Response caching */\n cache: z\n .object({\n /** Enable response caching */\n enabled: z.boolean().optional(),\n /** Response cache directory */\n path: z.string().optional(),\n })\n .optional(),\n\n /** Cost and duration limits */\n limits: z\n .object({\n /** Maximum cost per run in USD */\n maxCostUsd: z.number().min(0).optional(),\n /** Maximum duration per run in milliseconds */\n maxDurationMs: z.number().int().min(0).optional(),\n })\n .optional(),\n\n /** Lifecycle hooks */\n hooks: z\n .object({\n /**\n * Shell command to run once at agentv startup, before any command executes.\n * stdout is parsed for env var exports (`KEY=value` or `export KEY=\"value\"`)\n * and injected into process.env. Keys already set in the environment are\n * not overwritten — existing env always takes priority.\n * stderr is forwarded to the user. Non-zero exit aborts with an error.\n */\n beforeSession: z.string().optional(),\n })\n .optional(),\n});\n\n/**\n * AgentV project-level configuration type.\n * Inferred from the Zod schema for full type safety.\n */\nexport type AgentVConfig = z.infer<typeof AgentVConfigSchema>;\n\n/**\n * Define a typed AgentV configuration.\n *\n * Use this in `agentv.config.ts` at your project root. The configuration\n * is validated at load time and provides full IDE autocomplete.\n *\n * @param config - Configuration object\n * @returns Validated configuration\n *\n * @example\n * ```typescript\n * import { defineConfig } from '@agentv/core';\n *\n * export default defineConfig({\n * execution: { workers: 5 },\n * output: { dir: './results' },\n * limits: { maxCostUsd: 10.0 },\n * });\n * ```\n */\nexport function defineConfig(config: AgentVConfig): AgentVConfig {\n return AgentVConfigSchema.parse(config);\n}\n\n/**\n * Config file discovery order.\n * The first file found wins.\n */\nconst CONFIG_FILE_NAMES = [\n 'agentv.config.ts',\n 'agentv.config.js',\n 'agentv.config.mts',\n 'agentv.config.mjs',\n '.agentv/config.ts',\n '.agentv/config.js',\n] as const;\n\n/**\n * Discover and load an AgentV config file from the project root.\n *\n * Searches for config files in discovery order. Returns null if\n * no config file is found.\n *\n * @param projectRoot - Project root directory to search from\n * @returns Loaded and validated config, or null if not found\n */\nexport async function loadTsConfig(projectRoot: string): Promise<AgentVConfig | null> {\n const { existsSync } = await import('node:fs');\n const { pathToFileURL } = await import('node:url');\n const { join } = await import('node:path');\n\n for (const fileName of CONFIG_FILE_NAMES) {\n const filePath = join(projectRoot, fileName);\n if (!existsSync(filePath)) {\n continue;\n }\n\n try {\n const fileUrl = pathToFileURL(filePath).href;\n const mod = await import(fileUrl);\n const config = mod.default ?? mod;\n\n return AgentVConfigSchema.parse(config);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load config from ${filePath}: ${msg}`);\n }\n }\n\n return null;\n}\n","import { z } from 'zod';\n\nimport type { Provider } from '../providers/types.js';\nimport { extractLastAssistantContent } from '../providers/types.js';\nimport type { RubricItem } from '../types.js';\n\nconst rubricItemSchema = z.object({\n id: z.string().describe('Short identifier for this rubric (e.g., clarity, completeness)'),\n outcome: z.string().describe('Concrete expected outcome for this rubric item'),\n weight: z.number().default(1.0).describe('Relative importance (default 1.0)'),\n required: z.boolean().default(true).describe('Whether this is a mandatory requirement'),\n});\n\nconst rubricGenerationSchema = z.object({\n rubrics: z.array(rubricItemSchema).describe('List of evaluation rubrics'),\n});\n\nexport interface GenerateRubricsOptions {\n readonly criteria: string;\n readonly question?: string;\n readonly referenceAnswer?: string;\n readonly provider: Provider;\n}\n\n/**\n * Generate rubrics from expected outcome using an LLM.\n *\n * Calls the provider through `Provider.invoke()` — the LLM call itself is\n * a single non-streaming, non-tool-using completion. JSON output is parsed\n * with up to 3 retries to absorb model formatting variance.\n */\nexport async function generateRubrics(\n options: GenerateRubricsOptions,\n): Promise<readonly RubricItem[]> {\n const { criteria, question, referenceAnswer, provider } = options;\n\n const prompt = buildPrompt(criteria, question, referenceAnswer);\n\n const system = `You are an expert at creating evaluation rubrics.\nYou must return a valid JSON object matching this schema:\n{\n \"rubrics\": [\n {\n \"id\": \"string (short identifier)\",\n \"outcome\": \"string (concrete expected outcome for this rubric item)\",\n \"weight\": number (default 1.0),\n \"required\": boolean (default true)\n }\n ]\n}`;\n\n let result: z.infer<typeof rubricGenerationSchema> | undefined;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= 3; attempt++) {\n try {\n const response = await provider.invoke({\n question: prompt,\n systemPrompt: system,\n });\n\n const text = extractLastAssistantContent(response.output);\n const cleaned = text.replace(/```json\\n?|```/g, '').trim();\n result = rubricGenerationSchema.parse(JSON.parse(cleaned));\n break;\n } catch (e: unknown) {\n lastError = e instanceof Error ? e : new Error(String(e));\n // Continue to next attempt\n }\n }\n\n if (!result) {\n throw new Error(`Failed to parse generated rubrics after 3 attempts: ${lastError?.message}`);\n }\n\n return result.rubrics;\n}\n\nfunction buildPrompt(criteria: string, question?: string, referenceAnswer?: string): string {\n const parts: string[] = [\n 'You are an expert at creating evaluation rubrics.',\n 'Given the expected outcome (and optionally the question and reference answer),',\n 'generate a list of specific, measurable rubric items to evaluate whether an answer meets the expected outcome.',\n '',\n 'Each rubric should:',\n '- Be specific and testable',\n '- Have a short, descriptive ID',\n '- Include a clear expected outcome statement (what a good answer must demonstrate for this rubric)',\n '- Indicate if it is required (mandatory) or optional',\n '- Have an appropriate weight (default 1.0, use higher values for more important aspects)',\n '',\n 'Generate 3-7 rubric items that comprehensively cover the expected outcome.',\n '',\n '[[ ## criteria ## ]]',\n criteria,\n '',\n ];\n\n if (question && question.trim().length > 0) {\n parts.push('[[ ## question ## ]]', question, '');\n }\n\n if (referenceAnswer && referenceAnswer.trim().length > 0) {\n parts.push('[[ ## reference_answer ## ]]', referenceAnswer, '');\n }\n\n return parts.join('\\n');\n}\n","/**\n * Lightweight scanner that extracts repo dependencies from eval YAML files\n * without performing full test/grader parsing.\n *\n * Used by `agentv workspace deps` to determine which repos CI needs to fetch\n * before running evals.\n *\n * How it works:\n * 1. Reads each eval YAML file and parses it\n * 2. Extracts `workspace.repos` at suite-level and per-test level\n * 3. Resolves external workspace file references (string -> file path)\n * 4. Deduplicates repos by (canonical repo identity, ref)\n * 5. Returns a flat list of unique repo dependencies\n */\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { interpolateEnv } from '../interpolation.js';\nimport type { RepoConfig } from '../types.js';\nimport { parseYamlValue } from '../yaml-loader.js';\nimport { getRepoCheckoutRef } from './repo-checkout.js';\nimport { parseRepoConfig } from './repo-config-parser.js';\nimport { normalizeRepoIdentity, resolveRepoCloneUrl } from './repo-identity.js';\n\n/** A single repo dependency discovered from eval files. */\nexport interface RepoDep {\n /** Git clone URL */\n readonly url: string;\n /** Checkout ref (branch, tag, SHA). undefined means HEAD. */\n readonly ref: string | undefined;\n /** Optional sparse-checkout paths. */\n readonly sparse: readonly string[] | undefined;\n /** Optional ancestor walk after checkout. */\n readonly ancestor: number | undefined;\n /** Eval files that reference this repo. */\n readonly usedBy: string[];\n}\n\n/** Full output of the deps scanner. */\nexport interface DepsScanResult {\n readonly repos: readonly RepoDep[];\n /** Files that failed to parse (non-fatal). */\n readonly errors: readonly { file: string; message: string }[];\n}\n\n/**\n * Scan eval YAML files and collect unique repo dependencies.\n * Non-YAML files and parse errors are collected in `errors` but don't stop scanning.\n */\nexport async function scanRepoDeps(evalFilePaths: readonly string[]): Promise<DepsScanResult> {\n const seen = new Map<string, RepoDep & { usedBy: string[] }>();\n const errors: { file: string; message: string }[] = [];\n\n for (const filePath of evalFilePaths) {\n try {\n const repos = await extractReposFromEvalFile(filePath);\n for (const repo of repos) {\n if (!repo.repo) continue;\n const checkoutRef = getRepoCheckoutRef(repo);\n const ref = checkoutRef === 'HEAD' ? undefined : checkoutRef;\n const key = `${normalizeRepoIdentity(repo.repo)}\\0${ref ?? ''}`;\n const existing = seen.get(key);\n if (existing) {\n existing.usedBy.push(filePath);\n } else {\n seen.set(key, {\n url: resolveRepoCloneUrl(repo.repo),\n ref,\n sparse: repo.sparse,\n ancestor: repo.ancestor,\n usedBy: [filePath],\n });\n }\n }\n } catch (err) {\n errors.push({\n file: filePath,\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return { repos: [...seen.values()], errors };\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers — lightweight YAML extraction, no full test parsing\n// ---------------------------------------------------------------------------\n\nasync function extractReposFromEvalFile(filePath: string): Promise<RepoConfig[]> {\n const content = await readFile(filePath, 'utf8');\n const parsed = interpolateEnv(parseYamlValue(content), process.env);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return [];\n const obj = parsed as Record<string, unknown>;\n const evalFileDir = path.dirname(path.resolve(filePath));\n\n const repos: RepoConfig[] = [];\n\n const suiteRepos = await extractReposFromWorkspaceRaw(obj.workspace, evalFileDir);\n repos.push(...suiteRepos);\n\n const tests = Array.isArray(obj.tests) ? obj.tests : [];\n for (const test of tests) {\n if (test && typeof test === 'object' && !Array.isArray(test)) {\n const testObj = test as Record<string, unknown>;\n const testRepos = await extractReposFromWorkspaceRaw(testObj.workspace, evalFileDir);\n repos.push(...testRepos);\n }\n }\n\n return repos;\n}\n\n/**\n * Extract repos from a raw workspace value.\n * Handles both inline objects and string references to external workspace files.\n */\nasync function extractReposFromWorkspaceRaw(\n raw: unknown,\n evalFileDir: string,\n): Promise<RepoConfig[]> {\n if (typeof raw === 'string') {\n const workspaceFilePath = path.resolve(evalFileDir, raw);\n const content = await readFile(workspaceFilePath, 'utf8');\n const parsed = interpolateEnv(parseYamlValue(content), process.env);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return [];\n return extractReposFromObject(parsed as Record<string, unknown>);\n }\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n return extractReposFromObject(raw as Record<string, unknown>);\n }\n return [];\n}\n\nfunction extractReposFromObject(obj: Record<string, unknown>): RepoConfig[] {\n const rawRepos = Array.isArray(obj.repos) ? obj.repos : [];\n const result: RepoConfig[] = [];\n for (const r of rawRepos) {\n const parsed = parseRepoConfig(r);\n if (parsed?.repo) {\n result.push(parsed);\n }\n }\n return result;\n}\n","import { execFile, spawn } from 'node:child_process';\nimport {\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { cp, mkdtemp, readdir, rm, stat } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { getAgentvDataDir } from '../paths.js';\nimport type { ResultsConfig } from './loaders/config-loader.js';\n\nconst execFileAsync = promisify(execFile);\nconst RESULTS_REPO_RESULTS_DIR = '.agentv/results';\nconst RESULTS_REPO_RUNS_DIR = `${RESULTS_REPO_RESULTS_DIR}/runs`;\nconst RESULTS_REPO_COMMIT_EMAIL = 'agentv@results-repo';\nconst RESULTS_REPO_COMMIT_NAME = 'AgentV Results';\n\nexport interface ResultsRepoLocalPaths {\n readonly rootDir: string;\n readonly repoDir: string;\n readonly statusFile: string;\n}\n\nexport type ResultsRepoSyncStatus =\n | 'clean'\n | 'unavailable'\n | 'behind'\n | 'ahead'\n | 'diverged'\n | 'dirty'\n | 'conflicted'\n | 'syncing';\n\nexport interface ResultsRepoStatus {\n readonly configured: boolean;\n readonly available: boolean;\n readonly repo?: string;\n readonly path?: string;\n readonly auto_push?: boolean;\n readonly branch_prefix?: string;\n readonly local_dir?: string;\n readonly last_synced_at?: string;\n readonly last_error?: string;\n readonly sync_status?: ResultsRepoSyncStatus;\n readonly branch?: string;\n readonly upstream?: string;\n readonly ahead?: number;\n readonly behind?: number;\n readonly dirty_paths?: readonly string[];\n readonly conflicted_paths?: readonly string[];\n readonly git_status?: string;\n readonly git_diff_summary?: string;\n readonly blocked?: boolean;\n readonly block_reason?: string;\n readonly pull_performed?: boolean;\n readonly push_performed?: boolean;\n readonly commit_created?: boolean;\n}\n\nexport interface NormalizedResultsConfig {\n readonly mode: 'github';\n readonly repo: string;\n readonly branch?: string;\n readonly path: string;\n readonly auto_push: boolean;\n readonly branch_prefix: string;\n}\n\nexport interface CheckedOutResultsRepoBranch {\n readonly branchName: string;\n readonly baseBranch: string;\n readonly repoDir: string;\n}\n\nexport interface PreparedResultsRepoBranch extends CheckedOutResultsRepoBranch {\n readonly cleanup: () => Promise<void>;\n}\n\ntype PersistedStatus = {\n readonly last_synced_at?: string;\n readonly last_error?: string;\n};\n\ntype ResultsRepoGitInspection = {\n readonly syncStatus: ResultsRepoSyncStatus;\n readonly branch?: string;\n readonly upstream?: string;\n readonly ahead?: number;\n readonly behind?: number;\n readonly dirtyPaths: readonly string[];\n readonly conflictedPaths: readonly string[];\n readonly gitStatus?: string;\n readonly gitDiffSummary?: string;\n};\n\nconst activeResultsRepoSyncs = new Set<string>();\n\nfunction sanitizeRepoSlug(repo: string): string {\n return repo.trim().replace(/[^A-Za-z0-9._-]+/g, '-');\n}\n\nfunction withFriendlyGitHubAuthError(error: unknown): Error {\n const message = error instanceof Error ? error.message : String(error);\n const lower = message.toLowerCase();\n if (\n lower.includes('authentication failed') ||\n lower.includes('could not read username') ||\n lower.includes('permission denied') ||\n lower.includes('not logged into any github hosts')\n ) {\n return new Error(`${message}. Run 'gh auth login' to authenticate.`);\n }\n return new Error(message);\n}\n\nfunction expandHome(p: string): string {\n if (p === '~' || p.startsWith('~/') || p.startsWith('~\\\\')) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\nexport function normalizeResultsConfig(config: ResultsConfig): NormalizedResultsConfig {\n const repo = config.repo.trim();\n const branch = config.branch?.trim();\n const resolvedPath = config.path\n ? expandHome(config.path.trim())\n : path.join(getAgentvDataDir(), 'results', sanitizeRepoSlug(repo));\n return {\n mode: 'github',\n repo,\n ...(branch ? { branch } : {}),\n path: resolvedPath,\n auto_push: config.auto_push === true,\n branch_prefix: config.branch_prefix?.trim() || 'eval-results',\n };\n}\n\nexport function resolveResultsRepoUrl(repo: string): string {\n if (repo.includes('://') || repo.startsWith('git@')) {\n return repo;\n }\n return `https://github.com/${repo}.git`;\n}\n\nexport function getResultsRepoLocalPaths(repo: string): ResultsRepoLocalPaths {\n const rootDir = path.join(getAgentvDataDir(), 'cache', 'results-repo', sanitizeRepoSlug(repo));\n return {\n rootDir,\n repoDir: path.join(rootDir, 'repo'),\n statusFile: path.join(rootDir, 'status.json'),\n };\n}\n\nfunction readPersistedStatus(statusFile: string): PersistedStatus {\n if (!existsSync(statusFile)) {\n return {};\n }\n\n try {\n return JSON.parse(readFileSync(statusFile, 'utf8')) as PersistedStatus;\n } catch {\n return {};\n }\n}\n\nfunction writePersistedStatus(statusFile: string, status: PersistedStatus): void {\n mkdirSync(path.dirname(statusFile), { recursive: true });\n writeFileSync(statusFile, `${JSON.stringify(status, null, 2)}\\n`, 'utf8');\n}\n\nasync function runCommand(\n executable: string,\n args: readonly string[],\n options?: { cwd?: string; check?: boolean; env?: NodeJS.ProcessEnv },\n): Promise<{ stdout: string; stderr: string }> {\n try {\n const { stdout, stderr } = await execFileAsync(executable, [...args], {\n cwd: options?.cwd,\n env: options?.env ?? process.env,\n });\n return { stdout, stderr };\n } catch (error) {\n if (options?.check === false && error && typeof error === 'object') {\n const execError = error as { stdout?: string; stderr?: string };\n return {\n stdout: execError.stdout ?? '',\n stderr: execError.stderr ?? '',\n };\n }\n throw withFriendlyGitHubAuthError(error);\n }\n}\n\nfunction getGitEnv(): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined && !(key.startsWith('GIT_') && key !== 'GIT_SSH_COMMAND')) {\n env[key] = value;\n }\n }\n return env;\n}\n\nasync function runGit(\n args: readonly string[],\n options?: { cwd?: string; check?: boolean },\n): Promise<{ stdout: string; stderr: string }> {\n return runCommand('git', args, { ...options, env: getGitEnv() });\n}\n\nasync function runGh(\n args: readonly string[],\n options?: { cwd?: string },\n): Promise<{ stdout: string; stderr: string }> {\n return runCommand('gh', args, options);\n}\n\nasync function ensureResultsRepoCommitIdentity(repoDir: string): Promise<void> {\n await runGit(['config', 'user.email', RESULTS_REPO_COMMIT_EMAIL], { cwd: repoDir });\n await runGit(['config', 'user.name', RESULTS_REPO_COMMIT_NAME], { cwd: repoDir });\n}\n\nasync function resolveDefaultBranch(repoDir: string): Promise<string> {\n try {\n const { stdout } = await runGit(['symbolic-ref', 'refs/remotes/origin/HEAD'], { cwd: repoDir });\n const ref = stdout.trim();\n const prefix = 'refs/remotes/origin/';\n if (ref.startsWith(prefix)) {\n return ref.slice(prefix.length);\n }\n } catch {\n // Fall through to main/master probing.\n }\n\n for (const candidate of ['main', 'master']) {\n try {\n await runGit(['rev-parse', '--verify', `origin/${candidate}`], { cwd: repoDir });\n return candidate;\n } catch {\n // Try next candidate.\n }\n }\n\n return 'main';\n}\n\nasync function fetchResultsRepo(repoDir: string): Promise<void> {\n await runGit(['fetch', 'origin', '--prune'], { cwd: repoDir });\n}\n\nfunction remoteBranchRef(branch: string): string {\n return `origin/${branch}`;\n}\n\nfunction missingConfiguredBranchError(config: NormalizedResultsConfig): Error {\n const branch = config.branch ?? '<unknown>';\n return new Error(\n [\n `Results repo remote branch '${branch}' does not exist in ${config.repo}.`,\n 'Create the storage branch once, then retry. Example:',\n ` git clone ${resolveResultsRepoUrl(config.repo)} /tmp/agentv-results-init`,\n ' cd /tmp/agentv-results-init',\n ` git switch --orphan ${branch}`,\n ' git rm -rf .',\n ' git commit --allow-empty -m \"chore(results): initialize AgentV results branch\"',\n ` git push origin HEAD:${branch}`,\n ].join('\\n'),\n );\n}\n\nasync function assertConfiguredResultsBranchExists(\n repoDir: string,\n config: NormalizedResultsConfig,\n): Promise<string | undefined> {\n if (!config.branch) {\n return undefined;\n }\n\n const ref = remoteBranchRef(config.branch);\n const { stdout } = await runGit(['rev-parse', '--verify', `${ref}^{commit}`], {\n cwd: repoDir,\n check: false,\n });\n if (!stdout.trim()) {\n throw missingConfiguredBranchError(config);\n }\n return ref;\n}\n\nasync function localBranchExists(repoDir: string, branch: string): Promise<boolean> {\n const { stdout } = await runGit(['rev-parse', '--verify', `refs/heads/${branch}`], {\n cwd: repoDir,\n check: false,\n });\n return stdout.trim().length > 0;\n}\n\nasync function checkoutConfiguredResultsBranch(\n repoDir: string,\n config: NormalizedResultsConfig,\n): Promise<string | undefined> {\n const remoteRef = await assertConfiguredResultsBranchExists(repoDir, config);\n if (!config.branch || !remoteRef) {\n return undefined;\n }\n\n const currentBranch = await getCurrentBranch(repoDir);\n if (currentBranch !== config.branch) {\n if (await localBranchExists(repoDir, config.branch)) {\n await runGit(['checkout', config.branch], { cwd: repoDir });\n } else {\n await runGit(['checkout', '--track', '-b', config.branch, remoteRef], { cwd: repoDir });\n }\n }\n await runGit(['branch', '--set-upstream-to', remoteRef, config.branch], {\n cwd: repoDir,\n check: false,\n });\n\n return remoteRef;\n}\n\nasync function isGitRepository(repoDir: string): Promise<boolean> {\n try {\n const { stdout } = await runGit(['rev-parse', '--is-inside-work-tree'], { cwd: repoDir });\n return stdout.trim() === 'true';\n } catch {\n return false;\n }\n}\n\nfunction updateStatusFile(config: ResultsConfig, patch: PersistedStatus): void {\n const cachePaths = getResultsRepoLocalPaths(config.repo);\n const current = readPersistedStatus(cachePaths.statusFile);\n writePersistedStatus(cachePaths.statusFile, {\n ...current,\n ...patch,\n });\n}\n\nexport async function ensureResultsRepoClone(config: ResultsConfig): Promise<string> {\n const normalized = normalizeResultsConfig(config);\n const cachePaths = getResultsRepoLocalPaths(normalized.repo);\n const cloneDir = normalized.path;\n mkdirSync(cachePaths.rootDir, { recursive: true });\n mkdirSync(path.dirname(cloneDir), { recursive: true });\n\n const cloneMissing = !existsSync(cloneDir);\n const gitDir = path.join(cloneDir, '.git');\n const cloneEmpty = !cloneMissing && !existsSync(gitDir) && (await readdir(cloneDir)).length === 0;\n\n if (cloneMissing || cloneEmpty) {\n try {\n await runGit([\n 'clone',\n '--filter=blob:none',\n resolveResultsRepoUrl(normalized.repo),\n cloneDir,\n ]);\n return cloneDir;\n } catch (error) {\n updateStatusFile(normalized, { last_error: withFriendlyGitHubAuthError(error).message });\n throw withFriendlyGitHubAuthError(error);\n }\n }\n\n if (!existsSync(gitDir)) {\n throw new Error(`Results repo clone path is not a git repository: ${cloneDir}`);\n }\n\n return cloneDir;\n}\n\nexport function getResultsRepoStatus(config?: ResultsConfig): ResultsRepoStatus {\n if (!config) {\n return {\n configured: false,\n available: false,\n repo: '',\n local_dir: '',\n sync_status: 'unavailable',\n };\n }\n\n const normalized = normalizeResultsConfig(config);\n const localPaths = getResultsRepoLocalPaths(normalized.repo);\n const persisted = readPersistedStatus(localPaths.statusFile);\n\n return {\n configured: true,\n available: existsSync(normalized.path),\n repo: normalized.repo,\n path: normalized.path,\n auto_push: normalized.auto_push,\n branch_prefix: normalized.branch_prefix,\n local_dir: normalized.path,\n last_synced_at: persisted.last_synced_at,\n last_error: persisted.last_error,\n sync_status: existsSync(normalized.path) ? 'clean' : 'unavailable',\n };\n}\n\nfunction parseGitPorcelainPaths(status: string): {\n dirtyPaths: string[];\n conflictedPaths: string[];\n} {\n const dirtyPaths = new Set<string>();\n const conflictedPaths = new Set<string>();\n const conflictCodes = new Set(['DD', 'AU', 'UD', 'UA', 'DU', 'AA', 'UU']);\n\n for (const line of status.split(/\\r?\\n/)) {\n if (!line.trim()) continue;\n const code = line.slice(0, 2);\n const rawPath = line.slice(3).trim();\n const paths = rawPath.includes(' -> ') ? rawPath.split(' -> ') : [rawPath];\n\n for (const p of paths.map((entry) => entry.trim()).filter(Boolean)) {\n dirtyPaths.add(p);\n if (conflictCodes.has(code)) {\n conflictedPaths.add(p);\n }\n }\n }\n\n return {\n dirtyPaths: [...dirtyPaths].sort(),\n conflictedPaths: [...conflictedPaths].sort(),\n };\n}\n\nasync function getCurrentBranch(repoDir: string): Promise<string | undefined> {\n const { stdout } = await runGit(['branch', '--show-current'], { cwd: repoDir, check: false });\n const branch = stdout.trim();\n if (branch) {\n return branch;\n }\n\n const { stdout: sha } = await runGit(['rev-parse', '--short', 'HEAD'], {\n cwd: repoDir,\n check: false,\n });\n return sha.trim() ? `HEAD@${sha.trim()}` : undefined;\n}\n\nasync function resolveComparisonRef(\n repoDir: string,\n config?: NormalizedResultsConfig,\n): Promise<string | undefined> {\n if (config?.branch) {\n return assertConfiguredResultsBranchExists(repoDir, config);\n }\n\n const { stdout: upstream } = await runGit(\n ['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{upstream}'],\n { cwd: repoDir, check: false },\n );\n const upstreamRef = upstream.trim();\n if (upstreamRef && !upstreamRef.includes('fatal:')) {\n return upstreamRef;\n }\n\n const baseBranch = await resolveDefaultBranch(repoDir);\n const fallback = `origin/${baseBranch}`;\n const { stdout: fallbackSha } = await runGit(['rev-parse', '--verify', fallback], {\n cwd: repoDir,\n check: false,\n });\n return fallbackSha.trim() ? fallback : undefined;\n}\n\nasync function getAheadBehind(\n repoDir: string,\n upstream: string | undefined,\n): Promise<{ ahead?: number; behind?: number }> {\n if (!upstream) {\n return {};\n }\n\n const { stdout } = await runGit(['rev-list', '--left-right', '--count', `HEAD...${upstream}`], {\n cwd: repoDir,\n check: false,\n });\n const [aheadText, behindText] = stdout.trim().split(/\\s+/);\n const ahead = Number.parseInt(aheadText ?? '', 10);\n const behind = Number.parseInt(behindText ?? '', 10);\n\n return {\n ...(Number.isFinite(ahead) && { ahead }),\n ...(Number.isFinite(behind) && { behind }),\n };\n}\n\nasync function hasInProgressGitConflict(repoDir: string): Promise<boolean> {\n const markers = ['MERGE_HEAD', 'CHERRY_PICK_HEAD', 'REVERT_HEAD', 'REBASE_HEAD'];\n for (const marker of markers) {\n const { stdout } = await runGit(['rev-parse', '--git-path', marker], {\n cwd: repoDir,\n check: false,\n });\n const markerPath = stdout.trim();\n const resolvedMarkerPath = path.isAbsolute(markerPath)\n ? markerPath\n : path.join(repoDir, markerPath);\n if (markerPath && existsSync(resolvedMarkerPath)) {\n return true;\n }\n }\n return false;\n}\n\nasync function buildGitDiffSummary(\n repoDir: string,\n upstream: string | undefined,\n): Promise<string | undefined> {\n const summaries: string[] = [];\n for (const args of [\n ['diff', '--stat'],\n ['diff', '--cached', '--stat'],\n ...(upstream ? ([['diff', '--stat', `${upstream}..HEAD`]] as string[][]) : []),\n ]) {\n const { stdout } = await runGit(args, { cwd: repoDir, check: false });\n const summary = stdout.trim();\n if (summary) {\n summaries.push(summary);\n }\n }\n\n return summaries.length > 0 ? summaries.join('\\n') : undefined;\n}\n\nasync function inspectResultsRepoGit(\n repoDir: string,\n config?: NormalizedResultsConfig,\n): Promise<ResultsRepoGitInspection> {\n const branch = await getCurrentBranch(repoDir);\n const upstream = await resolveComparisonRef(repoDir, config);\n const { stdout: porcelain } = await runGit(\n ['status', '--porcelain=v1', '--untracked-files=all'],\n {\n cwd: repoDir,\n check: false,\n },\n );\n const { stdout: shortStatus } = await runGit(['status', '--short', '--branch'], {\n cwd: repoDir,\n check: false,\n });\n const { dirtyPaths: allDirtyPaths, conflictedPaths } = parseGitPorcelainPaths(porcelain);\n const dirtyPaths = allDirtyPaths.filter(isSafeResultsRepoPath);\n const { ahead = 0, behind = 0 } = await getAheadBehind(repoDir, upstream);\n const inProgressConflict = await hasInProgressGitConflict(repoDir);\n\n let syncStatus: ResultsRepoSyncStatus = 'clean';\n if (conflictedPaths.length > 0 || inProgressConflict) {\n syncStatus = 'conflicted';\n } else if (dirtyPaths.length > 0) {\n syncStatus = 'dirty';\n } else if (ahead > 0 && behind > 0) {\n syncStatus = 'diverged';\n } else if (behind > 0) {\n syncStatus = 'behind';\n } else if (ahead > 0) {\n syncStatus = 'ahead';\n }\n\n return {\n syncStatus,\n branch,\n upstream,\n ahead,\n behind,\n dirtyPaths,\n conflictedPaths,\n gitStatus: shortStatus.trim() || undefined,\n gitDiffSummary: await buildGitDiffSummary(repoDir, upstream),\n };\n}\n\nfunction withGitInspection(\n status: ResultsRepoStatus,\n inspection: ResultsRepoGitInspection,\n): ResultsRepoStatus {\n return {\n ...status,\n sync_status: inspection.syncStatus,\n branch: inspection.branch,\n upstream: inspection.upstream,\n ahead: inspection.ahead,\n behind: inspection.behind,\n dirty_paths: inspection.dirtyPaths,\n conflicted_paths: inspection.conflictedPaths,\n git_status: inspection.gitStatus,\n git_diff_summary: inspection.gitDiffSummary,\n last_error: lastErrorForGitInspection(status, inspection),\n };\n}\n\nfunction lastErrorForGitInspection(\n status: ResultsRepoStatus,\n inspection: ResultsRepoGitInspection,\n): string | undefined {\n if (inspection.syncStatus === 'conflicted') {\n return 'Results repo has unresolved git conflicts';\n }\n\n if (inspection.syncStatus === 'diverged') {\n return 'Results repo local and remote histories have diverged';\n }\n\n if (inspection.syncStatus === 'dirty') {\n if (status.auto_push === false) {\n return 'Results repo has uncommitted changes and auto_push is disabled';\n }\n }\n\n return undefined;\n}\n\nfunction withBlockedStatus(\n status: ResultsRepoStatus,\n blockReason: string,\n flags?: {\n readonly pullPerformed?: boolean;\n readonly pushPerformed?: boolean;\n readonly commitCreated?: boolean;\n },\n): ResultsRepoStatus {\n return {\n ...status,\n blocked: true,\n block_reason: blockReason,\n ...(flags?.pullPerformed !== undefined && { pull_performed: flags.pullPerformed }),\n ...(flags?.pushPerformed !== undefined && { push_performed: flags.pushPerformed }),\n ...(flags?.commitCreated !== undefined && { commit_created: flags.commitCreated }),\n };\n}\n\nfunction withActionFlags(\n status: ResultsRepoStatus,\n flags: {\n readonly pullPerformed: boolean;\n readonly pushPerformed: boolean;\n readonly commitCreated: boolean;\n },\n): ResultsRepoStatus {\n return {\n ...status,\n blocked: false,\n pull_performed: flags.pullPerformed,\n push_performed: flags.pushPerformed,\n commit_created: flags.commitCreated,\n };\n}\n\nfunction isSafeResultsRepoPath(p: string): boolean {\n return p === RESULTS_REPO_RESULTS_DIR || p.startsWith(`${RESULTS_REPO_RESULTS_DIR}/`);\n}\n\nfunction areSafeResultsRepoPaths(paths: readonly string[]): boolean {\n return paths.length > 0 && paths.every(isSafeResultsRepoPath);\n}\n\nasync function getAheadPaths(\n repoDir: string,\n upstream: string | undefined,\n): Promise<readonly string[]> {\n if (!upstream) {\n return [];\n }\n const { stdout } = await runGit(['diff', '--name-only', `${upstream}..HEAD`], {\n cwd: repoDir,\n check: false,\n });\n return stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .sort();\n}\n\nfunction getPushTargetBranch(upstream: string | undefined, baseBranch: string): string {\n return upstream?.startsWith('origin/') ? upstream.slice('origin/'.length) : baseBranch;\n}\n\nasync function statusFromInspection(\n normalized: NormalizedResultsConfig,\n repoDir: string,\n): Promise<ResultsRepoStatus> {\n return withGitInspection(\n getResultsRepoStatus(normalized),\n await inspectResultsRepoGit(repoDir, normalized),\n );\n}\n\nexport async function getResultsRepoSyncStatus(config?: ResultsConfig): Promise<ResultsRepoStatus> {\n const baseStatus = getResultsRepoStatus(config);\n if (!config) {\n return baseStatus;\n }\n\n const normalized = normalizeResultsConfig(config);\n if (activeResultsRepoSyncs.has(normalized.path)) {\n return {\n ...baseStatus,\n sync_status: 'syncing',\n };\n }\n\n if (!existsSync(normalized.path) || !(await isGitRepository(normalized.path))) {\n return {\n ...baseStatus,\n sync_status: 'unavailable',\n };\n }\n\n try {\n if (normalized.branch) {\n await fetchResultsRepo(normalized.path);\n await checkoutConfiguredResultsBranch(normalized.path, normalized);\n }\n return withGitInspection(baseStatus, await inspectResultsRepoGit(normalized.path, normalized));\n } catch (error) {\n return {\n ...baseStatus,\n ...(normalized.branch ? { available: false } : {}),\n sync_status: 'unavailable',\n last_error: getStatusMessage(error),\n };\n }\n}\n\nexport async function syncResultsRepo(config: ResultsConfig): Promise<ResultsRepoStatus> {\n const normalized = normalizeResultsConfig(config);\n\n try {\n const repoDir = await ensureResultsRepoClone(normalized);\n await fetchResultsRepo(repoDir);\n await checkoutConfiguredResultsBranch(repoDir, normalized);\n updateStatusFile(normalized, {\n last_synced_at: new Date().toISOString(),\n last_error: undefined,\n });\n } catch (error) {\n updateStatusFile(normalized, {\n last_error: withFriendlyGitHubAuthError(error).message,\n });\n throw withFriendlyGitHubAuthError(error);\n }\n\n return getResultsRepoStatus(normalized);\n}\n\nfunction getStatusMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport async function syncResultsRepoForProject(config: ResultsConfig): Promise<ResultsRepoStatus> {\n const normalized = normalizeResultsConfig(config);\n const syncKey = normalized.path;\n if (activeResultsRepoSyncs.has(syncKey)) {\n return {\n ...(await getResultsRepoSyncStatus(normalized)),\n sync_status: 'syncing',\n blocked: true,\n block_reason: 'Results repo sync is already in progress',\n };\n }\n\n activeResultsRepoSyncs.add(syncKey);\n let pullPerformed = false;\n let pushPerformed = false;\n let commitCreated = false;\n\n try {\n const repoDir = await ensureResultsRepoClone(normalized);\n await fetchResultsRepo(repoDir);\n await checkoutConfiguredResultsBranch(repoDir, normalized);\n let inspection = await inspectResultsRepoGit(repoDir, normalized);\n\n if (inspection.syncStatus === 'conflicted') {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n updateStatusFile(normalized, {\n last_error: 'Results repo has unresolved git conflicts',\n });\n return withBlockedStatus(status, 'Results repo has unresolved git conflicts', {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n\n if (inspection.syncStatus === 'dirty') {\n if (!normalized.auto_push) {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n updateStatusFile(normalized, {\n last_error: 'Results repo has uncommitted changes and auto_push is disabled',\n });\n return withBlockedStatus(\n status,\n 'Results repo has uncommitted changes and auto_push is disabled',\n {\n pullPerformed,\n pushPerformed,\n commitCreated,\n },\n );\n }\n\n if ((inspection.behind ?? 0) > 0) {\n if (!inspection.upstream) {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n updateStatusFile(normalized, {\n last_error: 'Results repo has no upstream branch to pull from',\n });\n return withBlockedStatus(status, 'Results repo has no upstream branch to pull from', {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n\n try {\n await runGit(['merge', '--ff-only', inspection.upstream], { cwd: repoDir });\n pullPerformed = true;\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n } catch (error) {\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n const reason = `Results repo could not be fast-forwarded: ${getStatusMessage(error)}`;\n updateStatusFile(normalized, { last_error: reason });\n return withBlockedStatus(status, reason, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n }\n\n if (inspection.syncStatus === 'dirty') {\n await runGit(['add', '--all', '--', RESULTS_REPO_RESULTS_DIR], { cwd: repoDir });\n await ensureResultsRepoCommitIdentity(repoDir);\n await runGit(\n [\n 'commit',\n '-m',\n 'chore(results): sync local result metadata',\n '--',\n RESULTS_REPO_RESULTS_DIR,\n ],\n {\n cwd: repoDir,\n },\n );\n commitCreated = true;\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n }\n }\n\n if (inspection.syncStatus === 'diverged') {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n updateStatusFile(normalized, {\n last_error: 'Results repo local and remote histories have diverged',\n });\n return withBlockedStatus(status, 'Results repo local and remote histories have diverged', {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n\n if ((inspection.behind ?? 0) > 0 && (inspection.ahead ?? 0) === 0) {\n if (!inspection.upstream) {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n updateStatusFile(normalized, {\n last_error: 'Results repo has no upstream branch to pull from',\n });\n return withBlockedStatus(status, 'Results repo has no upstream branch to pull from', {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n\n try {\n await runGit(['merge', '--ff-only', inspection.upstream], { cwd: repoDir });\n pullPerformed = true;\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n } catch (error) {\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n const reason = `Results repo could not be fast-forwarded: ${getStatusMessage(error)}`;\n updateStatusFile(normalized, { last_error: reason });\n return withBlockedStatus(status, reason, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n }\n\n if ((inspection.ahead ?? 0) > 0) {\n if (!normalized.auto_push) {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n return withActionFlags(status, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n\n const aheadPaths = await getAheadPaths(repoDir, inspection.upstream);\n if (!inspection.upstream || !areSafeResultsRepoPaths(aheadPaths)) {\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n const reason = !inspection.upstream\n ? 'Results repo has no upstream branch to push to'\n : 'Results repo has non-results committed changes';\n updateStatusFile(normalized, { last_error: reason });\n return withBlockedStatus(status, reason, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n\n const baseBranch = normalized.branch ?? (await resolveDefaultBranch(repoDir));\n const targetBranch = getPushTargetBranch(inspection.upstream, baseBranch);\n try {\n await runGit(['push', 'origin', `HEAD:${targetBranch}`], { cwd: repoDir });\n pushPerformed = true;\n await fetchResultsRepo(repoDir);\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n } catch (error) {\n await fetchResultsRepo(repoDir).catch(() => undefined);\n inspection = await inspectResultsRepoGit(repoDir, normalized);\n const status = withGitInspection(getResultsRepoStatus(normalized), inspection);\n const reason = `Results repo push was rejected: ${getStatusMessage(error)}`;\n updateStatusFile(normalized, { last_error: reason });\n return withBlockedStatus(status, reason, {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n }\n }\n\n updateStatusFile(normalized, {\n last_synced_at: new Date().toISOString(),\n last_error: undefined,\n });\n\n return withActionFlags(await statusFromInspection(normalized, repoDir), {\n pullPerformed,\n pushPerformed,\n commitCreated,\n });\n } catch (error) {\n updateStatusFile(normalized, {\n last_error: withFriendlyGitHubAuthError(error).message,\n });\n throw withFriendlyGitHubAuthError(error);\n } finally {\n activeResultsRepoSyncs.delete(syncKey);\n }\n}\n\nexport async function checkoutResultsRepoBranch(\n config: ResultsConfig,\n branchName: string,\n): Promise<CheckedOutResultsRepoBranch> {\n const normalized = normalizeResultsConfig(config);\n const repoDir = await ensureResultsRepoClone(normalized);\n const baseBranch = await resolveDefaultBranch(repoDir);\n await fetchResultsRepo(repoDir);\n await runGit(['checkout', '-B', branchName, `origin/${baseBranch}`], { cwd: repoDir });\n updateStatusFile(normalized, { last_error: undefined });\n return {\n branchName,\n baseBranch,\n repoDir,\n };\n}\n\nexport async function prepareResultsRepoBranch(\n config: ResultsConfig,\n branchName: string,\n): Promise<PreparedResultsRepoBranch> {\n const normalized = normalizeResultsConfig(config);\n const cloneDir = await ensureResultsRepoClone(normalized);\n const baseBranch = await resolveDefaultBranch(cloneDir);\n await fetchResultsRepo(cloneDir);\n\n const worktreeRoot = await mkdtemp(path.join(os.tmpdir(), 'agentv-results-repo-'));\n const worktreeDir = path.join(worktreeRoot, 'repo');\n await runGit(['worktree', 'add', '-B', branchName, worktreeDir, `origin/${baseBranch}`], {\n cwd: cloneDir,\n });\n\n return {\n branchName,\n baseBranch,\n repoDir: worktreeDir,\n cleanup: async () => {\n try {\n await runGit(['worktree', 'remove', '--force', worktreeDir], { cwd: cloneDir });\n } finally {\n await rm(worktreeRoot, { recursive: true, force: true }).catch(() => undefined);\n }\n },\n };\n}\n\nexport async function stageResultsArtifacts(params: {\n readonly repoDir: string;\n readonly sourceDir: string;\n readonly destinationDir: string;\n}): Promise<void> {\n rmSync(params.destinationDir, { recursive: true, force: true });\n mkdirSync(path.dirname(params.destinationDir), { recursive: true });\n await cp(params.sourceDir, params.destinationDir, { recursive: true });\n}\n\nexport function resolveResultsRepoRunsDir(config: ResultsConfig): string {\n const normalized = normalizeResultsConfig(config);\n return path.join(normalized.path, RESULTS_REPO_RESULTS_DIR, 'runs');\n}\n\nexport async function directorySizeBytes(targetPath: string): Promise<number> {\n const entry = await stat(targetPath);\n if (entry.isFile()) {\n return entry.size;\n }\n\n let total = 0;\n for (const child of await readdir(targetPath, { withFileTypes: true })) {\n total += await directorySizeBytes(path.join(targetPath, child.name));\n }\n return total;\n}\n\nexport async function commitAndPushResultsBranch(params: {\n readonly repoDir: string;\n readonly branchName: string;\n readonly commitMessage: string;\n}): Promise<boolean> {\n await runGit(['add', '--all'], { cwd: params.repoDir });\n\n const { stdout: diffStdout } = await runGit(['status', '--porcelain'], {\n cwd: params.repoDir,\n check: false,\n });\n if (diffStdout.trim().length === 0) {\n return false;\n }\n\n await ensureResultsRepoCommitIdentity(params.repoDir);\n await runGit(['commit', '-m', params.commitMessage], { cwd: params.repoDir });\n await runGit(['push', '-u', 'origin', params.branchName], { cwd: params.repoDir });\n return true;\n}\n\nexport async function pushResultsRepoBranch(\n config: ResultsConfig,\n branchName: string,\n cwd?: string,\n): Promise<void> {\n const normalized = normalizeResultsConfig(config);\n await runGit(['push', '-u', 'origin', branchName], {\n cwd: cwd ?? normalized.path,\n });\n updateStatusFile(normalized, {\n last_synced_at: new Date().toISOString(),\n last_error: undefined,\n });\n}\n\nexport async function createDraftResultsPr(params: {\n readonly repo: string;\n readonly repoDir: string;\n readonly baseBranch: string;\n readonly branchName: string;\n readonly title: string;\n readonly body: string;\n}): Promise<string> {\n const { stdout } = await runGh(\n [\n 'pr',\n 'create',\n '--draft',\n '--repo',\n params.repo,\n '--base',\n params.baseBranch,\n '--head',\n params.branchName,\n '--title',\n params.title,\n '--body',\n params.body,\n ],\n { cwd: params.repoDir },\n );\n return stdout.trim();\n}\n\nconst DIRECT_PUSH_MAX_RETRIES = 3;\n\nasync function hasUnpushedCommits(repoDir: string, upstreamRef: string): Promise<boolean> {\n const { stdout } = await runGit(['rev-list', '--count', `${upstreamRef}..HEAD`], {\n cwd: repoDir,\n check: false,\n });\n return Number.parseInt(stdout.trim(), 10) > 0;\n}\n\nasync function pushDirectResultsToStorageBranch(params: {\n readonly normalized: NormalizedResultsConfig;\n readonly repoDir: string;\n readonly storageBranch: string;\n readonly upstreamRef: string;\n}): Promise<void> {\n for (let attempt = 1; attempt <= DIRECT_PUSH_MAX_RETRIES; attempt++) {\n try {\n await runGit(['push', 'origin', `HEAD:${params.storageBranch}`], { cwd: params.repoDir });\n updateStatusFile(params.normalized, {\n last_synced_at: new Date().toISOString(),\n last_error: undefined,\n });\n return;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (attempt < DIRECT_PUSH_MAX_RETRIES && message.includes('non-fast-forward')) {\n await fetchResultsRepo(params.repoDir);\n await runGit(['rebase', params.upstreamRef], { cwd: params.repoDir });\n } else {\n throw error;\n }\n }\n }\n}\n\n/**\n * Push results directly to the configured storage branch of the results repo.\n * Handles non-fast-forward conflicts by fetching, rebasing, and retrying.\n * Returns true if artifacts were pushed, false if no changes were detected.\n */\nexport async function directPushResults(params: {\n readonly config: ResultsConfig;\n readonly sourceDir: string;\n readonly destinationPath: string;\n readonly commitMessage: string;\n}): Promise<boolean> {\n const normalized = normalizeResultsConfig(params.config);\n const repoDir = await ensureResultsRepoClone(normalized);\n await fetchResultsRepo(repoDir);\n const configuredRef = await checkoutConfiguredResultsBranch(repoDir, normalized);\n const storageBranch = normalized.branch ?? (await resolveDefaultBranch(repoDir));\n const upstreamRef = configuredRef ?? remoteBranchRef(storageBranch);\n const targetRunId = buildGitRunId(params.destinationPath);\n\n const destinationDir = path.join(\n repoDir,\n RESULTS_REPO_RESULTS_DIR,\n 'runs',\n params.destinationPath,\n );\n await stageResultsArtifacts({\n repoDir,\n sourceDir: params.sourceDir,\n destinationDir,\n });\n\n await runGit(['add', '--all'], { cwd: repoDir });\n const { stdout: status } = await runGit(['status', '--porcelain'], {\n cwd: repoDir,\n check: false,\n });\n if (status.trim().length === 0) {\n if (await hasUnpushedCommits(repoDir, upstreamRef)) {\n const aheadPaths = await getAheadPaths(repoDir, upstreamRef);\n if (!areSafeResultsRepoPaths(aheadPaths)) {\n throw new Error('Results repo has non-results committed changes');\n }\n await pushDirectResultsToStorageBranch({ normalized, repoDir, storageBranch, upstreamRef });\n return true;\n }\n return false;\n }\n\n await ensureResultsRepoCommitIdentity(repoDir);\n await runGit(['commit', '-m', params.commitMessage, '-m', `Agentv-Run: ${targetRunId}`], {\n cwd: repoDir,\n });\n\n await pushDirectResultsToStorageBranch({ normalized, repoDir, storageBranch, upstreamRef });\n return true;\n}\n\nexport interface GitListedRun {\n run_id: string;\n experiment: string;\n timestamp: string;\n pass_rate?: number;\n target?: string;\n manifest_path: string;\n benchmark_path: string;\n display_name: string;\n test_count: number;\n avg_score: number;\n size_bytes: number;\n}\n\ntype GitBatchBlob = {\n readonly size: number;\n readonly content: Buffer;\n};\n\ntype GitRunBenchmark = {\n readonly metadata?: {\n readonly display_name?: string;\n readonly timestamp?: string;\n readonly experiment?: string;\n readonly targets?: readonly string[];\n readonly tests_run?: readonly string[];\n };\n readonly run_summary?: Record<\n string,\n {\n readonly pass_rate?: { readonly mean?: number };\n }\n >;\n};\n\nfunction buildGitRunId(relativeRunPath: string): string {\n const normalized = relativeRunPath.split(path.sep).join('/');\n const segments = normalized.split('/').filter(Boolean);\n if (segments.length >= 2) {\n const experiment = segments.slice(0, -1).join('/');\n const timestamp = segments.at(-1);\n if (experiment === 'default') {\n return timestamp ?? normalized;\n }\n return `${experiment}::${timestamp}`;\n }\n return segments[0] ?? relativeRunPath;\n}\n\nfunction getRunExperiment(runId: string, benchmark: GitRunBenchmark): string {\n const experiment = benchmark.metadata?.experiment?.trim();\n if (experiment) {\n return experiment;\n }\n\n const separatorIndex = runId.lastIndexOf('::');\n return separatorIndex === -1 ? 'default' : runId.slice(0, separatorIndex);\n}\n\nfunction computeAveragePassRate(runSummary: GitRunBenchmark['run_summary']): number | undefined {\n if (!runSummary) {\n return undefined;\n }\n\n const passRates = Object.values(runSummary)\n .map((summary) => summary.pass_rate?.mean)\n .filter((value): value is number => typeof value === 'number' && Number.isFinite(value));\n\n if (passRates.length === 0) {\n return undefined;\n }\n\n return passRates.reduce((sum, value) => sum + value, 0) / passRates.length;\n}\n\nasync function runGitBatch(repoDir: string, input: string): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const child = spawn('git', ['cat-file', '--batch'], {\n cwd: repoDir,\n env: getGitEnv(),\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n child.stdout.on('data', (chunk: Buffer | string) => {\n stdoutChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n child.stderr.on('data', (chunk: Buffer | string) => {\n stderrChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n child.on('error', (error) => reject(withFriendlyGitHubAuthError(error)));\n child.on('close', (code) => {\n if (code === 0) {\n resolve(Buffer.concat(stdoutChunks));\n return;\n }\n\n const stderr = Buffer.concat(stderrChunks).toString('utf8').trim();\n reject(\n withFriendlyGitHubAuthError(\n stderr.length > 0 ? new Error(stderr) : new Error('git cat-file failed'),\n ),\n );\n });\n\n child.stdin.end(input);\n });\n}\n\nfunction parseGitBatchBlobs(output: Buffer): GitBatchBlob[] {\n const blobs: GitBatchBlob[] = [];\n let offset = 0;\n\n while (offset < output.length) {\n const headerEnd = output.indexOf(0x0a, offset);\n if (headerEnd === -1) {\n throw new Error('Malformed git cat-file output: missing header terminator');\n }\n\n const header = output.subarray(offset, headerEnd).toString('utf8');\n offset = headerEnd + 1;\n\n if (header.length === 0) {\n continue;\n }\n\n const missingMatch = /^(.*) missing$/.exec(header);\n if (missingMatch) {\n continue;\n }\n\n const headerMatch = /^(.*) (\\w+) (\\d+)$/.exec(header);\n if (!headerMatch) {\n throw new Error(`Malformed git cat-file header: ${header}`);\n }\n\n const [, objectRef, objectType, sizeText] = headerMatch;\n if (objectType !== 'blob') {\n throw new Error(`Unsupported git object type for ${objectRef}: ${objectType}`);\n }\n\n const size = Number.parseInt(sizeText, 10);\n const contentEnd = offset + size;\n if (contentEnd > output.length) {\n throw new Error(`Malformed git cat-file output for ${objectRef}: truncated blob content`);\n }\n\n blobs.push({\n size,\n content: output.subarray(offset, contentEnd),\n });\n offset = contentEnd;\n\n if (offset < output.length && output[offset] === 0x0a) {\n offset += 1;\n }\n }\n\n return blobs;\n}\n\n// ── WIP (work-in-progress) branch helpers ─────────────────────────────────\n//\n// Periodic best-effort checkpoints push the partial run output to a unique\n// non-default branch (`agentv/inflight/<hostname>/<run-dir-basename>`) every ~30s.\n// The branch is force-pushed (single-writer) to avoid conflict handling and\n// noisy history. On successful run completion the branch is deleted.\n//\n// Manual recovery: if a pod is lost mid-run, an operator can clone the results\n// repo, checkout `agentv/inflight/<hostname>/<run-dir>`, and resume with:\n// cp -r .agentv/results/runs/<run-dir> <local-workspace>\n// agentv eval <eval-file> --output <local-workspace>/<run-dir> --resume\n\nexport function buildWipBranchName(runDir: string): string {\n const hostname = os\n .hostname()\n .replace(/[^A-Za-z0-9._-]+/g, '-')\n .slice(0, 40);\n const runBasename = path\n .basename(runDir)\n .replace(/[^A-Za-z0-9._-]+/g, '-')\n .slice(0, 60);\n return `agentv/inflight/${hostname}/${runBasename}`;\n}\n\nexport interface WipWorktreeHandle {\n readonly wipBranch: string;\n readonly worktreeDir: string;\n readonly cloneDir: string;\n readonly cleanup: () => Promise<void>;\n}\n\nexport async function setupWipWorktree(params: {\n readonly config: ResultsConfig;\n readonly wipBranch: string;\n}): Promise<WipWorktreeHandle> {\n const normalized = normalizeResultsConfig(params.config);\n const cloneDir = await ensureResultsRepoClone(normalized);\n await fetchResultsRepo(cloneDir);\n const baseRef = normalized.branch\n ? await assertConfiguredResultsBranchExists(cloneDir, normalized)\n : remoteBranchRef(await resolveDefaultBranch(cloneDir));\n if (!baseRef) {\n throw missingConfiguredBranchError(normalized);\n }\n const worktreeRoot = await mkdtemp(path.join(os.tmpdir(), 'agentv-wip-'));\n const worktreeDir = path.join(worktreeRoot, 'repo');\n await runGit(['worktree', 'add', '-B', params.wipBranch, worktreeDir, baseRef], {\n cwd: cloneDir,\n });\n // Ensure commits work even without a global git user config.\n await runGit(['config', 'user.email', 'agentv@wip-checkpoint'], { cwd: worktreeDir });\n await runGit(['config', 'user.name', 'AgentV WIP Checkpoint'], { cwd: worktreeDir });\n return {\n wipBranch: params.wipBranch,\n worktreeDir,\n cloneDir,\n cleanup: async () => {\n try {\n await runGit(['worktree', 'remove', '--force', worktreeDir], { cwd: cloneDir });\n } finally {\n await rm(worktreeRoot, { recursive: true, force: true }).catch(() => undefined);\n }\n },\n };\n}\n\n/**\n * Snapshot the current run output into the WIP worktree and force-push to the\n * remote WIP branch. Returns true if a push was performed, false if nothing changed.\n *\n * Uses `--amend` on the base-branch tip so the remote WIP branch always holds\n * exactly one snapshot commit (no noisy history accumulation).\n */\nexport async function pushWipCheckpoint(params: {\n readonly handle: WipWorktreeHandle;\n readonly sourceDir: string;\n readonly destinationPath: string;\n}): Promise<boolean> {\n const destinationDir = path.join(\n params.handle.worktreeDir,\n RESULTS_REPO_RUNS_DIR,\n params.destinationPath,\n );\n await stageResultsArtifacts({\n repoDir: params.handle.worktreeDir,\n sourceDir: params.sourceDir,\n destinationDir,\n });\n await runGit(['add', '--all', '--', RESULTS_REPO_RESULTS_DIR], {\n cwd: params.handle.worktreeDir,\n });\n const { stdout: status } = await runGit(['status', '--porcelain'], {\n cwd: params.handle.worktreeDir,\n check: false,\n });\n if (!status.trim()) {\n return false;\n }\n const timestamp = new Date().toISOString();\n await runGit(\n ['commit', '--amend', '-m', `wip(results): checkpoint ${params.handle.wipBranch} ${timestamp}`],\n { cwd: params.handle.worktreeDir },\n );\n await runGit(['push', '--force', 'origin', params.handle.wipBranch], {\n cwd: params.handle.worktreeDir,\n });\n return true;\n}\n\nexport async function deleteWipBranch(params: {\n readonly config: ResultsConfig;\n readonly wipBranch: string;\n}): Promise<void> {\n const normalized = normalizeResultsConfig(params.config);\n const cloneDir = await ensureResultsRepoClone(normalized);\n await runGit(['push', 'origin', '--delete', params.wipBranch], { cwd: cloneDir });\n}\n\nexport async function listGitRuns(repoDir: string, ref = 'origin/main'): Promise<GitListedRun[]> {\n const { stdout: treeOut } = await runGit(\n ['ls-tree', '-r', '--name-only', ref, RESULTS_REPO_RUNS_DIR],\n {\n cwd: repoDir,\n },\n );\n\n const benchmarkPaths = treeOut\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.endsWith('/benchmark.json'));\n if (benchmarkPaths.length === 0) {\n return [];\n }\n\n const batchInput = `${benchmarkPaths.map((benchmarkPath) => `${ref}:${benchmarkPath}`).join('\\n')}\\n`;\n const blobs = parseGitBatchBlobs(await runGitBatch(repoDir, batchInput));\n if (blobs.length !== benchmarkPaths.length) {\n throw new Error(\n `Expected ${benchmarkPaths.length} git blobs but received ${blobs.length} while listing results runs`,\n );\n }\n\n const runs = blobs.flatMap((blob, index): GitListedRun[] => {\n const benchmarkPath = benchmarkPaths[index];\n const benchmark = JSON.parse(blob.content.toString('utf8')) as GitRunBenchmark;\n const runDir = path.posix.dirname(benchmarkPath);\n const relativeRunPath = path.posix.relative(RESULTS_REPO_RUNS_DIR, runDir);\n const runId = buildGitRunId(relativeRunPath);\n const timestamp = benchmark.metadata?.timestamp?.trim() || path.posix.basename(runDir);\n const displayName = benchmark.metadata?.display_name?.trim() || path.posix.basename(runDir);\n const targets = benchmark.metadata?.targets ?? [];\n const passRate = computeAveragePassRate(benchmark.run_summary);\n\n return [\n {\n run_id: runId,\n experiment: getRunExperiment(runId, benchmark),\n timestamp,\n ...(passRate !== undefined && { pass_rate: passRate }),\n ...(targets.length === 1 && targets[0] ? { target: targets[0] } : {}),\n manifest_path: path.posix.join(runDir, 'index.jsonl'),\n benchmark_path: benchmarkPath,\n display_name: displayName,\n test_count: benchmark.metadata?.tests_run?.length ?? 0,\n avg_score: 0,\n size_bytes: blob.size,\n },\n ];\n });\n\n runs.sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n return runs;\n}\n\nexport async function materializeGitRun(\n repoDir: string,\n relativeRunPath: string,\n ref = 'origin/main',\n): Promise<void> {\n const normalizedRunPath = relativeRunPath.split(path.sep).join('/');\n const runTreePath = path.posix.join(RESULTS_REPO_RUNS_DIR, normalizedRunPath);\n const targetRunDir = path.join(repoDir, ...runTreePath.split('/'));\n const { stdout: treeOut } = await runGit(['ls-tree', '-r', '--name-only', ref, runTreePath], {\n cwd: repoDir,\n });\n\n const filePaths = treeOut\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (filePaths.length === 0) {\n return;\n }\n\n const batchInput = `${filePaths.map((filePath) => `${ref}:${filePath}`).join('\\n')}\\n`;\n const blobs = parseGitBatchBlobs(await runGitBatch(repoDir, batchInput));\n if (blobs.length !== filePaths.length) {\n throw new Error(\n `Expected ${filePaths.length} git blobs but received ${blobs.length} while materializing results run`,\n );\n }\n\n const tempRoot = mkdtempSync(path.join(repoDir, '.agentv-run-'));\n const tempRunDir = path.join(tempRoot, 'run');\n\n try {\n for (const [index, filePath] of filePaths.entries()) {\n const relativeFilePath = path.posix.relative(runTreePath, filePath);\n const absolutePath = path.join(tempRunDir, ...relativeFilePath.split('/'));\n mkdirSync(path.dirname(absolutePath), { recursive: true });\n writeFileSync(absolutePath, blobs[index].content);\n }\n\n mkdirSync(path.dirname(targetRunDir), { recursive: true });\n try {\n renameSync(tempRunDir, targetRunDir);\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;\n if ((code === 'EEXIST' || code === 'ENOTEMPTY') && existsSync(targetRunDir)) {\n return;\n }\n throw error;\n }\n } finally {\n rmSync(tempRoot, { recursive: true, force: true });\n }\n}\n","/**\n * Project sync — pulls remote Git repos to the local path declared in the\n * project registry before Dashboard/eval startup.\n *\n * Sync is oneshot only, triggered by the Dashboard UI \"Sync\" button or the\n * `agentv project sync` CLI command. There is no daemon or continuous mode.\n *\n * First run — git clone --depth 1 --filter=blob:none --branch <ref> <repoUrl> <path>\n * Subsequent — git pull --ff-only (when <path>/.git already exists)\n *\n * Usage:\n * import { syncProjects } from './project-sync.js';\n * await syncProjects(registry.projects);\n */\n\nimport * as childProcess from 'node:child_process';\nimport { existsSync } from 'node:fs';\n\nimport type { ProjectEntry } from './projects.js';\n\n/**\n * Clone or pull a single project entry from its declared repo URL.\n * - No .git present: shallow clone into entry.path.\n * - .git present: git pull --ff-only to update in place.\n * Throws on git error or missing repoUrl/ref.\n */\nexport async function syncProject(entry: ProjectEntry): Promise<void> {\n if (!entry.repoUrl) {\n throw new Error(`Project '${entry.id}' has no repo_url defined`);\n }\n if (!entry.ref) {\n throw new Error(`Project '${entry.id}' has no ref defined`);\n }\n const dest = entry.path;\n\n if (existsSync(`${dest}/.git`)) {\n childProcess.execFileSync('git', ['-C', dest, 'pull', '--ff-only'], { stdio: 'inherit' });\n } else {\n childProcess.execFileSync(\n 'git',\n ['clone', '--depth', '1', '--filter=blob:none', '--branch', entry.ref, entry.repoUrl, dest],\n { stdio: 'inherit' },\n );\n }\n}\n\n/**\n * Iterate project entries and sync any that have a repo URL declared.\n * Entries without repoUrl are skipped silently.\n */\nexport async function syncProjects(entries: ProjectEntry[]): Promise<void> {\n for (const entry of entries) {\n if (!entry.repoUrl) continue;\n console.log(`Syncing project '${entry.id}' from ${entry.repoUrl}...`);\n await syncProject(entry);\n console.log(`Project '${entry.id}' synced.`);\n }\n}\n","import type { EvaluationResult, GraderResult } from './types.js';\n\n/**\n * Top-level fields to strip from baseline results.\n * Uses a denylist approach: new fields are auto-preserved.\n */\nconst STRIPPED_TOP_LEVEL_FIELDS = new Set([\n 'requests',\n 'trace',\n 'workspacePath',\n 'output',\n 'beforeAllOutput',\n 'beforeEachOutput',\n 'afterAllOutput',\n 'afterEachOutput',\n 'fileChanges',\n // Promoted execution metrics (debug, not needed for regression comparison)\n 'tokenUsage',\n 'costUsd',\n 'durationMs',\n 'startTime',\n 'endTime',\n]);\n\n/**\n * Fields to strip from grader results.\n */\nconst STRIPPED_EVALUATOR_FIELDS = new Set(['rawRequest', 'input']);\n\n/**\n * Trims an evaluator result for baseline storage.\n * Strips debug/audit fields while preserving scoring data.\n * Recursively trims nested grader results (for composites).\n */\nfunction trimEvaluatorResult(result: GraderResult): GraderResult {\n const trimmed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(result)) {\n if (STRIPPED_EVALUATOR_FIELDS.has(key)) continue;\n if (key === 'scores' && Array.isArray(value)) {\n trimmed[key] = (value as GraderResult[]).map(trimEvaluatorResult);\n } else {\n trimmed[key] = value;\n }\n }\n return trimmed as unknown as GraderResult;\n}\n\n/**\n * Trims an EvaluationResult for baseline storage.\n * Strips large debug/audit fields (denylist approach) while preserving\n * all fields needed for regression comparison (scores, assertions, etc.).\n *\n * Returns a new object — the input is not mutated.\n */\nexport function trimBaselineResult(result: EvaluationResult): EvaluationResult {\n const trimmed: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(result)) {\n if (STRIPPED_TOP_LEVEL_FIELDS.has(key)) continue;\n if (key === 'scores' && Array.isArray(value)) {\n trimmed[key] = (value as GraderResult[]).map(trimEvaluatorResult);\n } else {\n trimmed[key] = value;\n }\n }\n return trimmed as unknown as EvaluationResult;\n}\n","/** Default category for eval files without subdirectory structure. */\nexport const DEFAULT_CATEGORY = 'Uncategorized';\n\n/**\n * Derive a human-readable category from an eval file's relative path.\n *\n * Strips the filename and any `evals` directory segments, then joins\n * remaining directories with `/`. Returns {@link DEFAULT_CATEGORY} for files\n * at the root level.\n */\nexport function deriveCategory(relativePath: string): string {\n const parts = relativePath.split(/[/\\\\]/);\n if (parts.length <= 1) {\n return DEFAULT_CATEGORY;\n }\n const dirs = parts.slice(0, -1).filter((d) => d !== 'evals');\n return dirs.length > 0 ? dirs.join('/') : DEFAULT_CATEGORY;\n}\n","import type {\n Message,\n ProviderStreamCallbacks,\n ProviderTokenUsage,\n} from '../evaluation/providers/types.js';\nimport type { EvaluationResult } from '../evaluation/types.js';\nimport type { OtelBackendPreset, OtelExportOptions } from './types.js';\n\nexport type { OtelExportOptions, OtelBackendPreset };\n\n// ---------------------------------------------------------------------------\n// Backend presets\n// ---------------------------------------------------------------------------\n\nexport const OTEL_BACKEND_PRESETS: Record<string, OtelBackendPreset> = {\n langfuse: {\n name: 'langfuse',\n endpoint: process.env.LANGFUSE_HOST\n ? `${process.env.LANGFUSE_HOST}/api/public/otel/v1/traces`\n : 'https://cloud.langfuse.com/api/public/otel/v1/traces',\n headers: (env) => {\n const pub = env.LANGFUSE_PUBLIC_KEY ?? '';\n const secret = env.LANGFUSE_SECRET_KEY ?? '';\n return { Authorization: `Basic ${Buffer.from(`${pub}:${secret}`).toString('base64')}` };\n },\n },\n braintrust: {\n name: 'braintrust',\n endpoint: 'https://api.braintrust.dev/otel/v1/traces',\n headers: (env) => {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${env.BRAINTRUST_API_KEY ?? ''}`,\n };\n // x-bt-parent is required by Braintrust to associate traces with a project\n const parent =\n env.BRAINTRUST_PARENT ??\n (env.BRAINTRUST_PROJECT_ID ? `project_id:${env.BRAINTRUST_PROJECT_ID}` : undefined) ??\n (env.BRAINTRUST_PROJECT ? `project_name:${env.BRAINTRUST_PROJECT}` : undefined);\n if (parent) {\n headers['x-bt-parent'] = parent;\n }\n return headers;\n },\n },\n confident: {\n name: 'confident',\n endpoint: 'https://otel.confident-ai.com/v1/traces',\n headers: (env) => ({\n 'x-confident-api-key': env.CONFIDENT_API_KEY ?? '',\n }),\n },\n};\n\n// ---------------------------------------------------------------------------\n// OTel type aliases (resolved dynamically at init)\n// ---------------------------------------------------------------------------\n\n// biome-ignore lint/suspicious/noExplicitAny: OTel types loaded dynamically\ntype OtelApi = any;\n// biome-ignore lint/suspicious/noExplicitAny: OTel types loaded dynamically\ntype NodeTracerProvider = any;\n// biome-ignore lint/suspicious/noExplicitAny: OTel types loaded dynamically\ntype Tracer = any;\n\n// ---------------------------------------------------------------------------\n// Exporter\n// ---------------------------------------------------------------------------\n\nexport class OtelTraceExporter {\n private provider: NodeTracerProvider | null = null;\n private tracer: Tracer | null = null;\n private api: OtelApi | null = null;\n // biome-ignore lint/suspicious/noExplicitAny: OTel types loaded dynamically\n private W3CPropagator: any = null;\n\n constructor(private readonly options: OtelExportOptions) {}\n\n /** Initialize the OTel SDK. Returns false if OTel packages are not available. */\n async init(): Promise<boolean> {\n try {\n const [sdkTraceNode, resourcesMod, semconvMod, api, coreMod] = await Promise.all([\n import('@opentelemetry/sdk-trace-node'),\n import('@opentelemetry/resources'),\n import('@opentelemetry/semantic-conventions'),\n import('@opentelemetry/api'),\n import('@opentelemetry/core').catch(() => null),\n ]);\n\n const { NodeTracerProvider: Provider, SimpleSpanProcessor } = sdkTraceNode;\n const { resourceFromAttributes } = resourcesMod;\n const { ATTR_SERVICE_NAME } = semconvMod;\n\n const resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: this.options.serviceName ?? 'agentv',\n });\n\n // biome-ignore lint/suspicious/noExplicitAny: OTel processor types loaded dynamically\n const processors: any[] = [];\n\n // Remote OTLP exporter (only when endpoint is configured)\n if (this.options.endpoint) {\n const otlpHttp = await import('@opentelemetry/exporter-trace-otlp-http');\n const { OTLPTraceExporter } = otlpHttp;\n const exporter = new OTLPTraceExporter({\n url: this.options.endpoint,\n headers: this.options.headers,\n });\n processors.push(new SimpleSpanProcessor(exporter));\n }\n\n // OTLP JSON file exporter\n if (this.options.otlpFilePath) {\n const { OtlpJsonFileExporter } = await import('./otlp-json-file-exporter.js');\n processors.push(\n new SimpleSpanProcessor(new OtlpJsonFileExporter(this.options.otlpFilePath)),\n );\n }\n\n if (processors.length === 0) {\n return false;\n }\n\n this.provider = new Provider({\n resource,\n spanProcessors: processors,\n });\n this.provider.register();\n this.api = api;\n this.tracer = api.trace.getTracer('agentv', '1.0.0');\n this.W3CPropagator = coreMod?.W3CTraceContextPropagator ?? null;\n return true;\n } catch {\n return false;\n }\n }\n\n /** Export a single evaluation result as an OTel trace. */\n async exportResult(result: EvaluationResult): Promise<void> {\n if (!this.tracer || !this.api) return;\n\n const api = this.api;\n const tracer = this.tracer;\n const captureContent = this.options.captureContent ?? false;\n\n // Determine timing\n const startHr = toHrTime(result.startTime ?? result.timestamp);\n const endHr = toHrTime(result.endTime ?? result.timestamp);\n\n // Support trace composition via W3C traceparent propagation\n let parentCtx = api.ROOT_CONTEXT;\n const traceparent = process.env.TRACEPARENT;\n if (traceparent && this.W3CPropagator) {\n try {\n const propagator = new this.W3CPropagator();\n parentCtx = propagator.extract(\n api.ROOT_CONTEXT,\n { traceparent, tracestate: process.env.TRACESTATE ?? '' },\n {\n get: (carrier: Record<string, string>, key: string) => carrier[key],\n keys: (carrier: Record<string, string>) => Object.keys(carrier),\n },\n );\n } catch {\n // Malformed TRACEPARENT — fall back to standalone trace\n }\n }\n\n tracer.startActiveSpan(\n 'agentv.eval',\n { startTime: startHr },\n parentCtx,\n (rootSpan: {\n setAttribute: (...args: unknown[]) => void;\n addEvent: (...args: unknown[]) => void;\n setStatus: (...args: unknown[]) => void;\n end: (...args: unknown[]) => void;\n }) => {\n // GenAI semantic convention attributes\n rootSpan.setAttribute('gen_ai.operation.name', 'evaluate');\n rootSpan.setAttribute('gen_ai.system', 'agentv');\n\n // Core attributes\n rootSpan.setAttribute('agentv.test_id', result.testId);\n rootSpan.setAttribute('agentv.target', result.target);\n if (result.suite) rootSpan.setAttribute('agentv.suite', result.suite);\n rootSpan.setAttribute('agentv.score', result.score);\n if (captureContent && result.output.length > 0) {\n rootSpan.setAttribute('agentv.output_text', result.output);\n }\n\n // Flat execution metrics\n if (result.durationMs != null)\n rootSpan.setAttribute('agentv.trace.duration_ms', result.durationMs);\n if (result.costUsd != null) rootSpan.setAttribute('agentv.trace.cost_usd', result.costUsd);\n if (result.tokenUsage) {\n if (result.tokenUsage.input != null) {\n rootSpan.setAttribute('agentv.trace.token_input', result.tokenUsage.input);\n }\n if (result.tokenUsage.output != null) {\n rootSpan.setAttribute('agentv.trace.token_output', result.tokenUsage.output);\n }\n if (result.tokenUsage.cached != null) {\n rootSpan.setAttribute('agentv.trace.token_cached', result.tokenUsage.cached);\n }\n }\n\n // Trace summary attributes (tool-specific)\n if (result.trace) {\n const t = result.trace;\n rootSpan.setAttribute('agentv.trace.event_count', t.eventCount);\n rootSpan.setAttribute(\n 'agentv.trace.tool_names',\n Object.keys(t.toolCalls).sort().join(','),\n );\n if (t.llmCallCount != null)\n rootSpan.setAttribute('agentv.trace.llm_call_count', t.llmCallCount);\n }\n\n // Child spans from canonical trace messages.\n // Some callers may still export older result artifacts while migrating,\n // so tolerate a missing trace instead of crashing the exporter.\n const traceMessages = result.trace?.messages ?? [];\n if (traceMessages.length > 0) {\n const parentCtx = api.trace.setSpan(api.context.active(), rootSpan);\n\n if (this.options.groupTurns) {\n const turns = groupMessagesIntoTurns(traceMessages);\n if (turns.length > 1) {\n for (const [i, turn] of turns.entries()) {\n api.context.with(parentCtx, () => {\n tracer.startActiveSpan(\n `agentv.turn.${i + 1}`,\n {},\n (turnSpan: {\n end: (...args: unknown[]) => void;\n }) => {\n const turnCtx = api.trace.setSpan(api.context.active(), turnSpan);\n for (const msg of turn.messages) {\n this.exportMessage(tracer, api, turnCtx, msg, captureContent);\n }\n turnSpan.end();\n },\n );\n });\n }\n } else {\n for (const msg of traceMessages) {\n this.exportMessage(tracer, api, parentCtx, msg, captureContent);\n }\n }\n } else {\n for (const msg of traceMessages) {\n this.exportMessage(tracer, api, parentCtx, msg, captureContent);\n }\n }\n }\n\n // Grader scores as span events\n if (result.scores) {\n for (const score of result.scores) {\n rootSpan.addEvent(`agentv.grader.${score.name}`, {\n 'agentv.grader.score': score.score,\n 'agentv.grader.type': score.type,\n ...(score.verdict ? { 'agentv.grader.verdict': score.verdict } : {}),\n });\n }\n }\n\n // Status\n if (result.error) {\n rootSpan.setStatus({ code: api.SpanStatusCode.ERROR, message: result.error });\n } else {\n rootSpan.setStatus({ code: api.SpanStatusCode.OK });\n }\n\n rootSpan.end(endHr);\n },\n );\n }\n\n /** Flush pending spans and shut down. */\n async shutdown(): Promise<void> {\n await this.provider?.shutdown();\n }\n\n /** Create a streaming observer for real-time span export */\n createStreamingObserver(): OtelStreamingObserver | null {\n if (!this.tracer || !this.api) return null;\n // Extract TRACEPARENT for trace composition\n let parentCtx: unknown;\n const traceparent = process.env.TRACEPARENT;\n if (traceparent && this.W3CPropagator) {\n try {\n const propagator = new this.W3CPropagator();\n parentCtx = propagator.extract(\n this.api.ROOT_CONTEXT,\n { traceparent, tracestate: process.env.TRACESTATE ?? '' },\n {\n get: (carrier: Record<string, string>, key: string) => carrier[key],\n keys: (carrier: Record<string, string>) => Object.keys(carrier),\n },\n );\n } catch {\n // Malformed TRACEPARENT — ignore\n }\n }\n return new OtelStreamingObserver(\n this.tracer,\n this.api,\n this.options.captureContent ?? false,\n parentCtx,\n );\n }\n\n // -----------------------------------------------------------------------\n // Private helpers\n // -----------------------------------------------------------------------\n\n private exportMessage(\n tracer: Tracer,\n api: OtelApi,\n parentCtx: unknown,\n msg: Message,\n captureContent: boolean,\n ): void {\n const isAssistant = msg.role === 'assistant';\n const model = msg.metadata?.model ? String(msg.metadata.model) : undefined;\n const spanName = isAssistant ? `chat ${model ?? 'unknown'}` : `gen_ai.message.${msg.role}`;\n\n const startHr = toHrTime(msg.startTime);\n const endHr = toHrTime(msg.endTime);\n\n api.context.with(parentCtx, () => {\n tracer.startActiveSpan(\n spanName,\n { startTime: startHr },\n parentCtx,\n (span: {\n setAttribute: (...args: unknown[]) => void;\n end: (...args: unknown[]) => void;\n }) => {\n if (isAssistant) {\n span.setAttribute('gen_ai.operation.name', 'chat');\n }\n if (model) {\n span.setAttribute('gen_ai.request.model', model);\n span.setAttribute('gen_ai.response.model', model);\n }\n\n // Per-span token usage (GenAI conventions)\n if (msg.tokenUsage) {\n if (msg.tokenUsage.input != null) {\n span.setAttribute('gen_ai.usage.input_tokens', msg.tokenUsage.input);\n }\n if (msg.tokenUsage.output != null) {\n span.setAttribute('gen_ai.usage.output_tokens', msg.tokenUsage.output);\n }\n if (msg.tokenUsage.cached != null) {\n span.setAttribute('gen_ai.usage.cache_read.input_tokens', msg.tokenUsage.cached);\n }\n }\n\n if (captureContent && msg.content != null) {\n span.setAttribute(\n 'gen_ai.output.messages',\n typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content),\n );\n }\n\n // Tool call child spans\n if (msg.toolCalls) {\n const msgCtx = api.trace.setSpan(api.context.active(), span);\n for (const tc of msg.toolCalls) {\n api.context.with(msgCtx, () => {\n tracer.startActiveSpan(\n `execute_tool ${tc.tool}`,\n {},\n msgCtx,\n (toolSpan: {\n setAttribute: (...args: unknown[]) => void;\n end: (...args: unknown[]) => void;\n }) => {\n toolSpan.setAttribute('gen_ai.tool.name', tc.tool);\n if (tc.id) toolSpan.setAttribute('gen_ai.tool.call.id', tc.id);\n\n if (captureContent) {\n if (tc.input != null) {\n toolSpan.setAttribute(\n 'gen_ai.tool.call.arguments',\n typeof tc.input === 'string' ? tc.input : JSON.stringify(tc.input),\n );\n }\n if (tc.output != null) {\n toolSpan.setAttribute(\n 'gen_ai.tool.call.result',\n typeof tc.output === 'string' ? tc.output : JSON.stringify(tc.output),\n );\n }\n }\n\n toolSpan.end();\n },\n );\n });\n }\n }\n\n span.end(endHr);\n },\n );\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Streaming observer\n// ---------------------------------------------------------------------------\n\n/**\n * Streaming observer that creates OTel spans in real-time during eval execution.\n * Spans are exported immediately via SimpleSpanProcessor as each tool call / LLM response completes.\n */\nexport class OtelStreamingObserver {\n // biome-ignore lint/suspicious/noExplicitAny: OTel span type loaded dynamically\n private rootSpan: any = null;\n // biome-ignore lint/suspicious/noExplicitAny: OTel context loaded dynamically\n private rootCtx: any = null;\n private observedChildSpans = false;\n private pendingMetrics: {\n durationMs?: number;\n costUsd?: number;\n tokenUsage?: ProviderTokenUsage;\n trace?: {\n eventCount: number;\n toolCalls: Record<string, number>;\n llmCallCount?: number;\n };\n } | null = null;\n\n constructor(\n private readonly tracer: Tracer,\n private readonly api: OtelApi,\n private readonly captureContent: boolean,\n // biome-ignore lint/suspicious/noExplicitAny: OTel context loaded dynamically\n private readonly parentCtx?: any,\n ) {}\n\n /** Create root eval span immediately (visible in backend right away) */\n startEvalCase(testId: string, target: string, evalSet?: string): void {\n this.pendingMetrics = null;\n this.observedChildSpans = false;\n const ctx = this.parentCtx ?? this.api.context.active();\n this.rootSpan = this.tracer.startSpan('agentv.eval', undefined, ctx);\n this.rootSpan.setAttribute('gen_ai.operation.name', 'evaluate');\n this.rootSpan.setAttribute('gen_ai.system', 'agentv');\n this.rootSpan.setAttribute('agentv.test_id', testId);\n this.rootSpan.setAttribute('agentv.target', target);\n if (evalSet) this.rootSpan.setAttribute('agentv.suite', evalSet);\n this.rootCtx = this.api.trace.setSpan(this.api.context.active(), this.rootSpan);\n }\n\n /** Create and immediately export a tool span */\n onToolCall(\n name: string,\n input: unknown,\n output: unknown,\n _durationMs: number,\n toolCallId?: string,\n ): void {\n if (!this.rootCtx) return;\n this.observedChildSpans = true;\n this.api.context.with(this.rootCtx, () => {\n const span = this.tracer.startSpan(`execute_tool ${name}`, undefined, this.rootCtx);\n span.setAttribute('gen_ai.tool.name', name);\n if (toolCallId) span.setAttribute('gen_ai.tool.call.id', toolCallId);\n if (this.captureContent) {\n if (input != null)\n span.setAttribute(\n 'gen_ai.tool.call.arguments',\n typeof input === 'string' ? input : JSON.stringify(input),\n );\n if (output != null)\n span.setAttribute(\n 'gen_ai.tool.call.result',\n typeof output === 'string' ? output : JSON.stringify(output),\n );\n }\n span.end();\n });\n }\n\n /** Create and immediately export an LLM span */\n onLlmCall(model: string, tokenUsage?: ProviderTokenUsage): void {\n if (!this.rootCtx) return;\n this.observedChildSpans = true;\n this.api.context.with(this.rootCtx, () => {\n const span = this.tracer.startSpan(`chat ${model}`, undefined, this.rootCtx);\n span.setAttribute('gen_ai.operation.name', 'chat');\n span.setAttribute('gen_ai.request.model', model);\n span.setAttribute('gen_ai.response.model', model);\n if (tokenUsage) {\n if (tokenUsage.input != null)\n span.setAttribute('gen_ai.usage.input_tokens', tokenUsage.input);\n if (tokenUsage.output != null)\n span.setAttribute('gen_ai.usage.output_tokens', tokenUsage.output);\n if (tokenUsage.cached != null)\n span.setAttribute('gen_ai.usage.cache_read.input_tokens', tokenUsage.cached);\n }\n span.end();\n });\n }\n\n /** Record final execution metrics before the root span is finalized. */\n recordEvalMetrics(result: {\n durationMs?: number;\n costUsd?: number;\n tokenUsage?: ProviderTokenUsage;\n trace?: {\n eventCount: number;\n toolCalls: Record<string, number>;\n llmCallCount?: number;\n };\n }): void {\n this.pendingMetrics = result;\n }\n\n /** Finalize root span with score/verdict after evaluation completes */\n finalizeEvalCase(score: number, error?: string): void {\n if (!this.rootSpan) return;\n this.rootSpan.setAttribute('agentv.score', score);\n if (this.pendingMetrics?.durationMs != null) {\n this.rootSpan.setAttribute('agentv.trace.duration_ms', this.pendingMetrics.durationMs);\n }\n if (this.pendingMetrics?.costUsd != null) {\n this.rootSpan.setAttribute('agentv.trace.cost_usd', this.pendingMetrics.costUsd);\n }\n if (this.pendingMetrics?.tokenUsage) {\n if (this.pendingMetrics.tokenUsage.input != null) {\n this.rootSpan.setAttribute(\n 'agentv.trace.token_input',\n this.pendingMetrics.tokenUsage.input,\n );\n }\n if (this.pendingMetrics.tokenUsage.output != null) {\n this.rootSpan.setAttribute(\n 'agentv.trace.token_output',\n this.pendingMetrics.tokenUsage.output,\n );\n }\n if (this.pendingMetrics.tokenUsage.cached != null) {\n this.rootSpan.setAttribute(\n 'agentv.trace.token_cached',\n this.pendingMetrics.tokenUsage.cached,\n );\n }\n }\n if (this.pendingMetrics?.trace) {\n this.rootSpan.setAttribute('agentv.trace.event_count', this.pendingMetrics.trace.eventCount);\n this.rootSpan.setAttribute(\n 'agentv.trace.tool_names',\n Object.keys(this.pendingMetrics.trace.toolCalls).sort().join(','),\n );\n if (this.pendingMetrics.trace.llmCallCount != null) {\n this.rootSpan.setAttribute(\n 'agentv.trace.llm_call_count',\n this.pendingMetrics.trace.llmCallCount,\n );\n }\n }\n if (error) {\n this.rootSpan.setStatus({ code: this.api.SpanStatusCode.ERROR, message: error });\n } else {\n this.rootSpan.setStatus({ code: this.api.SpanStatusCode.OK });\n }\n this.rootSpan.end();\n this.rootSpan = null;\n this.rootCtx = null;\n this.observedChildSpans = false;\n this.pendingMetrics = null;\n }\n\n /** Backfill child spans from the completed result when the provider emitted no live callbacks. */\n completeFromResult(result: EvaluationResult): void {\n this.recordEvalMetrics({\n durationMs: result.durationMs,\n costUsd: result.costUsd,\n tokenUsage: result.tokenUsage,\n trace: result.trace,\n });\n\n if (this.observedChildSpans || !this.rootCtx) {\n return;\n }\n\n const model =\n result.trace.messages.find((msg) => msg.role === 'assistant')?.metadata?.model ??\n result.target ??\n 'unknown';\n\n this.onLlmCall(String(model), result.tokenUsage);\n\n for (const message of result.trace.messages) {\n for (const toolCall of message.toolCalls ?? []) {\n this.onToolCall(\n toolCall.tool,\n toolCall.input,\n toolCall.output,\n toolCall.durationMs ?? 0,\n toolCall.id,\n );\n }\n }\n }\n\n /** Return the active eval span's trace ID and span ID for Braintrust trace bridging */\n getActiveSpanIds(): { parentSpanId: string; rootSpanId: string } | null {\n if (!this.rootSpan) return null;\n try {\n const spanCtx = this.rootSpan.spanContext?.() ?? this.rootSpan._spanContext;\n if (!spanCtx?.traceId || !spanCtx?.spanId) return null;\n return { parentSpanId: spanCtx.spanId, rootSpanId: spanCtx.traceId };\n } catch {\n return null;\n }\n }\n\n /** Get ProviderStreamCallbacks for passing to providers */\n getStreamCallbacks(): ProviderStreamCallbacks {\n return {\n onToolCallEnd: (name, input, output, durationMs, toolCallId) =>\n this.onToolCall(name, input, output, durationMs, toolCallId),\n onLlmCallEnd: (model, tokenUsage) => this.onLlmCall(model, tokenUsage),\n getActiveSpanIds: () => this.getActiveSpanIds(),\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Turn grouping\n// ---------------------------------------------------------------------------\n\ninterface Turn {\n messages: Message[];\n}\n\nfunction groupMessagesIntoTurns(messages: readonly Message[]): Turn[] {\n const turns: Turn[] = [];\n let current: Message[] = [];\n for (const msg of messages) {\n if (msg.role === 'user' && current.length > 0) {\n turns.push({ messages: current });\n current = [];\n }\n current.push(msg);\n }\n if (current.length > 0) turns.push({ messages: current });\n return turns;\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/** Convert an optional ISO timestamp to an HrTime-compatible value (milliseconds). */\nfunction toHrTime(iso?: string): number | undefined {\n if (!iso) return undefined;\n return new Date(iso).getTime();\n}\n","/**\n * Tracks cumulative cost across all eval files in a single CLI run.\n *\n * The per-suite budget (`execution.budget_usd` in YAML) is enforced by the orchestrator\n * and caps spend within one eval file. This tracker provides a **run-level** cap that\n * spans all files in a single `agentv run` invocation.\n *\n * Usage:\n * 1. Instantiate with the cap from `--budget-usd`.\n * 2. Share the tracker with each orchestrator running in the invocation.\n * 3. After each completed case, call `add()` with that case's total cost.\n * 4. Before dispatching the next case or file, check `isExceeded()`.\n *\n * Thread-safety note: AgentV mutates this tracker from async orchestration code, but all\n * updates occur on the JavaScript event loop. There is no shared-memory mutation across\n * threads, so simple cumulative accounting is sufficient here.\n */\nexport class RunBudgetTracker {\n private cumulative = 0;\n\n constructor(private readonly capUsd: number) {}\n\n /** Accumulate cost from a completed test or file. */\n add(costUsd: number): void {\n this.cumulative += costUsd;\n }\n\n /** True when cumulative cost meets or exceeds the cap. */\n isExceeded(): boolean {\n return this.cumulative >= this.capUsd;\n }\n\n /** Current accumulated cost. */\n get currentCostUsd(): number {\n return this.cumulative;\n }\n\n /** The configured cap. */\n get budgetCapUsd(): number {\n return this.capUsd;\n }\n}\n","/**\n * Session hook execution for AgentV.\n *\n * Runs a shell command once at agentv startup and injects exported environment\n * variables into the current process. This lets projects fetch secrets at\n * runtime (e.g. from a vault) without needing a wrapper script.\n *\n * ## How it works\n *\n * 1. The command is run via `sh -c` (or `cmd /c` on Windows).\n * 2. stdout is captured and parsed for env var exports.\n * 3. stderr is forwarded to the process stderr so the user sees output.\n * 4. Non-zero exit aborts with a clear error.\n * 5. Parsed keys are injected into `process.env` — only for keys not already\n * set, so existing env always wins.\n *\n * ## Supported output formats\n *\n * Both shell-export and dotenv formats are accepted:\n * export KEY=\"value\" (shell export — quotes optional)\n * KEY=value (dotenv — no export prefix)\n *\n * Lines that don't match either pattern are silently ignored.\n *\n * @module\n */\n\nimport { spawnSync } from 'node:child_process';\n\n/**\n * Parse env var lines from hook stdout.\n *\n * Accepts:\n * export KEY=\"value\" → { KEY: \"value\" }\n * export KEY=value → { KEY: \"value\" }\n * KEY=value → { KEY: \"value\" }\n *\n * Strips surrounding single or double quotes from values.\n * Skips lines with empty keys or values that look like shell syntax.\n */\nexport function parseEnvOutput(stdout: string): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const line of stdout.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n // Match: [export ]KEY=value\n const match = trimmed.match(/^(?:export\\s+)?([A-Za-z_][A-Za-z0-9_]*)=(.*)$/);\n if (!match) continue;\n\n const key = match[1];\n let value = match[2];\n\n // Strip surrounding quotes (single or double)\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n if (key) {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Run the before_session hook command and inject exported env vars into process.env.\n *\n * - Runs via shell (`sh -c` on POSIX, `cmd /c` on Windows)\n * - Captured stdout is parsed for env vars; stderr is forwarded to process.stderr\n * - Non-zero exit throws an Error with the command and exit code\n * - Keys already set in process.env are NOT overwritten\n *\n * @param command Shell command string to execute\n */\nexport function runBeforeSessionHook(command: string): void {\n const isWindows = process.platform === 'win32';\n const shell = isWindows ? 'cmd' : 'sh';\n const shellFlag = isWindows ? '/c' : '-c';\n\n console.log(`Running before_session hook: ${command}`);\n\n const result = spawnSync(shell, [shellFlag, command], {\n encoding: 'utf8',\n // Do not inherit stdio — capture stdout for parsing, forward stderr manually\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n // Forward stderr so the user can see hook output (warnings, progress, etc.)\n if (result.stderr) {\n process.stderr.write(result.stderr);\n }\n\n if (result.error) {\n throw new Error(`before_session hook failed to start: ${result.error.message}`);\n }\n\n if (result.status !== 0) {\n throw new Error(\n `before_session hook exited with code ${result.status ?? 'unknown'}: ${command}`,\n );\n }\n\n const vars = parseEnvOutput(result.stdout ?? '');\n let injected = 0;\n\n for (const [key, value] of Object.entries(vars)) {\n if (process.env[key] === undefined) {\n process.env[key] = value;\n injected++;\n }\n }\n\n if (injected > 0) {\n console.log(`before_session hook injected ${injected} environment variable(s).`);\n }\n}\n","/**\n * Claude Code session JSONL parser.\n *\n * Reads a Claude Code session transcript (~/.claude/projects/<encoded-path>/<uuid>.jsonl)\n * and converts it to AgentV's Message[] format.\n *\n * Each line is a JSON object with:\n * { type, message: { role, content }, sessionId, timestamp, uuid, requestId, ... }\n *\n * Supported event types:\n * user → Message { role: 'user' } (also contains tool_result blocks)\n * assistant → Message { role: 'assistant', toolCalls from tool_use content blocks }\n *\n * Skipped event types: progress, system, file-history-snapshot\n *\n * Key behaviors:\n * - tool_use blocks in assistant events → ToolCall (pending output)\n * - tool_result blocks in user events → matched to pending tool_use by tool_use_id\n * - Usage is cumulative per requestId; only the last value per requestId is used\n * - Streaming assistant events with the same requestId are deduplicated (keep latest)\n * - Subagent events (isSidechain: true) are filtered out in v1\n * - Duration is from first↔last event timestamp (including skipped types)\n * - cost_usd is null (Claude Code does not report per-session cost)\n */\n\nimport { normalizeToolCall } from '../evaluation/providers/normalize-tool-call.js';\nimport type { Message, ToolCall } from '../evaluation/providers/types.js';\nimport type { TranscriptEntry, TranscriptSource } from './types.js';\n\ninterface ClaudeEvent {\n readonly type: string;\n readonly requestId?: string;\n readonly isSidechain?: boolean;\n readonly message?: {\n readonly role?: string;\n readonly content?: string | readonly ClaudeContentBlock[];\n readonly usage?: ClaudeUsage;\n readonly model?: string;\n };\n readonly sessionId?: string;\n readonly timestamp?: string;\n readonly uuid?: string;\n readonly cwd?: string;\n}\n\ninterface ClaudeContentBlock {\n readonly type: string;\n readonly text?: string;\n readonly thinking?: string;\n readonly name?: string;\n readonly input?: unknown;\n readonly id?: string;\n readonly tool_use_id?: string;\n readonly content?: string | readonly { readonly type: string; readonly text?: string }[];\n}\n\ninterface ClaudeUsage {\n readonly input_tokens?: number;\n readonly output_tokens?: number;\n readonly cache_read_input_tokens?: number;\n}\n\nconst SKIPPED_TYPES = new Set(['progress', 'system', 'file-history-snapshot']);\n\nexport function parseClaudeSession(jsonl: string): TranscriptEntry {\n const messages: Message[] = [];\n let sessionId = '';\n let projectPath: string | undefined;\n let model: string | undefined;\n let startTimestamp: string | undefined;\n let endTimestamp: string | undefined;\n\n // Track usage per requestId — values are cumulative, so we only keep the last\n const usageByRequestId = new Map<string, ClaudeUsage>();\n\n // Track the last assistant message per requestId to deduplicate streaming updates\n let lastAssistantRequestId: string | undefined;\n let lastAssistantIdx = -1;\n\n // Track pending tool_use IDs for pairing with tool_result in user events\n const pendingToolCalls = new Map<string, { msgIdx: number; toolIdx: number }>();\n\n const lines = jsonl.split('\\n').filter((l) => l.trim().length > 0);\n\n for (const line of lines) {\n let event: ClaudeEvent;\n try {\n event = JSON.parse(line) as ClaudeEvent;\n } catch {\n continue;\n }\n\n if (!event.type) continue;\n\n // Track timestamps from ALL events (including skipped types) for accurate duration\n if (event.timestamp) {\n if (!startTimestamp) startTimestamp = event.timestamp;\n endTimestamp = event.timestamp;\n }\n\n // Skip non-message event types\n if (SKIPPED_TYPES.has(event.type)) continue;\n\n // Skip subagent events (v1: only process main conversation)\n if (event.isSidechain) continue;\n\n // Capture session metadata from first event\n if (!sessionId && event.sessionId) {\n sessionId = event.sessionId;\n }\n if (!projectPath && event.cwd) {\n projectPath = event.cwd;\n }\n\n switch (event.type) {\n case 'user': {\n const msg = event.message;\n if (!msg) break;\n\n const contentArr = msg.content;\n\n // User events can contain both tool_result blocks (responses to tool_use)\n // and text blocks. Process tool_results first, then extract text.\n if (Array.isArray(contentArr)) {\n for (const block of contentArr as readonly ClaudeContentBlock[]) {\n if (block.type === 'tool_result' && block.tool_use_id) {\n const pending = pendingToolCalls.get(block.tool_use_id);\n if (pending) {\n const existingMsg = messages[pending.msgIdx];\n const existingCalls = [...(existingMsg.toolCalls ?? [])];\n existingCalls[pending.toolIdx] = {\n ...existingCalls[pending.toolIdx],\n output: extractToolResultContent(block.content),\n };\n messages[pending.msgIdx] = { ...existingMsg, toolCalls: existingCalls };\n pendingToolCalls.delete(block.tool_use_id);\n }\n }\n }\n }\n\n // Extract text content for the user message\n const text = extractTextContent(contentArr);\n if (text !== undefined) {\n messages.push({ role: 'user', content: text });\n }\n break;\n }\n\n case 'assistant': {\n const msg = event.message;\n if (!msg) break;\n\n // Capture model from first assistant message\n if (!model && msg.model) {\n model = msg.model;\n }\n\n // Track usage (cumulative per requestId — last value wins)\n if (msg.usage && event.requestId) {\n usageByRequestId.set(event.requestId, msg.usage);\n }\n\n // Parse content array for text and tool_use blocks\n const { text, toolCalls } = extractAssistantContent(msg.content);\n\n // Deduplicate streaming assistant events with the same requestId\n if (\n event.requestId &&\n event.requestId === lastAssistantRequestId &&\n lastAssistantIdx >= 0\n ) {\n // Replace the previous partial message\n messages[lastAssistantIdx] = {\n role: 'assistant',\n content: text || undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n // Re-register tool calls for pairing\n registerPendingToolCalls(toolCalls, lastAssistantIdx, pendingToolCalls);\n } else {\n // Only push if there's actual content or tool calls\n if (text || toolCalls.length > 0) {\n lastAssistantIdx = messages.length;\n messages.push({\n role: 'assistant',\n content: text || undefined,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n });\n registerPendingToolCalls(toolCalls, lastAssistantIdx, pendingToolCalls);\n }\n }\n lastAssistantRequestId = event.requestId;\n break;\n }\n }\n }\n\n // Compute final usage from last-seen value per requestId\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n for (const usage of usageByRequestId.values()) {\n totalInputTokens += Number(usage.input_tokens ?? 0);\n totalOutputTokens += Number(usage.output_tokens ?? 0);\n }\n const hasUsage = usageByRequestId.size > 0;\n\n let durationMs: number | undefined;\n if (startTimestamp && endTimestamp) {\n durationMs = new Date(endTimestamp).getTime() - new Date(startTimestamp).getTime();\n }\n\n const source: TranscriptSource = {\n provider: 'claude',\n sessionId,\n projectPath,\n startedAt: startTimestamp,\n model,\n };\n\n return {\n messages,\n source,\n tokenUsage: hasUsage ? { input: totalInputTokens, output: totalOutputTokens } : undefined,\n durationMs,\n costUsd: null,\n };\n}\n\n/**\n * Register tool_use IDs from an assistant message for later pairing with tool_result.\n */\nfunction registerPendingToolCalls(\n toolCalls: ToolCall[],\n msgIdx: number,\n pending: Map<string, { msgIdx: number; toolIdx: number }>,\n): void {\n for (let i = 0; i < toolCalls.length; i++) {\n const id = toolCalls[i].id;\n if (id) {\n pending.set(id, { msgIdx, toolIdx: i });\n }\n }\n}\n\n/**\n * Extract text content from a message's content field.\n */\nfunction extractTextContent(\n content: string | readonly ClaudeContentBlock[] | undefined,\n): string | undefined {\n if (content === undefined || content === null) return undefined;\n if (typeof content === 'string') return content;\n\n const textParts: string[] = [];\n for (const block of content) {\n if (block.type === 'text' && block.text) {\n textParts.push(block.text);\n }\n }\n return textParts.length > 0 ? textParts.join('') : undefined;\n}\n\n/**\n * Extract text and tool_use calls from an assistant message's content array.\n * Note: tool_result blocks appear in user events, not here.\n */\nfunction extractAssistantContent(content: string | readonly ClaudeContentBlock[] | undefined): {\n text: string | undefined;\n toolCalls: ToolCall[];\n} {\n if (content === undefined || content === null) {\n return { text: undefined, toolCalls: [] };\n }\n if (typeof content === 'string') {\n return { text: content, toolCalls: [] };\n }\n\n const textParts: string[] = [];\n const toolCalls: ToolCall[] = [];\n\n for (const block of content) {\n switch (block.type) {\n case 'text':\n if (block.text) textParts.push(block.text);\n break;\n\n case 'tool_use':\n if (block.name) {\n toolCalls.push(\n normalizeToolCall('claude', {\n tool: block.name,\n input: block.input,\n id: block.id,\n }),\n );\n }\n break;\n\n // Skip thinking blocks and other types\n }\n }\n\n return {\n text: textParts.length > 0 ? textParts.join('') : undefined,\n toolCalls,\n };\n}\n\n/**\n * Extract text from a tool_result content field.\n */\nfunction extractToolResultContent(\n content: string | readonly { readonly type: string; readonly text?: string }[] | undefined,\n): string | undefined {\n if (content === undefined || content === null) return undefined;\n if (typeof content === 'string') return content;\n\n const parts: string[] = [];\n for (const block of content) {\n if (block.type === 'text' && block.text) {\n parts.push(block.text);\n }\n }\n return parts.length > 0 ? parts.join('') : undefined;\n}\n","/**\n * Codex CLI session JSONL parser.\n *\n * Reads a Codex CLI rollout transcript\n * (~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl) and converts it to AgentV's\n * Message[] format.\n *\n * Each line is a JSON object with one of these top-level types:\n * session_meta → session metadata (id, cwd, cli_version, model)\n * turn_context → per-turn context (model, cwd, turn_id)\n * event_msg → events: task_started, task_complete, user_message,\n * agent_message, token_count\n * response_item → conversation items: message, function_call,\n * function_call_output, reasoning, custom_tool_call,\n * custom_tool_call_output\n *\n * Key behaviors:\n * - response_item with type=message and role=user → user Message\n * - response_item with type=message and role=assistant → assistant Message\n * - response_item with type=function_call → ToolCall (pending output)\n * - response_item with type=function_call_output → matched to pending call by call_id\n * - response_item with type=reasoning → skipped (thinking tokens)\n * - response_item with role=developer → skipped (system prompt)\n * - session_meta → source metadata (session_id, cwd, version, model)\n * - turn_context → model name extraction\n * - Duration is from first↔last event timestamp\n * - cost_usd is null (Codex CLI does not report per-session cost)\n * - Token usage not available from rollout format (rate limit info only)\n *\n * To add a new response_item type: add a case to the switch in parseCodexSession().\n */\n\nimport { normalizeToolCall } from '../evaluation/providers/normalize-tool-call.js';\nimport type { Message, ToolCall } from '../evaluation/providers/types.js';\nimport type { TranscriptEntry, TranscriptSource } from './types.js';\n\ninterface CodexLine {\n readonly timestamp?: string;\n readonly type: string;\n readonly payload: Record<string, unknown>;\n}\n\nexport function parseCodexSession(jsonl: string): TranscriptEntry {\n const messages: Message[] = [];\n let sessionId = '';\n let cwd: string | undefined;\n let model: string | undefined;\n let version: string | undefined;\n let startTimestamp: string | undefined;\n let endTimestamp: string | undefined;\n\n // Track pending function calls by call_id\n const pendingCalls = new Map<string, { msgIdx: number; toolIdx: number }>();\n\n const lines = jsonl.split('\\n').filter((l) => l.trim().length > 0);\n\n for (const line of lines) {\n let entry: CodexLine;\n try {\n entry = JSON.parse(line) as CodexLine;\n } catch {\n continue;\n }\n\n if (!entry.type) continue;\n\n // Track timestamps for duration\n if (entry.timestamp) {\n if (!startTimestamp) startTimestamp = entry.timestamp;\n endTimestamp = entry.timestamp;\n }\n\n const payload = entry.payload ?? {};\n\n switch (entry.type) {\n case 'session_meta': {\n sessionId = String(payload.id ?? '');\n cwd = payload.cwd ? String(payload.cwd) : undefined;\n version = payload.cli_version ? String(payload.cli_version) : undefined;\n if (payload.model && !model) {\n model = String(payload.model);\n }\n break;\n }\n\n case 'turn_context': {\n if (payload.model && !model) {\n model = String(payload.model);\n }\n if (payload.cwd && !cwd) {\n cwd = String(payload.cwd);\n }\n break;\n }\n\n case 'response_item': {\n const itemType = String(payload.type ?? '');\n const role = String(payload.role ?? '');\n\n switch (itemType) {\n case 'message': {\n // Skip developer (system prompt) messages\n if (role === 'developer') break;\n\n const content = extractResponseItemContent(payload.content);\n if (role === 'user' && content) {\n messages.push({ role: 'user', content });\n } else if (role === 'assistant' && content) {\n messages.push({ role: 'assistant', content });\n }\n break;\n }\n\n case 'function_call': {\n const toolName = String(payload.name ?? '');\n const callId = String(payload.call_id ?? '');\n let input: unknown;\n if (typeof payload.arguments === 'string') {\n try {\n input = JSON.parse(payload.arguments);\n } catch {\n input = payload.arguments;\n }\n } else {\n input = payload.arguments;\n }\n\n const toolCall: ToolCall = normalizeToolCall('codex', {\n tool: toolName,\n input,\n id: callId,\n });\n const msgIdx = messages.length;\n messages.push({\n role: 'assistant',\n toolCalls: [toolCall],\n });\n\n if (callId) {\n pendingCalls.set(callId, { msgIdx, toolIdx: 0 });\n }\n break;\n }\n\n case 'custom_tool_call': {\n const toolName = String(payload.name ?? '');\n const callId = String(payload.call_id ?? '');\n let input: unknown;\n if (typeof payload.arguments === 'string') {\n try {\n input = JSON.parse(payload.arguments);\n } catch {\n input = payload.arguments;\n }\n } else {\n input = payload.arguments;\n }\n\n const toolCall: ToolCall = normalizeToolCall('codex', {\n tool: toolName,\n input,\n id: callId,\n });\n const msgIdx = messages.length;\n messages.push({\n role: 'assistant',\n toolCalls: [toolCall],\n });\n\n if (callId) {\n pendingCalls.set(callId, { msgIdx, toolIdx: 0 });\n }\n break;\n }\n\n case 'function_call_output':\n case 'custom_tool_call_output': {\n const callId = String(payload.call_id ?? '');\n const pending = pendingCalls.get(callId);\n if (pending) {\n const existingMsg = messages[pending.msgIdx];\n const existingCalls = [...(existingMsg.toolCalls ?? [])];\n existingCalls[pending.toolIdx] = {\n ...existingCalls[pending.toolIdx],\n output: payload.output,\n };\n messages[pending.msgIdx] = { ...existingMsg, toolCalls: existingCalls };\n pendingCalls.delete(callId);\n }\n break;\n }\n\n // Skip reasoning blocks (thinking tokens)\n case 'reasoning':\n break;\n }\n break;\n }\n\n // Skip event_msg types (task_started, task_complete, token_count, etc.)\n // They don't contain conversation content\n }\n }\n\n let durationMs: number | undefined;\n if (startTimestamp && endTimestamp) {\n durationMs = new Date(endTimestamp).getTime() - new Date(startTimestamp).getTime();\n }\n\n const source: TranscriptSource = {\n provider: 'codex',\n sessionId,\n cwd,\n startedAt: startTimestamp,\n model,\n version,\n };\n\n return {\n messages,\n source,\n // Codex rollout files don't include token counts (only rate limit info)\n tokenUsage: undefined,\n durationMs,\n costUsd: null,\n };\n}\n\n/**\n * Extract text content from a Codex response_item content array.\n * Content is typically: [{ type: \"input_text\"|\"output_text\", text: \"...\" }]\n */\nfunction extractResponseItemContent(content: unknown): string | undefined {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return undefined;\n\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === 'object' && block !== null) {\n const b = block as Record<string, unknown>;\n if (typeof b.text === 'string') {\n parts.push(b.text);\n }\n }\n }\n return parts.length > 0 ? parts.join('') : undefined;\n}\n","/**\n * Codex CLI session discovery.\n *\n * Scans ~/.codex/sessions/ for rollout JSONL files. Codex CLI stores sessions at:\n * ~/.codex/sessions/YYYY/MM/DD/rollout-<timestamp>-<uuid>.jsonl\n *\n * Sessions are returned sorted by modification time (most recent first).\n */\n\nimport { readdir, stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\n\nexport interface CodexSession {\n /** UUID from the filename */\n readonly sessionId: string;\n /** Full path to the JSONL file */\n readonly filePath: string;\n /** Filename (e.g., rollout-2026-03-29T14-22-01-<uuid>.jsonl) */\n readonly filename: string;\n /** Last modification time */\n readonly updatedAt: Date;\n}\n\nexport interface CodexDiscoverOptions {\n /** Filter by date string (YYYY-MM-DD). */\n readonly date?: string;\n /** Maximum number of sessions to return (default: 10). */\n readonly limit?: number;\n /** Override the default ~/.codex/sessions directory. */\n readonly sessionsDir?: string;\n /** Return only the most recent session. */\n readonly latest?: boolean;\n}\n\nconst DEFAULT_SESSIONS_DIR = () => path.join(homedir(), '.codex', 'sessions');\n\nexport async function discoverCodexSessions(opts?: CodexDiscoverOptions): Promise<CodexSession[]> {\n const sessionsDir = opts?.sessionsDir ?? DEFAULT_SESSIONS_DIR();\n const limit = opts?.latest ? 1 : (opts?.limit ?? 10);\n\n const sessions: CodexSession[] = [];\n\n // Walk YYYY/MM/DD directory structure\n let yearDirs: string[];\n try {\n yearDirs = await readdir(sessionsDir);\n } catch {\n return [];\n }\n\n for (const year of yearDirs) {\n const yearPath = path.join(sessionsDir, year);\n let monthDirs: string[];\n try {\n monthDirs = await readdir(yearPath);\n } catch {\n continue;\n }\n\n for (const month of monthDirs) {\n const monthPath = path.join(yearPath, month);\n let dayDirs: string[];\n try {\n dayDirs = await readdir(monthPath);\n } catch {\n continue;\n }\n\n for (const day of dayDirs) {\n // Filter by date if specified\n if (opts?.date) {\n const dirDate = `${year}-${month}-${day}`;\n if (dirDate !== opts.date) continue;\n }\n\n const dayPath = path.join(monthPath, day);\n let files: string[];\n try {\n files = await readdir(dayPath);\n } catch {\n continue;\n }\n\n for (const file of files) {\n if (!file.startsWith('rollout-') || !file.endsWith('.jsonl')) continue;\n\n const filePath = path.join(dayPath, file);\n\n // Extract UUID from filename: rollout-<timestamp>-<uuid>.jsonl\n // UUID is the last segment before .jsonl\n const nameWithoutExt = file.replace(/\\.jsonl$/, '');\n const parts = nameWithoutExt.split('-');\n // UUID is typically the last 5 hyphen-separated segments (standard UUID format)\n const sessionId = parts.length >= 6 ? parts.slice(-5).join('-') : nameWithoutExt;\n\n let updatedAt: Date;\n try {\n const fileStat = await stat(filePath);\n updatedAt = fileStat.mtime;\n } catch {\n updatedAt = new Date(0);\n }\n\n sessions.push({ sessionId, filePath, filename: file, updatedAt });\n }\n }\n }\n }\n\n sessions.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n return sessions.slice(0, limit);\n}\n","/**\n * Claude Code session discovery.\n *\n * Scans ~/.claude/projects/ for session JSONL files. Claude Code stores\n * sessions at:\n * ~/.claude/projects/<encoded-project-path>/<uuid>.jsonl\n *\n * Where <encoded-project-path> is the absolute project path with `/` replaced\n * by `-` and prefixed with `-` (e.g., `-home-user-myproject`).\n *\n * Sessions are returned sorted by modification time (most recent first).\n */\n\nimport { readdir, stat } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\n\nexport interface ClaudeSession {\n /** UUID of the session */\n readonly sessionId: string;\n /** Full path to the JSONL file */\n readonly filePath: string;\n /** Encoded project directory name */\n readonly projectDir: string;\n /** Last modification time */\n readonly updatedAt: Date;\n}\n\nexport interface ClaudeDiscoverOptions {\n /** Filter by session UUID (exact match). */\n readonly sessionId?: string;\n /** Filter by project path (substring match against encoded dir name). */\n readonly projectPath?: string;\n /** Maximum number of sessions to return (default: 10). */\n readonly limit?: number;\n /** Override the default ~/.claude/projects directory. */\n readonly projectsDir?: string;\n /** Return only the most recent session. */\n readonly latest?: boolean;\n}\n\nconst DEFAULT_PROJECTS_DIR = () => path.join(homedir(), '.claude', 'projects');\n\n/**\n * Encode a filesystem path to Claude Code's project directory format.\n * `/home/user/myproject` → `-home-user-myproject`\n */\nfunction encodeProjectPath(projectPath: string): string {\n return projectPath.replace(/\\//g, '-');\n}\n\nexport async function discoverClaudeSessions(\n opts?: ClaudeDiscoverOptions,\n): Promise<ClaudeSession[]> {\n const projectsDir = opts?.projectsDir ?? DEFAULT_PROJECTS_DIR();\n const limit = opts?.latest ? 1 : (opts?.limit ?? 10);\n\n let projectDirs: string[];\n try {\n projectDirs = await readdir(projectsDir);\n } catch {\n return [];\n }\n\n // Filter project directories if projectPath is specified\n if (opts?.projectPath) {\n const encoded = encodeProjectPath(opts.projectPath);\n projectDirs = projectDirs.filter((dir) => dir === encoded || dir.includes(encoded));\n }\n\n const sessions: ClaudeSession[] = [];\n\n for (const projectDir of projectDirs) {\n const dirPath = path.join(projectsDir, projectDir);\n\n let entries: string[];\n try {\n entries = await readdir(dirPath);\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (!entry.endsWith('.jsonl')) continue;\n\n const sessionId = entry.replace(/\\.jsonl$/, '');\n\n // Filter by session ID if specified\n if (opts?.sessionId && sessionId !== opts.sessionId) continue;\n\n const filePath = path.join(dirPath, entry);\n\n let updatedAt: Date;\n try {\n const fileStat = await stat(filePath);\n updatedAt = fileStat.mtime;\n } catch {\n updatedAt = new Date(0);\n }\n\n sessions.push({\n sessionId,\n filePath,\n projectDir,\n updatedAt,\n });\n }\n }\n\n // Sort by modification time, most recent first\n sessions.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n\n return sessions.slice(0, limit);\n}\n","/**\n * Core types for the transcript import pipeline.\n *\n * A TranscriptEntry is the internal (camelCase) representation of a parsed\n * session. A TranscriptJsonLine is the on-disk (snake_case) wire format\n * written to .agentv/transcripts/*.jsonl files.\n *\n * Flow:\n * raw session JSONL → parser → TranscriptEntry (internal)\n * TranscriptEntry → toTranscriptJsonLines() → JSONL on disk\n * JSONL on disk → readTranscriptJsonl() → TranscriptJsonLine[]\n *\n * To add a new importer: write a parser that returns TranscriptEntry,\n * then use toTranscriptJsonLines() to serialize.\n */\n\nimport { readFile } from 'node:fs/promises';\n\nimport type { Message, ProviderTokenUsage, ToolCall } from '../evaluation/providers/types.js';\nimport { type Trace, buildTraceFromMessages } from '../evaluation/trace.js';\n\n/**\n * A parsed transcript: ordered messages plus session metadata (internal camelCase).\n */\nexport interface TranscriptEntry {\n readonly messages: Message[];\n readonly source: TranscriptSource;\n readonly tokenUsage?: ProviderTokenUsage;\n readonly durationMs?: number;\n readonly costUsd?: number | null;\n}\n\n/**\n * Metadata describing the origin of a transcript (internal camelCase).\n */\nexport interface TranscriptSource {\n readonly provider: string;\n readonly sessionId: string;\n readonly projectPath?: string;\n readonly startedAt?: string;\n readonly model?: string;\n readonly version?: string;\n readonly gitBranch?: string;\n readonly cwd?: string;\n}\n\n/**\n * One line in a transcript JSONL file (snake_case wire format).\n *\n * Each line captures one message within an ordered per-test transcript.\n * Consumers group all rows with the same `test_id` into a replayable session.\n */\nexport interface TranscriptJsonLine {\n readonly test_id: string;\n readonly target: string;\n readonly message_index: number;\n readonly role: string;\n readonly name?: string;\n readonly content?: unknown;\n readonly tool_calls?: readonly Record<string, unknown>[];\n readonly start_time?: string;\n readonly end_time?: string;\n readonly duration_ms?: number;\n readonly metadata?: Record<string, unknown>;\n readonly token_usage?: {\n readonly input: number;\n readonly output: number;\n readonly cached?: number;\n readonly reasoning?: number;\n };\n readonly transcript_token_usage?: {\n readonly input: number;\n readonly output: number;\n readonly cached?: number;\n readonly reasoning?: number;\n };\n readonly transcript_duration_ms?: number;\n readonly transcript_cost_usd?: number | null;\n readonly source: {\n readonly provider: string;\n readonly session_id: string;\n readonly model?: string;\n readonly timestamp?: string;\n readonly git_branch?: string;\n readonly cwd?: string;\n readonly version?: string;\n };\n}\n\n/**\n * Grouped replayable transcript reconstructed from per-message rows.\n */\nexport interface TranscriptReplayEntry {\n readonly testId: string;\n readonly target: string;\n readonly messages: readonly Message[];\n readonly tokenUsage?: ProviderTokenUsage;\n readonly durationMs?: number;\n readonly costUsd?: number | null;\n readonly source: TranscriptSource;\n}\n\nfunction dropUndefined(value: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));\n}\n\nfunction toTranscriptTokenUsage(\n usage: ProviderTokenUsage | undefined,\n): TranscriptJsonLine['token_usage'] | undefined {\n if (!usage) {\n return undefined;\n }\n return dropUndefined({\n input: usage.input,\n output: usage.output,\n cached: usage.cached,\n reasoning: usage.reasoning,\n }) as TranscriptJsonLine['token_usage'];\n}\n\nfunction toTranscriptToolCall(toolCall: ToolCall): Record<string, unknown> {\n return dropUndefined({\n tool: toolCall.tool,\n input: toolCall.input,\n output: toolCall.output,\n id: toolCall.id,\n start_time: toolCall.startTime,\n end_time: toolCall.endTime,\n duration_ms: toolCall.durationMs,\n });\n}\n\nfunction toTranscriptMessageFields(\n message: Message,\n): Omit<\n TranscriptJsonLine,\n | 'test_id'\n | 'target'\n | 'message_index'\n | 'source'\n | 'transcript_token_usage'\n | 'transcript_duration_ms'\n | 'transcript_cost_usd'\n> {\n return dropUndefined({\n role: message.role,\n name: message.name,\n content: message.content,\n tool_calls: message.toolCalls?.map(toTranscriptToolCall),\n start_time: message.startTime,\n end_time: message.endTime,\n duration_ms: message.durationMs,\n metadata: message.metadata,\n token_usage: toTranscriptTokenUsage(message.tokenUsage),\n }) as Omit<\n TranscriptJsonLine,\n | 'test_id'\n | 'target'\n | 'message_index'\n | 'source'\n | 'transcript_token_usage'\n | 'transcript_duration_ms'\n | 'transcript_cost_usd'\n >;\n}\n\n/**\n * Convert a parsed TranscriptEntry to per-message JSONL rows.\n */\nexport function toTranscriptJsonLines(\n entry: TranscriptEntry,\n options?: { testId?: string; target?: string },\n): TranscriptJsonLine[] {\n const source = {\n provider: entry.source.provider,\n session_id: entry.source.sessionId,\n model: entry.source.model,\n timestamp: entry.source.startedAt,\n git_branch: entry.source.gitBranch,\n cwd: entry.source.cwd ?? entry.source.projectPath,\n version: entry.source.version,\n };\n const transcriptTokenUsage = entry.tokenUsage\n ? {\n input: entry.tokenUsage.input,\n output: entry.tokenUsage.output,\n cached: entry.tokenUsage.cached,\n reasoning: entry.tokenUsage.reasoning,\n }\n : undefined;\n const testId = options?.testId ?? entry.source.sessionId;\n const target = options?.target ?? entry.source.provider;\n\n return entry.messages.map((message, index) => ({\n test_id: testId,\n target,\n message_index: index,\n ...toTranscriptMessageFields(message),\n transcript_token_usage: transcriptTokenUsage,\n transcript_duration_ms: entry.durationMs,\n transcript_cost_usd: entry.costUsd,\n source,\n }));\n}\n\n/**\n * Convert a canonical evaluation trace to transcript JSONL rows.\n */\nexport function traceToTranscriptJsonLines(\n trace: Trace,\n options?: { testId?: string; target?: string },\n): TranscriptJsonLine[] {\n const provider =\n (typeof trace.metadata?.provider === 'string' ? trace.metadata.provider : undefined) ??\n options?.target ??\n 'agentv';\n const sessionId =\n (typeof trace.metadata?.provider_session_id === 'string'\n ? trace.metadata.provider_session_id\n : undefined) ??\n (typeof trace.metadata?.eval_case_id === 'string' ? trace.metadata.eval_case_id : undefined) ??\n options?.testId ??\n 'trace';\n\n return toTranscriptJsonLines(\n {\n messages: [...trace.messages],\n source: {\n provider,\n sessionId,\n startedAt: trace.startTime,\n },\n tokenUsage: trace.tokenUsage,\n durationMs: trace.durationMs,\n costUsd: trace.costUsd,\n },\n options,\n );\n}\n\n/**\n * Reconstruct a canonical trace/messages representation from transcript JSONL\n * rows. Transcript-aware graders can use this for offline replay parity.\n */\nexport function traceFromTranscriptJsonLines(lines: readonly TranscriptJsonLine[]): Trace {\n const [entry] = groupTranscriptJsonLines(lines);\n if (!entry) {\n return buildTraceFromMessages();\n }\n\n return buildTraceFromMessages({\n output: entry.messages,\n tokenUsage: entry.tokenUsage,\n durationMs: entry.durationMs,\n costUsd: entry.costUsd ?? undefined,\n startTime: entry.source.startedAt,\n provider: entry.source.provider,\n target: entry.target,\n testId: entry.testId,\n conversationId: entry.source.sessionId,\n });\n}\n\nfunction fromTranscriptTokenUsage(\n usage: TranscriptJsonLine['token_usage'],\n): ProviderTokenUsage | undefined {\n if (!usage) {\n return undefined;\n }\n return {\n input: usage.input,\n output: usage.output,\n cached: usage.cached,\n reasoning: usage.reasoning,\n };\n}\n\nfunction readOptionalString(record: Record<string, unknown>, key: string): string | undefined {\n const value = record[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction readOptionalNumber(record: Record<string, unknown>, key: string): number | undefined {\n const value = record[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction fromTranscriptToolCall(wire: Record<string, unknown>): ToolCall | undefined {\n const tool = readOptionalString(wire, 'tool');\n if (!tool) {\n return undefined;\n }\n return {\n tool,\n input: wire.input,\n output: wire.output,\n id: readOptionalString(wire, 'id'),\n startTime: readOptionalString(wire, 'start_time'),\n endTime: readOptionalString(wire, 'end_time'),\n durationMs: readOptionalNumber(wire, 'duration_ms'),\n };\n}\n\nfunction buildReplayMessage(line: TranscriptJsonLine): Message {\n return {\n role: line.role,\n name: line.name,\n content: line.content as Message['content'],\n toolCalls: line.tool_calls\n ?.map(fromTranscriptToolCall)\n .filter((toolCall): toolCall is ToolCall => toolCall !== undefined),\n startTime: line.start_time,\n endTime: line.end_time,\n durationMs: line.duration_ms,\n metadata: line.metadata,\n tokenUsage: fromTranscriptTokenUsage(line.token_usage),\n };\n}\n\n/**\n * Group per-message transcript rows back into replayable conversations.\n */\nexport function groupTranscriptJsonLines(\n lines: readonly TranscriptJsonLine[],\n): TranscriptReplayEntry[] {\n const grouped = new Map<\n string,\n {\n target: string;\n tokenUsage?: ProviderTokenUsage;\n durationMs?: number;\n costUsd?: number | null;\n source: TranscriptSource;\n messages: { index: number; message: Message }[];\n }\n >();\n\n for (const line of lines) {\n const existing = grouped.get(line.test_id);\n const source: TranscriptSource = {\n provider: line.source.provider,\n sessionId: line.source.session_id,\n startedAt: line.source.timestamp,\n model: line.source.model,\n gitBranch: line.source.git_branch,\n cwd: line.source.cwd,\n version: line.source.version,\n };\n const transcriptTokenUsage = line.transcript_token_usage\n ? {\n input: line.transcript_token_usage.input,\n output: line.transcript_token_usage.output,\n cached: line.transcript_token_usage.cached,\n reasoning: line.transcript_token_usage.reasoning,\n }\n : undefined;\n\n if (existing) {\n existing.messages.push({ index: line.message_index, message: buildReplayMessage(line) });\n continue;\n }\n\n grouped.set(line.test_id, {\n target: line.target,\n tokenUsage: transcriptTokenUsage,\n durationMs: line.transcript_duration_ms,\n costUsd: line.transcript_cost_usd,\n source,\n messages: [{ index: line.message_index, message: buildReplayMessage(line) }],\n });\n }\n\n return [...grouped.entries()].map(([testId, entry]) => ({\n testId,\n target: entry.target,\n tokenUsage: entry.tokenUsage,\n durationMs: entry.durationMs,\n costUsd: entry.costUsd,\n source: entry.source,\n messages: entry.messages\n .sort((first, second) => first.index - second.index)\n .map((item) => item.message),\n }));\n}\n\n/**\n * Read a transcript JSONL file and parse each line into a TranscriptJsonLine.\n */\nexport async function readTranscriptJsonl(filePath: string): Promise<TranscriptJsonLine[]> {\n const text = await readFile(filePath, 'utf8');\n return text\n .split('\\n')\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line) as TranscriptJsonLine);\n}\n\n/**\n * Read a JSONL transcript file and return its raw text.\n * Throws if the file does not exist or cannot be read.\n */\nexport async function readTranscriptFile(filePath: string): Promise<string> {\n return readFile(filePath, 'utf8');\n}\n","/**\n * Transcript provider — replays pre-recorded session transcripts through the\n * evaluation pipeline without invoking any live agent.\n *\n * Used by `agentv eval --transcript <file>` to grade imported sessions.\n *\n * How it works:\n * 1. Reads a transcript JSONL file (produced by `agentv import`)\n * 2. Each invocation pops the next line from the transcript\n * 3. Returns a ProviderResponse with pre-populated output, token usage, etc.\n * 4. Graders run identically to live eval — they see the same ProviderResponse\n *\n * The provider name in results is set to the source provider from the transcript\n * (e.g., \"claude\", \"codex\", \"copilot\").\n */\n\nimport type { Provider, ProviderRequest, ProviderResponse } from '../evaluation/providers/types.js';\nimport type { TranscriptReplayEntry } from './types.js';\nimport { groupTranscriptJsonLines, readTranscriptJsonl } from './types.js';\n\nexport class TranscriptProvider implements Provider {\n readonly id: string;\n readonly kind = 'transcript' as const;\n readonly targetName: string;\n\n private entries: TranscriptReplayEntry[];\n private cursor = 0;\n\n constructor(targetName: string, entries: TranscriptReplayEntry[]) {\n this.targetName = targetName;\n this.id = `transcript:${targetName}`;\n this.entries = entries;\n }\n\n /**\n * Create a TranscriptProvider from a JSONL file path.\n */\n static async fromFile(filePath: string): Promise<TranscriptProvider> {\n const lines = await readTranscriptJsonl(filePath);\n if (lines.length === 0) {\n throw new Error(`Transcript file is empty: ${filePath}`);\n }\n const entries = groupTranscriptJsonLines(lines);\n const providerName = entries[0]?.source.provider ?? 'transcript';\n return new TranscriptProvider(providerName, entries);\n }\n\n get lineCount(): number {\n return this.entries.length;\n }\n\n async invoke(_request: ProviderRequest): Promise<ProviderResponse> {\n if (this.cursor >= this.entries.length) {\n throw new Error(\n `Transcript exhausted: ${this.entries.length} entr${this.entries.length === 1 ? 'y' : 'ies'} available but ` +\n `${this.cursor + 1} invocations attempted. Each transcript entry maps to one test case.`,\n );\n }\n\n const entry = this.entries[this.cursor++];\n\n return {\n output: entry.messages,\n tokenUsage: entry.tokenUsage\n ? {\n input: entry.tokenUsage.input,\n output: entry.tokenUsage.output,\n cached: entry.tokenUsage.cached,\n reasoning: entry.tokenUsage.reasoning,\n }\n : undefined,\n durationMs: entry.durationMs,\n costUsd: entry.costUsd ?? undefined,\n startTime: entry.source.startedAt,\n };\n }\n}\n","export * from './evaluation/content.js';\nexport * from './evaluation/types.js';\nexport * from './evaluation/trace.js';\nexport * from './evaluation/trace-envelope.js';\nexport * from './evaluation/replay-fixtures.js';\nexport * from './evaluation/replay-trace-envelopes.js';\nexport { parseYamlValue } from './evaluation/yaml-loader.js';\nexport * from './evaluation/yaml-parser.js';\nexport {\n isAgentSkillsFormat,\n parseAgentSkillsEvals,\n} from './evaluation/loaders/agent-skills-parser.js';\nexport {\n loadConfig,\n resolveResultsConfigForProject,\n type AgentVConfig as AgentVYamlConfig,\n type ResultsConfig,\n} from './evaluation/loaders/config-loader.js';\nexport {\n loadTsEvalFile,\n type TsEvalResult,\n} from './evaluation/loaders/ts-eval-loader.js';\nexport {\n transpileEvalYaml,\n transpileEvalYamlFile,\n getOutputFilenames,\n} from './evaluation/loaders/eval-yaml-transpiler.js';\nexport type {\n EvalsJsonCase,\n EvalsJsonFile,\n TranspileResult,\n} from './evaluation/loaders/eval-yaml-transpiler.js';\nexport * from './evaluation/file-utils.js';\nexport * from './evaluation/providers/index.js';\nexport * from './evaluation/graders.js';\nexport * from './evaluation/orchestrator.js';\nexport {\n evaluate,\n type AssertEntry,\n type ConversationTurnInput,\n type EvalConfig,\n type EvalTestInput,\n type EvalAssertionInput,\n type EvalRunResult,\n type EvalSummary,\n} from './evaluation/evaluate.js';\nexport type {\n AssertContext,\n AssertFn,\n AssertResult,\n} from './evaluation/assertions.js';\nexport {\n defineConfig,\n loadTsConfig,\n type AgentVConfig as AgentVTsConfig,\n} from './evaluation/config.js';\nexport * from './evaluation/generators/index.js';\nexport * from './evaluation/workspace/index.js';\nexport {\n ResponseCache,\n shouldEnableCache,\n shouldSkipCacheForTemperature,\n} from './evaluation/cache/response-cache.js';\nexport { toSnakeCaseDeep, toCamelCaseDeep } from './evaluation/case-conversion.js';\nexport {\n ensureResultsRepoClone,\n syncResultsRepo,\n syncResultsRepoForProject,\n getResultsRepoLocalPaths,\n getResultsRepoStatus,\n getResultsRepoSyncStatus,\n normalizeResultsConfig,\n resolveResultsRepoRunsDir,\n resolveResultsRepoUrl,\n prepareResultsRepoBranch,\n checkoutResultsRepoBranch,\n stageResultsArtifacts,\n directorySizeBytes,\n commitAndPushResultsBranch,\n pushResultsRepoBranch,\n createDraftResultsPr,\n directPushResults,\n buildWipBranchName,\n setupWipWorktree,\n pushWipCheckpoint,\n deleteWipBranch,\n listGitRuns,\n materializeGitRun,\n type CheckedOutResultsRepoBranch,\n type GitListedRun,\n type NormalizedResultsConfig,\n type PreparedResultsRepoBranch,\n type ResultsRepoLocalPaths,\n type ResultsRepoSyncStatus,\n type ResultsRepoStatus,\n type WipWorktreeHandle,\n} from './evaluation/results-repo.js';\nexport {\n getAgentvConfigDir,\n getAgentvHome,\n getAgentvDataDir,\n getWorkspacesRoot,\n getSubagentsRoot,\n getTraceStateRoot,\n getWorkspacePoolRoot,\n} from './paths.js';\nexport {\n type ProjectEntry,\n type ProjectRegistry,\n loadProjectRegistry,\n saveProjectRegistry,\n addProject,\n removeProject,\n getProject,\n getProjectForPath,\n touchProject,\n discoverProjects,\n deriveProjectId,\n getProjectsRegistryPath,\n} from './projects.js';\nexport { syncProject, syncProjects } from './project-sync.js';\nexport { trimBaselineResult } from './evaluation/baseline.js';\nexport { DEFAULT_CATEGORY, deriveCategory } from './evaluation/category.js';\nexport * from './observability/index.js';\n\n// Registry exports\nexport {\n GraderRegistry,\n DeterministicAssertionGrader,\n} from './evaluation/registry/grader-registry.js';\nexport type {\n GraderDispatchContext,\n GraderFactoryFn,\n} from './evaluation/registry/grader-registry.js';\nexport { createBuiltinRegistry } from './evaluation/registry/builtin-graders.js';\nexport { discoverAssertions } from './evaluation/registry/assertion-discovery.js';\nexport {\n runContainsAssertion,\n runContainsAnyAssertion,\n runContainsAllAssertion,\n runIcontainsAssertion,\n runIcontainsAnyAssertion,\n runIcontainsAllAssertion,\n runStartsWithAssertion,\n runEndsWithAssertion,\n runRegexAssertion,\n runIsJsonAssertion,\n runEqualsAssertion,\n type AssertionResult,\n} from './evaluation/graders/assertions.js';\nexport { discoverGraders } from './evaluation/registry/grader-discovery.js';\nexport { RunBudgetTracker } from './evaluation/run-budget-tracker.js';\nexport { runBeforeSessionHook, parseEnvOutput } from './evaluation/hooks.js';\nexport {\n trackChild,\n killAllTrackedChildren,\n trackedChildCount,\n} from './runtime/child-tracker.js';\n\n// Import pipeline\nexport * from './import/index.js';\n\nexport type AgentKernel = {\n status: string;\n};\n\nexport function createAgentKernel(): AgentKernel {\n return { status: 'stub' };\n}\n"],"mappings":"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","names":["path","readFileSync","existsSync","readdir","stat","homedir","readFile","noSkillFile","z","OtlpJsonFileExporter","parentCtx"]}
|