vieval 0.0.5 → 0.0.6

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.
Files changed (41) hide show
  1. package/dist/bin/vieval.mjs +1 -1
  2. package/dist/cli/index.mjs +1 -1
  3. package/dist/{cli-DayPXzHX.mjs → cli-sanbKtQq.mjs} +277 -49
  4. package/dist/cli-sanbKtQq.mjs.map +1 -0
  5. package/dist/config.d.mts +2 -2
  6. package/dist/config.mjs +1 -1
  7. package/dist/core/assertions/index.d.mts +1 -1
  8. package/dist/core/inference-executors/index.d.mts +1 -1
  9. package/dist/core/inference-executors/index.mjs +1 -1
  10. package/dist/core/processors/results/index.d.mts +1 -1
  11. package/dist/core/runner/index.d.mts +3 -2
  12. package/dist/core/runner/index.mjs +3 -2
  13. package/dist/core/runner/index.mjs.map +1 -1
  14. package/dist/core/scheduler/index.d.mts +2 -0
  15. package/dist/core/scheduler/index.mjs +188 -0
  16. package/dist/core/scheduler/index.mjs.map +1 -0
  17. package/dist/{env-BFSjny07.mjs → env--94B0UtW.mjs} +1 -1
  18. package/dist/{env-BFSjny07.mjs.map → env--94B0UtW.mjs.map} +1 -1
  19. package/dist/{env-BTq3dV7C.d.mts → env-BeHv_5mo.d.mts} +1 -1
  20. package/dist/{expect-extensions-QLXESWjn.mjs → expect-extensions-DCSqlneN.mjs} +1 -1
  21. package/dist/{expect-extensions-QLXESWjn.mjs.map → expect-extensions-DCSqlneN.mjs.map} +1 -1
  22. package/dist/expect.mjs +1 -1
  23. package/dist/{index-OEdqjQSe.d.mts → index-DBZKkpBe.d.mts} +105 -3
  24. package/dist/index-fakXoZEe.d.mts +147 -0
  25. package/dist/index.d.mts +110 -11
  26. package/dist/index.mjs +214 -53
  27. package/dist/index.mjs.map +1 -1
  28. package/dist/{models-D_MsBtYw.mjs → models-DIGdOUpJ.mjs} +1 -1
  29. package/dist/models-DIGdOUpJ.mjs.map +1 -0
  30. package/dist/plugins/chat-models/index.d.mts +21 -1
  31. package/dist/plugins/chat-models/index.mjs +27 -1
  32. package/dist/plugins/chat-models/index.mjs.map +1 -1
  33. package/dist/queue-DsZQkZO_.mjs +21 -0
  34. package/dist/queue-DsZQkZO_.mjs.map +1 -0
  35. package/dist/{registry-CwcMMjnZ.mjs → registry-CcKZqDJY.mjs} +25 -3
  36. package/dist/registry-CcKZqDJY.mjs.map +1 -0
  37. package/dist/testing/expect-extensions.mjs +1 -1
  38. package/package.json +7 -1
  39. package/dist/cli-DayPXzHX.mjs.map +0 -1
  40. package/dist/models-D_MsBtYw.mjs.map +0 -1
  41. package/dist/registry-CwcMMjnZ.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-sanbKtQq.mjs","names":["formatDuration","formatDateFnsDuration","formatDuration","normalizeCliArgv","normalizeCliArgv","packageJSON.name","normalizeCliArgv","formatTableOutput","normalizeCliArgv"],"sources":["../src/cli/comparison-config.ts","../src/cli/report-compare.ts","../src/cli/discovery.ts","../src/cli/module-runtime.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-artifacts.ts","../src/cli/report-analyze.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 VievalComparisonMethod {\n configFilePath?: string\n id: string\n project: string\n workspace: string\n}\n\nexport interface VievalComparisonConfig {\n benchmark: {\n id: string\n sharedCaseNamespace: string\n }\n methods: VievalComparisonMethod[]\n}\n\nexport interface LoadVievalComparisonConfigOptions {\n comparisonId?: string\n configFilePath?: string\n cwd?: 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\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 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\nasync function findWorkspaceConfigFile(workspaceDirectory: string): Promise<string | null> {\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\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\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\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 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 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\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","import type { CliRunOutput } from './run'\n\nimport { mkdir, writeFile } from 'node:fs/promises'\nimport { dirname, resolve } from 'node:path'\n\nexport interface CompareMethodSummary {\n methodId: string\n output: CliRunOutput\n}\n\nexport interface CompareSummaryRow {\n exactAverage: number | null\n hybridAverage: number | null\n methodId: string\n runCount: number\n}\n\nexport interface CompareReportArtifact {\n benchmarkId: string\n methods: CompareSummaryRow[]\n reportPath: string\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 firstProject = method.output.projects[0]\n const overall = firstProject?.result?.overall\n\n return {\n exactAverage: overall?.exactAverage ?? null,\n hybridAverage: overall?.hybridAverage ?? null,\n methodId: method.methodId,\n runCount: overall?.runCount ?? 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","import { uniq } from 'es-toolkit'\nimport { glob } from 'tinyglobby'\n\n/**\n * Options for eval file discovery.\n */\nexport interface DiscoverEvalFilesOptions {\n /**\n * Base directory scanned recursively.\n */\n root: string\n /**\n * Include glob patterns matched against relative paths.\n */\n include: readonly string[]\n /**\n * Exclude glob patterns matched against relative paths.\n */\n exclude: readonly 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 {\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 onRunStart(_payload: CliReporterRunStartPayload) {},\n onTaskQueued(_payload: CliReporterTaskQueuedPayload) {},\n onTaskStart(_payload: CliReporterTaskStartPayload) {},\n onCaseStart(_payload: CliReporterCaseStartPayload) {},\n onCaseEnd(_payload: CliReporterCaseEndPayload) {},\n onTaskEnd(_payload: CliReporterTaskEndPayload) {},\n onRunEnd(_payload: CliReporterRunEndPayload) {},\n dispose() {},\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\ninterface SummaryReporterCounterState {\n completed: number\n failed: number\n passed: number\n skipped: number\n timeout: number\n total: number\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 * 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 * 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\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 task queue events with additional display metadata.\n */\n onTaskQueued: (payload: SummaryReporterTaskQueuedPayload) => void\n /**\n * Handles case start events with additional display metadata.\n */\n onCaseStart: (payload: SummaryReporterCaseStartPayload) => void\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\ntype SummaryTaskLifecycleState = 'queued' | 'running' | 'finished'\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\ninterface ProgressTimingState {\n elapsedDurationMs: number\n estimatedDurationMs?: number\n}\n\nclass SummaryReporterStateMachine implements SummaryReporter {\n private readonly options: SummaryReporterOptions\n private readonly taskCounters = createCounterState()\n private readonly caseCounters = createCounterState()\n private readonly tasks = new Map<string, TaskRuntimeState>()\n private queueOrderCounter = 0\n private startedAtMs = 0\n private startTime = ''\n\n constructor(options: SummaryReporterOptions) {\n this.options = options\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 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 /**\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 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 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 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 * 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 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 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\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 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 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\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 padSummaryTitle(label: string): string {\n return `${c.dim(label.padEnd(8))} `\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 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 pluralize(noun: string, count: number): string {\n return count === 1 ? noun : `${noun}s`\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 formatTimeString(date: Date): string {\n return date.toTimeString().split(' ')[0] ?? ''\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 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\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 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 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","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\ntype DefaultWindowRendererTimer = ReturnType<typeof globalThis.setInterval>\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?: () => WindowRendererTimer | void\n}\n\ntype WindowRendererTimerHooks<TTimer extends WindowRendererTimer>\n = {\n clearInterval?: undefined\n createInterval?: undefined\n }\n | {\n clearInterval: (timer: TTimer) => void\n createInterval: (callback: () => void, intervalMs: number) => TTimer\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\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\ninterface ManagedWindowRendererTimer {\n clear: () => void\n unref?: () => WindowRendererTimer | void\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\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 readonly options: ResolvedWindowRendererOptions\n private renderInterval: ManagedWindowRendererTimer | undefined\n private renderScheduled = false\n private renderScheduleVersion = 0\n private windowHeight = 0\n private started = false\n private finished = false\n private bufferedOutput = ''\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 * 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 * 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 * 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 * 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 * 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 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 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 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 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\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\ntype Awaitable<T> = T | Promise<T>\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 * Normalized test-case-like entity delivered to vitest-compatible reporter hooks.\n */\nexport interface VievalVitestCompatCase {\n id: string\n name: string\n module: VievalVitestCompatModule\n state: 'failed' | 'passed' | 'pending' | 'skipped'\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 * 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\nexport type VievalVitestCompatReporterReference\n = VievalVitestCompatReporterValue\n | readonly [VievalVitestCompatReporterValue, unknown?]\n\nfunction isReporterReferenceTuple(\n reference: VievalVitestCompatReporterReference,\n): reference is readonly [VievalVitestCompatReporterValue, unknown?] {\n return Array.isArray(reference)\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\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\nfunction createReporterInstance(moduleValue: unknown, options: unknown): VievalVitestCompatReporter | null {\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\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 onTaskEnd: (payload: CliReporterTaskEndPayload) => Promise<void>\n onTaskQueued: (payload: CliReporterTaskQueuedPayload) => Promise<void>\n onTaskStart: (payload: CliReporterTaskStartPayload) => Promise<void>\n onRunEnd: (options: { failed: boolean }) => Promise<void>\n onRunStart: () => Promise<void>\n}\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<VievalVitestCompatReporterBridge | null> {\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","import type { TaskCaseReporterEndPayload, TaskCaseReporterPayload, TaskConcurrencyConfig, TaskReporterEventPayload, TaskReporterHooks } from '../config'\nimport type { AggregatedRunResults, ScheduledTask, ScheduledTaskExecutor, TaskExecutionContext } from '../core/runner'\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 { mkdir, writeFile } from 'node:fs/promises'\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 { loadVievalCliConfig } from './config'\nimport { discoverEvalFiles } from './discovery'\nimport { loadEvalModulesWithVitestRuntime } from './module-runtime'\nimport { createCliReporter } from './reporters'\nimport { WindowRenderer } from './reporters/renderers/windowed-renderer'\nimport { createVievalVitestCompatReporterBridge } from './reporters/vitest-compat-reporter'\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 kind: 'prepared'\n prepared: PreparedCliProjectExecution\n }\n | {\n kind: 'summary'\n summary: CliProjectSummary\n }\n\ninterface RunCliReporterCounters {\n failedTasks: number\n passedTasks: number\n skippedTasks: number\n}\n\ninterface RunCliProjectCaseCounters {\n failed: number\n passed: number\n seenCaseIds: Set<string>\n skipped: number\n timeout: number\n}\n\ntype CliRunReporter = Omit<CliReporter, 'onCaseStart' | 'onTaskQueued'> & {\n onCaseStart: (payload: SummaryReporterCaseStartPayload) => void\n onTaskQueued: (payload: SummaryReporterTaskQueuedPayload) => void\n}\n\ntype CliTaskExecutionContext = CliProjectExecutorContext\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\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 * 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 report output root directory.\n */\n reportOut?: string\n /**\n * Optional reporter overrides used by CLI integration tests or custom hosts.\n */\n reporter?: RunVievalCliReporterOptions\n /**\n * Workspace id attached to report artifacts.\n */\n workspace?: string\n /**\n * Optional task-level concurrency cap parsed by the CLI.\n */\n taskConcurrency?: number\n /**\n * Optional workspace-level concurrency cap parsed by the CLI.\n */\n workspaceConcurrency?: number\n /**\n * Cache project identifier override used to share benchmark cache across multiple method runs.\n */\n cacheProjectName?: string\n}\n\n/**\n * Summary of one processed project.\n */\nexport interface CliProjectSummary {\n caseSummary?: CliProjectCaseSummary | null\n caseFailures?: CliProjectCaseFailure[]\n discoveredEvalFileCount: number\n durationMs?: number\n entryCount: number\n errorMessage: string | null\n executed: boolean\n matrixSummary: CliProjectMatrixSummary | null\n name: string\n result: AggregatedRunResults | null\n taskCount: number\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 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 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 * Final CLI output model.\n */\nexport interface CliRunOutput {\n attemptId?: string\n configFilePath: string | null\n experimentId?: string\n projects: CliProjectSummary[]\n reportDirectory?: string | null\n runId?: string\n workspaceId?: string\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\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\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\ninterface CliColorPalette {\n black: (value: string) => string\n bgCyan: (value: string) => string\n bgGreen: (value: string) => string\n bgMagenta: (value: string) => string\n bgYellow: (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\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 resolveOptionalRuntimeTaskConcurrency(\n defaultConcurrency: number | undefined,\n cliConcurrency: number | undefined,\n): number | undefined {\n return cliConcurrency ?? defaultConcurrency\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 resolveProjectConcurrency(\n project: NormalizedCliProjectConfig,\n options: RunVievalCliOptions,\n): number {\n return resolveCappedConcurrency(project.concurrency?.project, options.projectConcurrency, Number.POSITIVE_INFINITY)\n}\n\nfunction resolveTaskConcurrency(\n project: NormalizedCliProjectConfig,\n options: RunVievalCliOptions,\n): number {\n return resolveCappedConcurrency(project.concurrency?.task, options.taskConcurrency, 1)\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 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 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 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 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\nfunction createColorPalette(enabled: boolean): CliColorPalette {\n if (!enabled) {\n return {\n black: value => value,\n bgCyan: value => value,\n bgGreen: value => value,\n bgMagenta: value => value,\n bgYellow: 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 black: value => c.black(value),\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 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 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 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 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 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 createRunIdentity(options: RunVievalCliOptions): CliRunIdentity {\n const workspaceId = sanitizeIdentitySegment(options.workspace ?? 'default-workspace')\n const experimentId = sanitizeIdentitySegment(options.experiment ?? 'default-experiment')\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 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 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 { taskId?: string, projectName?: 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 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\ninterface ProcessEnvSnapshotValue {\n existed: boolean\n value: string | undefined\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 isSummaryReporter(reporter: CliReporter): reporter is SummaryReporter {\n return 'getWindowRows' in reporter\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\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\nfunction createTaskQueuePayload(task: ScheduledTask, projectName: string): SummaryReporterTaskQueuedPayload {\n return {\n displayName: task.entry.name,\n projectName,\n taskId: task.id,\n }\n}\n\nfunction createTaskCaseReporterId(payload: TaskCaseReporterPayload | TaskCaseReporterEndPayload): string {\n return `${payload.index}:${encodeURIComponent(payload.name)}`\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?: VievalVitestCompatReporterBridge | null,\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 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 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\nfunction createCliTaskExecutionContext(\n task: ScheduledTask,\n models: NormalizedCliProjectConfig['models'],\n cacheRootDirectory: string,\n cacheProjectName: string,\n workspaceId: string,\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?: VievalVitestCompatReporterBridge | null,\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 }\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?: VievalVitestCompatReporterBridge | null,\n): TaskReporterHooks {\n return context.reporterHooks ?? createTaskReporterHooks(task, reporter, projectName, recordEvent, projectCaseCounters, projectCaseFailures, vitestCompatReporter)\n}\n\nfunction getFailedTaskId(error: unknown): string | null {\n if (error instanceof RunnerExecutionError) {\n return error.taskId\n }\n\n return null\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?: VievalVitestCompatReporterBridge | null,\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 model: context.model,\n reporterHooks: resolveTaskReporterHooks(task, context, reporter, projectName, recordEvent, projectCaseCounters, projectCaseFailures, vitestCompatReporter),\n task,\n })\n\n return {\n entryId: task.entry.id,\n id: task.id,\n matrix: task.matrix,\n inferenceExecutorId: task.inferenceExecutor.id,\n scores: [...output.scores],\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 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\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 evalMatrix: project.evalMatrix,\n entries,\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 kind: 'summary',\n summary: {\n caseSummary: null,\n caseFailures: [],\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 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 kind: 'summary',\n summary: {\n caseSummary: null,\n caseFailures: [],\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\nasync function executePreparedProject(\n prepared: PreparedCliProjectExecution,\n identity: CliRunIdentity,\n cacheProjectName: string | undefined,\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 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 reporter,\n prepared.name,\n recordEvent,\n projectCaseCounters,\n projectCaseFailures,\n resolveCliRuntimeConcurrency(options),\n vitestCompatReporter,\n )\n },\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 maxConcurrency: resolveScheduledTaskConcurrency(prepared.project, options),\n })\n\n await vitestCompatReporter?.onRunEnd({\n failed: false,\n })\n\n return {\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 caseFailures: projectCaseFailures,\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 caseSummary: {\n failed: projectCaseCounters.failed,\n passed: projectCaseCounters.passed,\n skipped: projectCaseCounters.skipped,\n timeout: projectCaseCounters.timeout,\n total: projectCaseCounters.seenCaseIds.size,\n },\n caseFailures: projectCaseFailures,\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\nasync function writeRunReportArtifacts(\n output: CliRunOutput,\n events: readonly CliRunReportEvent[],\n identity: CliRunIdentity,\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 await mkdir(reportDirectory, { recursive: true })\n await writeFile(\n resolve(reportDirectory, 'run-summary.json'),\n `${JSON.stringify(output, 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 return reportDirectory\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 identity = createRunIdentity(options)\n const loadedConfig = await loadVievalCliConfig({\n configFilePath: options.configFilePath,\n cwd: options.cwd,\n })\n const restoreEnvironment = applyRunEnvironment(loadedConfig.env)\n const eventRecorder = createEventRecorder(identity)\n const reporter = createReporterWithEventCapture(\n createRunReporter(options.reporter),\n eventRecorder.record,\n )\n\n try {\n const selectedProjects = filterProjectsByName(loadedConfig.projects, options.project ?? [])\n const workspaceScheduler = createSchedulerRuntime({\n concurrency: {\n workspace: resolveWorkspaceConcurrency(loadedConfig, options),\n },\n })\n const preparedProjects = await Promise.all(selectedProjects.map(async project => prepareProject(project)))\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 reporter.onRunStart({\n totalTasks,\n })\n\n for (const project of executableProjects) {\n for (const task of project.tasks) {\n reporter.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 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 reporter,\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 reporter.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 finally {\n reporter.dispose()\n restoreEnvironment()\n }\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): string | null {\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): string | null {\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 hybridAverage = project.result?.overall.hybridAverage\n const hybridAverageLabel = hybridAverage == null ? 'n/a' : String(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","import process from 'node:process'\n\nimport { resolve } from 'node:path'\n\nimport meow from 'meow'\n\nimport { errorMessageFrom } from '@moeru/std'\n\nimport { loadVievalComparisonConfig } from './comparison-config'\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\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\nexport function parseCompareCliArguments(argv: readonly string[]): ParsedCompareCliArguments {\n const cli = meow(compareHelpText, {\n argv: normalizeCliArgv(argv),\n flags: {\n config: {\n type: 'string',\n },\n comparison: {\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\nexport interface CompareMethodRunResult {\n methodId: string\n output: Awaited<ReturnType<typeof runVievalCli>>\n}\n\nexport interface CompareRunOutput {\n benchmarkId: string\n methods: CompareMethodRunResult[]\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\n for (const method of loaded.config.methods) {\n const methodWorkspace = resolve(method.workspace)\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 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 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","","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\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\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 importMeta: import.meta,\n flags: {\n config: {\n type: 'string',\n },\n json: {\n default: false,\n type: 'boolean',\n },\n project: {\n isMultiple: true,\n type: 'string',\n },\n workspace: {\n type: 'string',\n },\n experiment: {\n type: 'string',\n },\n attempt: {\n type: 'string',\n },\n workspaceConcurrency: {\n type: 'number',\n },\n projectConcurrency: {\n type: 'number',\n },\n taskConcurrency: {\n type: 'number',\n },\n attemptConcurrency: {\n type: 'number',\n },\n caseConcurrency: {\n type: 'number',\n },\n reportOut: {\n type: 'string',\n },\n },\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","import type { CliRunOutput } from './run'\n\nimport { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { glob } from 'tinyglobby'\n\nexport interface ReportRunArtifact {\n eventsCount: number\n events: ReportRunEvent[]\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 caseId?: string\n data?: unknown\n event: string\n taskId?: string\n}\n\nexport interface ReportRunSummaryRow {\n attemptId: string | null\n eventsCount: number\n executedProjects: number\n experimentId: string | null\n failedProjects: number\n projectNames: string[]\n reportDirectory: string\n runId: string | null\n totalProjects: number\n totalTasks: number\n workspaceId: string | null\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 * 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 caseId: event.caseId,\n data: event.data,\n event: event.event,\n taskId: event.taskId,\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 * 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 * 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","#!/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 evalMatrix?: Record<string, string>\n errorContains?: string\n experiment?: string\n format: 'csv' | 'json' | 'jsonl' | 'table'\n project?: string\n reportPath: string\n runMatrix?: Record<string, string>\n run?: 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\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\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 evalMatrix: {\n type: 'string',\n },\n errorContains: {\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 runMatrix: {\n type: 'string',\n },\n run: {\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 evalMatrix: parseMatrixSelector(cli.flags.evalMatrix),\n errorContains: cli.flags.errorContains,\n experiment: cli.flags.experiment,\n format,\n project: cli.flags.project,\n reportPath,\n runMatrix: parseMatrixSelector(cli.flags.runMatrix),\n run: cli.flags.run,\n taskState: normalizeStateFilter(cli.flags.taskState),\n workspace: cli.flags.workspace,\n }\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\ninterface ReportAnalyzeOutput {\n experimentSummaries: ReportAnalyzeExperimentSummary[]\n filteredRunCount: number\n runs: ReturnType<typeof summarizeReportRunArtifact>[]\n totalRunCount: number\n}\n\nexport interface ReportAnalyzeExperimentSummary {\n attemptCount: number\n attemptSummaries: ReportAnalyzeAttemptSummary[]\n attemptSuccessRateStats: {\n avg: number\n max: number\n min: number\n stdev: number\n }\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\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\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 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 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 { state?: unknown } | undefined)?.state\n return state === targetState\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 { state?: unknown } | undefined)?.state\n return state === targetState\n })\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 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 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 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\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\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\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 attemptSummaries,\n attemptSuccessRateStats: {\n avg: roundMetric(avgAttemptSuccessRate),\n max: roundMetric(maxAttemptSuccessRate),\n min: roundMetric(minAttemptSuccessRate),\n stdev: roundMetric(stdevAttemptSuccessRate),\n },\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\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 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\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","#!/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\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\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\ninterface ReportIndexOutput {\n indexFilePath: string\n indexedRunCount: number\n rows: ReturnType<typeof summarizeReportRunArtifact>[]\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 indexFilePath,\n indexedRunCount: rows.length,\n rows,\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\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","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 { runReportIndexCli } from './report-index'\n\ntype Command = 'compare' | 'report' | 'run'\n\ninterface ParsedTopLevelCliArguments {\n command: Command | 'help'\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\nfunction normalizeCliArgv(argv: readonly string[]): string[] {\n return argv[0] === '--'\n ? argv.slice(1)\n : [...argv]\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 autoHelp: false,\n autoVersion: false,\n argv: normalizedArgv,\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 throw new Error(`Unsupported vieval report command \"${reportSubcommand ?? '(none)'}\". Expected \"analyze\" or \"index\".`)\n }\n\n if (parsed.command === 'compare') {\n await runCompareCliOrExit(parsed.commandArgv)\n return\n }\n\n await runEvalRunCli(parsed.commandArgv)\n}\n"],"mappings":"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"}
package/dist/config.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { M as ModelDefinition, N as resolveModelByName, S as TaskRunOutput, _ as TaskCaseState, a as EvalDefinition, b as TaskReporterHooks, c as MatrixAxisValues, d as MatrixPrimitive, f as MatrixRow, g as TaskCaseReporterPayload, h as TaskCaseReporterEndPayload, i as CollectedEvalEntry, l as MatrixDefinition, m as ScopedMatrices, n as defineEval, o as EvalModule, p as MatrixValue, r as defineTask, s as EvalModuleMap, t as ConfigHookPlugin, u as MatrixLayer, v as TaskDefinition, x as TaskRunContext, y as TaskReporterEventPayload } from "./index-OEdqjQSe.mjs";
2
- export { CollectedEvalEntry, ConfigHookPlugin, EvalDefinition, EvalModule, EvalModuleMap, MatrixAxisValues, MatrixDefinition, MatrixLayer, MatrixPrimitive, MatrixRow, MatrixValue, ModelDefinition, ScopedMatrices, TaskCaseReporterEndPayload, TaskCaseReporterPayload, TaskCaseState, TaskDefinition, TaskReporterEventPayload, TaskReporterHooks, TaskRunContext, TaskRunOutput, defineEval, defineTask, resolveModelByName };
1
+ import { C as TaskRunContext, F as resolveModelByName, P as ModelDefinition, S as TaskReporterHooks, _ as TaskCaseState, a as EvalDefinition, b as TaskExecutionPolicy, c as MatrixAxisValues, d as MatrixPrimitive, f as MatrixRow, g as TaskCaseReporterPayload, h as TaskCaseReporterEndPayload, i as CollectedEvalEntry, l as MatrixDefinition, m as ScopedMatrices, n as defineEval, o as EvalModule, p as MatrixValue, r as defineTask, s as EvalModuleMap, t as ConfigHookPlugin, u as MatrixLayer, v as TaskConcurrencyConfig, w as TaskRunOutput, x as TaskReporterEventPayload, y as TaskDefinition } from "./index-DBZKkpBe.mjs";
2
+ export { CollectedEvalEntry, ConfigHookPlugin, EvalDefinition, EvalModule, EvalModuleMap, MatrixAxisValues, MatrixDefinition, MatrixLayer, MatrixPrimitive, MatrixRow, MatrixValue, ModelDefinition, ScopedMatrices, TaskCaseReporterEndPayload, TaskCaseReporterPayload, TaskCaseState, TaskConcurrencyConfig, TaskDefinition, TaskExecutionPolicy, TaskReporterEventPayload, TaskReporterHooks, TaskRunContext, TaskRunOutput, defineEval, defineTask, resolveModelByName };
package/dist/config.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { t as resolveModelByName } from "./models-D_MsBtYw.mjs";
1
+ import { t as resolveModelByName } from "./models-DIGdOUpJ.mjs";
2
2
  //#region src/config/define.ts
3
3
  /**
4
4
  * Returns the provided vieval definition while preserving literal field types.
@@ -1,4 +1,4 @@
1
- import { U as RunScore, W as RunScoreKind } from "../../index-OEdqjQSe.mjs";
1
+ import { G as RunScore, K as RunScoreKind } from "../../index-DBZKkpBe.mjs";
2
2
 
3
3
  //#region src/core/assertions/index.d.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { a as requiredEnvFrom, i as envFrom, n as EnvValueType, r as RequiredEnvFromOptions, t as EnvFromOptions } from "../../env-BTq3dV7C.mjs";
1
+ import { a as requiredEnvFrom, i as envFrom, n as EnvValueType, r as RequiredEnvFromOptions, t as EnvFromOptions } from "../../env-BeHv_5mo.mjs";
2
2
  import { createOpenAI } from "@xsai-ext/providers/create";
3
3
 
4
4
  //#region src/core/inference-executors/retry-policy.d.ts
@@ -1,4 +1,4 @@
1
- import { n as requiredEnvFrom, t as envFrom } from "../../env-BFSjny07.mjs";
1
+ import { n as requiredEnvFrom, t as envFrom } from "../../env--94B0UtW.mjs";
2
2
  import process from "node:process";
3
3
  import { errorMessageFrom, errorNameFrom, sleep } from "@moeru/std";
4
4
  import { createOpenAI } from "@xsai-ext/providers/create";
@@ -1,4 +1,4 @@
1
- import { B as AggregatedRunResults } from "../../../index-OEdqjQSe.mjs";
1
+ import { H as AggregatedRunResults } from "../../../index-DBZKkpBe.mjs";
2
2
 
3
3
  //#region src/core/processors/results/policies/hybrid-threshold.d.ts
4
4
  /**
@@ -1,2 +1,3 @@
1
- import { $ as ScheduledTaskMatrixMeta, A as TaskModelSelectionOptions, B as AggregatedRunResults, C as RunScheduledTasksOptions, D as runScheduledTasks, E as ScheduledTaskExecutor, F as collectEvalEntries, G as aggregateRunResults, H as RunResult, I as CreateVievalRunnerRuntimeContextOptions, J as RunnerMatrixDefinition, K as CreateRunnerScheduleOptions, L as RunnerRuntimeContext, O as CreateTaskExecutionContextOptions, P as asProjectRelativePath, Q as ScheduledTaskMatrix, R as createRunnerRuntimeContext, T as RunnerTaskState, U as RunScore, V as AggregatedRunSummary, W as RunScoreKind, X as RunnerMatrixSelection, Y as RunnerMatrixInput, Z as ScheduledTask, at as CacheFileOptions, et as createRunnerSchedule, it as CacheFileHandle, j as createTaskExecutionContext, k as TaskExecutionContext, nt as createFilesystemTaskCacheRuntime, ot as CacheNamespace, q as InferenceExecutor, rt as normalizeCacheFilePathSegments, st as TaskCacheRuntime, tt as CreateFilesystemTaskCacheRuntimeOptions, w as RunnerExecutionError, z as AggregatedProviderSummary } from "../../index-OEdqjQSe.mjs";
2
- export { AggregatedProviderSummary, AggregatedRunResults, AggregatedRunSummary, CacheFileHandle, CacheFileOptions, CacheNamespace, CreateFilesystemTaskCacheRuntimeOptions, CreateRunnerScheduleOptions, CreateTaskExecutionContextOptions, CreateVievalRunnerRuntimeContextOptions, InferenceExecutor, RunResult, RunScheduledTasksOptions, RunScore, RunScoreKind, RunnerExecutionError, RunnerMatrixDefinition, RunnerMatrixInput, RunnerMatrixSelection, RunnerRuntimeContext, RunnerTaskState, ScheduledTask, ScheduledTaskExecutor, ScheduledTaskMatrix, ScheduledTaskMatrixMeta, TaskCacheRuntime, TaskExecutionContext, TaskModelSelectionOptions, aggregateRunResults, asProjectRelativePath, collectEvalEntries, createFilesystemTaskCacheRuntime, createRunnerRuntimeContext, createRunnerSchedule, createTaskExecutionContext, normalizeCacheFilePathSegments, runScheduledTasks };
1
+ import { $ as ScheduledTask, A as CreateTaskExecutionContextOptions, B as createRunnerRuntimeContext, D as RunnerTaskState, E as RunnerExecutionError, G as RunScore, H as AggregatedRunResults, I as asProjectRelativePath, J as CreateRunnerScheduleOptions, K as RunScoreKind, L as collectEvalEntries, M as TaskModelSelectionOptions, N as createTaskExecutionContext, O as ScheduledTaskExecutor, Q as RunnerMatrixSelection, R as CreateVievalRunnerRuntimeContextOptions, T as RunScheduledTasksOptions, U as AggregatedRunSummary, V as AggregatedProviderSummary, W as RunResult, X as RunnerMatrixDefinition, Y as InferenceExecutor, Z as RunnerMatrixInput, at as normalizeCacheFilePathSegments, ct as CacheNamespace, et as ScheduledTaskMatrix, it as createFilesystemTaskCacheRuntime, j as TaskExecutionContext, k as runScheduledTasks, lt as TaskCacheRuntime, nt as createRunnerSchedule, ot as CacheFileHandle, q as aggregateRunResults, rt as CreateFilesystemTaskCacheRuntimeOptions, st as CacheFileOptions, tt as ScheduledTaskMatrixMeta, z as RunnerRuntimeContext } from "../../index-DBZKkpBe.mjs";
2
+ import { a as SchedulerMiddleware, c as SchedulerScopeContext, i as SchedulerConcurrencyConfig, n as getActiveScopes, o as SchedulerRuntime, r as CreateSchedulerRuntimeOptions, s as SchedulerScope, t as createSchedulerRuntime } from "../../index-fakXoZEe.mjs";
3
+ export { AggregatedProviderSummary, AggregatedRunResults, AggregatedRunSummary, CacheFileHandle, CacheFileOptions, CacheNamespace, CreateFilesystemTaskCacheRuntimeOptions, CreateRunnerScheduleOptions, CreateSchedulerRuntimeOptions, CreateTaskExecutionContextOptions, CreateVievalRunnerRuntimeContextOptions, InferenceExecutor, RunResult, RunScheduledTasksOptions, RunScore, RunScoreKind, RunnerExecutionError, RunnerMatrixDefinition, RunnerMatrixInput, RunnerMatrixSelection, RunnerRuntimeContext, RunnerTaskState, ScheduledTask, ScheduledTaskExecutor, ScheduledTaskMatrix, ScheduledTaskMatrixMeta, SchedulerConcurrencyConfig, SchedulerMiddleware, SchedulerRuntime, SchedulerScope, SchedulerScopeContext, TaskCacheRuntime, TaskExecutionContext, TaskModelSelectionOptions, aggregateRunResults, asProjectRelativePath, collectEvalEntries, createFilesystemTaskCacheRuntime, createRunnerRuntimeContext, createRunnerSchedule, createSchedulerRuntime, createTaskExecutionContext, getActiveScopes, normalizeCacheFilePathSegments, runScheduledTasks };
@@ -1,4 +1,5 @@
1
- import { t as resolveModelByName } from "../../models-D_MsBtYw.mjs";
1
+ import { createSchedulerRuntime, getActiveScopes } from "../scheduler/index.mjs";
2
+ import { t as resolveModelByName } from "../../models-DIGdOUpJ.mjs";
2
3
  import { createRequire } from "node:module";
3
4
  import process from "node:process";
4
5
  import { errorMessageFrom } from "@moeru/std";
@@ -631,6 +632,6 @@ function createTaskExecutionContext(options) {
631
632
  };
632
633
  }
633
634
  //#endregion
634
- export { RunnerExecutionError, aggregateRunResults, asProjectRelativePath, collectEvalEntries, createFilesystemTaskCacheRuntime, createRunnerRuntimeContext, createRunnerSchedule, createTaskExecutionContext, normalizeCacheFilePathSegments, runScheduledTasks };
635
+ export { RunnerExecutionError, aggregateRunResults, asProjectRelativePath, collectEvalEntries, createFilesystemTaskCacheRuntime, createRunnerRuntimeContext, createRunnerSchedule, createSchedulerRuntime, createTaskExecutionContext, getActiveScopes, normalizeCacheFilePathSegments, runScheduledTasks };
635
636
 
636
637
  //# sourceMappingURL=index.mjs.map