vieval 0.0.11 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -31
- package/dist/bin/vieval.mjs +1 -1
- package/dist/cli/index.d.mts +1 -1
- package/dist/cli/index.mjs +1 -1
- package/dist/{cli-CHFCF8UR.mjs → cli-uzS81IPd.mjs} +1529 -1529
- package/dist/cli-uzS81IPd.mjs.map +1 -0
- package/dist/config.d.mts +1 -1
- package/dist/core/assertions/index.d.mts +156 -156
- package/dist/core/assertions/index.mjs +82 -82
- package/dist/core/assertions/index.mjs.map +1 -1
- package/dist/core/inference-executors/index.d.mts +37 -37
- package/dist/core/inference-executors/index.mjs +53 -52
- package/dist/core/inference-executors/index.mjs.map +1 -1
- package/dist/core/processors/results/index.d.mts +18 -18
- package/dist/core/processors/results/index.mjs.map +1 -1
- package/dist/core/runner/index.d.mts +2 -2
- package/dist/core/runner/index.mjs +258 -258
- package/dist/core/runner/index.mjs.map +1 -1
- package/dist/core/scheduler/index.d.mts +1 -1
- package/dist/core/scheduler/index.mjs +64 -64
- package/dist/core/scheduler/index.mjs.map +1 -1
- package/dist/{env-bRH0K6fU.d.mts → env-Br6jaWGL.d.mts} +9 -9
- package/dist/{env-BVYeJhGA.mjs → env-egxaJtNn.mjs} +8 -8
- package/dist/env-egxaJtNn.mjs.map +1 -0
- package/dist/{expect-extensions-Mf1sMNBv.mjs → expect-extensions-BKdEPt3h.mjs} +46 -46
- package/dist/expect-extensions-BKdEPt3h.mjs.map +1 -0
- package/dist/expect.mjs +1 -1
- package/dist/{index-CwKBlCG9.d.mts → index-BLIlhiWT.d.mts} +565 -565
- package/dist/{index-Be5I1ZJL.d.mts → index-CIaJClcC.d.mts} +48 -48
- package/dist/index.d.mts +207 -195
- package/dist/index.mjs +147 -147
- package/dist/index.mjs.map +1 -1
- package/dist/models-CaCOUPZw.mjs.map +1 -1
- package/dist/plugins/chat-models/index.d.mts +279 -279
- package/dist/plugins/chat-models/index.mjs +359 -359
- package/dist/plugins/chat-models/index.mjs.map +1 -1
- package/dist/{registry-BSyjwZFx.mjs → registry-BK7k6X81.mjs} +293 -293
- package/dist/registry-BK7k6X81.mjs.map +1 -0
- package/dist/testing/expect-extensions.d.mts +27 -27
- package/dist/testing/expect-extensions.mjs +1 -1
- package/package.json +3 -3
- package/dist/cli-CHFCF8UR.mjs.map +0 -1
- package/dist/env-BVYeJhGA.mjs.map +0 -1
- package/dist/expect-extensions-Mf1sMNBv.mjs.map +0 -1
- package/dist/registry-BSyjwZFx.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-uzS81IPd.mjs","names":["normalizeCliArgv","sanitizeIdentitySegment","formatDuration","formatDateFnsDuration","candidate","formatDuration","normalizeCliArgv","normalizeCliArgv","packageJSON.name","normalizeCliArgv","formatTableOutput","normalizeCliArgv","normalizeCliArgv"],"sources":["../src/cli/comparison-config.ts","../src/cli/report-records.ts","../src/cli/report-selectors.ts","../src/cli/report-cases.ts","../src/cli/report-compare.ts","../src/cli/discovery.ts","../src/cli/module-runtime.ts","../src/cli/report-otlp.ts","../src/cli/report-artifacts.ts","../src/cli/reporters/noop-reporter.ts","../src/cli/reporters/summary-reporter.ts","../src/cli/reporters/index.ts","../src/cli/reporters/renderers/windowed-renderer.ts","../src/cli/reporters/vitest-compat-reporter.ts","../src/cli/run.ts","../src/cli/compare.ts","../package.json","../src/cli/eval-run.ts","../src/cli/report-analyze.ts","../src/cli/report-case-compare.ts","../src/cli/report-index.ts","../src/cli/index.ts"],"sourcesContent":["import type { CliComparisonMethodConfig, CliComparisonConfig as CliComparisonUserConfig, CliConfig, CliConfigMode } from './config'\n\nimport process from 'node:process'\n\nimport { access } from 'node:fs/promises'\nimport { basename, dirname, isAbsolute, join, relative, resolve } from 'node:path'\n\nimport { errorMessageFrom } from '@moeru/std'\nimport { glob } from 'tinyglobby'\n\nimport { detectCliConfigMode, loadRawVievalConfig, loadVievalCliConfig } from './config'\n\nexport interface LoadVievalComparisonConfigOptions {\n comparisonId?: string\n configFilePath?: string\n cwd?: string\n}\n\nexport interface VievalComparisonConfig {\n benchmark: {\n id: string\n sharedCaseNamespace: string\n }\n methods: VievalComparisonMethod[]\n}\n\nexport interface VievalComparisonMethod {\n configFilePath?: string\n id: string\n project: string\n workspace: string\n}\n\nconst supportedWorkspaceConfigFileNames = [\n 'vieval.config.ts',\n 'vieval.config.mts',\n 'vieval.config.cts',\n 'vieval.config.js',\n 'vieval.config.mjs',\n 'vieval.config.cjs',\n 'vieval.config.json',\n] as const\n\n/**\n * Loads and validates comparison-mode data from `vieval.config.*`.\n */\nexport async function loadVievalComparisonConfig(\n options: LoadVievalComparisonConfigOptions = {},\n): Promise<{ config: VievalComparisonConfig, configFilePath: string }> {\n const cwd = options.cwd ?? process.cwd()\n\n try {\n const loaded = await loadRawVievalConfig({\n configFilePath: options.configFilePath,\n cwd,\n })\n\n if (loaded.configFilePath == null || loaded.config == null) {\n throw new Error('Failed to find vieval config. Expected vieval.config.*')\n }\n\n assertComparisonMode(loaded.config)\n const selectedComparison = selectComparisonConfig(loaded.config.comparisons, options.comparisonId)\n const configDirectory = dirname(loaded.configFilePath)\n\n const explicitMethods = (selectedComparison.methods ?? []).map((method, index) =>\n normalizeMethodShape(method, configDirectory, index),\n )\n\n const discoveredMethods = await discoverMethodsFromWorkspaceGlobs({\n comparison: selectedComparison,\n configDirectory,\n })\n\n const methods = [...explicitMethods, ...discoveredMethods]\n if (methods.length === 0) {\n throw new Error('Comparison config resolved zero methods. Configure methods or includesWorkspaces.')\n }\n\n validateMethodIdsAreUnique(methods)\n\n return {\n config: {\n benchmark: normalizeBenchmark(selectedComparison),\n methods,\n },\n configFilePath: loaded.configFilePath,\n }\n }\n catch (error) {\n const errorMessage = errorMessageFrom(error) ?? 'Unknown comparison config loading error.'\n const resolvedPath = options.configFilePath ?? 'vieval.config'\n throw new Error(`Failed to load comparison config \"${resolvedPath}\": ${errorMessage}`)\n }\n}\n\nfunction assertComparisonMode(config: CliConfig): asserts config is { comparisons: CliComparisonUserConfig[] } {\n const mode = detectCliConfigMode(config) as CliConfigMode\n if (mode !== 'comparisons') {\n throw new Error(`Expected comparison-mode config, but received ${mode}-mode config.`)\n }\n}\n\nfunction createDiscoveredMethodId(configDirectory: string, workspace: string, projectName: string): string {\n const relativeWorkspace = relative(configDirectory, workspace)\n const workspaceLabel = relativeWorkspace.length > 0 ? relativeWorkspace : basename(workspace)\n return `${workspaceLabel.replaceAll('\\\\', '/')}:${projectName}`\n}\n\nasync function discoverMethodsFromWorkspaceGlobs(args: {\n comparison: CliComparisonUserConfig\n configDirectory: string\n}): Promise<VievalComparisonMethod[]> {\n const includes = normalizeGlobInput(args.comparison.includesWorkspaces)\n if (includes.length === 0) {\n return []\n }\n\n const discoveredWorkspaceDirectories = await glob(includes, {\n absolute: true,\n cwd: args.configDirectory,\n ignore: normalizeGlobInput(args.comparison.excludesWorkspaces),\n onlyDirectories: true,\n })\n\n const methods: VievalComparisonMethod[] = []\n for (const workspaceDirectory of discoveredWorkspaceDirectories.sort((left, right) => left.localeCompare(right))) {\n const configFilePath = await findWorkspaceConfigFile(workspaceDirectory)\n if (configFilePath == null) {\n continue\n }\n\n const loadedWorkspaceConfig = await loadVievalCliConfig({\n configFilePath,\n cwd: workspaceDirectory,\n })\n\n for (const project of loadedWorkspaceConfig.projects) {\n methods.push({\n configFilePath,\n id: createDiscoveredMethodId(args.configDirectory, workspaceDirectory, project.name),\n project: project.name,\n workspace: workspaceDirectory,\n })\n }\n }\n\n return methods\n}\n\nasync function findWorkspaceConfigFile(workspaceDirectory: string): Promise<null | string> {\n for (const fileName of supportedWorkspaceConfigFileNames) {\n const candidate = join(workspaceDirectory, fileName)\n if (await isReadableFile(candidate)) {\n return candidate\n }\n }\n\n return null\n}\n\nasync function isReadableFile(filePath: string): Promise<boolean> {\n try {\n await access(filePath)\n return true\n }\n catch {\n return false\n }\n}\n\nfunction normalizeBenchmark(comparison: CliComparisonUserConfig): VievalComparisonConfig['benchmark'] {\n const benchmarkId = comparison.benchmark.id.trim()\n const sharedCaseNamespace = comparison.benchmark.sharedCaseNamespace.trim()\n\n if (benchmarkId.length === 0) {\n throw new Error('Comparison config requires benchmark.id.')\n }\n if (sharedCaseNamespace.length === 0) {\n throw new Error('Comparison config requires benchmark.sharedCaseNamespace.')\n }\n\n return {\n id: benchmarkId,\n sharedCaseNamespace,\n }\n}\n\nfunction normalizeGlobInput(patterns: string | string[] | undefined): string[] {\n if (patterns == null) {\n return []\n }\n\n return (typeof patterns === 'string' ? [patterns] : patterns)\n .map(pattern => pattern.trim())\n .filter(pattern => pattern.length > 0)\n}\n\nfunction normalizeMethodShape(\n method: CliComparisonMethodConfig,\n configDirectory: string,\n index: number,\n): VievalComparisonMethod {\n const id = method.id.trim()\n const workspace = method.workspace.trim()\n const project = method.project.trim()\n const configFilePath = method.configFilePath?.trim()\n\n if (id.length === 0) {\n throw new Error(`Comparison method #${index + 1} is missing id.`)\n }\n if (workspace.length === 0) {\n throw new Error(`Comparison method \"${id}\" is missing workspace.`)\n }\n if (project.length === 0) {\n throw new Error(`Comparison method \"${id}\" is missing project.`)\n }\n\n const resolvedWorkspace = isAbsolute(workspace) ? workspace : resolve(configDirectory, workspace)\n const resolvedConfigFilePath = configFilePath == null || configFilePath.length === 0\n ? undefined\n : (isAbsolute(configFilePath) ? configFilePath : resolve(configDirectory, configFilePath))\n\n return {\n configFilePath: resolvedConfigFilePath,\n id,\n project,\n workspace: resolvedWorkspace,\n }\n}\n\nfunction selectComparisonConfig(\n comparisons: readonly CliComparisonUserConfig[],\n comparisonId: string | undefined,\n): CliComparisonUserConfig {\n if (comparisons.length === 0) {\n throw new Error('Comparison config requires at least one comparisons entry.')\n }\n\n if (comparisonId == null || comparisonId.trim().length === 0) {\n if (comparisons.length > 1) {\n throw new Error(`Multiple comparisons found. Provide --comparison. Available ids: ${comparisons.map(item => item.id).join(', ')}`)\n }\n\n return comparisons[0]\n }\n\n const selected = comparisons.find(item => item.id === comparisonId)\n if (selected == null) {\n throw new Error(`Unknown comparison id \"${comparisonId}\".`)\n }\n\n return selected\n}\n\nfunction validateMethodIdsAreUnique(methods: readonly VievalComparisonMethod[]): void {\n const methodIds = methods.map(method => method.id)\n const duplicatedMethodId = methodIds.find((methodId, index) => methodIds.indexOf(methodId) !== index)\n if (duplicatedMethodId != null) {\n throw new Error(`Duplicate comparison method id \"${duplicatedMethodId}\".`)\n }\n}\n","/** Arguments for building normalized case records from report events. */\nexport interface BuildCaseRecordsArgs {\n /** Default attempt id for events that do not carry one. */\n attemptId: string\n /** Source report events ordered by occurrence. */\n events: readonly CaseRecordSourceEvent[]\n /** Default experiment id for events that do not carry one. */\n experimentId: string\n /** Default project name for events that do not carry one. */\n projectName: string\n /** Default run id for events that do not carry one. */\n runId: string\n /** Default workspace id for events that do not carry one. */\n workspaceId: string\n}\n\n/** Scalar and array metric values persisted in case records. */\nexport type CaseMetricValue = boolean | null | number | readonly unknown[] | string\n\n/**\n * Normalized case artifact record written to `cases.jsonl`.\n *\n * Use when:\n * - report commands need dataframe-friendly case inspection records\n * - later processors need generic scores, metrics, lifecycle, and identity fields\n *\n * Expects:\n * - one record represents one final case outcome for one task in one run\n * - `metrics` stores JSON-safe scalar or array values emitted by task code\n *\n * Returns:\n * - a stable schema-versioned case projection for local report artifacts\n */\nexport interface CaseRecord {\n /** Attempt identity attached to the run. */\n attemptId: string\n /** Stable case id within the task. */\n caseId: string\n /** Human-readable case name. */\n caseName: string\n /** Non-negative duration in milliseconds when timestamps parse cleanly. */\n durationMs: number\n /** ISO-ish case end timestamp, or the best event timestamp available. */\n endedAt: string\n /** Experiment identity attached to the run. */\n experimentId: string\n /** Optional case input when emitted by lifecycle events. */\n input?: unknown\n /** Metric values keyed by metric name. */\n metrics: Record<string, CaseMetricValue>\n /** Optional case output when emitted by lifecycle events. */\n output?: unknown\n /** Project name for the task/case when known. */\n projectName: string\n /** Number of retries represented in the final case outcome. */\n retryCount: number\n /** Run identity attached to the run. */\n runId: string\n /** Case record schema version. */\n schemaVersion: 1\n /** Score values keyed by score kind. */\n scores: Record<string, number>\n /** ISO-ish case start timestamp, or the best event timestamp available. */\n startedAt: string\n /** Final terminal case state. */\n state: CaseRecordState\n /** Scheduled task id that owns the case. */\n taskId: string\n /** Workspace identity attached to the run. */\n workspaceId: string\n}\n\n/** Event envelope accepted by the local report record processor. */\nexport interface CaseRecordSourceEvent {\n /** Optional attempt id override from persisted events. */\n attemptId?: string\n /** Optional case id from current CLI event envelopes. */\n caseId?: string\n /** Optional event payload from reporter hooks or lifecycle capture. */\n data?: unknown\n /** Event name, including `task.case.*` and current CLI lifecycle names. */\n event: string\n /** Optional experiment id override from persisted events. */\n experimentId?: string\n /** Optional project id/name from current CLI event envelopes. */\n projectId?: string\n /** Optional project name from metadata-rich reporter events. */\n projectName?: string\n /** Optional run id override from persisted events. */\n runId?: string\n /** Optional task id from current CLI event envelopes. */\n taskId?: string\n /** Optional event timestamp from current CLI event envelopes. */\n timestamp?: string\n /** Optional workspace id override from persisted events. */\n workspaceId?: string\n}\n\n/** Terminal state stored for one normalized case record. */\nexport type CaseRecordState = 'failed' | 'passed' | 'skipped' | 'timeout'\n\n/** Generic metrics summary for overall scores and requested group facets. */\nexport interface MetricsSummary {\n /** Score aggregates keyed by `<groupKey>=<groupValue>`. */\n groups: Record<string, ScoreSummary>\n /** Overall score aggregates keyed by score kind. */\n overall: ScoreSummary\n}\n\n/** Generic score summary keyed by score kind. */\nexport type ScoreSummary = Record<string, ScoreSummaryBucket>\n\n/** Score aggregate for one score kind. */\nexport interface ScoreSummaryBucket {\n /** Average score for this kind, or `0` when count is zero. */\n average: number\n /** Number of records that provided this score kind. */\n count: number\n /** Sum of all score values for this kind. */\n sum: number\n}\n\ninterface CaseDraft {\n attemptId: string\n caseId: string\n caseName: string\n endedAt?: string\n experimentId: string\n input?: unknown\n metrics: Record<string, CaseMetricValue>\n output?: unknown\n projectName: string\n retryCount: number\n runId: string\n scores: Record<string, number>\n startCount: number\n startedAt?: string\n state?: CaseRecordState\n taskId: string\n workspaceId: string\n}\n\n/**\n * Builds normalized case records from lifecycle, metric, and score events.\n *\n * Use when:\n * - `events.jsonl` should be projected into `cases.jsonl`\n * - report commands need one final record per observed case outcome\n *\n * Expects:\n * - events are ordered by occurrence where possible\n * - lifecycle events use either `task.case.start`/`task.case.end` or current CLI `CaseStarted`/`CaseEnded` names\n *\n * Returns:\n * - records for cases that emitted an end lifecycle event\n */\nexport function buildCaseRecords(args: BuildCaseRecordsArgs): CaseRecord[] {\n const drafts = new Map<string, CaseDraft>()\n const completedKeys: string[] = []\n\n for (const event of args.events) {\n const normalizedEvent = normalizeCaseEventName(event.event)\n if (normalizedEvent == null) {\n continue\n }\n\n const ids = extractEventIds(event, args)\n if (ids.caseId.length === 0 || ids.taskId.length === 0) {\n continue\n }\n\n const draft = getOrCreateDraft(drafts, ids, event, args)\n applyIdentity(draft, ids, event, args)\n\n if (normalizedEvent === 'start') {\n applyCaseStart(draft, event)\n }\n else if (normalizedEvent === 'metric') {\n applyCaseMetric(draft, event)\n }\n else if (normalizedEvent === 'score') {\n applyCaseScore(draft, event)\n }\n else {\n applyCaseEnd(draft, event)\n const key = createCaseKey(ids.taskId, ids.caseId)\n if (!completedKeys.includes(key)) {\n completedKeys.push(key)\n }\n }\n }\n\n return completedKeys\n .map(key => drafts.get(key))\n .filter((draft): draft is CaseDraft => draft != null && draft.endedAt != null)\n .map(toCaseRecord)\n}\n\n/**\n * Builds generic score summaries overall and grouped by arbitrary keys.\n *\n * Use when:\n * - report artifacts need benchmark-neutral aggregate score views\n * - callers want to group by metrics such as `benchmark.category` or direct record fields such as `taskId`\n *\n * Expects:\n * - `groupByKeys` are stable metric names or direct `CaseRecord` field names\n * - record score values are normalized numeric scores\n *\n * Returns:\n * - overall score buckets and group buckets keyed by `<key>=<value>`\n */\nexport function buildMetricsSummary(records: readonly CaseRecord[], groupByKeys: readonly string[]): MetricsSummary {\n const overall: ScoreSummary = {}\n const groups: Record<string, ScoreSummary> = {}\n\n for (const record of records) {\n addRecordScores(overall, record)\n\n for (const groupByKey of groupByKeys) {\n const groupValue = getGroupValue(record, groupByKey)\n if (!groupValue.exists) {\n continue\n }\n\n const groupKey = `${groupByKey}=${String(groupValue.value)}`\n groups[groupKey] ??= {}\n addRecordScores(groups[groupKey], record)\n }\n }\n\n return {\n groups: finalizeSummaryGroups(groups),\n overall: finalizeScoreSummary(overall),\n }\n}\n\n/**\n * Encodes records as newline-delimited JSON.\n *\n * Use when:\n * - writing `cases.jsonl` for command-line tools, dataframes, or streaming parsers\n * - each record should occupy exactly one JSON line\n *\n * Expects:\n * - records are JSON-serializable case records\n *\n * Returns:\n * - one JSON object per line with a trailing newline for non-empty input\n */\nexport function encodeJsonl(records: readonly CaseRecord[]): string {\n if (records.length === 0) {\n return ''\n }\n\n return `${records.map(record => JSON.stringify(record)).join('\\n')}\\n`\n}\n\nfunction addRecordScores(summary: ScoreSummary, record: CaseRecord): void {\n for (const [kind, score] of Object.entries(record.scores)) {\n if (!Number.isFinite(score)) {\n continue\n }\n\n summary[kind] ??= { average: 0, count: 0, sum: 0 }\n summary[kind].count += 1\n summary[kind].sum += score\n }\n}\n\nfunction applyCaseEnd(draft: CaseDraft, event: CaseRecordSourceEvent): void {\n const data = asRecord(event.data)\n draft.caseName = extractCaseName(event) ?? draft.caseName\n draft.endedAt = stringFrom(data?.endedAt) ?? event.timestamp ?? draft.endedAt\n draft.output = data != null && 'output' in data ? data.output : draft.output\n draft.state = normalizeState(stringFrom(data?.state)) ?? 'failed'\n draft.scores.exact ??= draft.state === 'passed' ? 1 : 0\n}\n\nfunction applyCaseMetric(draft: CaseDraft, event: CaseRecordSourceEvent): void {\n const data = asRecord(event.data)\n const name = stringFrom(data?.name)\n if (name == null) {\n return\n }\n\n const value = data?.value\n if (isCaseMetricValue(value)) {\n draft.metrics[name] = value\n }\n}\n\nfunction applyCaseScore(draft: CaseDraft, event: CaseRecordSourceEvent): void {\n const data = asRecord(event.data)\n const kind = stringFrom(data?.kind) ?? stringFrom(data?.name) ?? stringFrom(data?.['vieval.score.kind'])\n const score = numberFrom(data?.score) ?? numberFrom(data?.value) ?? numberFrom(data?.['vieval.score.value'])\n if (kind == null || score == null) {\n return\n }\n\n draft.scores[kind] = score\n}\n\nfunction applyCaseStart(draft: CaseDraft, event: CaseRecordSourceEvent): void {\n const data = asRecord(event.data)\n draft.startCount += 1\n draft.caseName = extractCaseName(event) ?? draft.caseName\n draft.startedAt ??= stringFrom(data?.startedAt) ?? event.timestamp\n draft.endedAt = undefined\n draft.input = undefined\n draft.metrics = {}\n draft.output = undefined\n draft.scores = {}\n draft.state = undefined\n draft.input = data != null && 'input' in data ? data.input : draft.input\n\n const retryIndex = numberFrom(data?.retryIndex)\n if (retryIndex != null) {\n draft.retryCount = Math.max(draft.retryCount, retryIndex)\n return\n }\n\n draft.retryCount = Math.max(draft.retryCount, draft.startCount - 1)\n}\n\nfunction applyIdentity(\n draft: CaseDraft,\n ids: ReturnType<typeof extractEventIds>,\n event: CaseRecordSourceEvent,\n args: BuildCaseRecordsArgs,\n): void {\n draft.attemptId = ids.attemptId || args.attemptId\n draft.experimentId = ids.experimentId || args.experimentId\n draft.projectName = extractExplicitProjectName(event) ?? draft.projectName\n draft.runId = ids.runId || args.runId\n draft.workspaceId = ids.workspaceId || args.workspaceId\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return undefined\n }\n\n return value as Record<string, unknown>\n}\n\n/**\n * Normalizes duration timestamps.\n *\n * Before:\n * - `startedAt=\"2026-05-08T00:00:00.000Z\"`, `endedAt=\"2026-05-08T00:00:01.250Z\"`\n * - `startedAt=\"bad\"`, `endedAt=\"2026-05-08T00:00:01.250Z\"`\n *\n * After:\n * - `1250`\n * - `0`\n */\nfunction calculateDurationMs(startedAt: string, endedAt: string): number {\n const started = Date.parse(startedAt)\n const ended = Date.parse(endedAt)\n if (!Number.isFinite(started) || !Number.isFinite(ended)) {\n return 0\n }\n\n return Math.max(0, ended - started)\n}\n\nfunction createCaseKey(taskId: string, caseId: string): string {\n return `${taskId}\\u0000${caseId}`\n}\n\nfunction extractCaseName(event: CaseRecordSourceEvent): string | undefined {\n const data = asRecord(event.data)\n return stringFrom(data?.caseName) ?? stringFrom(data?.name)\n}\n\nfunction extractEventIds(event: CaseRecordSourceEvent, args: BuildCaseRecordsArgs): {\n attemptId: string\n caseId: string\n experimentId: string\n projectName: string\n runId: string\n taskId: string\n workspaceId: string\n} {\n const data = asRecord(event.data)\n\n return {\n attemptId: stringFrom(data?.attemptId) ?? event.attemptId ?? args.attemptId,\n caseId: stringFrom(data?.caseId) ?? event.caseId ?? '',\n experimentId: stringFrom(data?.experimentId) ?? event.experimentId ?? args.experimentId,\n projectName: stringFrom(data?.projectName) ?? event.projectName ?? event.projectId ?? args.projectName,\n runId: stringFrom(data?.runId) ?? event.runId ?? args.runId,\n taskId: stringFrom(data?.taskId) ?? event.taskId ?? '',\n workspaceId: stringFrom(data?.workspaceId) ?? event.workspaceId ?? args.workspaceId,\n }\n}\n\nfunction extractExplicitProjectName(event: CaseRecordSourceEvent): string | undefined {\n const data = asRecord(event.data)\n return stringFrom(data?.projectName) ?? event.projectName ?? event.projectId\n}\n\nfunction finalizeScoreSummary(summary: ScoreSummary): ScoreSummary {\n return Object.fromEntries(\n Object.entries(summary).map(([kind, bucket]) => [\n kind,\n {\n average: bucket.count === 0 ? 0 : bucket.sum / bucket.count,\n count: bucket.count,\n sum: bucket.sum,\n },\n ]),\n )\n}\n\nfunction finalizeSummaryGroups(groups: Record<string, ScoreSummary>): Record<string, ScoreSummary> {\n return Object.fromEntries(\n Object.entries(groups).map(([key, summary]) => [key, finalizeScoreSummary(summary)]),\n )\n}\n\nfunction getGroupValue(record: CaseRecord, key: string): { exists: false } | { exists: true, value: CaseMetricValue } {\n if (Object.hasOwn(record.metrics, key)) {\n return {\n exists: true,\n value: record.metrics[key]!,\n }\n }\n\n const directValue = record[key as keyof CaseRecord]\n return isCaseMetricValue(directValue)\n ? {\n exists: true,\n value: directValue,\n }\n : {\n exists: false,\n }\n}\n\nfunction getOrCreateDraft(\n drafts: Map<string, CaseDraft>,\n ids: ReturnType<typeof extractEventIds>,\n event: CaseRecordSourceEvent,\n args: BuildCaseRecordsArgs,\n): CaseDraft {\n const key = createCaseKey(ids.taskId, ids.caseId)\n const existing = drafts.get(key)\n if (existing != null) {\n return existing\n }\n\n const draft: CaseDraft = {\n attemptId: ids.attemptId,\n caseId: ids.caseId,\n caseName: extractCaseName(event) ?? ids.caseId,\n experimentId: ids.experimentId,\n metrics: {},\n projectName: ids.projectName || args.projectName,\n retryCount: 0,\n runId: ids.runId,\n scores: {},\n startCount: 0,\n taskId: ids.taskId,\n workspaceId: ids.workspaceId,\n }\n drafts.set(key, draft)\n return draft\n}\n\nfunction isCaseMetricValue(value: unknown): value is CaseMetricValue {\n if (value == null || typeof value === 'boolean' || typeof value === 'number' || typeof value === 'string') {\n return true\n }\n\n return Array.isArray(value)\n}\n\nfunction normalizeCaseEventName(eventName: string): 'end' | 'metric' | 'score' | 'start' | undefined {\n if (eventName === 'task.case.start' || eventName === 'CaseStarted') {\n return 'start'\n }\n\n if (eventName === 'task.case.metric') {\n return 'metric'\n }\n\n if (eventName === 'task.case.score') {\n return 'score'\n }\n\n if (eventName === 'task.case.end' || eventName === 'CaseEnded') {\n return 'end'\n }\n\n return undefined\n}\n\nfunction normalizeState(value: string | undefined): CaseRecordState | undefined {\n if (value === 'failed' || value === 'passed' || value === 'skipped' || value === 'timeout') {\n return value\n }\n\n return undefined\n}\n\nfunction numberFrom(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction stringFrom(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined\n}\n\nfunction toCaseRecord(draft: CaseDraft): CaseRecord {\n const startedAt = draft.startedAt ?? draft.endedAt ?? ''\n const endedAt = draft.endedAt ?? startedAt\n\n return {\n attemptId: draft.attemptId,\n caseId: draft.caseId,\n caseName: draft.caseName,\n durationMs: calculateDurationMs(startedAt, endedAt),\n endedAt,\n experimentId: draft.experimentId,\n ...(draft.input === undefined ? {} : { input: draft.input }),\n metrics: draft.metrics,\n ...(draft.output === undefined ? {} : { output: draft.output }),\n projectName: draft.projectName,\n retryCount: draft.retryCount,\n runId: draft.runId,\n schemaVersion: 1,\n scores: draft.scores,\n startedAt,\n state: draft.state ?? 'failed',\n taskId: draft.taskId,\n workspaceId: draft.workspaceId,\n }\n}\n","import type { CaseRecord } from './report-records'\n\n/**\n * Resolved value for one case selector lookup.\n */\nexport interface CaseSelectorValue {\n /** Whether the selector exists on the case record. */\n exists: boolean\n /** Matched direct field, score, or metric value. */\n value?: unknown\n}\n\n/**\n * Resolves a generic case selector from metrics, scores, then direct fields.\n *\n * Use when:\n * - report commands accept benchmark-neutral selectors such as `benchmark.case.id`\n * - comparisons need the same lookup semantics as filtering and grouping\n *\n * Expects:\n * - `key` is a direct `CaseRecord` field, score key, `scores.<key>`, or metric key\n *\n * Returns:\n * - existence flag plus matched value when present\n */\nexport function getCaseSelectorValue(record: CaseRecord, key: string): CaseSelectorValue {\n if (Object.hasOwn(record.metrics, key)) {\n return { exists: true, value: record.metrics[key] }\n }\n\n if (key.startsWith('scores.') && Object.hasOwn(record.scores, key.slice('scores.'.length))) {\n return { exists: true, value: record.scores[key.slice('scores.'.length)] }\n }\n\n if (Object.hasOwn(record.scores, key)) {\n return { exists: true, value: record.scores[key] }\n }\n\n if (Object.hasOwn(record, key)) {\n return { exists: true, value: record[key as keyof CaseRecord] }\n }\n\n return { exists: false }\n}\n\n/**\n * Stable-stringifies JSON-like values for report comparisons.\n *\n * Before:\n * - `{ b: 1, a: true }`\n *\n * After:\n * - `{\"a\":true,\"b\":1}`\n */\nexport function stableStringify(value: unknown): string {\n if (value == null || typeof value !== 'object') {\n return JSON.stringify(value)\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(item => stableStringify(item)).join(',')}]`\n }\n\n const record = value as Record<string, unknown>\n return `{${Object.keys(record)\n .sort((left, right) => left.localeCompare(right))\n .map(key => `${JSON.stringify(key)}:${stableStringify(record[key])}`)\n .join(',')}}`\n}\n","#!/usr/bin/env node\n\nimport type { CaseRecord, ScoreSummary } from './report-records'\n\nimport process from 'node:process'\n\nimport { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport meow from 'meow'\n\nimport { errorMessageFrom } from '@moeru/std'\nimport { glob } from 'tinyglobby'\n\nimport { encodeJsonl } from './report-records'\nimport { getCaseSelectorValue } from './report-selectors'\n\nexport type ReportCasesFormat = 'json' | 'jsonl' | 'table'\n\n/** One grouped case summary produced by `vieval report cases --group-by`. */\nexport interface ReportCasesGroupSummary {\n /** Number of case records in this group. */\n count: number\n /** Score averages/sums/counts for this group. */\n scores: ScoreSummary\n}\n\n/** Options for inspecting normalized `cases.jsonl` report artifacts. */\nexport interface ReportCasesOptions {\n /** Output format for the command response. */\n format: ReportCasesFormat\n /** Optional case field, score name, or metric name used to group score summaries. */\n groupBy?: string\n /** Equality filters in `key=value` form. */\n where?: readonly string[]\n}\n\n/** Structured output for case inspection and optional grouped summaries. */\nexport interface ReportCasesOutput {\n /** Grouped summaries keyed by `<groupKey>=<groupValue>`, when requested. */\n groups?: Record<string, ReportCasesGroupSummary>\n /** Filtered case records. */\n records: CaseRecord[]\n}\n\ninterface ParsedReportCasesCliArguments extends ReportCasesOptions {\n reportPath: string\n}\n\nconst reportCasesHelpText = `\n Inspect normalized case records from generated vieval report artifacts.\n\n Usage\n $ vieval report cases <reportPath> [options]\n\n Options\n --format Output format: table | json | jsonl (default: table)\n --where Equality filter \"key=value\"; repeatable\n --group-by Case field, score name, or metric name used for grouped score summaries\n`\n\n/**\n * Builds filtered case inspection output.\n *\n * Use when:\n * - `vieval report cases` needs deterministic JSON/table output\n * - tests need pure filtering and grouping behavior without process I/O\n *\n * Expects:\n * - `where` filters use `key=value`\n * - lookup keys may target direct case fields, score names, or metric names\n *\n * Returns:\n * - filtered records plus grouped score summaries when `groupBy` is present\n */\nexport function buildReportCasesOutput(\n records: readonly CaseRecord[],\n options: ReportCasesOptions,\n): ReportCasesOutput {\n const whereFilters = (options.where ?? []).map(parseSelector)\n const filteredRecords = records.filter(record => matchesWhereFilters(record, whereFilters))\n const groups = options.groupBy == null\n ? undefined\n : buildCaseGroups(filteredRecords, options.groupBy)\n\n return {\n groups,\n records: [...filteredRecords],\n }\n}\n\n/**\n * Reads normalized case records from one report run directory or report root.\n *\n * Use when:\n * - CLI tools need case-level inspection from local report artifacts\n * - callers may pass a run directory, a `cases.jsonl` file, or a report root\n *\n * Expects:\n * - discovered `cases.jsonl` files contain one `CaseRecord` JSON object per line\n *\n * Returns:\n * - all parsed case records sorted by discovered file path order\n */\nexport async function readCaseRecordsFromReport(reportPath: string): Promise<CaseRecord[]> {\n const caseFilePaths = await resolveCaseRecordPaths(reportPath)\n if (caseFilePaths.length === 0) {\n throw new Error(`No cases.jsonl files found under \"${resolve(reportPath)}\".`)\n }\n\n const records: CaseRecord[] = []\n\n for (const caseFilePath of caseFilePaths) {\n const contents = readFileSync(caseFilePath, 'utf-8')\n const lines = contents.split('\\n')\n for (const [index, line] of lines.entries()) {\n const trimmed = line.trim()\n if (trimmed.length === 0) {\n continue\n }\n\n try {\n records.push(JSON.parse(trimmed) as CaseRecord)\n }\n catch (error) {\n throw new Error(`Invalid cases.jsonl line ${index + 1} in \"${caseFilePath}\": ${errorMessageFrom(error) ?? 'Unknown JSON parse failure.'}`)\n }\n }\n }\n\n return records\n}\n\n/**\n * Runs the `vieval report cases` command.\n *\n * Call stack:\n *\n * published executable (`../bin/vieval`)\n * -> {@link import('./index').runTopLevelCli}\n * -> {@link runReportCasesCli}\n * -> {@link readCaseRecordsFromReport}\n *\n * Use when:\n * - the top-level CLI dispatches local case artifact inspection\n *\n * Expects:\n * - argv is either `cases <reportPath> ...` or `<reportPath> ...`\n *\n * Returns:\n * - resolves after writing the requested output to stdout\n */\nexport async function runReportCasesCli(argv: readonly string[]): Promise<void> {\n try {\n const parsed = parseReportCasesCliArguments(argv)\n const records = await readCaseRecordsFromReport(parsed.reportPath)\n const output = buildReportCasesOutput(records, parsed)\n\n if (parsed.format === 'json') {\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`)\n return\n }\n\n if (parsed.format === 'jsonl') {\n process.stdout.write(encodeJsonl(output.records))\n return\n }\n\n process.stdout.write(`${formatCasesTable(output)}\\n`)\n }\n catch (error) {\n const errorMessage = errorMessageFrom(error) ?? 'Unknown report cases failure.'\n process.stderr.write(`[vieval report cases] ${errorMessage}\\n`)\n process.exitCode = 1\n }\n}\n\nfunction addScores(summary: ScoreSummary, scores: Record<string, number>): void {\n for (const [scoreName, value] of Object.entries(scores)) {\n summary[scoreName] ??= { average: 0, count: 0, sum: 0 }\n summary[scoreName].count += 1\n summary[scoreName].sum += value\n }\n}\n\nfunction buildCaseGroups(records: readonly CaseRecord[], groupBy: string): Record<string, ReportCasesGroupSummary> {\n const groups: Record<string, ReportCasesGroupSummary> = {}\n\n for (const record of records) {\n const resolved = getCaseSelectorValue(record, groupBy)\n if (!resolved.exists) {\n continue\n }\n\n const groupKey = `${groupBy}=${String(resolved.value)}`\n groups[groupKey] ??= { count: 0, scores: {} }\n groups[groupKey].count += 1\n addScores(groups[groupKey].scores, record.scores)\n }\n\n return Object.fromEntries(\n Object.entries(groups)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([groupKey, group]) => [groupKey, {\n count: group.count,\n scores: finalizeScores(group.scores),\n } satisfies ReportCasesGroupSummary]),\n )\n}\n\nfunction finalizeScores(summary: ScoreSummary): ScoreSummary {\n return Object.fromEntries(\n Object.entries(summary)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([scoreName, bucket]) => [scoreName, {\n average: bucket.count === 0 ? 0 : bucket.sum / bucket.count,\n count: bucket.count,\n sum: bucket.sum,\n }]),\n )\n}\n\nfunction formatCasesTable(output: ReportCasesOutput): string {\n const lines = [\n 'CASES vieval report',\n `Case count ${output.records.length}`,\n ]\n\n if (output.groups != null) {\n lines.push('Groups')\n for (const [groupKey, group] of Object.entries(output.groups)) {\n const scoreText = Object.entries(group.scores)\n .map(([scoreName, bucket]) => `${scoreName}=${bucket.average.toFixed(3)}`)\n .join(' ')\n lines.push(`${groupKey} count=${group.count}${scoreText.length > 0 ? ` ${scoreText}` : ''}`)\n }\n }\n\n return lines.join('\\n')\n}\n\nfunction matchesWhereFilters(record: CaseRecord, whereFilters: ReadonlyArray<{ key: string, value: string }>): boolean {\n return whereFilters.every((parsed) => {\n const resolved = getCaseSelectorValue(record, parsed.key)\n\n return resolved.exists && String(resolved.value) === parsed.value\n })\n}\n\nfunction normalizeCliArgv(argv: readonly string[]): string[] {\n const normalizedArgv = argv[0] === '--'\n ? argv.slice(1)\n : [...argv]\n\n if (normalizedArgv[0] === 'report' && normalizedArgv[1] === 'cases') {\n return normalizedArgv.slice(2)\n }\n\n if (normalizedArgv[0] === 'cases') {\n return normalizedArgv.slice(1)\n }\n\n return normalizedArgv\n}\n\nfunction normalizeReportCasesFormat(value: string): ReportCasesFormat {\n const normalized = value.toLowerCase()\n if (normalized === 'json') {\n return 'json'\n }\n\n if (normalized === 'jsonl') {\n return 'jsonl'\n }\n\n return 'table'\n}\n\nfunction parseReportCasesCliArguments(argv: readonly string[]): ParsedReportCasesCliArguments {\n const cli = meow(reportCasesHelpText, {\n argv: normalizeCliArgv(argv),\n flags: {\n format: {\n default: 'table',\n type: 'string',\n },\n groupBy: {\n type: 'string',\n },\n where: {\n isMultiple: true,\n type: 'string',\n },\n },\n importMeta: import.meta,\n })\n\n const reportPath = cli.input[0]\n if (reportPath == null || reportPath.length === 0) {\n throw new Error('Missing required <reportPath> argument.')\n }\n\n return {\n format: normalizeReportCasesFormat(cli.flags.format),\n groupBy: cli.flags.groupBy,\n reportPath,\n where: cli.flags.where,\n }\n}\n\nfunction parseSelector(selector: string): { key: string, value: string } {\n const separatorIndex = selector.indexOf('=')\n if (separatorIndex <= 0 || separatorIndex === selector.length - 1) {\n throw new Error(`Invalid selector \"${selector}\". Expected \"key=value\".`)\n }\n\n return {\n key: selector.slice(0, separatorIndex).trim(),\n value: selector.slice(separatorIndex + 1).trim(),\n }\n}\n\nasync function resolveCaseRecordPaths(reportPath: string): Promise<string[]> {\n const absoluteReportPath = resolve(reportPath)\n const directCaseFilePath = resolve(absoluteReportPath, 'cases.jsonl')\n\n if (existsSync(absoluteReportPath) && absoluteReportPath.endsWith('.jsonl')) {\n return [absoluteReportPath]\n }\n\n if (existsSync(directCaseFilePath)) {\n return [directCaseFilePath]\n }\n\n const discovered = await glob('**/cases.jsonl', {\n absolute: true,\n cwd: absoluteReportPath,\n })\n\n return discovered.sort((left, right) => left.localeCompare(right))\n}\n","import type { CaseRecord } from './report-records'\nimport type { CliRunOutput } from './run'\n\nimport { mkdir, writeFile } from 'node:fs/promises'\nimport { dirname, resolve } from 'node:path'\n\nexport interface CompareMethodSummary {\n caseRecords?: readonly CaseRecord[]\n methodId: string\n output: CliRunOutput\n}\n\n/**\n * Coverage and score summary for one project inside a compare method output.\n */\nexport interface CompareProjectSummary {\n caseCount: number\n distinctCaseCount: number\n exactAverage: null | number\n executed: boolean\n hybridAverage: null | number\n name: string\n runCount: number\n taskCount: number\n}\n\nexport interface CompareReportArtifact {\n benchmarkId: string\n methods: CompareSummaryRow[]\n reportPath: string\n}\n\n/**\n * Method-level compare row with coverage counts and weighted score averages.\n */\nexport interface CompareSummaryRow {\n caseCount: number\n distinctCaseCount: number\n exactAverage: null | number\n executedProjectCount: number\n hybridAverage: null | number\n methodId: string\n projectCount: number\n projects: CompareProjectSummary[]\n runCount: number\n taskCount: number\n}\n\n/**\n * Builds a compact compare report sorted by hybrid/exact score.\n */\nexport function buildCompareReportArtifact(args: {\n benchmarkId: string\n methods: CompareMethodSummary[]\n reportPath: string\n}): CompareReportArtifact {\n const rows = args.methods.map((method): CompareSummaryRow => {\n const caseRecords = method.caseRecords ?? []\n const projects = method.output.projects.map((project): CompareProjectSummary => ({\n caseCount: countCasesForProject(caseRecords, project.name),\n distinctCaseCount: countDistinctCasesForProject(caseRecords, project.name),\n exactAverage: project.result?.overall.exactAverage ?? null,\n executed: project.executed,\n hybridAverage: project.result?.overall.hybridAverage ?? null,\n name: project.name,\n runCount: project.result?.overall.runCount ?? 0,\n taskCount: project.taskCount,\n }))\n\n return {\n caseCount: caseRecords.length,\n distinctCaseCount: countDistinctCases(caseRecords),\n exactAverage: createWeightedAverage(projects, project => project.exactAverage),\n executedProjectCount: projects.filter(project => project.executed).length,\n hybridAverage: createWeightedAverage(projects, project => project.hybridAverage),\n methodId: method.methodId,\n projectCount: projects.length,\n projects,\n runCount: projects.reduce((sum, project) => sum + project.runCount, 0),\n taskCount: projects.reduce((sum, project) => sum + project.taskCount, 0),\n }\n })\n\n rows.sort((left, right) => {\n const leftHybrid = left.hybridAverage ?? Number.NEGATIVE_INFINITY\n const rightHybrid = right.hybridAverage ?? Number.NEGATIVE_INFINITY\n if (leftHybrid !== rightHybrid) {\n return rightHybrid - leftHybrid\n }\n\n const leftExact = left.exactAverage ?? Number.NEGATIVE_INFINITY\n const rightExact = right.exactAverage ?? Number.NEGATIVE_INFINITY\n return rightExact - leftExact\n })\n\n return {\n benchmarkId: args.benchmarkId,\n methods: rows,\n reportPath: args.reportPath,\n }\n}\n\n/**\n * Writes compare report artifact as JSON.\n */\nexport async function writeCompareReportArtifact(args: {\n artifact: CompareReportArtifact\n outputPath: string\n}): Promise<string> {\n const outputPath = resolve(args.outputPath)\n await mkdir(dirname(outputPath), { recursive: true })\n await writeFile(outputPath, `${JSON.stringify(args.artifact, null, 2)}\\n`, 'utf-8')\n return outputPath\n}\n\nfunction countCasesForProject(caseRecords: readonly CaseRecord[], projectName: string): number {\n return caseRecords.filter(record => record.projectName === projectName).length\n}\n\nfunction countDistinctCases(caseRecords: readonly CaseRecord[]): number {\n const caseKeys = new Set<string>()\n\n for (const record of caseRecords) {\n caseKeys.add(`${record.projectName}:${record.taskId}:${record.caseId}`)\n }\n\n return caseKeys.size\n}\n\nfunction countDistinctCasesForProject(caseRecords: readonly CaseRecord[], projectName: string): number {\n return countDistinctCases(caseRecords.filter(record => record.projectName === projectName))\n}\n\nfunction createWeightedAverage(\n projects: readonly CompareProjectSummary[],\n selectAverage: (project: CompareProjectSummary) => null | number,\n): null | number {\n let weightedScoreTotal = 0\n let weightTotal = 0\n\n for (const project of projects) {\n const average = selectAverage(project)\n if (average == null || project.runCount <= 0) {\n continue\n }\n\n weightedScoreTotal += average * project.runCount\n weightTotal += project.runCount\n }\n\n if (weightTotal === 0) {\n return null\n }\n\n return weightedScoreTotal / weightTotal\n}\n","import { uniq } from 'es-toolkit'\nimport { glob } from 'tinyglobby'\n\n/**\n * Options for eval file discovery.\n */\nexport interface DiscoverEvalFilesOptions {\n /**\n * Exclude glob patterns matched against relative paths.\n */\n exclude: readonly string[]\n /**\n * Include glob patterns matched against relative paths.\n */\n include: readonly string[]\n /**\n * Base directory scanned recursively.\n */\n root: string\n}\n\n/**\n * Discovers eval files using include/exclude globs relative to project root.\n *\n * Before:\n * - Absolute path file list from recursive filesystem walk\n *\n * After:\n * - Filtered absolute path list matching include/exclude rules\n */\nexport async function discoverEvalFiles(options: DiscoverEvalFilesOptions): Promise<string[]> {\n const discoveredFilePaths = await glob([...options.include], {\n absolute: true,\n cwd: options.root,\n ignore: [...options.exclude],\n onlyFiles: true,\n })\n\n return uniq(discoveredFilePaths).sort((left, right) => left.localeCompare(right))\n}\n","import type { EvalDefinition, EvalModuleMap } from '../config'\n\nimport { pathToFileURL } from 'node:url'\n\nimport { createVitest } from 'vitest/node'\n\nimport { beginModuleRegistration, consumeModuleRegistrations, endModuleRegistration } from '../dsl/registry'\n\n/**\n * Loads eval modules and returns a normalized eval-module map.\n *\n * Use when:\n * - CLI collection needs Vite/Vitest-powered module resolution and transforms\n * - eval files should be imported with the same runtime semantics as Vitest\n *\n * Expects:\n * - `projectRoot` points at the project that owns the eval files\n * - each `evalFilePaths` entry is an absolute file path\n *\n * Returns:\n * - eval modules keyed by stable file href + optional registration suffixes\n */\nexport async function loadEvalModulesWithVitestRuntime(\n evalFilePaths: readonly string[],\n projectRoot: string,\n): Promise<EvalModuleMap> {\n const loadedModules: EvalModuleMap = {}\n const runtime = await createVitest('test', {\n config: false,\n root: projectRoot,\n run: false,\n silent: true,\n watch: false,\n })\n\n try {\n for (const evalFilePath of evalFilePaths) {\n const moduleHref = pathToFileURL(evalFilePath).href\n beginModuleRegistration(moduleHref)\n\n try {\n const moduleValue = await runtime.import<{ default?: EvalDefinition }>(moduleHref)\n const registeredDefinitions = consumeModuleRegistrations(moduleHref)\n const defaultDefinition = moduleValue.default\n\n const definitions = [\n ...registeredDefinitions,\n ...(defaultDefinition == null ? [] : [defaultDefinition]),\n ]\n\n const deduplicatedDefinitions = definitions.filter((definition, index) => {\n const key = `${definition.name}::${definition.description}::${definition.task?.id ?? ''}`\n return definitions.findIndex(candidate => `${candidate.name}::${candidate.description}::${candidate.task?.id ?? ''}` === key) === index\n })\n\n if (deduplicatedDefinitions.length === 0) {\n continue\n }\n\n for (const [definitionIndex, definition] of deduplicatedDefinitions.entries()) {\n const moduleKey = definitionIndex === 0\n ? moduleHref\n : `${moduleHref}#registration-${definitionIndex + 1}`\n\n loadedModules[moduleKey] = {\n default: definition,\n }\n }\n }\n finally {\n endModuleRegistration()\n }\n }\n }\n finally {\n await runtime.close()\n }\n\n return loadedModules\n}\n","import type { CaseRecord } from './report-records'\n\nimport { stableStringify } from './report-selectors'\n\n/** Local deterministic JSON shape for trace, log, and metric report artifacts. */\nexport interface LocalOtlpProjection {\n /** OTLP-like log container written to `otlp/logs.json`. */\n logs: {\n resourceLogs: Array<{\n scopeLogs: Array<{\n logRecords: LocalOtlpLogRecord[]\n scope: { name: string }\n }>\n }>\n }\n /** OTLP-like metric container written to `otlp/metrics.json`. */\n metrics: {\n resourceMetrics: Array<{\n scopeMetrics: Array<{\n metrics: LocalOtlpMetric[]\n scope: { name: string }\n }>\n }>\n }\n /** OTLP-like trace container written to `otlp/traces.json`. */\n traces: {\n resourceSpans: Array<{\n scopeSpans: Array<{\n scope: { name: string }\n spans: LocalOtlpSpan[]\n }>\n }>\n }\n}\n\ninterface LocalOtlpAnyValue {\n arrayValue?: {\n values: LocalOtlpAnyValue[]\n }\n boolValue?: boolean\n doubleValue?: number\n stringValue?: string\n}\n\ninterface LocalOtlpAttribute {\n key: string\n value: LocalOtlpAnyValue\n}\n\ntype LocalOtlpAttributeScalar = boolean | null | number | string\n\ninterface LocalOtlpLogRecord {\n attributes: LocalOtlpAttribute[]\n body: LocalOtlpAnyValue\n eventName: string\n timeUnixNano: string\n}\n\ninterface LocalOtlpMetric {\n gauge: {\n dataPoints: Array<{\n asDouble: number\n attributes: LocalOtlpAttribute[]\n timeUnixNano: string\n }>\n }\n name: string\n}\n\ninterface LocalOtlpSpan {\n attributes: LocalOtlpAttribute[]\n endTimeUnixNano?: string\n name: string\n startTimeUnixNano?: string\n}\n\n/**\n * Builds local OTLP-shaped JSON projections from normalized case records.\n *\n * Use when:\n * - writing deterministic report artifacts without requiring an OpenTelemetry Collector\n * - future tools need trace/log/metric-shaped JSON files\n *\n * Expects:\n * - records belong to one Vieval run\n *\n * Returns:\n * - trace, log, and metric containers shaped after OTLP JSON concepts\n */\nexport function buildLocalOtlpProjection(args: { records: readonly CaseRecord[], runId: string }): LocalOtlpProjection {\n const projectSpans = collectProjectNames(args.records).map(projectName => ({\n attributes: toAttributes({\n 'vieval.project.name': projectName,\n 'vieval.run.id': args.runId,\n }),\n name: 'vieval.project',\n }))\n const taskSpans = collectTasks(args.records).map(task => ({\n attributes: toAttributes({\n 'vieval.project.name': task.projectName,\n 'vieval.run.id': args.runId,\n 'vieval.task.id': task.taskId,\n }),\n name: 'vieval.task',\n }))\n const caseSpans = args.records.map(record => ({\n attributes: toAttributes({\n ...record.metrics,\n 'vieval.case.duration_ms': record.durationMs,\n 'vieval.case.id': record.caseId,\n 'vieval.case.name': record.caseName,\n 'vieval.case.retry_count': record.retryCount,\n 'vieval.case.state': record.state,\n 'vieval.project.name': record.projectName,\n 'vieval.task.id': record.taskId,\n }),\n endTimeUnixNano: isoToUnixNano(record.endedAt),\n name: 'vieval.case',\n startTimeUnixNano: isoToUnixNano(record.startedAt),\n }))\n\n return {\n logs: {\n resourceLogs: [{\n scopeLogs: [{\n logRecords: args.records.map(record => ({\n attributes: toAttributes(record.metrics),\n body: {\n stringValue: JSON.stringify({\n caseId: record.caseId,\n scores: record.scores,\n state: record.state,\n }),\n },\n eventName: 'vieval.case',\n timeUnixNano: isoToUnixNano(record.endedAt),\n })),\n scope: { name: 'vieval' },\n }],\n }],\n },\n metrics: {\n resourceMetrics: [{\n scopeMetrics: [{\n metrics: collectScoreKinds(args.records).map(kind => ({\n gauge: {\n dataPoints: args.records\n .filter(record => typeof record.scores[kind] === 'number')\n .map(record => ({\n asDouble: record.scores[kind]!,\n attributes: toAttributes({\n ...record.metrics,\n 'vieval.case.id': record.caseId,\n 'vieval.task.id': record.taskId,\n }),\n timeUnixNano: isoToUnixNano(record.endedAt),\n })),\n },\n name: `vieval.score.${kind}`,\n })),\n scope: { name: 'vieval' },\n }],\n }],\n },\n traces: {\n resourceSpans: [{\n scopeSpans: [{\n scope: { name: 'vieval' },\n spans: [\n {\n attributes: toAttributes({ 'vieval.run.id': args.runId }),\n name: 'vieval.run',\n },\n ...projectSpans,\n ...taskSpans,\n ...caseSpans,\n ],\n }],\n }],\n },\n }\n}\n\nfunction collectProjectNames(records: readonly CaseRecord[]): string[] {\n return [...new Set(records.map(record => record.projectName))]\n .sort((left, right) => left.localeCompare(right))\n}\n\nfunction collectScoreKinds(records: readonly CaseRecord[]): string[] {\n return [...new Set(records.flatMap(record => Object.keys(record.scores)))]\n .sort((left, right) => left.localeCompare(right))\n}\n\nfunction collectTasks(records: readonly CaseRecord[]): Array<{ projectName: string, taskId: string }> {\n const tasks = new Map<string, { projectName: string, taskId: string }>()\n for (const record of records) {\n tasks.set(`${record.projectName}\\0${record.taskId}`, {\n projectName: record.projectName,\n taskId: record.taskId,\n })\n }\n\n return [...tasks.values()].sort((left, right) => {\n const projectOrder = left.projectName.localeCompare(right.projectName)\n return projectOrder === 0\n ? left.taskId.localeCompare(right.taskId)\n : projectOrder\n })\n}\n\nfunction isAttributeScalar(value: unknown): value is LocalOtlpAttributeScalar {\n return value == null || typeof value === 'boolean' || typeof value === 'number' || typeof value === 'string'\n}\n\nfunction isoToUnixNano(value: string): string {\n const preciseMatch = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2})(?:\\.(\\d{1,9}))?(Z|[+-]\\d{2}:\\d{2})$/.exec(value)\n if (preciseMatch != null) {\n const [, secondsPart, fraction = '', zone] = preciseMatch\n const unixMilliseconds = Date.parse(`${secondsPart}.000${zone}`)\n if (!Number.isFinite(unixMilliseconds)) {\n return '0'\n }\n\n // NOTICE: OTLP JSON represents unix nanos as int64. We parse the fractional\n // seconds directly so traces can preserve microsecond/nanosecond precision\n // when upstream event timestamps contain more precision than Date can store.\n return String((BigInt(unixMilliseconds) * 1_000_000n) + BigInt(fraction.padEnd(9, '0').slice(0, 9)))\n }\n\n const unixMilliseconds = Date.parse(value)\n if (!Number.isFinite(unixMilliseconds)) {\n return '0'\n }\n\n // NOTICE: OTLP JSON represents unix nanos as int64. We keep strings to avoid\n // JavaScript precision loss above Number.MAX_SAFE_INTEGER.\n return String(BigInt(unixMilliseconds) * 1_000_000n)\n}\n\nfunction toAnyValue(value: unknown): LocalOtlpAnyValue {\n if (Array.isArray(value)) {\n return {\n arrayValue: {\n values: value.map(item => toAnyValue(item)),\n },\n }\n }\n\n if (isAttributeScalar(value)) {\n if (typeof value === 'boolean') {\n return { boolValue: value }\n }\n\n if (typeof value === 'number') {\n return Number.isFinite(value)\n ? { doubleValue: value }\n : { stringValue: String(value) }\n }\n\n if (value == null) {\n return { stringValue: 'null' }\n }\n\n return { stringValue: value }\n }\n\n return { stringValue: stableStringify(value) }\n}\n\nfunction toAttributes(attributes: Record<string, unknown>): LocalOtlpAttribute[] {\n return Object.entries(attributes)\n .filter(([, value]) => value !== undefined)\n .sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey))\n .map(([key, value]) => ({\n key,\n value: toAnyValue(value),\n }))\n}\n","import type { CliRunOutput } from './run'\n\nimport { existsSync, readFileSync } from 'node:fs'\nimport { mkdir, writeFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\n\nimport { glob } from 'tinyglobby'\n\nimport { buildLocalOtlpProjection } from './report-otlp'\nimport { buildCaseRecords, buildMetricsSummary, encodeJsonl } from './report-records'\n\n/** Identity segments used to place report artifacts on disk. */\nexport interface ReportArtifactIdentity {\n /** Attempt id path segment and default case record identity. */\n attemptId: string\n /** Experiment id path segment and default case record identity. */\n experimentId: string\n /** Run id path segment and default case record identity. */\n runId: string\n /** Workspace id path segment and default case record identity. */\n workspaceId: string\n}\n\nexport interface ReportRunArtifact {\n events: ReportRunEvent[]\n eventsCount: number\n reportDirectory: string\n summary: CliRunOutput\n summaryFilePath: string\n}\n\n/**\n * Minimal event envelope used by report analysis.\n */\nexport interface ReportRunEvent {\n attemptId?: string\n caseId?: string\n data?: unknown\n event: string\n experimentId?: string\n projectId?: string\n projectName?: string\n runId?: string\n taskId?: string\n timestamp?: string\n workspaceId?: string\n}\n\nexport interface ReportRunSummaryRow {\n attemptId: null | string\n eventsCount: number\n executedProjects: number\n experimentId: null | string\n failedProjects: number\n projectNames: string[]\n reportDirectory: string\n runId: null | string\n totalProjects: number\n totalTasks: number\n workspaceId: null | string\n}\n\n/**\n * Reads all run artifacts found under `reportPath`.\n *\n * Use when:\n * - callers need multi-run analysis from a directory root\n */\nexport async function readReportArtifacts(reportPath: string): Promise<ReportRunArtifact[]> {\n const summaryFilePaths = await resolveRunSummaryPaths(reportPath)\n return summaryFilePaths.map(summaryFilePath => readReportRunArtifact(summaryFilePath))\n}\n\n/**\n * Reads one run report artifact set from `run-summary.json` and sibling `events.jsonl`.\n *\n * Use when:\n * - report analysis needs both run aggregate output and event count metadata\n */\nexport function readReportRunArtifact(summaryFilePath: string): ReportRunArtifact {\n const reportDirectory = resolve(summaryFilePath, '..')\n const summary = JSON.parse(readFileSync(summaryFilePath, 'utf-8')) as CliRunOutput\n const eventsFilePath = resolve(reportDirectory, 'events.jsonl')\n const events = existsSync(eventsFilePath)\n ? readFileSync(eventsFilePath, 'utf-8')\n .split('\\n')\n .filter(line => line.trim().length > 0)\n .map((line) => {\n const event = JSON.parse(line) as ReportRunEvent\n return {\n attemptId: event.attemptId,\n caseId: event.caseId,\n data: event.data,\n event: event.event,\n experimentId: event.experimentId,\n projectId: event.projectId,\n projectName: event.projectName,\n runId: event.runId,\n taskId: event.taskId,\n timestamp: event.timestamp,\n workspaceId: event.workspaceId,\n } satisfies ReportRunEvent\n })\n : []\n\n return {\n events,\n eventsCount: events.length,\n reportDirectory,\n summary,\n summaryFilePath,\n }\n}\n\n/**\n * Resolves one or more `run-summary.json` paths from a report location.\n *\n * Use when:\n * - callers may pass a run directory, summary file path, or a report root\n *\n * Returns:\n * - sorted absolute summary file paths\n */\nexport async function resolveRunSummaryPaths(reportPath: string): Promise<string[]> {\n const absoluteReportPath = resolve(reportPath)\n const directSummaryPath = resolve(absoluteReportPath, 'run-summary.json')\n\n if (existsSync(absoluteReportPath) && absoluteReportPath.endsWith('.json')) {\n return [absoluteReportPath]\n }\n\n if (existsSync(directSummaryPath)) {\n return [directSummaryPath]\n }\n\n const discovered = await glob('**/run-summary.json', {\n absolute: true,\n cwd: absoluteReportPath,\n })\n\n return discovered.sort((left, right) => left.localeCompare(right))\n}\n\n/**\n * Creates a compact summary row for one run artifact.\n *\n * Use when:\n * - table/csv/jsonl exports should stay stable and cheap to parse\n */\nexport function summarizeReportRunArtifact(artifact: ReportRunArtifact): ReportRunSummaryRow {\n const totalProjects = artifact.summary.projects.length\n const failedProjects = artifact.summary.projects.filter(project => project.errorMessage != null).length\n const executedProjects = artifact.summary.projects.filter(project => project.executed).length\n const totalTasks = artifact.summary.projects.reduce((sum, project) => sum + project.taskCount, 0)\n const projectNames = artifact.summary.projects.map(project => project.name)\n\n return {\n attemptId: artifact.summary.attemptId ?? null,\n eventsCount: artifact.eventsCount,\n executedProjects,\n experimentId: artifact.summary.experimentId ?? null,\n failedProjects,\n projectNames,\n reportDirectory: artifact.reportDirectory,\n runId: artifact.summary.runId ?? null,\n totalProjects,\n totalTasks,\n workspaceId: artifact.summary.workspaceId ?? null,\n }\n}\n\n/**\n * Writes one complete local run report artifact set.\n *\n * Use when:\n * - CLI runs need deterministic local artifacts under workspace/project/experiment/attempt/run\n * - report commands need normalized case, metrics, and OTLP-shaped files\n *\n * Expects:\n * - `events` are the same envelopes written to `events.jsonl`\n * - `output` already contains run identity fields\n *\n * Returns:\n * - absolute report directory path containing the written artifacts\n */\nexport async function writeRunReportArtifacts(\n output: CliRunOutput,\n events: readonly ReportRunEvent[],\n identity: ReportArtifactIdentity,\n reportOut: string,\n): Promise<string> {\n const projectId = deriveReportProjectId(output)\n const reportDirectory = resolve(\n reportOut,\n identity.workspaceId,\n projectId,\n identity.experimentId,\n identity.attemptId,\n identity.runId,\n )\n const persistedOutput: CliRunOutput = {\n ...output,\n reportDirectory,\n }\n\n await mkdir(reportDirectory, { recursive: true })\n await writeFile(\n resolve(reportDirectory, 'run-summary.json'),\n `${JSON.stringify(persistedOutput, null, 2)}\\n`,\n 'utf-8',\n )\n await writeFile(\n resolve(reportDirectory, 'events.jsonl'),\n events.map(event => JSON.stringify(event)).join('\\n').concat(events.length > 0 ? '\\n' : ''),\n 'utf-8',\n )\n\n const caseRecords = buildCaseRecords({\n attemptId: identity.attemptId,\n events,\n experimentId: identity.experimentId,\n projectName: projectId,\n runId: identity.runId,\n workspaceId: identity.workspaceId,\n })\n const metricsSummary = buildMetricsSummary(caseRecords, [])\n const otlp = buildLocalOtlpProjection({ records: caseRecords, runId: identity.runId })\n\n await writeFile(resolve(reportDirectory, 'cases.jsonl'), encodeJsonl(caseRecords), 'utf-8')\n await writeFile(\n resolve(reportDirectory, 'metrics-summary.json'),\n `${JSON.stringify(metricsSummary, null, 2)}\\n`,\n 'utf-8',\n )\n await mkdir(resolve(reportDirectory, 'otlp'), { recursive: true })\n await mkdir(resolve(reportDirectory, 'benchmark'), { recursive: true })\n await writeFile(resolve(reportDirectory, 'otlp', 'traces.json'), `${JSON.stringify(otlp.traces, null, 2)}\\n`, 'utf-8')\n await writeFile(resolve(reportDirectory, 'otlp', 'logs.json'), `${JSON.stringify(otlp.logs, null, 2)}\\n`, 'utf-8')\n await writeFile(resolve(reportDirectory, 'otlp', 'metrics.json'), `${JSON.stringify(otlp.metrics, null, 2)}\\n`, 'utf-8')\n\n return reportDirectory\n}\n\nfunction deriveReportProjectId(output: CliRunOutput): string {\n const uniqueProjectNames = [...new Set(output.projects.map(project => project.name))]\n if (uniqueProjectNames.length === 1) {\n return sanitizeIdentitySegment(uniqueProjectNames[0] ?? 'default-project')\n }\n\n return 'multi-project'\n}\n\nfunction sanitizeIdentitySegment(value: string): string {\n const normalized = value.trim()\n if (normalized.length === 0) {\n return 'default'\n }\n\n return normalized.replace(/[^\\w.-]+/g, '-')\n}\n","import type {\n CliReporter,\n CliReporterCaseEndPayload,\n CliReporterCaseStartPayload,\n CliReporterRunEndPayload,\n CliReporterRunStartPayload,\n CliReporterTaskEndPayload,\n CliReporterTaskQueuedPayload,\n CliReporterTaskStartPayload,\n} from './types'\n\n/**\n * Creates a reporter that intentionally does nothing.\n *\n * Use when:\n * - terminal output should stay silent\n * - reporter wiring needs a safe default for tests or non-interactive runs\n *\n * Expects:\n * - callers may invoke any lifecycle method in any order that matches the run\n *\n * Returns:\n * - a stable reporter implementation with no observable side effects\n */\nexport function createNoopReporter(): CliReporter {\n return {\n dispose() {},\n onCaseEnd(_payload: CliReporterCaseEndPayload) {},\n onCaseStart(_payload: CliReporterCaseStartPayload) {},\n onRunEnd(_payload: CliReporterRunEndPayload) {},\n onRunStart(_payload: CliReporterRunStartPayload) {},\n onTaskEnd(_payload: CliReporterTaskEndPayload) {},\n onTaskQueued(_payload: CliReporterTaskQueuedPayload) {},\n onTaskStart(_payload: CliReporterTaskStartPayload) {},\n }\n}\n","import type {\n CliReporter,\n CliReporterCaseEndPayload,\n CliReporterCaseStartPayload,\n CliReporterRunEndPayload,\n CliReporterRunStartPayload,\n CliReporterTaskEndPayload,\n CliReporterTaskQueuedPayload,\n CliReporterTaskStartPayload,\n CliReporterTaskState,\n} from './types'\n\nimport c from 'tinyrainbow'\n\nimport { formatDuration as formatDateFnsDuration, intervalToDuration } from 'date-fns'\n\n// NOTICE:\n// Adapted from Vitest's SummaryReporter state-model and live summary layout.\n// Source permalink: https://github.com/vitest-dev/vitest/blob/v4.1.1/packages/vitest/src/node/reporters/summary.ts\n// Adaptation scope: keep the live active-row plus footer summary structure while replacing Vitest's module/test model with vieval's task/case lifecycle events.\n// Changes: no direct WindowRenderer ownership in this task, explicit queued/running/finished task state machine, task/case counters, stable task sorting, and `getWindowRows()` for upcoming CLI wiring.\n\nconst POINTER = '❯'\nconst TREE_NODE_END = '└'\nconst TREE_NODE_MIDDLE = '├'\n\n/**\n * Reporter contract for live summary state plus window row generation.\n *\n * Use when:\n * - CLI code needs the reporter lifecycle plus `getWindowRows()`\n * - tests need to inspect the rendered terminal rows directly\n *\n * Expects:\n * - lifecycle calls follow the scheduled task execution order\n * - `getWindowRows()` is safe before, during, and after a run\n *\n * Returns:\n * - a `CliReporter`-compatible reporter with row generation helpers\n */\nexport interface SummaryReporter extends CliReporter {\n /**\n * Builds the current live summary window rows.\n */\n getWindowRows: (options?: SummaryReporterWindowRowsOptions) => string[]\n /**\n * Handles case start events with additional display metadata.\n */\n onCaseStart: (payload: SummaryReporterCaseStartPayload) => void\n /**\n * Handles task queue events with additional display metadata.\n */\n onTaskQueued: (payload: SummaryReporterTaskQueuedPayload) => void\n}\n\n/**\n * Additional case metadata accepted by the live summary reporter.\n *\n * Use when:\n * - a case start event needs a human-readable name for the slow-task window\n *\n * Expects:\n * - `caseName` is optional and falls back to `caseId`\n *\n * Returns:\n * - metadata stored for slow-row rendering while the case is active\n */\nexport interface SummaryReporterCaseStartPayload extends CliReporterCaseStartPayload {\n /**\n * Human-readable case label.\n */\n caseName?: string\n}\n\n/**\n * Input dependencies for the live summary reporter state machine.\n *\n * Use when:\n * - creating the live TTY summary reporter for CLI runs\n * - testing the state machine with deterministic clocks\n *\n * Expects:\n * - `getNow()` returns milliseconds from a monotonic or deterministic clock\n * - `getWallClockNow()` returns a wall-clock Unix timestamp suitable for `Date`\n * - `slowThresholdMs` is a non-negative duration\n *\n * Returns:\n * - configuration consumed by {@link createSummaryReporter}\n */\nexport interface SummaryReporterOptions {\n getColumns: () => number\n getNow: () => number\n getWallClockNow: () => number\n isTTY: boolean\n slowThresholdMs: number\n writeError: (value: string) => void\n writeOutput: (value: string) => void\n}\n\n/**\n * Additional task metadata accepted by the live summary reporter.\n *\n * Use when:\n * - queue events can provide richer task labels before CLI wiring is complete\n * - tests need to set deterministic display names and case totals\n *\n * Expects:\n * - all fields are optional and fall back to the base task identifier when absent\n *\n * Returns:\n * - metadata merged into queued task state\n */\nexport interface SummaryReporterTaskQueuedPayload extends CliReporterTaskQueuedPayload {\n /**\n * Stable display label shown in the active window.\n */\n displayName?: string\n /**\n * Project label rendered as a badge prefix.\n */\n projectName?: string\n /**\n * Total number of cases expected for the task.\n */\n totalCases?: number\n}\n\n/**\n * Row generation options for the live summary window.\n *\n * Use when:\n * - the upcoming WindowRenderer integration needs to cap visible rows\n *\n * Expects:\n * - `maxRows` counts every returned terminal row\n *\n * Returns:\n * - a bounded live summary window\n */\nexport interface SummaryReporterWindowRowsOptions {\n /**\n * Maximum number of rows to return.\n */\n maxRows?: number\n}\n\ninterface ActiveCaseState {\n autoRetry: number | undefined\n caseId: string\n caseName: string\n order: number\n retryIndex: number | undefined\n startedAt: number\n}\n\ninterface ProgressTimingState {\n elapsedDurationMs: number\n estimatedDurationMs?: number\n}\n\ninterface SummaryReporterCounterState {\n completed: number\n failed: number\n passed: number\n skipped: number\n timeout: number\n total: number\n}\n\ntype SummaryTaskLifecycleState = 'finished' | 'queued' | 'running'\n\ninterface TaskRuntimeState {\n caseOrderCounter: number\n completedCases: number\n displayName: string\n projectName: string | undefined\n queueOrder: number\n runningCases: Map<string, ActiveCaseState>\n settledCaseIds: Set<string>\n startedAt: number | undefined\n state: SummaryTaskLifecycleState\n taskId: string\n taskResult: CliReporterTaskState | undefined\n totalCases: number\n}\n\nclass SummaryReporterStateMachine implements SummaryReporter {\n private readonly caseCounters = createCounterState()\n private readonly options: SummaryReporterOptions\n private queueOrderCounter = 0\n private startedAtMs = 0\n private startTime = ''\n private readonly taskCounters = createCounterState()\n private readonly tasks = new Map<string, TaskRuntimeState>()\n\n constructor(options: SummaryReporterOptions) {\n this.options = options\n }\n\n /**\n * Releases reporter resources.\n *\n * Use when:\n * - CLI cleanup runs from a `finally` block\n *\n * Expects:\n * - repeated calls are safe\n *\n * Returns:\n * - no direct value\n */\n dispose(): void {}\n\n /**\n * Builds the current live summary window rows.\n *\n * Use when:\n * - the live reporter or tests need a snapshot of the active window\n *\n * Expects:\n * - `maxRows`, when present, keeps footer rows visible\n *\n * Returns:\n * - terminal rows in display order\n */\n getWindowRows(options?: SummaryReporterWindowRowsOptions): string[] {\n const activeRows = this.createActiveRows()\n const footerRows = this.createFooterRows()\n const maxRows = options?.maxRows\n const footerBlock = [...footerRows, '']\n\n if (maxRows == null || maxRows <= 0) {\n const activeBlock = ['', ...activeRows, ...(activeRows.length > 0 ? [''] : [])]\n return [...activeBlock, ...footerBlock]\n }\n\n if (maxRows <= footerBlock.length) {\n return footerBlock.slice(-maxRows)\n }\n\n const availableActiveRows = Math.max(0, maxRows - footerBlock.length)\n return [...createBoundedActiveBlock(activeRows, availableActiveRows), ...footerBlock]\n }\n\n /**\n * Handles case completion.\n *\n * Use when:\n * - a running case settles and counters must advance\n *\n * Expects:\n * - duplicate completion for the same `caseId` is ignored\n *\n * Returns:\n * - no direct value\n */\n onCaseEnd(payload: CliReporterCaseEndPayload): void {\n const task = this.getOrCreateTaskState(payload.taskId)\n\n if (task.state === 'finished') {\n return\n }\n\n if (task.settledCaseIds.has(payload.caseId)) {\n task.runningCases.delete(payload.caseId)\n return\n }\n\n task.settledCaseIds.add(payload.caseId)\n task.runningCases.delete(payload.caseId)\n task.completedCases += 1\n this.syncTaskTotalCases(task)\n this.caseCounters.completed += 1\n\n if (payload.state === 'passed') {\n this.caseCounters.passed += 1\n return\n }\n\n if (payload.state === 'failed') {\n this.caseCounters.failed += 1\n return\n }\n\n if (payload.state === 'timeout') {\n this.caseCounters.timeout += 1\n return\n }\n\n this.caseCounters.skipped += 1\n }\n\n /**\n * Handles case start events.\n *\n * Use when:\n * - a running task starts one case and slow-case tracking may begin\n *\n * Expects:\n * - `caseId` is stable for the lifetime of the running case\n *\n * Returns:\n * - no direct value\n */\n onCaseStart(payload: SummaryReporterCaseStartPayload): void {\n const task = this.getOrCreateTaskState(payload.taskId)\n\n if (task.state === 'finished') {\n return\n }\n\n task.state = 'running'\n task.startedAt ??= this.options.getNow()\n\n if (task.settledCaseIds.has(payload.caseId)) {\n return\n }\n\n const existingCase = task.runningCases.get(payload.caseId)\n if (existingCase != null) {\n existingCase.autoRetry = payload.autoRetry\n existingCase.caseName = payload.caseName ?? payload.caseId\n existingCase.retryIndex = payload.retryIndex\n return\n }\n\n task.caseOrderCounter += 1\n task.runningCases.set(payload.caseId, {\n autoRetry: payload.autoRetry,\n caseId: payload.caseId,\n caseName: payload.caseName ?? payload.caseId,\n order: task.caseOrderCounter,\n retryIndex: payload.retryIndex,\n startedAt: this.options.getNow(),\n })\n\n this.syncTaskTotalCases(task)\n }\n\n /**\n * Handles run completion.\n *\n * Use when:\n * - the caller has final task totals and wants the footer normalized\n *\n * Expects:\n * - payload counters are final terminal task totals\n *\n * Returns:\n * - no direct value\n */\n onRunEnd(payload: CliReporterRunEndPayload): void {\n this.taskCounters.total = payload.totalTasks\n this.taskCounters.passed = payload.passedTasks\n this.taskCounters.failed = payload.failedTasks\n this.taskCounters.skipped = payload.skippedTasks\n this.taskCounters.completed = payload.passedTasks + payload.failedTasks + payload.skippedTasks\n }\n\n /**\n * Handles run startup.\n *\n * Use when:\n * - a new CLI run is starting and the summary state must reset\n *\n * Expects:\n * - `totalTasks` matches the scheduled task count for the run\n *\n * Returns:\n * - no direct value\n */\n onRunStart(payload: CliReporterRunStartPayload): void {\n this.tasks.clear()\n this.queueOrderCounter = 0\n resetCounterState(this.taskCounters, payload.totalTasks)\n resetCounterState(this.caseCounters, 0)\n this.startedAtMs = this.options.getNow()\n this.startTime = formatTimeString(new Date(this.options.getWallClockNow()))\n }\n\n /**\n * Handles task completion.\n *\n * Use when:\n * - a task leaves the active window and contributes to terminal totals\n *\n * Expects:\n * - duplicate task completion for the same task is ignored\n *\n * Returns:\n * - no direct value\n */\n onTaskEnd(payload: CliReporterTaskEndPayload): void {\n const task = this.getOrCreateTaskState(payload.taskId)\n\n if (task.state === 'finished') {\n return\n }\n\n this.syncTaskTotalCases(task)\n task.state = 'finished'\n task.taskResult = payload.state\n task.runningCases.clear()\n this.taskCounters.completed += 1\n\n if (payload.state === 'passed') {\n this.taskCounters.passed += 1\n return\n }\n\n if (payload.state === 'failed') {\n this.taskCounters.failed += 1\n return\n }\n\n this.taskCounters.skipped += 1\n }\n\n /**\n * Handles task queue events.\n *\n * Use when:\n * - a scheduled task becomes visible in the live summary before it starts\n *\n * Expects:\n * - `taskId` is stable across later lifecycle events\n *\n * Returns:\n * - no direct value\n */\n onTaskQueued(payload: SummaryReporterTaskQueuedPayload): void {\n const task = this.getOrCreateTaskState(payload.taskId)\n\n if (task.state === 'finished') {\n return\n }\n\n task.displayName = payload.displayName ?? task.displayName\n task.projectName = payload.projectName ?? task.projectName\n this.syncTaskTotalCases(task, payload.totalCases)\n }\n\n /**\n * Handles task start events.\n *\n * Use when:\n * - a queued task begins executing\n *\n * Expects:\n * - the task was previously queued or can be synthesized from its identifier\n *\n * Returns:\n * - no direct value\n */\n onTaskStart(payload: CliReporterTaskStartPayload): void {\n const task = this.getOrCreateTaskState(payload.taskId)\n\n if (task.state === 'finished') {\n return\n }\n\n task.state = 'running'\n task.startedAt ??= this.options.getNow()\n }\n\n private createActiveRows(): string[] {\n const activeTasks = Array\n .from(this.tasks.values())\n .filter(task => task.state !== 'finished')\n .sort(compareActiveTasks)\n\n const rows: string[] = []\n\n for (const task of activeTasks) {\n const now = this.options.getNow()\n const suffix = task.state === 'queued'\n ? c.dim(' [queued]')\n : formatTaskProgressSuffix(task, now)\n const badge = formatProjectBadge(task.projectName, this.options.isTTY)\n rows.push(c.bold(c.yellow(` ${POINTER} `)) + badge + task.displayName + c.dim(suffix))\n\n const slowCases = Array\n .from(task.runningCases.values())\n .filter(activeCase => now - activeCase.startedAt >= this.options.slowThresholdMs)\n .sort((left, right) => left.order - right.order)\n\n for (const [index, activeCase] of slowCases.entries()) {\n const icon = index === slowCases.length - 1 ? TREE_NODE_END : TREE_NODE_MIDDLE\n const elapsed = Math.max(0, now - activeCase.startedAt)\n rows.push(\n c.bold(c.yellow(` ${icon} `))\n + activeCase.caseName\n + formatRetrySuffix(activeCase)\n + c.bold(c.yellow(` ${formatDuration(elapsed)}`)),\n )\n }\n }\n\n return rows\n }\n\n private createFooterRows(): string[] {\n const now = this.options.getNow()\n const runElapsedDurationMs = Math.max(0, now - this.startedAtMs)\n const taskRunningCount = countRunningTasks(this.tasks.values())\n const caseRunningCount = countRunningCases(this.tasks.values())\n\n return [\n padSummaryTitle('Tasks') + formatCounterState(\n this.taskCounters,\n taskRunningCount,\n {\n elapsedDurationMs: runElapsedDurationMs,\n estimatedDurationMs: estimateTotalDurationMs(this.taskCounters.completed, this.taskCounters.total, runElapsedDurationMs),\n },\n ),\n padSummaryTitle('Cases') + formatCounterState(\n this.caseCounters,\n caseRunningCount,\n {\n elapsedDurationMs: runElapsedDurationMs,\n estimatedDurationMs: estimateTotalDurationMs(this.caseCounters.completed, this.caseCounters.total, runElapsedDurationMs),\n },\n ),\n padSummaryTitle('Concurrency') + formatActiveConcurrencyState({\n caseRunningCount,\n taskRunningCount,\n }),\n padSummaryTitle('Start at') + this.startTime,\n padSummaryTitle('Duration') + formatHumanDuration(runElapsedDurationMs),\n ]\n }\n\n private getOrCreateTaskState(taskId: string): TaskRuntimeState {\n const existing = this.tasks.get(taskId)\n\n if (existing != null) {\n return existing\n }\n\n const created: TaskRuntimeState = {\n caseOrderCounter: 0,\n completedCases: 0,\n displayName: taskId,\n projectName: undefined,\n queueOrder: this.queueOrderCounter,\n runningCases: new Map(),\n settledCaseIds: new Set(),\n startedAt: undefined,\n state: 'queued',\n taskId,\n taskResult: undefined,\n totalCases: 0,\n }\n\n this.queueOrderCounter += 1\n this.tasks.set(taskId, created)\n return created\n }\n\n private syncTaskTotalCases(task: TaskRuntimeState, reportedTotalCases?: number): void {\n const observedTotalCases = task.completedCases + task.runningCases.size\n task.totalCases = Math.max(task.totalCases, reportedTotalCases ?? 0, observedTotalCases)\n this.caseCounters.total = sumTaskCaseTotals(this.tasks.values())\n }\n}\n\n/**\n * Creates the live summary reporter state machine for `vieval` CLI runs.\n *\n * Use when:\n * - the CLI wants Vitest-style active rows and live counters\n * - tests need a deterministic reporter surface without touching the terminal\n *\n * Expects:\n * - queue/start/end events describe task lifecycle in order\n * - `getNow()` remains monotonic within one run\n * - `getWallClockNow()` returns the wall-clock run start timestamp\n *\n * Returns:\n * - a reporter compatible with the base CLI lifecycle plus `getWindowRows()`\n *\n * Call stack:\n *\n * {@link createSummaryReporter}\n * -> {@link SummaryReporterStateMachine.onTaskQueued}\n * -> {@link SummaryReporterStateMachine.onCaseStart}\n * -> {@link SummaryReporterStateMachine.getWindowRows}\n */\nexport function createSummaryReporter(options: SummaryReporterOptions): SummaryReporter {\n return new SummaryReporterStateMachine(options)\n}\n\nfunction compareActiveTasks(left: TaskRuntimeState, right: TaskRuntimeState): number {\n const leftProject = left.projectName ?? ''\n const rightProject = right.projectName ?? ''\n\n if (leftProject !== rightProject) {\n return leftProject.localeCompare(rightProject)\n }\n\n const displayNameOrder = left.displayName.localeCompare(right.displayName)\n\n if (displayNameOrder !== 0) {\n return displayNameOrder\n }\n\n return left.queueOrder - right.queueOrder\n}\n\nfunction countRunningCases(tasks: Iterable<TaskRuntimeState>): number {\n let runningCount = 0\n\n for (const task of tasks) {\n runningCount += task.runningCases.size\n }\n\n return runningCount\n}\n\nfunction countRunningTasks(tasks: Iterable<TaskRuntimeState>): number {\n let runningCount = 0\n\n for (const task of tasks) {\n if (task.state === 'running') {\n runningCount += 1\n }\n }\n\n return runningCount\n}\n\n/**\n * Creates the active task block while keeping room for summary footer rows.\n *\n * Use when:\n * - the live TTY window is smaller than the number of running task/case rows\n * - active rows need a visible truncation marker instead of silently disappearing\n *\n * Expects:\n * - `activeRows` contains already-formatted task and slow-case rows\n * - `maxRows` counts the leading spacer and truncation marker\n *\n * Returns:\n * - rows that fit inside `maxRows`\n * - a final hidden-row marker when active rows were omitted\n */\nfunction createBoundedActiveBlock(activeRows: readonly string[], maxRows: number): string[] {\n if (maxRows <= 0) {\n return []\n }\n\n if (activeRows.length === 0) {\n return ['']\n }\n\n const fullBlock = ['', ...activeRows, '']\n\n if (fullBlock.length <= maxRows) {\n return fullBlock\n }\n\n if (maxRows === 1) {\n return ['']\n }\n\n const visibleActiveRows = Math.max(0, maxRows - 2)\n const hiddenRows = Math.max(0, activeRows.length - visibleActiveRows)\n\n return [\n '',\n ...activeRows.slice(0, visibleActiveRows),\n c.dim(` ${TREE_NODE_END} ... ${hiddenRows} more running rows hidden`),\n ]\n}\n\nfunction createCounterState(): SummaryReporterCounterState {\n return {\n completed: 0,\n failed: 0,\n passed: 0,\n skipped: 0,\n timeout: 0,\n total: 0,\n }\n}\n\nfunction estimateTaskDurationMs(task: TaskRuntimeState, now: number): number | undefined {\n if (task.startedAt == null) {\n return undefined\n }\n\n return estimateTotalDurationMs(\n task.completedCases,\n task.totalCases,\n Math.max(0, now - task.startedAt),\n )\n}\n\nfunction estimateTotalDurationMs(\n completedCount: number,\n totalCount: number,\n elapsedDurationMs: number,\n): number | undefined {\n if (completedCount === 0 || totalCount === 0) {\n return undefined\n }\n\n const averageDurationMs = elapsedDurationMs / completedCount\n return Math.round(averageDurationMs * totalCount)\n}\n\nfunction formatActiveConcurrencyState(options: {\n caseRunningCount: number\n taskRunningCount: number\n}): string {\n return [\n options.taskRunningCount > 0\n ? c.bold(c.yellow(`${options.taskRunningCount} ${pluralize('task', options.taskRunningCount)} running`))\n : c.dim('0 tasks running'),\n options.caseRunningCount > 0\n ? c.bold(c.yellow(`${options.caseRunningCount} ${pluralize('case', options.caseRunningCount)} running`))\n : c.dim('0 cases running'),\n ].join(c.dim(' | '))\n}\n\nfunction formatCounterState(\n counter: SummaryReporterCounterState,\n runningCount: number,\n timing: ProgressTimingState,\n): string {\n const plannedCount = Math.max(0, counter.total - counter.completed - runningCount)\n\n return [\n plannedCount > 0 ? c.bold(c.blue(`${plannedCount} planned`)) : c.dim(`${plannedCount} planned`),\n runningCount > 0 ? c.bold(c.yellow(`${runningCount} running`)) : c.dim(`${runningCount} running`),\n c.bold(c.green(`${counter.passed} passed`)),\n counter.failed > 0 ? c.bold(c.red(`${counter.failed} failed`)) : c.dim(`${counter.failed} failed`),\n counter.timeout > 0 ? c.bold(c.yellow(`${counter.timeout} timeout`)) : c.dim(`${counter.timeout} timeout`),\n counter.skipped > 0 ? c.yellow(`${counter.skipped} skipped`) : c.dim(`${counter.skipped} skipped`),\n ].join(c.dim(' | ')) + c.gray(` (${counter.total})`) + formatTimingSuffix(timing)\n}\n\nfunction formatDuration(durationMs: number): string {\n return formatHumanDuration(durationMs)\n}\n\nfunction formatHumanDuration(durationMs: number): string {\n if (durationMs < 1_000) {\n return `${Math.round(durationMs)}ms`\n }\n\n const formatted = formatDateFnsDuration(intervalToDuration({\n end: durationMs,\n start: 0,\n }), {\n delimiter: ' ',\n format: ['hours', 'minutes', 'seconds'],\n zero: false,\n })\n\n return formatted.length > 0 ? formatted : '0 seconds'\n}\n\nfunction formatProjectBadge(projectName: string | undefined, isTTY: boolean): string {\n if (projectName == null || projectName.length === 0) {\n return ''\n }\n\n if (!isTTY || !c.isColorSupported) {\n return `|${projectName}| `\n }\n\n const backgroundPool = [c.bgYellow, c.bgCyan, c.bgGreen, c.bgMagenta] as const\n const seed = projectName\n .split('')\n .reduce((accumulator, character, index) => accumulator + character.charCodeAt(0) + index, 0)\n const background = backgroundPool[seed % backgroundPool.length]\n return `${c.black(background(` ${projectName} `))} `\n}\n\nfunction formatRetrySuffix(activeCase: ActiveCaseState): string {\n if (activeCase.retryIndex == null || activeCase.retryIndex <= 0 || activeCase.autoRetry == null || activeCase.autoRetry <= 0) {\n return ''\n }\n\n return c.dim(` retry ${activeCase.retryIndex}/${activeCase.autoRetry}`)\n}\n\nfunction formatTaskProgressSuffix(task: TaskRuntimeState, now: number): string {\n const elapsedDurationMs = task.startedAt == null\n ? 0\n : Math.max(0, now - task.startedAt)\n\n return ` ${task.completedCases}/${task.totalCases}, ${task.runningCases.size} ${pluralize('case', task.runningCases.size)} running${formatTimingSuffix({\n elapsedDurationMs,\n estimatedDurationMs: estimateTaskDurationMs(task, now),\n })}`\n}\n\nfunction formatTimeString(date: Date): string {\n return date.toTimeString().split(' ')[0] ?? ''\n}\n\nfunction formatTimingSuffix(timing: ProgressTimingState): string {\n const parts = [`elapsed ${formatHumanDuration(timing.elapsedDurationMs)}`]\n\n if (timing.estimatedDurationMs != null) {\n parts.push(`estimated ${formatHumanDuration(timing.estimatedDurationMs)}`)\n }\n\n return ` (${parts.join(', ')})`\n}\n\nfunction padSummaryTitle(label: string): string {\n return `${c.dim(label.padEnd(8))} `\n}\n\nfunction pluralize(noun: string, count: number): string {\n return count === 1 ? noun : `${noun}s`\n}\n\nfunction resetCounterState(counter: SummaryReporterCounterState, total: number): void {\n counter.completed = 0\n counter.failed = 0\n counter.passed = 0\n counter.skipped = 0\n counter.timeout = 0\n counter.total = total\n}\n\nfunction sumTaskCaseTotals(tasks: Iterable<TaskRuntimeState>): number {\n let total = 0\n\n for (const task of tasks) {\n total += task.totalCases\n }\n\n return total\n}\n","import type { SummaryReporterOptions } from './summary-reporter'\nimport type { CliReporter } from './types'\n\nimport { createNoopReporter } from './noop-reporter'\nimport { createSummaryReporter } from './summary-reporter'\n\n/**\n * Factory options for selecting the default CLI reporter.\n *\n * Use when:\n * - CLI wiring needs one reporter factory for TTY and non-TTY runs\n * - tests want to exercise reporter selection without importing concrete reporters\n *\n * Expects:\n * - the shared timing and output hooks match {@link SummaryReporterOptions}\n * - `isTTY` reflects whether live terminal rendering is allowed\n *\n * Returns:\n * - the minimal configuration consumed by {@link createCliReporter}\n */\nexport interface CreateCliReporterOptions extends SummaryReporterOptions {}\n\n/**\n * Creates the default CLI reporter for the current output mode.\n *\n * Use when:\n * - interactive terminals should use the live summary reporter\n * - non-interactive environments should stay silent with the noop reporter\n *\n * Expects:\n * - `isTTY` decides whether the live summary reporter can be used\n *\n * Returns:\n * - a summary reporter for TTY runs, otherwise a noop reporter\n */\nexport function createCliReporter(options: CreateCliReporterOptions): CliReporter {\n if (!options.isTTY) {\n return createNoopReporter()\n }\n\n return createSummaryReporter(options)\n}\n\nexport * from './noop-reporter'\nexport * from './summary-reporter'\nexport * from './types'\n","import { stripVTControlCharacters } from 'node:util'\n\n// NOTICE:\n// This renderer needs a grapheme-aware terminal width utility for emoji sequences such as `1️⃣`.\n// `fast-string-width` is the enforced replacement for `string-width` in this repository.\nimport stringWidth from 'fast-string-width'\n\n// NOTICE:\n// Adapted from Vitest's WindowRenderer implementation.\n// Source permalink: https://github.com/vitest-dev/vitest/blob/v4.1.1/packages/vitest/src/node/reporters/renderers/windowedRenderer.ts\n// Adaptation scope: keep the bottom-window redraw and scheduling behavior while replacing Vitest logger and stream interception with injected callbacks for vieval.\n// Changes: deterministic timer/reset hooks for tests, no direct process stdout/stderr interception in this task, and lifecycle exposed as start/schedule/finish/dispose with safe repeated cleanup.\n\nconst DEFAULT_RENDER_INTERVAL_MS = 1_000\n\nconst ESC = '\\x1B['\nconst CARRIAGE_RETURN = '\\r'\nconst CLEAR_LINE = `${ESC}K`\nconst MOVE_CURSOR_ONE_ROW_UP = `${ESC}1A`\nconst SYNC_START = `${ESC}?2026h`\nconst SYNC_END = `${ESC}?2026l`\n\n/**\n * Dependency contract for the TTY window renderer.\n *\n * Use when:\n * - rendering the live reporter window into injected output sinks\n * - testing redraw behavior without touching process streams\n *\n * Expects:\n * - `getWindow()` returns the current bottom-window rows in render order\n * - `getColumns()` returns a positive terminal width\n * - custom timer injection supplies matching `createInterval` and `clearInterval`\n */\nexport type WindowRendererOptions<TTimer extends WindowRendererTimer = DefaultWindowRendererTimer> = WindowRendererConstructorOptions<TTimer>\n\n/**\n * Timer handle used by the renderer's periodic refresh loop.\n *\n * Use when:\n * - integrating with the default Node.js interval handle\n * - injecting a deterministic fake timer in tests\n *\n * Expects:\n * - `unref()` mirrors the Node.js timer contract when present\n *\n * Returns:\n * - the same handle or `void`\n */\nexport interface WindowRendererTimer {\n unref?: () => void | WindowRendererTimer\n}\n\ntype DefaultWindowRendererTimer = ReturnType<typeof globalThis.setInterval>\n\ninterface ManagedWindowRendererTimer {\n clear: () => void\n unref?: () => void | WindowRendererTimer\n}\n\ninterface ResolvedWindowRendererOptions {\n createInterval: (callback: () => void, intervalMs: number) => ManagedWindowRendererTimer\n getColumns: () => number\n getWindow: () => string[]\n intervalMs: number\n queueRenderReset: (callback: () => void) => void\n supportsAnsiWindowing: boolean\n writeOutput: (value: string) => void\n}\n\ninterface WindowRendererBaseOptions {\n getColumns: () => number\n getWindow: () => string[]\n intervalMs?: number\n queueRenderReset?: (callback: () => void) => void\n supportsAnsiWindowing?: boolean\n writeOutput: (value: string) => void\n}\n\ntype WindowRendererConstructorOptions<TTimer extends WindowRendererTimer> = WindowRendererBaseOptions & WindowRendererTimerHooks<TTimer>\n\ntype WindowRendererTimerHooks<TTimer extends WindowRendererTimer>\n = {\n clearInterval: (timer: TTimer) => void\n createInterval: (callback: () => void, intervalMs: number) => TTimer\n }\n | {\n clearInterval?: undefined\n createInterval?: undefined\n }\n\n/**\n * Renders a dynamic window at the bottom of the terminal.\n *\n * Use when:\n * - a reporter needs in-place TTY updates without leaking terminal control codes into tests\n * - callers want Vitest-style redraw behavior with injected output/timer dependencies\n *\n * Expects:\n * - `start()` runs before `schedule()`\n * - `finish()` or `dispose()` may be called multiple times safely\n *\n * Returns:\n * - no direct value; all effects are emitted through the injected callbacks\n *\n * Call stack:\n *\n * {@link WindowRenderer.start}\n * -> periodic schedule callback\n * -> {@link WindowRenderer.schedule}\n * -> {@link WindowRenderer.renderWindow}\n */\nexport class WindowRenderer<TTimer extends WindowRendererTimer = DefaultWindowRendererTimer> {\n private bufferedOutput = ''\n private finished = false\n private readonly options: ResolvedWindowRendererOptions\n private renderInterval: ManagedWindowRendererTimer | undefined\n private renderScheduled = false\n private renderScheduleVersion = 0\n private started = false\n private windowHeight = 0\n\n constructor(options: WindowRendererOptions<TTimer>) {\n if (options.createInterval && options.clearInterval) {\n this.options = {\n createInterval: (callback, intervalMs) => {\n const timer = options.createInterval(callback, intervalMs)\n return {\n clear: () => options.clearInterval(timer),\n unref: timer.unref?.bind(timer),\n }\n },\n getColumns: options.getColumns,\n getWindow: options.getWindow,\n intervalMs: options.intervalMs ?? DEFAULT_RENDER_INTERVAL_MS,\n queueRenderReset: options.queueRenderReset ?? defaultQueueRenderReset,\n supportsAnsiWindowing: options.supportsAnsiWindowing ?? true,\n writeOutput: options.writeOutput,\n }\n return\n }\n\n this.options = {\n createInterval: defaultCreateInterval,\n getColumns: options.getColumns,\n getWindow: options.getWindow,\n intervalMs: options.intervalMs ?? DEFAULT_RENDER_INTERVAL_MS,\n queueRenderReset: options.queueRenderReset ?? defaultQueueRenderReset,\n supportsAnsiWindowing: options.supportsAnsiWindowing ?? true,\n writeOutput: options.writeOutput,\n }\n }\n\n /**\n * Stops the renderer and clears any visible window state.\n *\n * Use when:\n * - cleanup needs to happen from a `finally` block or interrupted run\n *\n * Expects:\n * - callers may invoke it more than once\n *\n * Returns:\n * - no direct value\n */\n dispose(): void {\n this.finish()\n }\n\n /**\n * Clears the rendered window and stops the refresh loop.\n *\n * Use when:\n * - the live reporter is transitioning to final static output\n *\n * Expects:\n * - repeated calls are safe\n *\n * Returns:\n * - no direct value\n */\n finish(): void {\n if (this.finished) {\n return\n }\n\n this.finished = true\n this.started = false\n this.renderScheduleVersion += 1\n this.renderScheduled = false\n this.stopInterval()\n this.clearWindow()\n this.flushBufferedOutput()\n }\n\n /**\n * Queues a render if one is not already in flight.\n *\n * Use when:\n * - reporter state changes and the bottom window should refresh\n *\n * Expects:\n * - the renderer has been started\n *\n * Returns:\n * - no direct value\n */\n schedule(): void {\n if (!this.started || this.finished || this.renderScheduled) {\n return\n }\n\n const renderScheduleVersion = this.renderScheduleVersion\n this.renderScheduled = true\n this.renderWindow()\n this.options.queueRenderReset(() => {\n if (this.renderScheduleVersion !== renderScheduleVersion) {\n return\n }\n\n this.renderScheduled = false\n })\n }\n\n /**\n * Starts the periodic refresh loop.\n *\n * Use when:\n * - the live reporter is about to emit in-place updates\n *\n * Expects:\n * - repeated calls are harmless and keep the existing timer\n *\n * Returns:\n * - no direct value\n */\n start(): void {\n if (this.started && !this.finished) {\n return\n }\n\n this.started = true\n this.finished = false\n this.renderScheduleVersion += 1\n\n if (!this.renderInterval) {\n this.renderInterval = this.options.createInterval(() => this.schedule(), this.options.intervalMs)\n this.renderInterval.unref?.()\n }\n }\n\n /**\n * Alias for disposal to match Vitest's renderer lifecycle naming.\n *\n * Use when:\n * - adapting code that expects `stop()`\n *\n * Expects:\n * - callers want the same semantics as `dispose()`\n *\n * Returns:\n * - no direct value\n */\n stop(): void {\n this.dispose()\n }\n\n /**\n * Writes reporter output through the renderer lifecycle.\n *\n * Use when:\n * - emitting log lines that must appear above the live ANSI window\n * - callers need deterministic buffering behavior in tests\n *\n * Expects:\n * - active ANSI window mode buffers until `schedule()` or `finish()`\n * - inactive or non-windowed mode writes directly\n *\n * Returns:\n * - no direct value\n */\n write(message: string): void {\n if (!this.isActiveWindowMode()) {\n this.writeOutput(message)\n return\n }\n\n this.bufferedOutput += message\n }\n\n private clearWindow(): void {\n if (!this.options.supportsAnsiWindowing || this.windowHeight === 0) {\n return\n }\n\n this.writeOutput(`${CARRIAGE_RETURN}${CLEAR_LINE}`)\n\n for (let rowIndex = 1; rowIndex < this.windowHeight; rowIndex += 1) {\n this.writeOutput(`${CARRIAGE_RETURN}${MOVE_CURSOR_ONE_ROW_UP}${CLEAR_LINE}`)\n }\n\n this.windowHeight = 0\n }\n\n private flushBufferedOutput(): void {\n if (this.bufferedOutput.length === 0) {\n return\n }\n\n this.writeOutput(this.bufferedOutput)\n this.bufferedOutput = ''\n }\n\n private isActiveWindowMode(): boolean {\n return this.started && !this.finished && this.options.supportsAnsiWindowing\n }\n\n private renderWindow(): void {\n const windowContent = this.options.getWindow()\n const rowCount = getRenderedRowCount(windowContent, this.options.getColumns())\n\n if (this.options.supportsAnsiWindowing) {\n this.writeOutput(SYNC_START)\n this.clearWindow()\n }\n\n this.flushBufferedOutput()\n this.writeOutput(windowContent.join('\\n'))\n\n if (this.options.supportsAnsiWindowing) {\n this.writeOutput(SYNC_END)\n this.windowHeight = rowCount\n return\n }\n\n this.writeOutput('\\n')\n this.windowHeight = 0\n }\n\n private stopInterval(): void {\n if (!this.renderInterval) {\n return\n }\n\n this.renderInterval.clear()\n this.renderInterval = undefined\n }\n\n private writeOutput(message: string): void {\n this.options.writeOutput(message)\n }\n}\n\nfunction defaultCreateInterval(callback: () => void, intervalMs: number): ManagedWindowRendererTimer {\n const timer = globalThis.setInterval(callback, intervalMs)\n\n return {\n clear: () => globalThis.clearInterval(timer),\n unref: timer.unref?.bind(timer),\n }\n}\n\nfunction defaultQueueRenderReset(callback: () => void): void {\n setTimeout(callback, 100).unref()\n}\n\n/** Calculate the rendered row count for the supplied rows and terminal width. */\nfunction getRenderedRowCount(rows: string[], columns: number): number {\n const safeColumns = Math.max(1, columns)\n let count = 0\n\n for (const row of rows) {\n const text = stripVTControlCharacters(row)\n count += Math.max(1, Math.ceil(getTextDisplayWidth(text) / safeColumns))\n }\n\n return count\n}\n\nfunction getTextDisplayWidth(text: string): number {\n return stringWidth(stripVTControlCharacters(text))\n}\n","import type { CliReporterCaseEndPayload, CliReporterCaseStartPayload, CliReporterTaskEndPayload, CliReporterTaskQueuedPayload, CliReporterTaskStartPayload } from './types'\n\nimport { pathToFileURL } from 'node:url'\n\n/**\n * Normalized test-case-like entity delivered to vitest-compatible reporter hooks.\n */\nexport interface VievalVitestCompatCase {\n id: string\n module: VievalVitestCompatModule\n name: string\n state: 'failed' | 'passed' | 'pending' | 'skipped'\n}\n\n/**\n * Normalized module-like entity delivered to vitest-compatible reporter hooks.\n */\nexport interface VievalVitestCompatModule {\n id: string\n name: string\n projectName: string\n}\n\n/**\n * Supported vitest-style reporter lifecycle hooks.\n *\n * Use when:\n * - external reporter modules should observe vieval task/case lifecycle events\n * - the project wants a familiar Vitest reporter callback model\n *\n * Expects:\n * - hook handlers to be best-effort observers only\n * - thrown errors are ignored to avoid interrupting eval execution\n */\nexport interface VievalVitestCompatReporter {\n onTestCaseReady?: (testCase: VievalVitestCompatCase) => Awaitable<void>\n onTestCaseResult?: (testCase: VievalVitestCompatCase) => Awaitable<void>\n onTestModuleCollected?: (module: VievalVitestCompatModule) => Awaitable<void>\n onTestModuleEnd?: (module: VievalVitestCompatModule) => Awaitable<void>\n onTestModuleQueued?: (module: VievalVitestCompatModule) => Awaitable<void>\n onTestModuleStart?: (module: VievalVitestCompatModule) => Awaitable<void>\n onTestRunEnd?: (modules: readonly VievalVitestCompatModule[], errors: readonly { message: string }[], state: 'failed' | 'passed') => Awaitable<void>\n onTestRunStart?: (specifications: readonly { moduleId: string, projectName: string }[]) => Awaitable<void>\n}\n\n/**\n * Project-scoped bridge that adapts vieval lifecycle events to vitest-style hooks.\n */\nexport interface VievalVitestCompatReporterBridge {\n onCaseEnd: (payload: CliReporterCaseEndPayload) => Promise<void>\n onCaseStart: (payload: CliReporterCaseStartPayload) => Promise<void>\n onRunEnd: (options: { failed: boolean }) => Promise<void>\n onRunStart: () => Promise<void>\n onTaskEnd: (payload: CliReporterTaskEndPayload) => Promise<void>\n onTaskQueued: (payload: CliReporterTaskQueuedPayload) => Promise<void>\n onTaskStart: (payload: CliReporterTaskStartPayload) => Promise<void>\n}\n\nexport type VievalVitestCompatReporterReference\n = readonly [VievalVitestCompatReporterValue, unknown?]\n | VievalVitestCompatReporterValue\n\n/**\n * Supported project reporter references.\n *\n * - String: module path or package name, default export used.\n * - Reporter object: inline hook object (Vitest-style inline reporter).\n * - Tuple: [string or reporter object, constructor options].\n *\n * Source permalink:\n * `https://github.com/vitest-dev/vitest/blob/b865b4d83d1e7874607ba1b2d84b9e2d135ecd33/packages/vitest/src/node/config/resolveConfig.ts#L674-L713`\n */\nexport type VievalVitestCompatReporterValue = string | VievalVitestCompatReporter\n\ntype Awaitable<T> = Promise<T> | T\n\n/**\n * Creates a project-level vitest-compatible reporter bridge.\n *\n * Use when:\n * - `vieval` should reuse vitest-like reporter callbacks without changing CLI output contracts\n *\n * Expects:\n * - references point to modules whose default export is a reporter instance or constructor\n *\n * Returns:\n * - `null` when no reporter references are configured\n */\nexport async function createVievalVitestCompatReporterBridge(options: {\n projectName: string\n references: readonly VievalVitestCompatReporterReference[]\n}): Promise<null | VievalVitestCompatReporterBridge> {\n if (options.references.length === 0) {\n return null\n }\n\n const loadedReporters: VievalVitestCompatReporter[] = []\n\n for (const reference of options.references) {\n const normalized = normalizeReporterReference(reference)\n try {\n const moduleValue = typeof normalized.value === 'string'\n ? await loadReporterModule(normalized.value)\n : normalized.value\n const instance = createReporterInstance(moduleValue, normalized.options)\n if (instance != null) {\n loadedReporters.push(instance)\n }\n }\n catch {\n // Best effort only: invalid reporter modules should not break eval runs.\n }\n }\n\n if (loadedReporters.length === 0) {\n return null\n }\n\n const modulesByTaskId = new Map<string, VievalVitestCompatModule>()\n const casesByCompositeId = new Map<string, VievalVitestCompatCase>()\n\n function getOrCreateModule(taskId: string): VievalVitestCompatModule {\n const existing = modulesByTaskId.get(taskId)\n if (existing != null) {\n return existing\n }\n\n const created: VievalVitestCompatModule = {\n id: taskId,\n name: taskId,\n projectName: options.projectName,\n }\n modulesByTaskId.set(taskId, created)\n return created\n }\n\n function getOrCreateCase(taskId: string, caseId: string): VievalVitestCompatCase {\n const compositeId = `${taskId}::${caseId}`\n const existing = casesByCompositeId.get(compositeId)\n if (existing != null) {\n return existing\n }\n\n const created: VievalVitestCompatCase = {\n id: caseId,\n module: getOrCreateModule(taskId),\n name: caseId,\n state: 'pending',\n }\n casesByCompositeId.set(compositeId, created)\n return created\n }\n\n return {\n async onCaseEnd(payload) {\n const taskCase = getOrCreateCase(payload.taskId, payload.caseId)\n taskCase.state = payload.state === 'timeout' ? 'failed' : payload.state\n await emitToReporters(loadedReporters, reporter => reporter.onTestCaseResult?.(taskCase))\n },\n\n async onCaseStart(payload) {\n const taskCase = getOrCreateCase(payload.taskId, payload.caseId)\n await emitToReporters(loadedReporters, reporter => reporter.onTestCaseReady?.(taskCase))\n },\n\n async onRunEnd(run) {\n const modules = [...modulesByTaskId.values()]\n const errors = run.failed\n ? [{ message: 'vieval run failed' }]\n : []\n await emitToReporters(loadedReporters, reporter => reporter.onTestRunEnd?.(modules, errors, run.failed ? 'failed' : 'passed'))\n },\n\n async onRunStart() {\n const specifications = [...modulesByTaskId.values()].map(module => ({\n moduleId: module.id,\n projectName: module.projectName,\n }))\n await emitToReporters(loadedReporters, reporter => reporter.onTestRunStart?.(specifications))\n },\n\n async onTaskEnd(payload) {\n const module = getOrCreateModule(payload.taskId)\n if (payload.state === 'failed') {\n const syntheticCase = getOrCreateCase(payload.taskId, `${payload.taskId}:task`)\n syntheticCase.state = 'failed'\n await emitToReporters(loadedReporters, reporter => reporter.onTestCaseResult?.(syntheticCase))\n }\n await emitToReporters(loadedReporters, reporter => reporter.onTestModuleEnd?.(module))\n },\n\n async onTaskQueued(payload) {\n const module = getOrCreateModule(payload.taskId)\n await emitToReporters(loadedReporters, reporter => reporter.onTestModuleQueued?.(module))\n await emitToReporters(loadedReporters, reporter => reporter.onTestModuleCollected?.(module))\n },\n\n async onTaskStart(payload) {\n const module = getOrCreateModule(payload.taskId)\n await emitToReporters(loadedReporters, reporter => reporter.onTestModuleStart?.(module))\n },\n }\n}\n\nfunction createReporterInstance(moduleValue: unknown, options: unknown): null | VievalVitestCompatReporter {\n const candidate = moduleValue as { default?: unknown }\n const value = candidate.default ?? moduleValue\n\n if (value == null) {\n return null\n }\n\n if (typeof value === 'function') {\n const reporter = new (value as new (options?: unknown) => unknown)(options)\n return reporter as VievalVitestCompatReporter\n }\n\n if (typeof value === 'object') {\n return value as VievalVitestCompatReporter\n }\n\n return null\n}\n\nasync function emitToReporters(\n reporters: readonly VievalVitestCompatReporter[],\n callback: (reporter: VievalVitestCompatReporter) => Awaitable<void> | void,\n): Promise<void> {\n await Promise.all(reporters.map(async (reporter) => {\n try {\n await callback(reporter)\n }\n catch {\n // Reporter errors are intentionally swallowed to keep task execution deterministic.\n }\n }))\n}\n\nfunction isAbsoluteLikePath(value: string): boolean {\n return value.startsWith('/')\n || value.startsWith('./')\n || value.startsWith('../')\n || /^[A-Z]:[\\\\/]/i.test(value)\n}\n\nfunction isReporterReferenceTuple(\n reference: VievalVitestCompatReporterReference,\n): reference is readonly [VievalVitestCompatReporterValue, unknown?] {\n return Array.isArray(reference)\n}\n\nasync function loadReporterModule(path: string): Promise<unknown> {\n if (isAbsoluteLikePath(path)) {\n return import(pathToFileURL(path).href)\n }\n\n return import(path)\n}\n\nfunction normalizeReporterReference(reference: VievalVitestCompatReporterReference): {\n options: unknown\n value: VievalVitestCompatReporterValue\n} {\n if (isReporterReferenceTuple(reference)) {\n return {\n options: reference[1],\n value: reference[0],\n }\n }\n\n return {\n options: undefined,\n value: reference,\n }\n}\n","import type { TaskCaseReporterEndPayload, TaskCaseReporterPayload, TaskConcurrencyConfig, TaskReporterEventPayload, TaskReporterHooks } from '../config'\nimport type { AggregatedRunResults, ScheduledTask, ScheduledTaskExecutor, TaskExecutionContext } from '../core/runner'\nimport type { TelemetryRuntime } from '../core/telemetry'\nimport type { CliProjectExecutorContext, LoadVievalCliConfigOptions, NormalizedCliProjectConfig } from './config'\nimport type { CliReporter, SummaryReporter, SummaryReporterCaseStartPayload, SummaryReporterTaskQueuedPayload } from './reporters'\nimport type { WindowRendererTimer } from './reporters/renderers/windowed-renderer'\nimport type { VievalVitestCompatReporterBridge } from './reporters/vitest-compat-reporter'\n\nimport process from 'node:process'\n\nimport { randomUUID } from 'node:crypto'\nimport { resolve } from 'node:path'\n\nimport c from 'tinyrainbow'\n\nimport { errorMessageFrom } from '@moeru/std'\n\nimport { collectEvalEntries, createFilesystemTaskCacheRuntime, createRunnerRuntimeContext, createRunnerSchedule, createSchedulerRuntime, createTaskExecutionContext, RunnerExecutionError, runScheduledTasks } from '../core/runner'\nimport { createNoopTelemetryRuntime, createOpenTelemetryRuntime } from '../core/telemetry'\nimport { loadVievalCliConfig } from './config'\nimport { discoverEvalFiles } from './discovery'\nimport { loadEvalModulesWithVitestRuntime } from './module-runtime'\nimport { writeRunReportArtifacts } from './report-artifacts'\nimport { createCliReporter } from './reporters'\nimport { WindowRenderer } from './reporters/renderers/windowed-renderer'\nimport { createVievalVitestCompatReporterBridge } from './reporters/vitest-compat-reporter'\n\n/**\n * Captures one failed case with its message for CLI and JSON debugging output.\n */\nexport interface CliProjectCaseFailure {\n caseId: string\n caseName: string\n errorMessage: string\n taskId: string\n}\n\n/**\n * Captures case-level summary counts for one project.\n */\nexport interface CliProjectCaseSummary {\n failed: number\n passed: number\n skipped: number\n timeout: number\n total: number\n}\n\n/**\n * Captures matrix-row and axis coverage for one project schedule.\n */\nexport interface CliProjectMatrixSummary {\n evalAxes: string[]\n evalRows: number\n runAxes: string[]\n runRows: number\n}\n\n/**\n * Summary of one processed project.\n */\nexport interface CliProjectSummary {\n caseFailures?: CliProjectCaseFailure[]\n caseSummary?: CliProjectCaseSummary | null\n discoveredEvalFileCount: number\n durationMs?: number\n entryCount: number\n errorMessage: null | string\n executed: boolean\n matrixSummary: CliProjectMatrixSummary | null\n name: string\n result: AggregatedRunResults | null\n taskCount: number\n}\n\n/**\n * Final CLI output model.\n */\nexport interface CliRunOutput {\n attemptId?: string\n configFilePath: null | string\n experimentId?: string\n projects: CliProjectSummary[]\n reportDirectory?: null | string\n runId?: string\n workspaceId?: string\n}\n\n/**\n * Runtime options for `runVievalCli`.\n */\nexport interface RunVievalCliOptions extends LoadVievalCliConfigOptions {\n /**\n * Attempt id attached to report artifacts.\n */\n attempt?: string\n /**\n * Optional attempt-level concurrency cap parsed by the CLI.\n */\n attemptConcurrency?: number\n /**\n * Cache project identifier override used to share benchmark cache across multiple method runs.\n */\n cacheProjectName?: string\n /**\n * Optional case-level concurrency cap parsed by the CLI.\n */\n caseConcurrency?: number\n /**\n * Experiment id attached to report artifacts.\n */\n experiment?: string\n /**\n * Restrict run to project names.\n *\n * @default []\n */\n project?: string[]\n /**\n * Optional project-level concurrency cap parsed by the CLI.\n */\n projectConcurrency?: number\n /**\n * Optional reporter overrides used by CLI integration tests or custom hosts.\n */\n reporter?: RunVievalCliReporterOptions\n /**\n * Optional report output root directory.\n */\n reportOut?: string\n /**\n * Optional task-level concurrency cap parsed by the CLI.\n */\n taskConcurrency?: number\n /**\n * Workspace id attached to report artifacts.\n */\n workspace?: string\n /**\n * Optional workspace-level concurrency cap parsed by the CLI.\n */\n workspaceConcurrency?: number\n}\n\n/**\n * Reporter runtime options for `runVievalCli`.\n */\nexport interface RunVievalCliReporterOptions {\n clearInterval?: (timer: WindowRendererTimer) => void\n createInterval?: (callback: () => void, intervalMs: number) => WindowRendererTimer\n getColumns?: () => number\n getNow?: () => number\n getRows?: () => number | undefined\n getWallClockNow?: () => number\n isTTY?: boolean\n queueRenderReset?: (callback: () => void) => void\n slowThresholdMs?: number\n supportsAnsiWindowing?: boolean\n writeError?: (value: string) => void\n writeOutput?: (value: string) => void\n}\n\ninterface CliColorPalette {\n bgCyan: (value: string) => string\n bgGreen: (value: string) => string\n bgMagenta: (value: string) => string\n bgYellow: (value: string) => string\n black: (value: string) => string\n dim: (value: string) => string\n gray: (value: string) => string\n green: (value: string) => string\n red: (value: string) => string\n yellow: (value: string) => string\n}\n\ninterface CliRunIdentity {\n attemptId: string\n experimentId: string\n runId: string\n workspaceId: string\n}\n\ninterface CliRunRecordedEventMetadata {\n caseId?: string\n projectName?: string\n taskId?: string\n}\n\ntype CliRunReporter = Omit<CliReporter, 'onCaseStart' | 'onTaskQueued'> & {\n onCaseStart: (payload: SummaryReporterCaseStartPayload) => void\n onTaskQueued: (payload: SummaryReporterTaskQueuedPayload) => void\n}\n\ninterface CliRunReportEvent {\n attemptId: string\n caseId?: string\n data: unknown\n event: string\n experimentId: string\n projectId?: string\n runId: string\n schemaVersion: 1\n taskId?: string\n timestamp: string\n version: 1\n workspaceId: string\n}\n\ntype CliTaskExecutionContext = CliProjectExecutorContext\n\ninterface PreparedCliProjectExecution {\n discoveredEvalFileCount: number\n entryCount: number\n name: string\n project: NormalizedCliProjectConfig\n startedAt: number\n tasks: ScheduledTask[]\n}\n\ntype PreparedCliProjectResult\n = {\n experimentMatrixRows: string[]\n kind: 'prepared'\n prepared: PreparedCliProjectExecution\n }\n | {\n experimentMatrixRows: string[]\n kind: 'summary'\n summary: CliProjectSummary\n }\n\ninterface ProcessEnvSnapshotValue {\n existed: boolean\n value: string | undefined\n}\n\ninterface RunCliProjectCaseCounters {\n failed: number\n passed: number\n seenCaseIds: Set<string>\n skipped: number\n timeout: number\n}\n\ninterface RunCliReporterCounters {\n failedTasks: number\n passedTasks: number\n skippedTasks: number\n}\n\n/**\n * Formats CLI run output as human-readable lines.\n */\nexport function formatVievalCliRunOutput(output: CliRunOutput): string {\n const colorEnabled = shouldUseColor()\n const colors = createColorPalette(colorEnabled)\n const lines: string[] = []\n lines.push(` ${colors.dim('RUN')} ${colors.yellow('vieval')}`)\n lines.push(` ${colors.dim('Config')} ${output.configFilePath ?? '(not found, using defaults)'}`)\n lines.push('')\n\n let passedProjects = 0\n let skippedProjects = 0\n let failedProjects = 0\n let totalTasks = 0\n let executedTasks = 0\n\n function formatMatrixSummary(summary: CliProjectMatrixSummary | null): null | string {\n if (summary == null) {\n return null\n }\n\n const runAxesLabel = summary.runAxes.length === 0 ? '-' : summary.runAxes.join('|')\n const evalAxesLabel = summary.evalAxes.length === 0 ? '-' : summary.evalAxes.join('|')\n return `matrix run ${summary.runRows} [${runAxesLabel}] / eval ${summary.evalRows} [${evalAxesLabel}]`\n }\n\n function formatScheduleBreakdown(project: CliProjectSummary): null | string {\n const summary = project.matrixSummary\n if (summary == null) {\n return null\n }\n\n if (project.taskCount <= 0 || project.entryCount <= 0 || summary.runRows <= 0 || summary.evalRows <= 0) {\n return null\n }\n\n const denominator = project.entryCount * summary.runRows * summary.evalRows\n if (denominator <= 0 || project.taskCount % denominator !== 0) {\n return null\n }\n\n const providerCount = project.taskCount / denominator\n\n return [\n colors.dim('schedule '),\n colors.yellow(String(project.entryCount)),\n colors.dim(' entries × '),\n colors.yellow(String(providerCount)),\n colors.dim(' inferenceExecutors × '),\n colors.yellow(String(summary.runRows)),\n colors.dim(' run rows × '),\n colors.yellow(String(summary.evalRows)),\n colors.dim(' eval rows = '),\n colors.green(String(project.taskCount)),\n colors.dim(' tasks'),\n ].join('')\n }\n\n for (const project of output.projects) {\n totalTasks += project.taskCount\n executedTasks += project.result?.overall.runCount ?? 0\n\n const badge = createProjectBadge(project.name, colors, colorEnabled)\n const isFailed = project.errorMessage != null\n const hasFailedCases = (project.caseSummary?.failed ?? 0) > 0 || (project.caseSummary?.timeout ?? 0) > 0 || (project.caseFailures?.length ?? 0) > 0\n if (isFailed) {\n failedProjects += 1\n lines.push(` ${colors.red('❯')} ${badge}${formatDuration(project.durationMs, colors)}`)\n lines.push(` ${project.errorMessage}`)\n continue\n }\n\n if (!project.executed) {\n skippedProjects += 1\n const countLabel = colors.dim(`(${project.taskCount} tasks)`)\n const detailsLabel = colors.dim(` ${project.discoveredEvalFileCount} files, ${project.entryCount} entries, 0 runs, hybrid n/a`)\n const matrixSummary = formatMatrixSummary(project.matrixSummary)\n lines.push(` ${colors.dim('○')} ${badge}${countLabel}${detailsLabel}${formatDuration(project.durationMs, colors)}`)\n if (matrixSummary != null) {\n lines.push(` ${colors.dim(matrixSummary)}`)\n }\n const scheduleBreakdown = formatScheduleBreakdown(project)\n if (scheduleBreakdown != null) {\n lines.push(` ${scheduleBreakdown}`)\n }\n continue\n }\n\n if (hasFailedCases) {\n failedProjects += 1\n }\n else {\n passedProjects += 1\n }\n const hybridAverageLabel = formatHybridAverage(project.result?.overall.hybridAverage)\n const runCount = project.result?.overall.runCount ?? 0\n const countLabel = colors.dim(`(${project.taskCount} tasks)`)\n const caseSummaryLabel = project.caseSummary == null\n ? ''\n : `, cases ${project.caseSummary.passed} passed | ${project.caseSummary.failed} failed | ${project.caseSummary.timeout} timeout`\n const detailsLabel = colors.dim(` ${project.discoveredEvalFileCount} files, ${project.entryCount} entries, ${runCount} runs${caseSummaryLabel}, hybrid ${hybridAverageLabel}`)\n const matrixSummary = formatMatrixSummary(project.matrixSummary)\n lines.push(` ${hasFailedCases ? colors.red('❯') : colors.green('✓')} ${badge}${countLabel}${detailsLabel}${formatDuration(project.durationMs, colors)}`)\n if (matrixSummary != null) {\n lines.push(` ${colors.dim(matrixSummary)}`)\n }\n const scheduleBreakdown = formatScheduleBreakdown(project)\n if (scheduleBreakdown != null) {\n lines.push(` ${scheduleBreakdown}`)\n }\n if ((project.caseFailures?.length ?? 0) > 0) {\n lines.push(` ${colors.red('Failed cases:')}`)\n for (const failure of project.caseFailures!.slice(0, 5)) {\n lines.push(` ${colors.red(`- ${failure.caseName} (${failure.taskId})`)}`)\n for (const line of failure.errorMessage.split('\\n')) {\n lines.push(` ${colors.red(line)}`)\n }\n }\n if (project.caseFailures!.length > 5) {\n lines.push(` ${colors.dim(`... ${project.caseFailures!.length - 5} more failed cases`)}`)\n }\n }\n }\n\n lines.push('')\n if (failedProjects > 0 || skippedProjects > 0) {\n const summarySegments = [`${colors.green(String(passedProjects))} passed`]\n\n if (skippedProjects > 0) {\n summarySegments.push(`${colors.dim(String(skippedProjects))} skipped`)\n }\n\n if (failedProjects > 0) {\n summarySegments.push(`${colors.red(String(failedProjects))} failed`)\n }\n\n lines.push(` ${colors.dim('Projects')} ${summarySegments.join(' | ')} (${output.projects.length})`)\n }\n else {\n lines.push(` ${colors.dim('Projects')} ${colors.green(String(passedProjects))} passed (${output.projects.length})`)\n }\n lines.push(` ${colors.dim('Tasks')} ${executedTasks} executed / ${totalTasks} scheduled`)\n\n return lines.join('\\n')\n}\n\n/**\n * Returns true when output contains at least one failing project/task/case outcome.\n */\nexport function hasRunFailures(output: CliRunOutput): boolean {\n return output.projects.some((project) => {\n if (project.errorMessage != null) {\n return true\n }\n\n if (project.caseSummary != null && (project.caseSummary.failed > 0 || project.caseSummary.timeout > 0)) {\n return true\n }\n\n return (project.caseFailures?.length ?? 0) > 0\n })\n}\n\n/**\n * Runs vieval orchestration from config and returns project-level summaries.\n *\n * Call stack:\n *\n * {@link runVievalCli}\n * -> {@link loadVievalCliConfig}\n * -> {@link discoverEvalFiles}\n * -> {@link collectEvalEntries}\n * -> {@link createRunnerSchedule}\n * -> {@link runScheduledTasks} (optional)\n *\n * Use when:\n * - running eval collection and scheduling from a single command\n * - keeping business-agent eval files near their implementation packages\n */\nexport async function runVievalCli(options: RunVievalCliOptions = {}): Promise<CliRunOutput> {\n const loadedConfig = await loadVievalCliConfig({\n configFilePath: options.configFilePath,\n cwd: options.cwd,\n })\n const telemetry = loadedConfig.reporting?.openTelemetry?.enabled === true\n ? createOpenTelemetryRuntime()\n : createNoopTelemetryRuntime()\n const onOpenTelemetryRunEnd = loadedConfig.reporting?.openTelemetry?.enabled === true\n ? loadedConfig.reporting.openTelemetry.onRunEnd\n : undefined\n const restoreEnvironment = applyRunEnvironment(loadedConfig.env)\n\n let runError: unknown\n let runEndError: unknown\n let output: CliRunOutput | undefined\n let reporter: CliRunReporter | undefined\n try {\n const selectedProjects = filterProjectsByName(loadedConfig.projects, options.project ?? [])\n const preparedProjects = await Promise.all(selectedProjects.map(async project => prepareProject(project)))\n const identity = createRunIdentity(options, preparedProjects)\n const eventRecorder = createEventRecorder(identity)\n const runReporter = createReporterWithEventCapture(\n createRunReporter(options.reporter),\n eventRecorder.record,\n )\n reporter = runReporter\n\n output = await telemetry.withSpan('vieval.run', {\n 'vieval.attempt.id': identity.attemptId,\n 'vieval.experiment.id': identity.experimentId,\n 'vieval.run.id': identity.runId,\n 'vieval.workspace.id': identity.workspaceId,\n }, async () => {\n const workspaceScheduler = createSchedulerRuntime({\n concurrency: {\n workspace: resolveWorkspaceConcurrency(loadedConfig, options),\n },\n })\n const executableProjects = preparedProjects\n .filter(project => project.kind === 'prepared')\n .map(project => project.prepared)\n const totalTasks = preparedProjects.reduce((sum, project) => {\n if (project.kind === 'prepared') {\n return sum + project.prepared.tasks.length\n }\n\n return sum + project.summary.taskCount\n }, 0)\n const skippedSummaryTasks = preparedProjects.reduce((sum, project) => {\n if (project.kind === 'summary') {\n return sum + project.summary.taskCount\n }\n\n return sum\n }, 0)\n const reporterCounters: RunCliReporterCounters = {\n failedTasks: 0,\n passedTasks: 0,\n skippedTasks: 0,\n }\n\n runReporter.onRunStart({\n totalTasks,\n })\n\n for (const project of executableProjects) {\n for (const task of project.tasks) {\n runReporter.onTaskQueued(createTaskQueuePayload(task, project.name))\n }\n }\n\n const projectSummaryPairs = await Promise.all(preparedProjects.map(async (preparedProject, index) => {\n if (preparedProject.kind === 'summary') {\n return {\n index,\n summary: preparedProject.summary,\n }\n }\n\n return {\n index,\n summary: await telemetry.withSpan('vieval.project', {\n 'vieval.project.name': preparedProject.prepared.name,\n 'vieval.run.id': identity.runId,\n }, async () => await workspaceScheduler.runCase({\n experimentId: identity.experimentId,\n projectName: preparedProject.prepared.name,\n scope: 'workspace',\n workspaceId: identity.workspaceId,\n }, async () => executePreparedProject(\n preparedProject.prepared,\n identity,\n options.cacheProjectName,\n telemetry,\n runReporter,\n reporterCounters,\n eventRecorder.record,\n options,\n ))),\n }\n }))\n const projectSummaries = projectSummaryPairs\n .sort((left, right) => left.index - right.index)\n .map(item => item.summary)\n\n runReporter.onRunEnd({\n failedTasks: reporterCounters.failedTasks,\n passedTasks: reporterCounters.passedTasks,\n skippedTasks: reporterCounters.skippedTasks + skippedSummaryTasks,\n totalTasks,\n })\n\n const output: CliRunOutput = {\n attemptId: identity.attemptId,\n configFilePath: loadedConfig.configFilePath,\n experimentId: identity.experimentId,\n projects: projectSummaries,\n reportDirectory: null,\n runId: identity.runId,\n workspaceId: identity.workspaceId,\n }\n\n if (options.reportOut != null) {\n output.reportDirectory = await writeRunReportArtifacts(\n output,\n eventRecorder.events,\n identity,\n options.reportOut,\n )\n }\n\n return output\n })\n }\n catch (error) {\n runError = error\n }\n finally {\n if (onOpenTelemetryRunEnd != null) {\n try {\n await onOpenTelemetryRunEnd()\n }\n catch (error) {\n if (runError == null) {\n runEndError = error\n }\n }\n }\n reporter?.dispose()\n restoreEnvironment()\n }\n\n if (runError != null) {\n throw runError\n }\n\n if (runEndError != null) {\n throw runEndError\n }\n\n if (output == null) {\n throw new Error('Vieval run finished without output.')\n }\n\n return output\n}\n\nfunction applyRunEnvironment(env: NodeJS.ProcessEnv): () => void {\n const envEntries = Object.entries(env)\n if (envEntries.length === 0) {\n return () => {}\n }\n\n const snapshot = new Map<string, ProcessEnvSnapshotValue>()\n\n for (const [key, value] of envEntries) {\n snapshot.set(key, {\n existed: Object.hasOwn(process.env, key),\n value: process.env[key],\n })\n\n if (value == null) {\n delete process.env[key]\n continue\n }\n process.env[key] = value\n }\n\n return () => {\n for (const [key, previous] of snapshot.entries()) {\n if (previous.existed) {\n if (previous.value == null) {\n delete process.env[key]\n continue\n }\n process.env[key] = previous.value\n continue\n }\n delete process.env[key]\n }\n }\n}\n\nfunction cloneScheduledTaskMatrix(task: ScheduledTask): ScheduledTask['matrix'] {\n return {\n eval: {\n ...task.matrix.eval,\n },\n meta: {\n ...task.matrix.meta,\n },\n run: {\n ...task.matrix.run,\n },\n }\n}\n\nfunction createAutoTaskExecutor(\n reporter: CliRunReporter,\n projectName: string,\n recordEvent: (event: string, payload: unknown, metadata?: CliRunRecordedEventMetadata) => void,\n projectCaseCounters: RunCliProjectCaseCounters,\n projectCaseFailures: CliProjectCaseFailure[],\n vitestCompatReporter?: null | VievalVitestCompatReporterBridge,\n): ScheduledTaskExecutor {\n return async (task, context) => {\n const taskDefinition = task.entry.task\n if (taskDefinition == null) {\n throw new Error(`Missing eval task definition for entry \"${task.entry.id}\".`)\n }\n\n const output = await taskDefinition.run({\n cache: context.cache,\n models: context.models,\n reporterHooks: resolveTaskReporterHooks(task, context, reporter, projectName, recordEvent, projectCaseCounters, projectCaseFailures, vitestCompatReporter),\n task,\n telemetry: (context as CliProjectExecutorContext).telemetry,\n })\n\n return {\n entryId: task.entry.id,\n id: task.id,\n inferenceExecutorId: task.inferenceExecutor.id,\n matrix: task.matrix,\n scores: [...output.scores],\n }\n }\n}\n\nfunction createCliTaskExecutionContext(\n task: ScheduledTask,\n models: NormalizedCliProjectConfig['models'],\n cacheRootDirectory: string,\n cacheProjectName: string,\n workspaceId: string,\n telemetry: TelemetryRuntime,\n reporter: CliRunReporter,\n projectName: string,\n recordEvent: (event: string, payload: unknown, metadata?: CliRunRecordedEventMetadata) => void,\n projectCaseCounters: RunCliProjectCaseCounters,\n projectCaseFailures: CliProjectCaseFailure[],\n runtimeConcurrency: TaskConcurrencyConfig | undefined,\n vitestCompatReporter?: null | VievalVitestCompatReporterBridge,\n): CliTaskExecutionContext {\n return {\n ...createTaskExecutionContext({\n cache: createFilesystemTaskCacheRuntime({\n cacheRootDirectory,\n projectName: cacheProjectName,\n workspaceId,\n }),\n models,\n task,\n }),\n reporterHooks: createTaskReporterHooks(task, reporter, projectName, recordEvent, projectCaseCounters, projectCaseFailures, vitestCompatReporter),\n runtimeConcurrency,\n telemetry,\n }\n}\n\nfunction createColorPalette(enabled: boolean): CliColorPalette {\n if (!enabled) {\n return {\n bgCyan: value => value,\n bgGreen: value => value,\n bgMagenta: value => value,\n bgYellow: value => value,\n black: value => value,\n dim: value => value,\n gray: value => value,\n green: value => value,\n red: value => value,\n yellow: value => value,\n }\n }\n\n return {\n bgCyan: value => c.bgCyan(value),\n bgGreen: value => c.bgGreen(value),\n bgMagenta: value => c.bgMagenta(value),\n bgYellow: value => c.bgYellow(value),\n black: value => c.black(value),\n dim: value => c.dim(value),\n gray: value => c.gray(value),\n green: value => c.green(value),\n red: value => c.red(value),\n yellow: value => c.yellow(value),\n }\n}\n\nfunction createEventRecorder(identity: CliRunIdentity): {\n events: CliRunReportEvent[]\n record: (event: string, payload: unknown, metadata?: CliRunRecordedEventMetadata) => void\n} {\n const events: CliRunReportEvent[] = []\n const taskProjectMap = new Map<string, string>()\n\n return {\n events,\n record(event, payload, metadata): void {\n const maybeTaskPayload = payload as { projectName?: string, taskId?: string }\n const taskId = metadata?.taskId ?? maybeTaskPayload?.taskId\n const caseId = metadata?.caseId ?? (payload as { caseId?: string })?.caseId\n const projectName = metadata?.projectName ?? maybeTaskPayload?.projectName\n\n if (taskId != null && projectName != null) {\n taskProjectMap.set(taskId, projectName)\n }\n\n events.push({\n attemptId: identity.attemptId,\n caseId,\n data: payload,\n event,\n experimentId: identity.experimentId,\n projectId: taskId == null ? undefined : taskProjectMap.get(taskId),\n runId: identity.runId,\n schemaVersion: 1,\n taskId,\n timestamp: new Date().toISOString(),\n version: 1,\n workspaceId: identity.workspaceId,\n })\n },\n }\n}\n\nfunction createExperimentMatrixRows(tasks: readonly ScheduledTask[]): string[] {\n const rows = new Set<string>()\n\n for (const task of tasks) {\n const runRowId = task.matrix.meta.runRowId\n const evalRowId = task.matrix.meta.evalRowId\n\n if (runRowId !== 'default' && evalRowId !== 'default') {\n rows.add(`run:${runRowId}+eval:${evalRowId}`)\n continue\n }\n\n if (runRowId !== 'default') {\n rows.add(`run:${runRowId}`)\n }\n\n if (evalRowId !== 'default') {\n rows.add(`eval:${evalRowId}`)\n }\n }\n\n return [...rows].sort((left, right) => left.localeCompare(right))\n}\n\nfunction createProjectBadge(name: string, colors: CliColorPalette, colorEnabled: boolean): string {\n if (!colorEnabled || !c.isColorSupported) {\n return `|${name}| `\n }\n\n const labelColorPool = [colors.bgYellow, colors.bgCyan, colors.bgGreen, colors.bgMagenta] as const\n const seed = name\n .split('')\n .reduce((accumulator, char, index) => accumulator + char.charCodeAt(0) + index, 0)\n const background = labelColorPool[seed % labelColorPool.length]\n return `${colors.black(background(` ${name} `))} `\n}\n\nfunction createProjectMatrixSummary(tasks: readonly ScheduledTask[]): CliProjectMatrixSummary | null {\n if (tasks.length === 0) {\n return null\n }\n\n const runAxes = new Set<string>()\n const evalAxes = new Set<string>()\n const runRows = new Set<string>()\n const evalRows = new Set<string>()\n\n for (const task of tasks) {\n Object.keys(task.matrix.run).forEach(axis => runAxes.add(axis))\n Object.keys(task.matrix.eval).forEach(axis => evalAxes.add(axis))\n runRows.add(task.matrix.meta.runRowId)\n evalRows.add(task.matrix.meta.evalRowId)\n }\n\n return {\n evalAxes: [...evalAxes].sort(),\n evalRows: evalRows.size,\n runAxes: [...runAxes].sort(),\n runRows: runRows.size,\n }\n}\n\nfunction createReporterWithEventCapture(\n reporter: CliRunReporter,\n recordEvent: (event: string, payload: unknown, metadata?: CliRunRecordedEventMetadata) => void,\n): CliRunReporter {\n return {\n dispose() {\n reporter.dispose()\n },\n onCaseEnd(payload) {\n recordEvent('CaseEnded', payload)\n reporter.onCaseEnd(payload)\n },\n onCaseStart(payload) {\n recordEvent('CaseStarted', payload)\n reporter.onCaseStart(payload)\n },\n onRunEnd(payload) {\n recordEvent('RunEnded', payload)\n reporter.onRunEnd(payload)\n },\n onRunStart(payload) {\n recordEvent('RunStarted', payload)\n reporter.onRunStart(payload)\n },\n onTaskEnd(payload) {\n recordEvent('TaskEnded', payload)\n reporter.onTaskEnd(payload)\n },\n onTaskQueued(payload) {\n recordEvent('TaskQueued', payload)\n reporter.onTaskQueued(payload)\n },\n onTaskStart(payload) {\n recordEvent('TaskStarted', payload)\n reporter.onTaskStart(payload)\n },\n }\n}\n\nfunction createRunIdentity(\n options: RunVievalCliOptions,\n preparedProjects: readonly PreparedCliProjectResult[],\n): CliRunIdentity {\n const workspaceId = sanitizeIdentitySegment(options.workspace ?? 'default-workspace')\n const experimentId = resolveExperimentId(options, preparedProjects)\n const attemptId = sanitizeIdentitySegment(options.attempt ?? `attempt-${new Date().toISOString().replace(/[:.]/g, '-')}`)\n\n return {\n attemptId,\n experimentId,\n runId: `run-${Date.now()}-${randomUUID().slice(0, 8)}`,\n workspaceId,\n }\n}\n\nfunction createRunReporter(options: RunVievalCliReporterOptions | undefined): CliRunReporter {\n const getRows = options?.getRows ?? (() => process.stdout.rows)\n const reporter = createCliReporter({\n getColumns: options?.getColumns ?? (() => process.stdout.columns ?? 80),\n getNow: options?.getNow ?? (() => Date.now()),\n getWallClockNow: options?.getWallClockNow ?? (() => Date.now()),\n isTTY: options?.isTTY ?? (process.stdout.isTTY === true),\n slowThresholdMs: options?.slowThresholdMs ?? 300,\n writeError: options?.writeError ?? (value => process.stderr.write(value)),\n writeOutput: options?.writeOutput ?? (value => process.stdout.write(value)),\n })\n\n if (!isSummaryReporter(reporter)) {\n return {\n ...reporter,\n onCaseStart(payload) {\n reporter.onCaseStart(payload)\n },\n onTaskQueued(payload) {\n reporter.onTaskQueued(payload)\n },\n }\n }\n\n const rendererBaseOptions = {\n getColumns: options?.getColumns ?? (() => process.stdout.columns ?? 80),\n getWindow: () => reporter.getWindowRows({\n maxRows: normalizeLiveReporterMaxRows(getRows()),\n }),\n queueRenderReset: options?.queueRenderReset,\n supportsAnsiWindowing: options?.supportsAnsiWindowing,\n writeOutput: options?.writeOutput ?? (value => process.stdout.write(value)),\n }\n const renderer = options?.clearInterval != null && options.createInterval != null\n ? new WindowRenderer({\n ...rendererBaseOptions,\n clearInterval: options.clearInterval,\n createInterval: options.createInterval,\n })\n : new WindowRenderer(rendererBaseOptions)\n\n renderer.start()\n\n function scheduleRender(): void {\n renderer.schedule()\n }\n\n return {\n dispose() {\n reporter.dispose()\n renderer.dispose()\n },\n onCaseEnd(payload) {\n reporter.onCaseEnd(payload)\n scheduleRender()\n },\n onCaseStart(payload) {\n reporter.onCaseStart(payload)\n scheduleRender()\n },\n onRunEnd(payload) {\n reporter.onRunEnd(payload)\n scheduleRender()\n },\n onRunStart(payload) {\n reporter.onRunStart(payload)\n scheduleRender()\n },\n onTaskEnd(payload) {\n reporter.onTaskEnd(payload)\n scheduleRender()\n },\n onTaskQueued(payload) {\n reporter.onTaskQueued(payload)\n scheduleRender()\n },\n onTaskStart(payload) {\n reporter.onTaskStart(payload)\n scheduleRender()\n },\n }\n}\n\nfunction createScheduledTaskWithRuntimeConcurrency(\n task: ScheduledTask,\n project: NormalizedCliProjectConfig,\n options: RunVievalCliOptions,\n): ScheduledTask {\n const taskDefinition = task.entry.task\n if (taskDefinition == null) {\n return task\n }\n\n const concurrency = resolveRuntimeTaskConcurrency(taskDefinition.concurrency, project, options)\n\n return {\n ...task,\n entry: {\n ...task.entry,\n task: {\n ...taskDefinition,\n concurrency,\n },\n },\n }\n}\n\nfunction createTaskCaseReporterId(payload: TaskCaseReporterEndPayload | TaskCaseReporterPayload): string {\n return `${payload.index}:${encodeURIComponent(payload.name)}`\n}\n\nfunction createTaskQueuePayload(task: ScheduledTask, projectName: string): SummaryReporterTaskQueuedPayload {\n return {\n displayName: task.entry.name,\n projectName,\n taskId: task.id,\n }\n}\n\nfunction createTaskReporterHooks(\n task: ScheduledTask,\n reporter: CliRunReporter,\n projectName: string,\n recordEvent: (event: string, payload: unknown, metadata?: CliRunRecordedEventMetadata) => void,\n projectCaseCounters?: RunCliProjectCaseCounters,\n projectCaseFailures?: CliProjectCaseFailure[],\n vitestCompatReporter?: null | VievalVitestCompatReporterBridge,\n): TaskReporterHooks {\n function syncCaseTotal(total: number): void {\n reporter.onTaskQueued({\n taskId: task.id,\n totalCases: total,\n })\n }\n\n return {\n onCaseEnd(payload) {\n const caseId = createTaskCaseReporterId(payload)\n if (projectCaseCounters != null) {\n const projectCaseId = `${task.id}:${caseId}`\n if (!projectCaseCounters.seenCaseIds.has(projectCaseId)) {\n projectCaseCounters.seenCaseIds.add(projectCaseId)\n if (payload.state === 'passed') {\n projectCaseCounters.passed += 1\n }\n else if (payload.state === 'failed') {\n projectCaseCounters.failed += 1\n }\n else if (payload.state === 'timeout') {\n projectCaseCounters.timeout += 1\n }\n else {\n projectCaseCounters.skipped += 1\n }\n }\n }\n\n syncCaseTotal(payload.total)\n if ((payload.state === 'failed' || payload.state === 'timeout') && payload.errorMessage != null && projectCaseFailures != null) {\n projectCaseFailures.push({\n caseId,\n caseName: payload.name,\n errorMessage: payload.errorMessage,\n taskId: task.id,\n })\n }\n reporter.onCaseEnd({\n caseId,\n errorMessage: payload.errorMessage,\n output: payload.output,\n state: payload.state,\n taskId: task.id,\n })\n void vitestCompatReporter?.onCaseEnd({\n caseId,\n errorMessage: payload.errorMessage,\n state: payload.state,\n taskId: task.id,\n })\n },\n onCaseStart(payload) {\n const caseId = createTaskCaseReporterId(payload)\n syncCaseTotal(payload.total)\n reporter.onCaseStart({\n autoRetry: payload.autoRetry,\n caseId,\n caseName: payload.name,\n input: payload.input,\n retryIndex: payload.retryIndex,\n taskId: task.id,\n })\n void vitestCompatReporter?.onCaseStart({\n caseId,\n taskId: task.id,\n })\n },\n onEvent(payload: TaskReporterEventPayload) {\n recordEvent(payload.event, payload.data, {\n caseId: payload.caseId,\n projectName,\n taskId: task.id,\n })\n },\n }\n}\n\nasync function executePreparedProject(\n prepared: PreparedCliProjectExecution,\n identity: CliRunIdentity,\n cacheProjectName: string | undefined,\n telemetry: TelemetryRuntime,\n reporter: CliRunReporter,\n counters: RunCliReporterCounters,\n recordEvent: (event: string, payload: unknown, metadata?: CliRunRecordedEventMetadata) => void,\n options: RunVievalCliOptions,\n): Promise<CliProjectSummary> {\n const settledTaskIds = new Set<string>()\n const projectCaseCounters: RunCliProjectCaseCounters = {\n failed: 0,\n passed: 0,\n seenCaseIds: new Set<string>(),\n skipped: 0,\n timeout: 0,\n }\n const projectCaseFailures: CliProjectCaseFailure[] = []\n const vitestCompatReporter = await createVievalVitestCompatReporterBridge({\n projectName: prepared.name,\n references: prepared.project.reporters,\n })\n const rawTaskExecutor = prepared.project.executor ?? createAutoTaskExecutor(\n reporter,\n prepared.name,\n recordEvent,\n projectCaseCounters,\n projectCaseFailures,\n vitestCompatReporter,\n )\n const taskExecutor: ScheduledTaskExecutor = async (task, context) => {\n const runtimeTask = createScheduledTaskWithRuntimeConcurrency(task, prepared.project, options)\n const result = await telemetry.withSpan('vieval.task', {\n 'vieval.project.name': prepared.name,\n 'vieval.run.id': identity.runId,\n 'vieval.task.entry.id': runtimeTask.entry.id,\n 'vieval.task.id': runtimeTask.id,\n 'vieval.task.name': runtimeTask.entry.name,\n }, async () => await rawTaskExecutor(runtimeTask, context))\n\n return {\n ...result,\n matrix: cloneScheduledTaskMatrix(runtimeTask),\n }\n }\n\n for (const task of prepared.tasks) {\n await vitestCompatReporter?.onTaskQueued({\n taskId: task.id,\n })\n }\n\n await vitestCompatReporter?.onRunStart()\n\n try {\n const aggregated = await runScheduledTasks(prepared.tasks, taskExecutor, {\n createExecutionContext(task): TaskExecutionContext {\n return createCliTaskExecutionContext(\n task,\n prepared.project.models,\n resolve(prepared.project.root, '.vieval', 'cache'),\n cacheProjectName ?? prepared.name,\n identity.workspaceId,\n telemetry,\n reporter,\n prepared.name,\n recordEvent,\n projectCaseCounters,\n projectCaseFailures,\n resolveCliRuntimeConcurrency(options),\n vitestCompatReporter,\n )\n },\n maxConcurrency: resolveScheduledTaskConcurrency(prepared.project, options),\n onTaskEnd(task, state): void {\n settledTaskIds.add(task.id)\n reporter.onTaskEnd({\n state,\n taskId: task.id,\n })\n void vitestCompatReporter?.onTaskEnd({\n state,\n taskId: task.id,\n })\n\n if (state === 'passed') {\n counters.passedTasks += 1\n return\n }\n\n counters.failedTasks += 1\n },\n onTaskStart(task): void {\n reporter.onTaskStart({\n taskId: task.id,\n })\n void vitestCompatReporter?.onTaskStart({\n taskId: task.id,\n })\n },\n })\n\n await vitestCompatReporter?.onRunEnd({\n failed: false,\n })\n\n return {\n caseFailures: projectCaseFailures,\n caseSummary: {\n failed: projectCaseCounters.failed,\n passed: projectCaseCounters.passed,\n skipped: projectCaseCounters.skipped,\n timeout: projectCaseCounters.timeout,\n total: projectCaseCounters.seenCaseIds.size,\n },\n discoveredEvalFileCount: prepared.discoveredEvalFileCount,\n durationMs: Date.now() - prepared.startedAt,\n entryCount: prepared.entryCount,\n errorMessage: null,\n executed: true,\n matrixSummary: createProjectMatrixSummary(prepared.tasks),\n name: prepared.name,\n result: aggregated,\n taskCount: prepared.tasks.length,\n }\n }\n catch (error) {\n const failedTaskId = getFailedTaskId(error)\n\n if (failedTaskId != null && !settledTaskIds.has(failedTaskId)) {\n counters.failedTasks += 1\n settledTaskIds.add(failedTaskId)\n reporter.onTaskEnd({\n state: 'failed',\n taskId: failedTaskId,\n })\n await vitestCompatReporter?.onTaskEnd({\n state: 'failed',\n taskId: failedTaskId,\n })\n }\n\n for (const task of prepared.tasks) {\n if (settledTaskIds.has(task.id)) {\n continue\n }\n\n counters.skippedTasks += 1\n settledTaskIds.add(task.id)\n reporter.onTaskEnd({\n state: 'skipped',\n taskId: task.id,\n })\n await vitestCompatReporter?.onTaskEnd({\n state: 'skipped',\n taskId: task.id,\n })\n }\n\n await vitestCompatReporter?.onRunEnd({\n failed: true,\n })\n\n return {\n caseFailures: projectCaseFailures,\n caseSummary: {\n failed: projectCaseCounters.failed,\n passed: projectCaseCounters.passed,\n skipped: projectCaseCounters.skipped,\n timeout: projectCaseCounters.timeout,\n total: projectCaseCounters.seenCaseIds.size,\n },\n discoveredEvalFileCount: prepared.discoveredEvalFileCount,\n durationMs: Date.now() - prepared.startedAt,\n entryCount: prepared.entryCount,\n errorMessage: errorMessageFrom(error) ?? 'Unknown project execution error.',\n executed: false,\n matrixSummary: createProjectMatrixSummary(prepared.tasks),\n name: prepared.name,\n result: null,\n taskCount: prepared.tasks.length,\n }\n }\n}\n\nfunction filterProjectsByName(projects: readonly NormalizedCliProjectConfig[], names: readonly string[]): NormalizedCliProjectConfig[] {\n if (names.length === 0) {\n return [...projects]\n }\n\n const nameSet = new Set(names)\n return projects.filter(project => nameSet.has(project.name))\n}\n\nfunction formatDuration(durationMs: number | undefined, colors: CliColorPalette): string {\n if (durationMs == null) {\n return ''\n }\n\n const rounded = Math.round(durationMs)\n const color = rounded > 1_000 ? colors.yellow : colors.green\n return color(` ${rounded}${colors.dim('ms')}`)\n}\n\nfunction formatHybridAverage(hybridAverage: null | number | undefined): string {\n if (hybridAverage == null) {\n return 'n/a'\n }\n\n return hybridAverage.toFixed(3).replace(/\\.?0+$/, '')\n}\n\nfunction getFailedTaskId(error: unknown): null | string {\n if (error instanceof RunnerExecutionError) {\n return error.taskId\n }\n\n return null\n}\n\nfunction isSummaryReporter(reporter: CliReporter): reporter is SummaryReporter {\n return 'getWindowRows' in reporter\n}\n\n/**\n * Normalizes terminal row count into the live reporter window height.\n *\n * Before:\n * - undefined\n * - 4\n * - 40\n *\n * After:\n * - 23\n * - 6\n * - 39\n */\nfunction normalizeLiveReporterMaxRows(rows: number | undefined): number {\n const visibleRows = rows == null || !Number.isFinite(rows) || rows <= 0\n ? 24\n : Math.floor(rows)\n\n // Keep one physical terminal row free so cursor-up based redraws do not\n // scroll the previous frame out of the region that can be cleared.\n return Math.max(6, visibleRows - 1)\n}\n\nasync function prepareProject(project: NormalizedCliProjectConfig): Promise<PreparedCliProjectResult> {\n const startedAt = Date.now()\n\n try {\n const runtimeContext = await createRunnerRuntimeContext({\n cwd: project.root,\n fallbackProjectRootDirectory: project.root,\n })\n const evalFilePaths = await discoverEvalFiles({\n exclude: project.exclude,\n include: project.include,\n root: project.root,\n })\n const modules = await loadEvalModulesWithVitestRuntime(evalFilePaths, project.root)\n const entries = collectEvalEntries(modules, runtimeContext)\n const tasks = createRunnerSchedule({\n entries,\n evalMatrix: project.evalMatrix,\n inferenceExecutors: project.inferenceExecutors,\n runMatrix: project.runMatrix,\n })\n\n const hasEntryTasks = entries.some(entry => entry.task != null)\n\n const canAutoExecuteEntryTasks = hasEntryTasks && project.models.length > 0\n\n if (project.executor == null && !canAutoExecuteEntryTasks) {\n return {\n experimentMatrixRows: createExperimentMatrixRows(tasks),\n kind: 'summary',\n summary: {\n caseFailures: [],\n caseSummary: null,\n discoveredEvalFileCount: evalFilePaths.length,\n durationMs: Date.now() - startedAt,\n entryCount: entries.length,\n errorMessage: null,\n executed: false,\n matrixSummary: createProjectMatrixSummary(tasks),\n name: project.name,\n result: null,\n taskCount: tasks.length,\n },\n }\n }\n\n return {\n experimentMatrixRows: createExperimentMatrixRows(tasks),\n kind: 'prepared',\n prepared: {\n discoveredEvalFileCount: evalFilePaths.length,\n entryCount: entries.length,\n name: project.name,\n project,\n startedAt,\n tasks,\n },\n }\n }\n catch (error) {\n return {\n experimentMatrixRows: [],\n kind: 'summary',\n summary: {\n caseFailures: [],\n caseSummary: null,\n discoveredEvalFileCount: 0,\n durationMs: Date.now() - startedAt,\n entryCount: 0,\n errorMessage: errorMessageFrom(error) ?? 'Unknown project execution error.',\n executed: false,\n matrixSummary: null,\n name: project.name,\n result: null,\n taskCount: 0,\n },\n }\n }\n}\n\nfunction resolveCappedConcurrency(\n defaultConcurrency: number | undefined,\n cliConcurrency: number | undefined,\n fallback: number,\n): number {\n const effectiveDefault = defaultConcurrency ?? fallback\n if (cliConcurrency == null) {\n return effectiveDefault\n }\n\n return Math.min(effectiveDefault, cliConcurrency)\n}\n\nfunction resolveCliRuntimeConcurrency(options: RunVievalCliOptions): TaskConcurrencyConfig | undefined {\n if (options.attemptConcurrency == null && options.caseConcurrency == null) {\n return undefined\n }\n\n return {\n attempt: options.attemptConcurrency,\n case: options.caseConcurrency,\n }\n}\n\nfunction resolveExperimentId(\n options: RunVievalCliOptions,\n preparedProjects: readonly PreparedCliProjectResult[],\n): string {\n if (options.experiment != null) {\n return sanitizeIdentitySegment(options.experiment)\n }\n\n const matrixRows = new Set<string>()\n for (const project of preparedProjects) {\n project.experimentMatrixRows.forEach(row => matrixRows.add(row))\n }\n\n if (matrixRows.size === 0) {\n return 'default-experiment'\n }\n\n return sanitizeIdentitySegment(`matrix-${[...matrixRows].sort().join('--')}`)\n}\n\nfunction resolveOptionalRuntimeTaskConcurrency(\n defaultConcurrency: number | undefined,\n cliConcurrency: number | undefined,\n): number | undefined {\n return cliConcurrency ?? defaultConcurrency\n}\n\nfunction resolveProjectConcurrency(\n project: NormalizedCliProjectConfig,\n options: RunVievalCliOptions,\n): number {\n return resolveCappedConcurrency(project.concurrency?.project, options.projectConcurrency, Number.POSITIVE_INFINITY)\n}\n\nfunction resolveRuntimeTaskConcurrency(\n taskConcurrency: TaskConcurrencyConfig | undefined,\n project: NormalizedCliProjectConfig,\n options: RunVievalCliOptions,\n): TaskConcurrencyConfig | undefined {\n const attempt = resolveOptionalRuntimeTaskConcurrency(\n taskConcurrency?.attempt ?? project.concurrency?.attempt,\n options.attemptConcurrency,\n )\n const caseConcurrency = resolveOptionalRuntimeTaskConcurrency(\n taskConcurrency?.case ?? project.concurrency?.case,\n options.caseConcurrency,\n )\n\n if (attempt == null && caseConcurrency == null) {\n return undefined\n }\n\n return {\n attempt,\n case: caseConcurrency,\n }\n}\n\nfunction resolveScheduledTaskConcurrency(\n project: NormalizedCliProjectConfig,\n options: RunVievalCliOptions,\n): number {\n return Math.min(\n resolveProjectConcurrency(project, options),\n resolveTaskConcurrency(project, options),\n )\n}\n\nfunction resolveTaskConcurrency(\n project: NormalizedCliProjectConfig,\n options: RunVievalCliOptions,\n): number {\n return resolveCappedConcurrency(project.concurrency?.task, options.taskConcurrency, 1)\n}\n\nfunction resolveTaskReporterHooks(\n task: ScheduledTask,\n context: CliProjectExecutorContext,\n reporter: CliRunReporter,\n projectName: string,\n recordEvent: (event: string, payload: unknown, metadata?: CliRunRecordedEventMetadata) => void,\n projectCaseCounters: RunCliProjectCaseCounters,\n projectCaseFailures: CliProjectCaseFailure[],\n vitestCompatReporter?: null | VievalVitestCompatReporterBridge,\n): TaskReporterHooks {\n return context.reporterHooks ?? createTaskReporterHooks(task, reporter, projectName, recordEvent, projectCaseCounters, projectCaseFailures, vitestCompatReporter)\n}\n\nfunction resolveWorkspaceConcurrency(\n loadedConfig: Awaited<ReturnType<typeof loadVievalCliConfig>>,\n options: RunVievalCliOptions,\n): number {\n return resolveCappedConcurrency(loadedConfig.concurrency?.workspace, options.workspaceConcurrency, 1)\n}\n\nfunction sanitizeIdentitySegment(value: string): string {\n const normalized = value.trim()\n if (normalized.length === 0) {\n return 'default'\n }\n\n return normalized.replace(/[^\\w.-]+/g, '-')\n}\n\nfunction shouldUseColor(): boolean {\n if (process.env.NO_COLOR != null) {\n return false\n }\n\n const forceColor = process.env.FORCE_COLOR\n if (forceColor != null) {\n return forceColor !== '0'\n }\n\n return process.stdout.isTTY === true\n}\n","import process from 'node:process'\n\nimport { mkdtemp } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { join, resolve } from 'node:path'\n\nimport meow from 'meow'\n\nimport { errorMessageFrom } from '@moeru/std'\n\nimport { loadVievalComparisonConfig } from './comparison-config'\nimport { readCaseRecordsFromReport } from './report-cases'\nimport { buildCompareReportArtifact, writeCompareReportArtifact } from './report-compare'\nimport { runVievalCli } from './run'\n\nexport interface ParsedCompareCliArguments {\n comparisonId?: string\n configFilePath?: string\n cwd?: string\n format: 'json' | 'table'\n output?: string\n}\n\nconst compareHelpText = `\n Compare multiple methods on one benchmark.\n\n Usage\n $ vieval compare [--config <path>] [--comparison <id>] [--output <path>] [--format <format>]\n\n Options\n --config Config file path (default: nearest vieval.config.*)\n --comparison Comparison entry id from config.comparisons\n --output Optional output artifact path\n --format Console output format: table | json (default: table)\n`\n\nexport interface CompareMethodRunResult {\n caseRecords: Awaited<ReturnType<typeof readCaseRecordsFromReport>>\n methodId: string\n output: Awaited<ReturnType<typeof runVievalCli>>\n}\n\nexport interface CompareRunOutput {\n benchmarkId: string\n methods: CompareMethodRunResult[]\n}\n\nexport function parseCompareCliArguments(argv: readonly string[]): ParsedCompareCliArguments {\n const cli = meow(compareHelpText, {\n argv: normalizeCliArgv(argv),\n flags: {\n comparison: {\n type: 'string',\n },\n config: {\n type: 'string',\n },\n format: {\n default: 'table',\n type: 'string',\n },\n output: {\n type: 'string',\n },\n },\n importMeta: import.meta,\n })\n\n return {\n comparisonId: cli.flags.comparison,\n configFilePath: cli.flags.config,\n format: cli.flags.format === 'json' ? 'json' : 'table',\n output: cli.flags.output,\n }\n}\n\n/**\n * Runs one compare session from `vieval.config.*` comparison-mode config.\n */\nexport async function runCompareCli(argv: readonly string[]): Promise<CompareRunOutput> {\n const parsed = parseCompareCliArguments(argv)\n const loaded = await loadVievalComparisonConfig({\n comparisonId: parsed.comparisonId,\n configFilePath: parsed.configFilePath,\n cwd: parsed.cwd,\n })\n const methodResults: CompareMethodRunResult[] = []\n const reportRoot = await mkdtemp(join(tmpdir(), 'vieval-compare-'))\n\n for (const method of loaded.config.methods) {\n const methodWorkspace = resolve(method.workspace)\n const methodReportOut = join(reportRoot, method.id)\n const output = await runVievalCli({\n cacheProjectName: loaded.config.benchmark.sharedCaseNamespace,\n configFilePath: method.configFilePath ?? resolve(methodWorkspace, 'vieval.config.ts'),\n cwd: methodWorkspace,\n project: [method.project],\n reportOut: methodReportOut,\n workspace: loaded.config.benchmark.id,\n })\n\n const failedProject = output.projects.find(project => project.errorMessage != null)\n if (failedProject != null) {\n throw new Error(`Comparison method \"${method.id}\" failed: ${failedProject.errorMessage}`)\n }\n\n methodResults.push({\n caseRecords: await readCaseRecordsFromReport(methodReportOut),\n methodId: method.id,\n output,\n })\n }\n\n const runOutput: CompareRunOutput = {\n benchmarkId: loaded.config.benchmark.id,\n methods: methodResults,\n }\n\n const artifact = buildCompareReportArtifact({\n benchmarkId: runOutput.benchmarkId,\n methods: runOutput.methods,\n reportPath: loaded.configFilePath,\n })\n if (parsed.output != null) {\n await writeCompareReportArtifact({\n artifact,\n outputPath: parsed.output,\n })\n }\n\n if (parsed.format === 'json') {\n process.stdout.write(`${JSON.stringify(artifact, null, 2)}\\n`)\n }\n else {\n process.stdout.write([\n 'COMPARE vieval',\n `Benchmark ${artifact.benchmarkId}`,\n ...artifact.methods.map((method, index) => {\n const hybrid = method.hybridAverage == null ? 'n/a' : method.hybridAverage.toFixed(3)\n const exact = method.exactAverage == null ? 'n/a' : method.exactAverage.toFixed(3)\n return `${index + 1}. ${method.methodId} hybrid=${hybrid} exact=${exact} runs=${method.runCount}`\n }),\n ].join('\\n').concat('\\n'))\n }\n\n return runOutput\n}\n\nexport async function runCompareCliOrExit(argv: readonly string[]): Promise<void> {\n try {\n await runCompareCli(argv)\n }\n catch (error) {\n const errorMessage = errorMessageFrom(error) ?? 'Unknown compare command failure.'\n process.stderr.write(`[vieval compare] ${errorMessage}\\n`)\n process.exitCode = 1\n }\n}\n\nfunction normalizeCliArgv(argv: readonly string[]): string[] {\n const normalizedArgv = argv[0] === '--'\n ? argv.slice(1)\n : [...argv]\n\n if (normalizedArgv[0] === 'compare') {\n return normalizedArgv.slice(1)\n }\n\n return normalizedArgv\n}\n","","import process from 'node:process'\n\nimport meow from 'meow'\n\nimport { errorMessageFrom } from '@moeru/std'\n\nimport packageJSON from '../../package.json'\n\nimport { formatVievalCliRunOutput, hasRunFailures, runVievalCli } from './run'\n\ninterface ParsedCliArguments {\n attempt?: string\n attemptConcurrency?: number\n caseConcurrency?: number\n configFilePath?: string\n experiment?: string\n json: boolean\n project: string[]\n projectConcurrency?: number\n reportOut?: string\n taskConcurrency?: number\n workspace?: string\n workspaceConcurrency?: number\n}\n\nconst evalRunHelpText = `\n Execute vieval projects from discovered or explicit config.\n\n Usage\n $ vieval run [--config <path>] [--project <name>] [--json] [--report-out <path>]\n\n Options\n --config Config file path\n --project Project name to execute; may be repeated\n --workspace Workspace id used in report artifacts\n --experiment Experiment id used in report artifacts\n --attempt Attempt id used in report artifacts\n --workspace-concurrency Workspace scheduling cap\n --project-concurrency Project scheduling cap\n --task-concurrency Task scheduling cap\n --attempt-concurrency Attempt scheduling cap\n --case-concurrency Case scheduling cap\n --report-out Report output root directory\n --json Print machine-readable JSON output\n`\n\n/**\n * Parses `vieval run` CLI arguments into one normalized execution payload.\n *\n * Use when:\n * - the top-level CLI forwards `run` subcommand arguments\n * - tests need stable flag normalization without executing the runner\n *\n * Expects:\n * - argv in either direct `run` form or forwarded `-- ...` form\n *\n * Returns:\n * - normalized run options ready for {@link runVievalCli}\n */\nexport function parseCliArguments(argv: readonly string[]): ParsedCliArguments {\n const cli = meow(evalRunHelpText, {\n argv: normalizeCliArgv(argv),\n flags: {\n attempt: {\n type: 'string',\n },\n attemptConcurrency: {\n type: 'number',\n },\n caseConcurrency: {\n type: 'number',\n },\n config: {\n type: 'string',\n },\n experiment: {\n type: 'string',\n },\n json: {\n default: false,\n type: 'boolean',\n },\n project: {\n isMultiple: true,\n type: 'string',\n },\n projectConcurrency: {\n type: 'number',\n },\n reportOut: {\n type: 'string',\n },\n taskConcurrency: {\n type: 'number',\n },\n workspace: {\n type: 'string',\n },\n workspaceConcurrency: {\n type: 'number',\n },\n },\n importMeta: import.meta,\n })\n\n return {\n attempt: cli.flags.attempt,\n attemptConcurrency: cli.flags.attemptConcurrency,\n caseConcurrency: cli.flags.caseConcurrency,\n configFilePath: cli.flags.config,\n experiment: cli.flags.experiment,\n json: cli.flags.json === true,\n project: normalizeProjectNames(cli.flags.project),\n projectConcurrency: cli.flags.projectConcurrency,\n reportOut: cli.flags.reportOut,\n taskConcurrency: cli.flags.taskConcurrency,\n workspace: cli.flags.workspace,\n workspaceConcurrency: cli.flags.workspaceConcurrency,\n }\n}\n\n/**\n * Executes the `vieval run` subcommand.\n *\n * Call stack:\n *\n * top-level `vieval` CLI\n * -> {@link runTopLevelCli} (`./index`)\n * -> {@link runEvalRunCli}\n * -> {@link parseCliArguments}\n * -> {@link runVievalCli}\n * -> `process.stdout.write(...)` / `process.stderr.write(...)`\n * -> `process.exitCode`\n *\n * Use when:\n * - the published `vieval` binary needs to execute the `run` subcommand\n * - callers want one reusable implementation without a second bundled entrypoint\n *\n * Expects:\n * - argv that belongs to the `run` subcommand only\n *\n * Returns:\n * - resolves after writing CLI output and updating `process.exitCode`\n *\n * NOTICE:\n * - `src/cli/index.ts` is the only direct-execution entrypoint for the bundled\n * CLI artifact. Keeping `eval-run.ts` reusable avoids duplicate top-level\n * await guards once tsdown inlines both modules into `dist/cli/index.mjs`.\n */\nexport async function runEvalRunCli(argv: readonly string[]): Promise<void> {\n const parsed = parseCliArguments(argv)\n\n try {\n const output = await runVievalCli({\n attempt: parsed.attempt,\n attemptConcurrency: parsed.attemptConcurrency,\n caseConcurrency: parsed.caseConcurrency,\n configFilePath: parsed.configFilePath,\n experiment: parsed.experiment,\n project: parsed.project,\n projectConcurrency: parsed.projectConcurrency,\n reportOut: parsed.reportOut,\n taskConcurrency: parsed.taskConcurrency,\n workspace: parsed.workspace,\n workspaceConcurrency: parsed.workspaceConcurrency,\n })\n\n if (parsed.json) {\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`)\n if (hasRunFailures(output)) {\n process.exitCode = 1\n }\n return\n }\n\n process.stdout.write(`${formatVievalCliRunOutput(output)}\\n`)\n if (hasRunFailures(output)) {\n process.exitCode = 1\n }\n }\n catch (error) {\n const errorMessage = errorMessageFrom(error) ?? 'Unknown CLI failure.'\n process.stderr.write(`[${packageJSON.name}] ${errorMessage}\\n`)\n process.exitCode = 1\n }\n}\n\nfunction normalizeCliArgv(argv: readonly string[]): string[] {\n const normalizedArgv = argv[0] === '--'\n ? argv.slice(1)\n : [...argv]\n\n return normalizedArgv[0] === 'run'\n ? normalizedArgv.slice(1)\n : normalizedArgv\n}\n\nfunction normalizeProjectNames(projectNames: string | string[] | undefined): string[] {\n if (typeof projectNames === 'string') {\n return [projectNames]\n }\n\n return projectNames ?? []\n}\n","#!/usr/bin/env node\n\nimport type { ReportRunArtifact } from './report-artifacts'\n\nimport process from 'node:process'\n\nimport meow from 'meow'\n\nimport { errorMessageFrom } from '@moeru/std'\n\nimport { readReportArtifacts, summarizeReportRunArtifact } from './report-artifacts'\n\nexport interface ParsedReportAnalyzeCliArguments {\n attempt?: string\n caseState?: 'failed' | 'passed' | 'skipped'\n contains?: string\n errorContains?: string\n evalMatrix?: Record<string, string>\n experiment?: string\n format: 'csv' | 'json' | 'jsonl' | 'table'\n project?: string\n reportPath: string\n run?: string\n runMatrix?: Record<string, string>\n taskState?: 'failed' | 'passed' | 'skipped'\n workspace?: string\n}\n\nconst reportAnalyzeHelpText = `\n Analyze generated vieval report artifacts.\n\n Usage\n $ vieval report analyze <reportPath> [options]\n\n Options\n --format Output format: table | json | jsonl | csv (default: table)\n --workspace Workspace id filter\n --project Project name filter (exact)\n --experiment Experiment id filter\n --attempt Attempt id filter\n --run Run id filter\n --task-state Keep runs containing at least one task in this state\n --case-state Keep runs containing at least one case in this state\n --contains Keep runs containing this text in event name or payload\n --error-contains Keep runs containing this text in project errors or event payload\n --run-matrix Keep runs matching run-matrix selector \"key=value[,key=value]\"\n --eval-matrix Keep runs matching eval-matrix selector \"key=value[,key=value]\"\n`\n\nexport interface ReportAnalyzeAttemptSummary {\n attemptId: string\n failedProjects: number\n runCount: number\n runIds: string[]\n successRate: number\n totalEvents: number\n totalTasks: number\n}\n\nexport interface ReportAnalyzeExperimentSummary {\n attemptCount: number\n attemptSuccessRateStats: {\n avg: number\n max: number\n min: number\n stdev: number\n }\n attemptSummaries: ReportAnalyzeAttemptSummary[]\n casePassRate?: number\n experimentId: string\n failedProjects: number\n runCount: number\n successRate: number\n taskPassRate?: number\n totalEvents: number\n totalTasks: number\n workspaceId: string\n}\n\ninterface ReportAnalyzeOutput {\n experimentSummaries: ReportAnalyzeExperimentSummary[]\n filteredRunCount: number\n runs: ReturnType<typeof summarizeReportRunArtifact>[]\n totalRunCount: number\n}\n\n/**\n * Builds experiment-level rollups from filtered run rows.\n *\n * Use when:\n * - CLI consumers need stability and reliability summaries above per-run data\n *\n * Returns:\n * - one summary row per `workspaceId + experimentId` group\n */\nexport function buildExperimentSummaries(\n rows: readonly ReturnType<typeof summarizeReportRunArtifact>[],\n): ReportAnalyzeExperimentSummary[] {\n const grouped = new Map<string, ReturnType<typeof summarizeReportRunArtifact>[]>()\n\n for (const row of rows) {\n const groupKey = createExperimentGroupKey(row)\n const existing = grouped.get(groupKey)\n if (existing == null) {\n grouped.set(groupKey, [row])\n continue\n }\n\n existing.push(row)\n }\n\n return [...grouped.entries()]\n .map(([groupKey, groupRows]) => {\n const [workspaceId, experimentId] = groupKey.split('::')\n const failedProjects = groupRows.reduce((sum, row) => sum + row.failedProjects, 0)\n const totalTasks = groupRows.reduce((sum, row) => sum + row.totalTasks, 0)\n const totalEvents = groupRows.reduce((sum, row) => sum + row.eventsCount, 0)\n const successfulRunCount = groupRows.filter(row => row.failedProjects === 0).length\n const successRate = groupRows.length === 0 ? 0 : successfulRunCount / groupRows.length\n\n const attemptToRuns = new Map<string, ReturnType<typeof summarizeReportRunArtifact>[]>()\n for (const row of groupRows) {\n const attemptId = row.attemptId ?? 'unknown-attempt'\n const attemptRows = attemptToRuns.get(attemptId)\n if (attemptRows == null) {\n attemptToRuns.set(attemptId, [row])\n continue\n }\n\n attemptRows.push(row)\n }\n\n const attemptSummaries = [...attemptToRuns.entries()]\n .map(([attemptId, attemptRows]) => {\n const successCount = attemptRows.filter(row => row.failedProjects === 0).length\n const runCount = attemptRows.length\n const failedProjectCount = attemptRows.reduce((sum, row) => sum + row.failedProjects, 0)\n const totalTaskCount = attemptRows.reduce((sum, row) => sum + row.totalTasks, 0)\n const totalEventCount = attemptRows.reduce((sum, row) => sum + row.eventsCount, 0)\n\n return {\n attemptId,\n failedProjects: failedProjectCount,\n runCount,\n runIds: attemptRows\n .map(row => row.runId)\n .filter((runId): runId is string => runId != null)\n .sort((left, right) => left.localeCompare(right)),\n successRate: roundMetric(runCount === 0 ? 0 : successCount / runCount),\n totalEvents: totalEventCount,\n totalTasks: totalTaskCount,\n }\n })\n .sort((left, right) => left.attemptId.localeCompare(right.attemptId))\n\n const attemptSuccessRates = attemptSummaries.map(summary => summary.successRate)\n const minAttemptSuccessRate = attemptSuccessRates.length === 0\n ? 0\n : Math.min(...attemptSuccessRates)\n const maxAttemptSuccessRate = attemptSuccessRates.length === 0\n ? 0\n : Math.max(...attemptSuccessRates)\n const avgAttemptSuccessRate = computeAverage(attemptSuccessRates)\n const stdevAttemptSuccessRate = computeStandardDeviation(attemptSuccessRates)\n\n return {\n attemptCount: attemptToRuns.size,\n attemptSuccessRateStats: {\n avg: roundMetric(avgAttemptSuccessRate),\n max: roundMetric(maxAttemptSuccessRate),\n min: roundMetric(minAttemptSuccessRate),\n stdev: roundMetric(stdevAttemptSuccessRate),\n },\n attemptSummaries,\n experimentId,\n failedProjects,\n runCount: groupRows.length,\n successRate: roundMetric(successRate),\n totalEvents,\n totalTasks,\n workspaceId,\n }\n })\n .sort((left, right) => {\n const workspaceCompare = left.workspaceId.localeCompare(right.workspaceId)\n if (workspaceCompare !== 0) {\n return workspaceCompare\n }\n\n return left.experimentId.localeCompare(right.experimentId)\n })\n}\n\nexport function parseReportAnalyzeCliArguments(argv: readonly string[]): ParsedReportAnalyzeCliArguments {\n const cli = meow(reportAnalyzeHelpText, {\n argv: normalizeCliArgv(argv),\n flags: {\n attempt: {\n type: 'string',\n },\n caseState: {\n type: 'string',\n },\n contains: {\n type: 'string',\n },\n errorContains: {\n type: 'string',\n },\n evalMatrix: {\n type: 'string',\n },\n experiment: {\n type: 'string',\n },\n format: {\n default: 'table',\n type: 'string',\n },\n project: {\n type: 'string',\n },\n run: {\n type: 'string',\n },\n runMatrix: {\n type: 'string',\n },\n taskState: {\n type: 'string',\n },\n workspace: {\n type: 'string',\n },\n },\n importMeta: import.meta,\n })\n\n const reportPath = cli.input[0]\n\n if (reportPath == null || reportPath.length === 0) {\n throw new Error('Missing required <reportPath> argument.')\n }\n\n const normalizedFormat = cli.flags.format.toLowerCase()\n const format = normalizedFormat === 'json'\n ? 'json'\n : normalizedFormat === 'jsonl'\n ? 'jsonl'\n : normalizedFormat === 'csv'\n ? 'csv'\n : 'table'\n\n return {\n attempt: cli.flags.attempt,\n caseState: normalizeStateFilter(cli.flags.caseState),\n contains: cli.flags.contains,\n errorContains: cli.flags.errorContains,\n evalMatrix: parseMatrixSelector(cli.flags.evalMatrix),\n experiment: cli.flags.experiment,\n format,\n project: cli.flags.project,\n reportPath,\n run: cli.flags.run,\n runMatrix: parseMatrixSelector(cli.flags.runMatrix),\n taskState: normalizeStateFilter(cli.flags.taskState),\n workspace: cli.flags.workspace,\n }\n}\n\nexport async function runReportAnalyzeCli(argv: readonly string[]): Promise<void> {\n try {\n const parsed = parseReportAnalyzeCliArguments(argv)\n const output = await readReportAnalyzeOutput(parsed)\n\n if (parsed.format === 'json') {\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`)\n return\n }\n\n if (parsed.format === 'jsonl') {\n const jsonl = output.runs.map(run => JSON.stringify(run)).join('\\n')\n process.stdout.write(`${jsonl}${jsonl.length > 0 ? '\\n' : ''}`)\n return\n }\n\n if (parsed.format === 'csv') {\n process.stdout.write(`${formatCsvOutput(output)}\\n`)\n return\n }\n\n process.stdout.write(`${formatTableOutput(output)}\\n`)\n }\n catch (error) {\n const errorMessage = errorMessageFrom(error) ?? 'Unknown report analyze failure.'\n process.stderr.write(`[vieval report analyze] ${errorMessage}\\n`)\n process.exitCode = 1\n }\n}\n\nfunction computeAverage(values: readonly number[]): number {\n if (values.length === 0) {\n return 0\n }\n\n return values.reduce((sum, value) => sum + value, 0) / values.length\n}\n\nfunction computeStandardDeviation(values: readonly number[]): number {\n if (values.length === 0) {\n return 0\n }\n\n const average = computeAverage(values)\n const variance = computeAverage(values.map(value => (value - average) ** 2))\n return Math.sqrt(variance)\n}\n\nfunction createExperimentGroupKey(row: ReturnType<typeof summarizeReportRunArtifact>): string {\n const workspaceId = row.workspaceId ?? 'unknown-workspace'\n const experimentId = row.experimentId ?? 'unknown-experiment'\n return `${workspaceId}::${experimentId}`\n}\n\nfunction filterAnalyzeRows(\n rows: readonly ReturnType<typeof summarizeReportRunArtifact>[],\n parsed: ParsedReportAnalyzeCliArguments,\n): ReturnType<typeof summarizeReportRunArtifact>[] {\n return rows.filter((row) => {\n if (parsed.workspace != null && row.workspaceId !== parsed.workspace) {\n return false\n }\n\n if (parsed.experiment != null && row.experimentId !== parsed.experiment) {\n return false\n }\n\n if (parsed.attempt != null && row.attemptId !== parsed.attempt) {\n return false\n }\n\n if (parsed.run != null && row.runId !== parsed.run) {\n return false\n }\n\n if (parsed.project != null && !row.projectNames.includes(parsed.project)) {\n return false\n }\n\n return true\n })\n}\n\nfunction formatCsvOutput(output: ReportAnalyzeOutput): string {\n const header = [\n 'runId',\n 'workspaceId',\n 'experimentId',\n 'attemptId',\n 'totalProjects',\n 'executedProjects',\n 'failedProjects',\n 'totalTasks',\n 'eventsCount',\n 'reportDirectory',\n 'projectNames',\n ].join(',')\n const rows = output.runs.map((row) => {\n const escapedProjectNames = `\"${row.projectNames.join('|').replaceAll('\"', '\"\"')}\"`\n const escapedDirectory = `\"${row.reportDirectory.replaceAll('\"', '\"\"')}\"`\n\n return [\n row.runId ?? '',\n row.workspaceId ?? '',\n row.experimentId ?? '',\n row.attemptId ?? '',\n row.totalProjects.toString(),\n row.executedProjects.toString(),\n row.failedProjects.toString(),\n row.totalTasks.toString(),\n row.eventsCount.toString(),\n escapedDirectory,\n escapedProjectNames,\n ].join(',')\n })\n\n return [header, ...rows].join('\\n')\n}\n\nfunction formatTableOutput(output: ReportAnalyzeOutput): string {\n const header = 'Run ID | Workspace | Experiment | Attempt | Projects(executed/total) | FailedProjects | Tasks | Events'\n const lines = output.runs.map((row) => {\n const runId = row.runId ?? 'n/a'\n const workspaceId = row.workspaceId ?? 'n/a'\n const experimentId = row.experimentId ?? 'n/a'\n const attemptId = row.attemptId ?? 'n/a'\n const projects = `${row.executedProjects}/${row.totalProjects}`\n return `${runId} | ${workspaceId} | ${experimentId} | ${attemptId} | ${projects} | ${row.failedProjects} | ${row.totalTasks} | ${row.eventsCount}`\n })\n\n const metadata = `ANALYZE vieval report: ${output.filteredRunCount}/${output.totalRunCount} runs (${output.experimentSummaries.length} experiment groups)`\n return [metadata, header, ...lines].join('\\n')\n}\n\nfunction hasCaseState(artifact: ReportRunArtifact, targetState: 'failed' | 'passed' | 'skipped'): boolean {\n return artifact.events.some((event) => {\n if (event.event !== 'CaseEnded') {\n return false\n }\n\n const state = (event.data as undefined | { state?: unknown })?.state\n return state === targetState\n })\n}\n\nfunction hasEvalMatrixMatch(artifact: ReportRunArtifact, selector: Record<string, string>): boolean {\n return artifact.summary.projects.some(project => project.result?.runs.some(run => matchesMatrixSelector(run.matrix.eval, selector)) === true)\n}\n\nfunction hasRunMatrixMatch(artifact: ReportRunArtifact, selector: Record<string, string>): boolean {\n return artifact.summary.projects.some(project => project.result?.runs.some(run => matchesMatrixSelector(run.matrix.run, selector)) === true)\n}\n\nfunction hasTaskState(artifact: ReportRunArtifact, targetState: 'failed' | 'passed' | 'skipped'): boolean {\n return artifact.events.some((event) => {\n if (event.event !== 'TaskEnded') {\n return false\n }\n\n const state = (event.data as undefined | { state?: unknown })?.state\n return state === targetState\n })\n}\n\nfunction includesNeedle(value: unknown, needle: string): boolean {\n const normalizedNeedle = needle.trim().toLowerCase()\n if (normalizedNeedle.length === 0) {\n return true\n }\n\n return JSON.stringify(value).toLowerCase().includes(normalizedNeedle)\n}\n\nfunction matchesMatrixSelector(matrix: Record<string, unknown>, selector: Record<string, string>): boolean {\n return Object.entries(selector).every(([key, expectedValue]) => String(matrix[key]) === expectedValue)\n}\n\nfunction matchesOutcomeFilters(artifact: ReportRunArtifact, parsed: ParsedReportAnalyzeCliArguments): boolean {\n if (parsed.runMatrix != null && !hasRunMatrixMatch(artifact, parsed.runMatrix)) {\n return false\n }\n\n if (parsed.evalMatrix != null && !hasEvalMatrixMatch(artifact, parsed.evalMatrix)) {\n return false\n }\n\n if (parsed.taskState != null && !hasTaskState(artifact, parsed.taskState)) {\n return false\n }\n\n if (parsed.caseState != null && !hasCaseState(artifact, parsed.caseState)) {\n return false\n }\n\n if (parsed.contains != null) {\n const matched = artifact.events.some(event => includesNeedle({ data: event.data, event: event.event }, parsed.contains!))\n if (!matched) {\n return false\n }\n }\n\n if (parsed.errorContains != null) {\n const projectErrors = artifact.summary.projects\n .map(project => project.errorMessage)\n .filter((errorMessage): errorMessage is string => errorMessage != null)\n const matchedError = projectErrors.some(errorMessage => includesNeedle(errorMessage, parsed.errorContains!))\n || artifact.events.some(event => includesNeedle(event.data, parsed.errorContains!))\n\n if (!matchedError) {\n return false\n }\n }\n\n return true\n}\n\nfunction normalizeCliArgv(argv: readonly string[]): string[] {\n const normalizedArgv = argv[0] === '--'\n ? argv.slice(1)\n : [...argv]\n\n if (normalizedArgv[0] === 'report' && normalizedArgv[1] === 'analyze') {\n return normalizedArgv.slice(2)\n }\n\n if (normalizedArgv[0] === 'analyze') {\n return normalizedArgv.slice(1)\n }\n\n return normalizedArgv\n}\n\nfunction normalizeStateFilter(value: string | undefined): 'failed' | 'passed' | 'skipped' | undefined {\n if (value == null) {\n return undefined\n }\n\n const normalized = value.trim().toLowerCase()\n if (normalized === 'passed' || normalized === 'failed' || normalized === 'skipped') {\n return normalized\n }\n\n throw new Error(`Unsupported state filter \"${value}\". Expected \"passed\", \"failed\", or \"skipped\".`)\n}\n\nfunction parseMatrixSelector(value: string | undefined): Record<string, string> | undefined {\n if (value == null) {\n return undefined\n }\n\n const selector: Record<string, string> = {}\n const segments = value.split(',').map(segment => segment.trim()).filter(segment => segment.length > 0)\n\n for (const segment of segments) {\n const separatorIndex = segment.indexOf('=')\n if (separatorIndex <= 0 || separatorIndex === segment.length - 1) {\n throw new Error(`Invalid matrix selector segment \"${segment}\". Expected \"key=value\".`)\n }\n\n const key = segment.slice(0, separatorIndex).trim()\n const parsedValue = segment.slice(separatorIndex + 1).trim()\n if (key.length === 0 || parsedValue.length === 0) {\n throw new Error(`Invalid matrix selector segment \"${segment}\". Expected \"key=value\".`)\n }\n\n selector[key] = parsedValue\n }\n\n return selector\n}\n\nasync function readReportAnalyzeOutput(parsed: ParsedReportAnalyzeCliArguments): Promise<ReportAnalyzeOutput> {\n const artifacts = await readReportArtifacts(parsed.reportPath)\n const rows = artifacts.map(artifact => summarizeReportRunArtifact(artifact))\n const identityFilteredRows = filterAnalyzeRows(rows, parsed)\n const rowByDirectory = new Map(identityFilteredRows.map(row => [row.reportDirectory, row]))\n\n const filteredRows = artifacts\n .filter(artifact => rowByDirectory.has(artifact.reportDirectory))\n .filter(artifact => matchesOutcomeFilters(artifact, parsed))\n .map(artifact => rowByDirectory.get(artifact.reportDirectory))\n .filter((row): row is ReturnType<typeof summarizeReportRunArtifact> => row != null)\n\n return {\n experimentSummaries: buildExperimentSummaries(filteredRows),\n filteredRunCount: filteredRows.length,\n runs: filteredRows,\n totalRunCount: rows.length,\n }\n}\n\nfunction roundMetric(value: number): number {\n return Number(value.toFixed(6))\n}\n","#!/usr/bin/env node\n\nimport type { CaseMetricValue, CaseRecord } from './report-records'\n\nimport process from 'node:process'\n\nimport meow from 'meow'\n\nimport { errorMessageFrom } from '@moeru/std'\n\nimport { readCaseRecordsFromReport } from './report-cases'\nimport { getCaseSelectorValue, stableStringify } from './report-selectors'\n\nexport interface BuildCaseComparisonArgs extends CaseComparisonOptions {\n /** Left/base run case records. */\n left: readonly CaseRecord[]\n /** Right/candidate run case records. */\n right: readonly CaseRecord[]\n}\n\nexport interface CaseComparisonOptions {\n /** Optional key used to match cases. Defaults to `benchmark.case.id`, then `caseId`. */\n caseKey?: string\n /** Optional key used to group matched case deltas. */\n groupBy?: string\n /** Score kind used for averages and deltas. */\n scoreKind?: string\n}\n\n/** Full case comparison output for local report artifacts. */\nexport interface CaseComparisonOutput {\n /** Cases present only in the right/candidate report. */\n added: CaseRecord[]\n /** Matched case diffs. */\n cases: CaseComparisonRow[]\n /** Group summaries keyed by `<groupKey>=<groupValue>`, when requested. */\n groups?: Record<string, CaseComparisonSummary & { count: number }>\n /** Aggregate score delta over all records with the selected score. */\n overall: CaseComparisonSummary\n /** Cases present only in the left/base report. */\n removed: CaseRecord[]\n /** Matched cases sorted from largest improvement to largest regression. */\n topImprovements: CaseComparisonRow[]\n /** Matched cases sorted from largest regression to largest improvement. */\n topRegressions: CaseComparisonRow[]\n}\n\n/** One matched case diff between two report runs. */\nexport interface CaseComparisonRow {\n /** Stable comparison key used to match the case. */\n caseKey: string\n /** Direct left and right scores plus right-minus-left delta. */\n delta: {\n left: number\n right: number\n score: number\n }\n /** Left/base case record. */\n left: CaseRecord\n /** Metric values that differ between the two matched records. */\n metricsChanged: Record<string, { left: CaseMetricValue | undefined, right: CaseMetricValue | undefined }>\n /** Right/candidate case record. */\n right: CaseRecord\n}\n\n/** Score summary for all compared cases or one group of compared cases. */\nexport interface CaseComparisonSummary {\n /** Difference between right and left average. */\n delta: number\n /** Average score in the left/base records. */\n leftAverage: number\n /** Average score in the right/candidate records. */\n rightAverage: number\n}\n\ninterface ParsedReportCompareCliArguments extends CaseComparisonOptions {\n format: 'json' | 'table'\n leftReportPath: string\n rightReportPath: string\n}\n\nconst reportCompareHelpText = `\n Compare normalized case records from two generated vieval reports.\n\n Usage\n $ vieval report compare <leftReportPath> <rightReportPath> [options]\n\n Options\n --format Output format: table | json (default: table)\n --case-key Case field, score name, or metric name used to match records\n --score-kind Score kind used for deltas (default: exact)\n --group-by Case field, score name, or metric name used for grouped deltas\n`\n\n/**\n * Builds a generic case-level comparison between two report runs.\n *\n * Use when:\n * - local report analysis needs per-case improvements/regressions\n * - benchmark-specific facets should stay as generic metric keys\n *\n * Expects:\n * - left and right records are normalized `cases.jsonl` rows\n * - score values are numeric and comparable by `scoreKind`\n *\n * Returns:\n * - matched case deltas, added/removed cases, top changes, and optional group summaries\n */\nexport function buildCaseComparison(args: BuildCaseComparisonArgs): CaseComparisonOutput {\n const scoreKind = args.scoreKind ?? 'exact'\n const leftByKey = indexRecordsByCaseKey(args.left, args.caseKey, 'left')\n const rightByKey = indexRecordsByCaseKey(args.right, args.caseKey, 'right')\n const cases: CaseComparisonRow[] = []\n const added: CaseRecord[] = []\n const removed: CaseRecord[] = []\n\n for (const [caseKey, leftRecord] of leftByKey) {\n const rightRecord = rightByKey.get(caseKey)\n if (rightRecord == null) {\n removed.push(leftRecord)\n continue\n }\n\n const leftScore = getScore(leftRecord, scoreKind)\n const rightScore = getScore(rightRecord, scoreKind)\n cases.push({\n caseKey,\n delta: {\n left: leftScore,\n right: rightScore,\n score: rightScore - leftScore,\n },\n left: leftRecord,\n metricsChanged: diffMetrics(leftRecord.metrics, rightRecord.metrics),\n right: rightRecord,\n })\n }\n\n for (const [caseKey, rightRecord] of rightByKey) {\n if (!leftByKey.has(caseKey)) {\n added.push(rightRecord)\n }\n }\n\n const sortedCases = [...cases].sort((left, right) => {\n const deltaOrder = right.delta.score - left.delta.score\n return deltaOrder === 0\n ? left.caseKey.localeCompare(right.caseKey)\n : deltaOrder\n })\n\n return {\n added: added.sort(compareCaseRecords),\n cases: cases.sort((left, right) => left.caseKey.localeCompare(right.caseKey)),\n groups: args.groupBy == null ? undefined : buildComparisonGroups(cases, args.groupBy),\n overall: {\n delta: averageScore(args.right, scoreKind) - averageScore(args.left, scoreKind),\n leftAverage: averageScore(args.left, scoreKind),\n rightAverage: averageScore(args.right, scoreKind),\n },\n removed: removed.sort(compareCaseRecords),\n topImprovements: sortedCases.filter(row => row.delta.score > 0).slice(0, 10),\n topRegressions: [...sortedCases].reverse().filter(row => row.delta.score < 0).slice(0, 10),\n }\n}\n\n/**\n * Formats a case comparison as a compact human-readable table.\n *\n * Use when:\n * - `vieval report compare` should expose the same information as JSON output\n * - users need a terminal-first overview of group and per-case deltas\n *\n * Expects:\n * - comparison output was produced by {@link buildCaseComparison}\n *\n * Returns:\n * - multi-line text containing aggregate, group, top-change, case, and unmatched summaries\n */\nexport function formatCaseComparisonTable(output: CaseComparisonOutput): string {\n const lines = [\n 'COMPARE vieval report cases',\n `Matched ${output.cases.length}`,\n `Added ${output.added.length}`,\n `Removed ${output.removed.length}`,\n `Scores left=${output.overall.leftAverage.toFixed(3)} right=${output.overall.rightAverage.toFixed(3)} delta=${output.overall.delta.toFixed(3)}`,\n ]\n\n if (output.groups != null && Object.keys(output.groups).length > 0) {\n lines.push('Groups')\n for (const [groupKey, group] of Object.entries(output.groups)) {\n lines.push(`${groupKey} count=${group.count} left=${group.leftAverage.toFixed(3)} right=${group.rightAverage.toFixed(3)} delta=${group.delta.toFixed(3)}`)\n }\n }\n\n if (output.topImprovements.length > 0) {\n lines.push('Top improvements')\n for (const row of output.topImprovements) {\n lines.push(`${row.caseKey} delta=${row.delta.score.toFixed(3)} left=${row.delta.left.toFixed(3)} right=${row.delta.right.toFixed(3)}`)\n }\n }\n\n if (output.topRegressions.length > 0) {\n lines.push('Top regressions')\n for (const row of output.topRegressions) {\n lines.push(`${row.caseKey} delta=${row.delta.score.toFixed(3)} left=${row.delta.left.toFixed(3)} right=${row.delta.right.toFixed(3)}`)\n }\n }\n\n if (output.cases.length > 0) {\n lines.push('Cases')\n for (const row of output.cases) {\n const changedMetricNames = Object.keys(row.metricsChanged)\n lines.push(`${row.caseKey} delta=${row.delta.score.toFixed(3)} changedMetrics=${changedMetricNames.length === 0 ? 'none' : changedMetricNames.join(',')}`)\n }\n }\n\n if (output.added.length > 0) {\n lines.push(`Added cases ${output.added.map(record => record.caseId).join(',')}`)\n }\n\n if (output.removed.length > 0) {\n lines.push(`Removed cases ${output.removed.map(record => record.caseId).join(',')}`)\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Runs the `vieval report compare` command.\n *\n * Call stack:\n *\n * published executable (`../bin/vieval`)\n * -> {@link import('./index').runTopLevelCli}\n * -> {@link runReportCompareCli}\n * -> {@link readCaseRecordsFromReport}\n * -> {@link buildCaseComparison}\n *\n * Use when:\n * - two local report artifact directories should be compared case-by-case\n *\n * Expects:\n * - argv is either `compare <left> <right> ...` or `<left> <right> ...`\n *\n * Returns:\n * - resolves after writing the requested output to stdout\n */\nexport async function runReportCompareCli(argv: readonly string[]): Promise<void> {\n try {\n const parsed = parseReportCompareCliArguments(argv)\n const [left, right] = await Promise.all([\n readCaseRecordsFromReport(parsed.leftReportPath),\n readCaseRecordsFromReport(parsed.rightReportPath),\n ])\n const output = buildCaseComparison({\n caseKey: parsed.caseKey,\n groupBy: parsed.groupBy,\n left,\n right,\n scoreKind: parsed.scoreKind,\n })\n\n if (parsed.format === 'json') {\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`)\n return\n }\n\n process.stdout.write(`${formatCaseComparisonTable(output)}\\n`)\n }\n catch (error) {\n const errorMessage = errorMessageFrom(error) ?? 'Unknown report compare failure.'\n process.stderr.write(`[vieval report compare] ${errorMessage}\\n`)\n process.exitCode = 1\n }\n}\n\nfunction averageScore(records: readonly CaseRecord[], scoreKind: string): number {\n const values = records\n .map(record => record.scores[scoreKind])\n .filter((value): value is number => typeof value === 'number')\n\n if (values.length === 0) {\n return 0\n }\n\n return values.reduce((sum, value) => sum + value, 0) / values.length\n}\n\nfunction buildComparisonGroups(\n cases: readonly CaseComparisonRow[],\n groupBy: string,\n): Record<string, CaseComparisonSummary & { count: number }> {\n const groupedRows: Record<string, CaseComparisonRow[]> = {}\n\n for (const row of cases) {\n const resolved = getCaseSelectorValue(row.right, groupBy)\n if (!resolved.exists) {\n continue\n }\n\n const groupKey = `${groupBy}=${String(resolved.value)}`\n groupedRows[groupKey] ??= []\n groupedRows[groupKey].push(row)\n }\n\n return Object.fromEntries(\n Object.entries(groupedRows)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([groupKey, rows]) => {\n const leftAverage = rows.reduce((sum, row) => sum + row.delta.left, 0) / rows.length\n const rightAverage = rows.reduce((sum, row) => sum + row.delta.right, 0) / rows.length\n\n return [groupKey, {\n count: rows.length,\n delta: rightAverage - leftAverage,\n leftAverage,\n rightAverage,\n }]\n }),\n )\n}\n\nfunction compareCaseRecords(left: CaseRecord, right: CaseRecord): number {\n return left.caseId.localeCompare(right.caseId)\n}\n\nfunction diffMetrics(\n left: Record<string, CaseMetricValue>,\n right: Record<string, CaseMetricValue>,\n): Record<string, { left: CaseMetricValue | undefined, right: CaseMetricValue | undefined }> {\n const changed: Record<string, { left: CaseMetricValue | undefined, right: CaseMetricValue | undefined }> = {}\n const metricKeys = [...new Set([...Object.keys(left), ...Object.keys(right)])].sort((leftKey, rightKey) => leftKey.localeCompare(rightKey))\n\n for (const metricKey of metricKeys) {\n if (stableStringify(left[metricKey]) !== stableStringify(right[metricKey])) {\n changed[metricKey] = {\n left: left[metricKey],\n right: right[metricKey],\n }\n }\n }\n\n return changed\n}\n\nfunction getScore(record: CaseRecord, scoreKind: string): number {\n return record.scores[scoreKind] ?? 0\n}\n\nfunction indexRecordsByCaseKey(records: readonly CaseRecord[], caseKey: string | undefined, side: 'left' | 'right'): Map<string, CaseRecord> {\n const indexed = new Map<string, CaseRecord>()\n\n for (const record of records) {\n const resolved = resolveCaseKey(record, caseKey)\n if (indexed.has(resolved)) {\n throw new Error(`Duplicate case key \"${resolved}\" in ${side} report.`)\n }\n\n indexed.set(resolved, record)\n }\n\n return indexed\n}\n\nfunction normalizeCliArgv(argv: readonly string[]): string[] {\n const normalizedArgv = argv[0] === '--'\n ? argv.slice(1)\n : [...argv]\n\n if (normalizedArgv[0] === 'report' && normalizedArgv[1] === 'compare') {\n return normalizedArgv.slice(2)\n }\n\n if (normalizedArgv[0] === 'compare') {\n return normalizedArgv.slice(1)\n }\n\n return normalizedArgv\n}\n\nfunction parseReportCompareCliArguments(argv: readonly string[]): ParsedReportCompareCliArguments {\n const cli = meow(reportCompareHelpText, {\n argv: normalizeCliArgv(argv),\n flags: {\n caseKey: {\n type: 'string',\n },\n format: {\n default: 'table',\n type: 'string',\n },\n groupBy: {\n type: 'string',\n },\n scoreKind: {\n default: 'exact',\n type: 'string',\n },\n },\n importMeta: import.meta,\n })\n\n const leftReportPath = cli.input[0]\n const rightReportPath = cli.input[1]\n if (leftReportPath == null || leftReportPath.length === 0 || rightReportPath == null || rightReportPath.length === 0) {\n throw new Error('Missing required <leftReportPath> and <rightReportPath> arguments.')\n }\n\n return {\n caseKey: cli.flags.caseKey,\n format: cli.flags.format === 'json' ? 'json' : 'table',\n groupBy: cli.flags.groupBy,\n leftReportPath,\n rightReportPath,\n scoreKind: cli.flags.scoreKind,\n }\n}\n\nfunction resolveCaseKey(record: CaseRecord, caseKey: string | undefined): string {\n if (caseKey != null) {\n const resolved = getCaseSelectorValue(record, caseKey)\n if (resolved.exists) {\n return String(resolved.value)\n }\n\n throw new Error(`Missing explicit case key \"${caseKey}\" for case \"${record.caseId}\".`)\n }\n\n const benchmarkCaseId = getCaseSelectorValue(record, 'benchmark.case.id')\n if (benchmarkCaseId.exists) {\n return String(benchmarkCaseId.value)\n }\n\n const vievalCaseId = getCaseSelectorValue(record, 'vieval.case.id')\n return vievalCaseId.exists\n ? String(vievalCaseId.value)\n : record.caseId\n}\n","#!/usr/bin/env node\n\nimport process from 'node:process'\n\nimport { mkdir, writeFile } from 'node:fs/promises'\nimport { dirname, resolve } from 'node:path'\n\nimport meow from 'meow'\n\nimport { errorMessageFrom } from '@moeru/std'\n\nimport { readReportArtifacts, summarizeReportRunArtifact } from './report-artifacts'\n\nexport interface ParsedReportIndexCliArguments {\n format: 'json' | 'jsonl' | 'table'\n output?: string\n reportPath: string\n}\n\nconst reportIndexHelpText = `\n Build report indexes from generated vieval artifacts.\n\n Usage\n $ vieval report index <reportPath> [--output <path>] [--format <format>]\n\n Options\n --output Output file path (default: <reportPath>/index/runs.jsonl)\n --format Console output format: table | json | jsonl (default: table)\n`\n\ninterface ReportIndexOutput {\n indexedRunCount: number\n indexFilePath: string\n rows: ReturnType<typeof summarizeReportRunArtifact>[]\n}\n\nexport function parseReportIndexCliArguments(argv: readonly string[]): ParsedReportIndexCliArguments {\n const cli = meow(reportIndexHelpText, {\n argv: normalizeCliArgv(argv),\n flags: {\n format: {\n default: 'table',\n type: 'string',\n },\n output: {\n type: 'string',\n },\n },\n importMeta: import.meta,\n })\n\n const reportPath = cli.input[0]\n if (reportPath == null || reportPath.length === 0) {\n throw new Error('Missing required <reportPath> argument.')\n }\n\n const normalizedFormat = cli.flags.format.toLowerCase()\n const format = normalizedFormat === 'json'\n ? 'json'\n : normalizedFormat === 'jsonl'\n ? 'jsonl'\n : 'table'\n\n return {\n format,\n output: cli.flags.output,\n reportPath,\n }\n}\n\nexport async function runReportIndexCli(argv: readonly string[]): Promise<void> {\n try {\n const parsed = parseReportIndexCliArguments(argv)\n const output = await writeIndexFile(parsed)\n\n if (parsed.format === 'json') {\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`)\n return\n }\n\n if (parsed.format === 'jsonl') {\n const jsonl = output.rows.map(row => JSON.stringify(row)).join('\\n')\n process.stdout.write(`${jsonl}${jsonl.length > 0 ? '\\n' : ''}`)\n return\n }\n\n process.stdout.write(`${formatTableOutput(output)}\\n`)\n }\n catch (error) {\n const errorMessage = errorMessageFrom(error) ?? 'Unknown report index failure.'\n process.stderr.write(`[vieval report index] ${errorMessage}\\n`)\n process.exitCode = 1\n }\n}\n\nfunction formatTableOutput(output: ReportIndexOutput): string {\n return [\n 'INDEX vieval report',\n `Path ${output.indexFilePath}`,\n `Run count ${output.indexedRunCount}`,\n ].join('\\n')\n}\n\nfunction normalizeCliArgv(argv: readonly string[]): string[] {\n const normalizedArgv = argv[0] === '--'\n ? argv.slice(1)\n : [...argv]\n\n if (normalizedArgv[0] === 'report' && normalizedArgv[1] === 'index') {\n return normalizedArgv.slice(2)\n }\n\n if (normalizedArgv[0] === 'index') {\n return normalizedArgv.slice(1)\n }\n\n return normalizedArgv\n}\n\nasync function writeIndexFile(parsed: ParsedReportIndexCliArguments): Promise<ReportIndexOutput> {\n const artifacts = await readReportArtifacts(parsed.reportPath)\n const rows = artifacts.map(artifact => summarizeReportRunArtifact(artifact))\n const indexFilePath = resolve(parsed.output ?? resolve(parsed.reportPath, 'index', 'runs.jsonl'))\n const indexDirectory = dirname(indexFilePath)\n\n await mkdir(indexDirectory, { recursive: true })\n const indexContents = rows.map(row => JSON.stringify(row)).join('\\n')\n await writeFile(indexFilePath, `${indexContents}${indexContents.length > 0 ? '\\n' : ''}`, 'utf-8')\n\n return {\n indexedRunCount: rows.length,\n indexFilePath,\n rows,\n }\n}\n","import process from 'node:process'\n\nimport meow from 'meow'\n\nimport { runCompareCliOrExit } from './compare'\nimport { runEvalRunCli } from './eval-run'\nimport { runReportAnalyzeCli } from './report-analyze'\nimport { runReportCompareCli } from './report-case-compare'\nimport { runReportCasesCli } from './report-cases'\nimport { runReportIndexCli } from './report-index'\n\ntype Command = 'compare' | 'report' | 'run'\n\ninterface ParsedTopLevelCliArguments {\n command: 'help' | Command\n commandArgv: string[]\n}\n\nconst topLevelHelpText = `\n Execute and report evaluation projects.\n\n Usage\n $ vieval <command> [options]\n\n Commands\n run Discover and execute eval projects\n compare Compare multiple workspaces/methods on one benchmark\n report Analyze and index generated report artifacts\n\n Examples\n $ vieval run\n $ vieval run --config vieval.config.ts --project chess --json --report-out .vieval/reports\n $ vieval compare --config vieval.config.ts --comparison agent-memory\n $ vieval report analyze .vieval/reports/my-run\n $ vieval report index .vieval/reports --output .vieval/reports/index/runs.jsonl\n`\n\n/**\n * Parses top-level `vieval` CLI arguments into one command dispatch payload.\n *\n * Use when:\n * - the executable needs to resolve which subcommand should run\n * - tests need stable top-level argv normalization without invoking subcommands\n *\n * Expects:\n * - argv excludes the node executable and script path\n *\n * Returns:\n * - the normalized top-level command plus subcommand argv\n */\nexport function parseTopLevelCliArguments(argv: readonly string[]): ParsedTopLevelCliArguments {\n const normalizedArgv = normalizeCliArgv(argv)\n const command = normalizedArgv[0]\n\n meow(topLevelHelpText, {\n argv: normalizedArgv,\n autoHelp: false,\n autoVersion: false,\n importMeta: import.meta,\n })\n\n if (command == null || command === 'help' || command === '--help' || command === '-h') {\n return {\n command: 'help',\n commandArgv: [],\n }\n }\n\n if (command !== 'run' && command !== 'report' && command !== 'compare') {\n const receivedCommand = command ?? '(none)'\n throw new Error(`Unsupported vieval command \"${receivedCommand}\". Expected \"run\", \"compare\", or \"report\".`)\n }\n\n return {\n command,\n commandArgv: normalizedArgv.slice(1),\n }\n}\n\n/**\n * Dispatches the top-level `vieval` command to one concrete subcommand module.\n *\n * Call stack:\n *\n * published executable (`../bin/vieval`)\n * -> {@link runTopLevelCli}\n * -> {@link runEvalRunCli} / report CLI / compare CLI\n *\n * Use when:\n * - the executable or tests need import-safe CLI orchestration\n * - subcommands should remain reusable without process-bound startup code\n *\n * Expects:\n * - argv excludes the node executable and script path\n *\n * Returns:\n * - resolves after the selected subcommand completes\n */\nexport async function runTopLevelCli(argv: readonly string[]): Promise<void> {\n const parsed = parseTopLevelCliArguments(argv)\n\n if (parsed.command === 'help') {\n process.stdout.write(`${topLevelHelpText.trim()}\\n`)\n return\n }\n\n if (parsed.command === 'report') {\n const reportSubcommand = parsed.commandArgv[0]\n\n if (reportSubcommand === 'analyze') {\n await runReportAnalyzeCli(parsed.commandArgv)\n return\n }\n\n if (reportSubcommand === 'index') {\n await runReportIndexCli(parsed.commandArgv)\n return\n }\n\n if (reportSubcommand === 'cases') {\n await runReportCasesCli(parsed.commandArgv)\n return\n }\n\n if (reportSubcommand === 'compare') {\n await runReportCompareCli(parsed.commandArgv)\n return\n }\n\n throw new Error(`Unsupported vieval report command \"${reportSubcommand ?? '(none)'}\". Expected \"analyze\", \"index\", \"cases\", or \"compare\".`)\n }\n\n if (parsed.command === 'compare') {\n await runCompareCliOrExit(parsed.commandArgv)\n return\n }\n\n await runEvalRunCli(parsed.commandArgv)\n}\n\nfunction normalizeCliArgv(argv: readonly string[]): string[] {\n return argv[0] === '--'\n ? argv.slice(1)\n : [...argv]\n}\n"],"mappings":"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"}
|