vieval 0.0.1

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 (47) hide show
  1. package/README.md +290 -0
  2. package/dist/assertions-DcAjfVDA.mjs +183 -0
  3. package/dist/assertions-DcAjfVDA.mjs.map +1 -0
  4. package/dist/cli/index.d.mts +11 -0
  5. package/dist/cli/index.mjs +1434 -0
  6. package/dist/cli/index.mjs.map +1 -0
  7. package/dist/config-D2fe1SnT.mjs +17 -0
  8. package/dist/config-D2fe1SnT.mjs.map +1 -0
  9. package/dist/config.d.mts +3 -0
  10. package/dist/config.mjs +3 -0
  11. package/dist/core/assertions/index.d.mts +2 -0
  12. package/dist/core/assertions/index.mjs +2 -0
  13. package/dist/core/inference-executors/index.d.mts +273 -0
  14. package/dist/core/inference-executors/index.mjs +225 -0
  15. package/dist/core/inference-executors/index.mjs.map +1 -0
  16. package/dist/core/processors/results/index.d.mts +96 -0
  17. package/dist/core/processors/results/index.mjs +64 -0
  18. package/dist/core/processors/results/index.mjs.map +1 -0
  19. package/dist/core/runner/index.d.mts +2 -0
  20. package/dist/core/runner/index.mjs +2 -0
  21. package/dist/expect-0jPJ7Zio.d.mts +2318 -0
  22. package/dist/expect-extensions-CwPtgTz8.mjs +13471 -0
  23. package/dist/expect-extensions-CwPtgTz8.mjs.map +1 -0
  24. package/dist/expect-i9WZWGrA.mjs +17 -0
  25. package/dist/expect-i9WZWGrA.mjs.map +1 -0
  26. package/dist/expect.d.mts +2 -0
  27. package/dist/expect.mjs +2 -0
  28. package/dist/index-DP7jsORl.d.mts +947 -0
  29. package/dist/index-oSXhM1zx.d.mts +314 -0
  30. package/dist/index.d.mts +92 -0
  31. package/dist/index.mjs +150 -0
  32. package/dist/index.mjs.map +1 -0
  33. package/dist/magic-string.es-CH1jwzMg.mjs +1013 -0
  34. package/dist/magic-string.es-CH1jwzMg.mjs.map +1 -0
  35. package/dist/models-D_MsBtYw.mjs +14 -0
  36. package/dist/models-D_MsBtYw.mjs.map +1 -0
  37. package/dist/plugin-DVaRZY2x.d.mts +84 -0
  38. package/dist/plugins/chat-models/index.d.mts +90 -0
  39. package/dist/plugins/chat-models/index.mjs +48 -0
  40. package/dist/plugins/chat-models/index.mjs.map +1 -0
  41. package/dist/registry-ChOjjdEC.mjs +245 -0
  42. package/dist/registry-ChOjjdEC.mjs.map +1 -0
  43. package/dist/runner-4ZsOveoY.mjs +480 -0
  44. package/dist/runner-4ZsOveoY.mjs.map +1 -0
  45. package/dist/testing/expect-extensions.d.mts +86 -0
  46. package/dist/testing/expect-extensions.mjs +2 -0
  47. package/package.json +88 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["formatDuration","normalizeCliArgv","isDirectExecution","main","packageJSON.name","parseRunCliArguments"],"sources":["../../package.json","../../src/cli/discovery.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/run.ts","../../src/cli/eval-run.ts","../../src/cli/index.ts"],"sourcesContent":["","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 {\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\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 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 caseId: string\n caseName: string\n order: number\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\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) || task.runningCases.has(payload.caseId)) {\n return\n }\n\n task.caseOrderCounter += 1\n task.runningCases.set(payload.caseId, {\n caseId: payload.caseId,\n caseName: payload.caseName ?? payload.caseId,\n order: task.caseOrderCounter,\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 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 activeBlock = ['', ...activeRows, ...(activeRows.length > 0 ? [''] : [])]\n const footerBlock = [...footerRows, '']\n\n if (maxRows == null || maxRows <= 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 [...activeBlock.slice(0, 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 suffix = task.state === 'queued'\n ? c.dim(' [queued]')\n : ` ${task.completedCases}/${task.totalCases}`\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 => this.options.getNow() - 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, this.options.getNow() - activeCase.startedAt)\n rows.push(\n c.bold(c.yellow(` ${icon} `))\n + activeCase.caseName\n + c.bold(c.yellow(` ${formatDuration(elapsed)}`)),\n )\n }\n }\n\n return rows\n }\n\n private createFooterRows(): string[] {\n return [\n padSummaryTitle('Tasks') + formatCounterState(this.taskCounters),\n padSummaryTitle('Cases') + formatCounterState(this.caseCounters),\n padSummaryTitle('Start at') + this.startTime,\n padSummaryTitle('Duration') + formatDuration(Math.max(0, this.options.getNow() - this.startedAtMs)),\n ]\n }\n\n private getOrCreateTaskState(taskId: string): TaskRuntimeState {\n const existing = this.tasks.get(taskId)\n\n if (existing != null) {\n return existing\n }\n\n const created: TaskRuntimeState = {\n caseOrderCounter: 0,\n completedCases: 0,\n displayName: taskId,\n projectName: undefined,\n queueOrder: this.queueOrderCounter,\n runningCases: new Map(),\n settledCaseIds: new Set(),\n startedAt: undefined,\n state: 'queued',\n taskId,\n taskResult: undefined,\n totalCases: 0,\n }\n\n this.queueOrderCounter += 1\n this.tasks.set(taskId, created)\n return created\n }\n\n private syncTaskTotalCases(task: TaskRuntimeState, reportedTotalCases?: number): void {\n const observedTotalCases = task.completedCases + task.runningCases.size\n task.totalCases = Math.max(task.totalCases, reportedTotalCases ?? 0, observedTotalCases)\n this.caseCounters.total = sumTaskCaseTotals(this.tasks.values())\n }\n}\n\n/**\n * Creates the live summary reporter state machine for `vieval` CLI runs.\n *\n * Use when:\n * - the CLI wants Vitest-style active rows and live counters\n * - tests need a deterministic reporter surface without touching the terminal\n *\n * Expects:\n * - queue/start/end events describe task lifecycle in order\n * - `getNow()` remains monotonic within one run\n * - `getWallClockNow()` returns the wall-clock run start timestamp\n *\n * Returns:\n * - a reporter compatible with the base CLI lifecycle plus `getWindowRows()`\n *\n * Call stack:\n *\n * {@link createSummaryReporter}\n * -> {@link SummaryReporterStateMachine.onTaskQueued}\n * -> {@link SummaryReporterStateMachine.onCaseStart}\n * -> {@link SummaryReporterStateMachine.getWindowRows}\n */\nexport function createSummaryReporter(options: SummaryReporterOptions): SummaryReporter {\n return new SummaryReporterStateMachine(options)\n}\n\nfunction createCounterState(): SummaryReporterCounterState {\n return {\n completed: 0,\n failed: 0,\n passed: 0,\n skipped: 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.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(counter: SummaryReporterCounterState): string {\n return [\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.skipped > 0 ? c.yellow(`${counter.skipped} skipped`) : c.dim(`${counter.skipped} skipped`),\n ].join(c.dim(' | ')) + c.gray(` (${counter.total})`)\n}\n\nfunction formatTimeString(date: Date): string {\n return date.toTimeString().split(' ')[0] ?? ''\n}\n\nfunction formatDuration(durationMs: number): string {\n if (durationMs >= 1_000) {\n return `${(durationMs / 1_000).toFixed(2)}s`\n }\n\n return `${Math.round(durationMs)}ms`\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","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 { EvalDefinition, EvalModuleMap, TaskCaseReporterEndPayload, TaskCaseReporterPayload, 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'\n\nimport process from 'node:process'\n\nimport { pathToFileURL } from 'node:url'\n\nimport c from 'tinyrainbow'\n\nimport { errorMessageFrom } from '@moeru/std'\n\nimport { collectEvalEntries, createRunnerRuntimeContext, createRunnerSchedule, createTaskExecutionContext, RunnerExecutionError, runScheduledTasks } from '../core/runner'\nimport { beginModuleRegistration, consumeModuleRegistrations, endModuleRegistration } from '../dsl/registry'\nimport { loadVievalCliConfig } from './config'\nimport { discoverEvalFiles } from './discovery'\nimport { createCliReporter } from './reporters'\nimport { WindowRenderer } from './reporters/renderers/windowed-renderer'\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}\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 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 * Restrict run to project names.\n *\n * @default []\n */\n project?: string[]\n /**\n * Optional reporter overrides used by CLI integration tests or custom hosts.\n */\n reporter?: RunVievalCliReporterOptions\n}\n\n/**\n * Summary of one processed project.\n */\nexport interface CliProjectSummary {\n caseSummary?: CliProjectCaseSummary | null\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 total: number\n}\n\n/**\n * Captures matrix-row and axis coverage for one project schedule.\n */\nexport interface CliProjectMatrixSummary {\n evalAxes: string[]\n evalRows: number\n runAxes: string[]\n runRows: number\n}\n\n/**\n * Final CLI output model.\n */\nexport interface CliRunOutput {\n configFilePath: string | null\n projects: CliProjectSummary[]\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 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\nasync function loadEvalModules(evalFilePaths: readonly string[]): Promise<EvalModuleMap> {\n const loadedModules: EvalModuleMap = {}\n\n for (const [moduleIndex, evalFilePath] of evalFilePaths.entries()) {\n const moduleHref = pathToFileURL(evalFilePath).href\n const importHref = `${moduleHref}?vieval_load=${Date.now()}_${moduleIndex}`\n beginModuleRegistration(importHref)\n try {\n const moduleValue = await import(importHref)\n const registeredDefinitions = consumeModuleRegistrations(importHref)\n const defaultDefinition = (moduleValue as { default?: EvalDefinition }).default\n\n const definitions = [\n ...registeredDefinitions,\n ...(defaultDefinition == null ? [] : [defaultDefinition]),\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 return loadedModules\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\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 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 queueRenderReset: options?.queueRenderReset,\n supportsAnsiWindowing: options?.supportsAnsiWindowing,\n writeOutput: options?.writeOutput ?? (value => process.stdout.write(value)),\n }\n const renderer = options?.clearInterval != null && options.createInterval != null\n ? new WindowRenderer({\n ...rendererBaseOptions,\n clearInterval: options.clearInterval,\n createInterval: options.createInterval,\n })\n : new WindowRenderer(rendererBaseOptions)\n\n renderer.start()\n\n function scheduleRender(): void {\n renderer.schedule()\n }\n\n return {\n dispose() {\n reporter.dispose()\n renderer.dispose()\n },\n onCaseEnd(payload) {\n reporter.onCaseEnd(payload)\n scheduleRender()\n },\n onCaseStart(payload) {\n reporter.onCaseStart(payload)\n scheduleRender()\n },\n onRunEnd(payload) {\n reporter.onRunEnd(payload)\n scheduleRender()\n },\n onRunStart(payload) {\n reporter.onRunStart(payload)\n scheduleRender()\n },\n onTaskEnd(payload) {\n reporter.onTaskEnd(payload)\n scheduleRender()\n },\n onTaskQueued(payload) {\n reporter.onTaskQueued(payload)\n scheduleRender()\n },\n onTaskStart(payload) {\n reporter.onTaskStart(payload)\n scheduleRender()\n },\n }\n}\n\nfunction 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 projectCaseCounters?: RunCliProjectCaseCounters,\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 {\n projectCaseCounters.skipped += 1\n }\n }\n }\n\n syncCaseTotal(payload.total)\n reporter.onCaseEnd({\n caseId,\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 caseId,\n caseName: payload.name,\n taskId: task.id,\n })\n },\n }\n}\n\nfunction createCliTaskExecutionContext(\n task: ScheduledTask,\n models: NormalizedCliProjectConfig['models'],\n reporter: CliRunReporter,\n projectCaseCounters: RunCliProjectCaseCounters,\n): CliTaskExecutionContext {\n return {\n ...createTaskExecutionContext({\n models,\n task,\n }),\n reporterHooks: createTaskReporterHooks(task, reporter, projectCaseCounters),\n }\n}\n\nfunction resolveTaskReporterHooks(\n task: ScheduledTask,\n context: CliProjectExecutorContext,\n reporter: CliRunReporter,\n projectCaseCounters: RunCliProjectCaseCounters,\n): TaskReporterHooks {\n return context.reporterHooks ?? createTaskReporterHooks(task, reporter, projectCaseCounters)\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 projectCaseCounters: RunCliProjectCaseCounters,\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 model: context.model,\n reporterHooks: resolveTaskReporterHooks(task, context, reporter, projectCaseCounters),\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 loadEvalModules(evalFilePaths)\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 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 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 reporter: CliRunReporter,\n counters: RunCliReporterCounters,\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 }\n const rawTaskExecutor = prepared.project.executor ?? createAutoTaskExecutor(reporter, projectCaseCounters)\n const taskExecutor: ScheduledTaskExecutor = async (task, context) => {\n const result = await rawTaskExecutor(task, context)\n\n return {\n ...result,\n matrix: cloneScheduledTaskMatrix(task),\n }\n }\n\n try {\n const aggregated = await runScheduledTasks(prepared.tasks, taskExecutor, {\n createExecutionContext(task): TaskExecutionContext {\n return createCliTaskExecutionContext(task, prepared.project.models, reporter, projectCaseCounters)\n },\n onTaskEnd(task, state): void {\n settledTaskIds.add(task.id)\n reporter.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 },\n })\n\n return {\n caseSummary: {\n failed: projectCaseCounters.failed,\n passed: projectCaseCounters.passed,\n skipped: projectCaseCounters.skipped,\n total: projectCaseCounters.seenCaseIds.size,\n },\n discoveredEvalFileCount: prepared.discoveredEvalFileCount,\n durationMs: Date.now() - prepared.startedAt,\n entryCount: prepared.entryCount,\n errorMessage: null,\n executed: true,\n matrixSummary: createProjectMatrixSummary(prepared.tasks),\n name: prepared.name,\n result: aggregated,\n taskCount: prepared.tasks.length,\n }\n }\n catch (error) {\n const failedTaskId = getFailedTaskId(error)\n\n if (failedTaskId != null && !settledTaskIds.has(failedTaskId)) {\n counters.failedTasks += 1\n settledTaskIds.add(failedTaskId)\n reporter.onTaskEnd({\n state: 'failed',\n taskId: failedTaskId,\n })\n }\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 }\n\n return {\n caseSummary: {\n failed: projectCaseCounters.failed,\n passed: projectCaseCounters.passed,\n skipped: projectCaseCounters.skipped,\n total: projectCaseCounters.seenCaseIds.size,\n },\n discoveredEvalFileCount: prepared.discoveredEvalFileCount,\n durationMs: Date.now() - prepared.startedAt,\n entryCount: prepared.entryCount,\n errorMessage: errorMessageFrom(error) ?? 'Unknown project execution error.',\n executed: false,\n matrixSummary: createProjectMatrixSummary(prepared.tasks),\n name: prepared.name,\n result: null,\n taskCount: prepared.tasks.length,\n }\n }\n}\n\n/**\n * Runs vieval orchestration from config and returns project-level summaries.\n *\n * Call stack:\n *\n * {@link runVievalCli}\n * -> {@link loadVievalCliConfig}\n * -> {@link discoverEvalFiles}\n * -> {@link collectEvalEntries}\n * -> {@link createRunnerSchedule}\n * -> {@link runScheduledTasks} (optional)\n *\n * Use when:\n * - running eval collection and scheduling from a single command\n * - keeping business-agent eval files near their implementation packages\n */\nexport async function runVievalCli(options: RunVievalCliOptions = {}): Promise<CliRunOutput> {\n const loadedConfig = await loadVievalCliConfig({\n configFilePath: options.configFilePath,\n cwd: options.cwd,\n })\n const restoreEnvironment = applyRunEnvironment(loadedConfig.env)\n const reporter = createRunReporter(options.reporter)\n\n try {\n const selectedProjects = filterProjectsByName(loadedConfig.projects, options.project ?? [])\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 projectSummaries: CliProjectSummary[] = []\n\n for (const preparedProject of preparedProjects) {\n if (preparedProject.kind === 'summary') {\n projectSummaries.push(preparedProject.summary)\n continue\n }\n\n projectSummaries.push(await executePreparedProject(preparedProject.prepared, reporter, reporterCounters))\n }\n\n reporter.onRunEnd({\n failedTasks: reporterCounters.failedTasks,\n passedTasks: reporterCounters.passedTasks,\n skippedTasks: reporterCounters.skippedTasks + skippedSummaryTasks,\n totalTasks,\n })\n\n return {\n configFilePath: loadedConfig.configFilePath,\n projects: projectSummaries,\n }\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 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 passedProjects += 1\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`\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(` ${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 }\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","#!/usr/bin/env node\n\nimport path from 'node:path'\nimport process from 'node:process'\n\nimport { fileURLToPath } from 'node:url'\n\nimport meow from 'meow'\n\nimport { errorMessageFrom } from '@moeru/std'\n\nimport packageJSON from '../../package.json'\n\nimport { formatVievalCliRunOutput, runVievalCli } from './run'\n\ninterface ParsedCliArguments {\n configFilePath?: string\n json: boolean\n project: string[]\n}\n\nconst evalRunHelpText = `\n Execute vieval projects from discovered or explicit config.\n\n Usage\n $ vieval run [--config <path>] [--project <name>] [--json]\n\n Options\n --config Config file path\n --project Project name to execute; may be repeated\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\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 },\n })\n\n return {\n configFilePath: cli.flags.config,\n json: cli.flags.json === true,\n project: normalizeProjectNames(cli.flags.project),\n }\n}\n\nfunction isDirectExecution(): boolean {\n if (!process.argv[1]) {\n return false\n }\n\n return path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)\n}\n\n/**\n * CLI entrypoint for `vieval run`.\n *\n * Call stack:\n *\n * {@link main}\n * -> {@link parseCliArguments}(`process.argv`)\n * -> {@link runVievalCli}\n * -> `process.stdout.write(...)` / `process.stderr.write(...)`\n * -> `process.exitCode`\n *\n * Use when:\n * - developers want project-style eval discovery and execution from one command\n * - manual `import.meta.glob` and runner wiring should stay internal\n */\nasync function main(): Promise<void> {\n // NOTICE:\n // CLI arguments are read from process argv because this module is the\n // user-facing executable entrypoint.\n const parsed = parseCliArguments(process.argv.slice(2))\n\n try {\n const output = await runVievalCli({\n configFilePath: parsed.configFilePath,\n project: parsed.project,\n })\n\n if (parsed.json) {\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`)\n return\n }\n\n process.stdout.write(`${formatVievalCliRunOutput(output)}\\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\nif (isDirectExecution()) {\n await main()\n}\n","#!/usr/bin/env node\n\nimport path from 'node:path'\nimport process from 'node:process'\n\nimport { fileURLToPath } from 'node:url'\n\nimport meow from 'meow'\n\nimport { errorMessageFrom } from '@moeru/std'\n\nimport { parseCliArguments as parseRunCliArguments } from './eval-run'\nimport { formatVievalCliRunOutput, runVievalCli } from './run'\n\ntype Command = '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\n Examples\n $ vieval run\n $ vieval run --config vieval.config.ts --project chess --json\n`\n\nfunction normalizeCliArgv(argv: readonly string[]): string[] {\n return argv[0] === '--'\n ? argv.slice(1)\n : [...argv]\n}\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') {\n const receivedCommand = command ?? '(none)'\n throw new Error(`Unsupported vieval command \"${receivedCommand}\". Expected \"run\".`)\n }\n\n return {\n command,\n commandArgv: normalizedArgv.slice(1),\n }\n}\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 const runArguments = parseRunCliArguments(parsed.commandArgv)\n const output = await runVievalCli({\n configFilePath: runArguments.configFilePath,\n project: runArguments.project,\n })\n\n if (runArguments.json) {\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`)\n return\n }\n\n process.stdout.write(`${formatVievalCliRunOutput(output)}\\n`)\n}\n\nfunction isDirectExecution(): boolean {\n if (!process.argv[1]) {\n return false\n }\n\n return path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)\n}\n\nasync function main(): Promise<void> {\n try {\n await runTopLevelCli(process.argv.slice(2))\n }\n catch (error) {\n const errorMessage = errorMessageFrom(error) ?? 'Unknown CLI failure.'\n process.stderr.write(`[vieval] ${errorMessage}\\n`)\n process.exitCode = 1\n }\n}\n\nif (isDirectExecution()) {\n await main()\n}\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ //#region src/config/define.ts
2
+ /**
3
+ * Returns the provided vieval definition while preserving literal field types.
4
+ */
5
+ function defineEval(definition) {
6
+ return definition;
7
+ }
8
+ /**
9
+ * Returns the provided task definition while preserving literal field types.
10
+ */
11
+ function defineTask(definition) {
12
+ return definition;
13
+ }
14
+ //#endregion
15
+ export { defineTask as n, defineEval as t };
16
+
17
+ //# sourceMappingURL=config-D2fe1SnT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-D2fe1SnT.mjs","names":[],"sources":["../src/config/define.ts"],"sourcesContent":["import type { EvalDefinition, TaskDefinition } from './types'\n\n/**\n * Returns the provided vieval definition while preserving literal field types.\n */\nexport function defineEval<const TDefinition extends EvalDefinition>(definition: TDefinition): TDefinition {\n return definition\n}\n\n/**\n * Returns the provided task definition while preserving literal field types.\n */\nexport function defineTask<const TDefinition extends TaskDefinition>(definition: TDefinition): TDefinition {\n return definition\n}\n"],"mappings":";;;;AAKA,SAAgB,WAAqD,YAAsC;AACzG,QAAO;;;;;AAMT,SAAgB,WAAqD,YAAsC;AACzG,QAAO"}
@@ -0,0 +1,3 @@
1
+ import { _ as TaskDefinition, a as EvalModule, b as TaskRunOutput, c as MatrixDefinition, d as MatrixRow, f as MatrixValue, g as TaskCaseState, h as TaskCaseReporterPayload, i as EvalDefinition, l as MatrixLayer, m as TaskCaseReporterEndPayload, n as defineTask, o as EvalModuleMap, p as ScopedMatrices, r as CollectedEvalEntry, s as MatrixAxisValues, t as defineEval, u as MatrixPrimitive, v as TaskReporterHooks, y as TaskRunContext } from "./index-DP7jsORl.mjs";
2
+ import { n as ModelDefinition, r as resolveModelByName, t as ConfigHookPlugin } from "./plugin-DVaRZY2x.mjs";
3
+ export { CollectedEvalEntry, ConfigHookPlugin, EvalDefinition, EvalModule, EvalModuleMap, MatrixAxisValues, MatrixDefinition, MatrixLayer, MatrixPrimitive, MatrixRow, MatrixValue, ModelDefinition, ScopedMatrices, TaskCaseReporterEndPayload, TaskCaseReporterPayload, TaskCaseState, TaskDefinition, TaskReporterHooks, TaskRunContext, TaskRunOutput, defineEval, defineTask, resolveModelByName };
@@ -0,0 +1,3 @@
1
+ import { n as defineTask, t as defineEval } from "./config-D2fe1SnT.mjs";
2
+ import { t as resolveModelByName } from "./models-D_MsBtYw.mjs";
3
+ export { defineEval, defineTask, resolveModelByName };
@@ -0,0 +1,2 @@
1
+ import { C as expectToolCallArgs, S as expectStructuredOutput, T as toRunScores, _ as expectMustExclude, a as CustomAssertionOptions, b as expectRegex, c as RegexAssertionOptions, d as StructuredOutputAssertionOptions, f as ToolCall, g as expectCustom, h as evaluateAssertions, i as AssertionState, l as RubricAssertionOptions, m as collectFailedAssertions, n as AssertionContext, o as MustExcludeAssertionOptions, p as ToolCallArgsAssertionOptions, r as AssertionOutcome, s as MustIncludeAssertionOptions, t as Assertion, u as RubricJudgeResult, v as expectMustInclude, w as normalizeMatchText, x as expectRubric, y as expectNot } from "../../index-oSXhM1zx.mjs";
2
+ export { Assertion, AssertionContext, AssertionOutcome, AssertionState, CustomAssertionOptions, MustExcludeAssertionOptions, MustIncludeAssertionOptions, RegexAssertionOptions, RubricAssertionOptions, RubricJudgeResult, StructuredOutputAssertionOptions, ToolCall, ToolCallArgsAssertionOptions, collectFailedAssertions, evaluateAssertions, expectCustom, expectMustExclude, expectMustInclude, expectNot, expectRegex, expectRubric, expectStructuredOutput, expectToolCallArgs, normalizeMatchText, toRunScores };
@@ -0,0 +1,2 @@
1
+ import { a as expectMustInclude, c as expectRubric, d as normalizeMatchText, f as toRunScores, i as expectMustExclude, l as expectStructuredOutput, n as evaluateAssertions, o as expectNot, r as expectCustom, s as expectRegex, t as collectFailedAssertions, u as expectToolCallArgs } from "../../assertions-DcAjfVDA.mjs";
2
+ export { collectFailedAssertions, evaluateAssertions, expectCustom, expectMustExclude, expectMustInclude, expectNot, expectRegex, expectRubric, expectStructuredOutput, expectToolCallArgs, normalizeMatchText, toRunScores };
@@ -0,0 +1,273 @@
1
+ import { createOpenAI } from "@xsai-ext/providers/create";
2
+
3
+ //#region src/core/inference-executors/retry-policy.d.ts
4
+ /**
5
+ * Describes how provider retries should behave.
6
+ *
7
+ * ASCII flow:
8
+ * attempt -> run request -> success return
9
+ * attempt -> run request -> retriable failure -> sleep -> next attempt
10
+ * attempt -> run request -> non-retriable failure -> throw
11
+ */
12
+ interface RetryPolicy {
13
+ /**
14
+ * Maximum number of total attempts, including the first try.
15
+ */
16
+ maxAttempts: number;
17
+ /**
18
+ * Returns the wait time for a retry attempt.
19
+ */
20
+ delayMs: (attempt: number) => number;
21
+ /**
22
+ * Determines whether an error can be retried safely.
23
+ */
24
+ shouldRetry: (error: unknown) => boolean;
25
+ /**
26
+ * Suspends execution between retries.
27
+ */
28
+ sleep: (milliseconds: number) => Promise<void>;
29
+ }
30
+ /**
31
+ * Configures a retry policy before a provider call is executed.
32
+ *
33
+ * Use when:
34
+ * - you want the default retry classifier but need to tune attempts or delay
35
+ * - you need to replace the sleeper in tests
36
+ *
37
+ * Expects:
38
+ * - `maxAttempts` to be a finite integer greater than or equal to `1`
39
+ * - `delayMs` to return a non-negative wait time in milliseconds
40
+ */
41
+ interface RetryPolicyOptions {
42
+ /**
43
+ * Maximum total attempts, including the first request.
44
+ *
45
+ * @default 3
46
+ */
47
+ maxAttempts?: number;
48
+ /**
49
+ * Computes the delay for a retry attempt.
50
+ *
51
+ * The attempt number starts at `1` for the first retry.
52
+ */
53
+ delayMs?: (attempt: number) => number;
54
+ /**
55
+ * Overrides the retry classifier.
56
+ */
57
+ shouldRetry?: (error: unknown) => boolean;
58
+ /**
59
+ * Overrides the sleeper used between attempts.
60
+ */
61
+ sleep?: (milliseconds: number) => Promise<void>;
62
+ }
63
+ /**
64
+ * Returns true when a provider failure is temporary and a retry is reasonable.
65
+ *
66
+ * Use when:
67
+ * - the upstream failure is a transport problem or a 5xx/429 response
68
+ *
69
+ * Expects:
70
+ * - provider errors to expose a status code, name, or message when possible
71
+ */
72
+ declare function isRetriableProviderError(error: unknown): boolean;
73
+ declare function createRetryPolicy(options?: RetryPolicyOptions): RetryPolicy;
74
+ /**
75
+ * Runs an operation with bounded retries.
76
+ *
77
+ * Use when:
78
+ * - you are calling an LLM provider or other temporary upstream dependency
79
+ * - non-retriable failures should bubble immediately
80
+ *
81
+ * Expects:
82
+ * - the operation to be idempotent across attempts
83
+ */
84
+ declare function runWithRetry<T>(operation: () => Promise<T>, policy?: RetryPolicy): Promise<T>;
85
+ //#endregion
86
+ //#region src/core/inference-executors/adapters.d.ts
87
+ /**
88
+ * Bundles a provider with the retry policy used to call it.
89
+ *
90
+ * Use when:
91
+ * - a provider instance should travel with the retry runner that governs it
92
+ * - you want call sites to share one retry configuration object
93
+ */
94
+ interface ProviderAdapter<TProvider> {
95
+ /**
96
+ * The underlying provider instance.
97
+ */
98
+ provider: TProvider;
99
+ /**
100
+ * The retry policy used for provider calls.
101
+ */
102
+ retryPolicy: RetryPolicy;
103
+ /**
104
+ * Runs a provider-dependent operation with the adapter retry policy.
105
+ */
106
+ runWithRetry: <TResult>(operation: () => Promise<TResult>) => Promise<TResult>;
107
+ }
108
+ /**
109
+ * Creates a provider adapter with the default retry policy.
110
+ *
111
+ * Use when:
112
+ * - you have a provider instance and want a consistent retry wrapper
113
+ *
114
+ * Expects:
115
+ * - the provider to be safe to reuse across attempts
116
+ */
117
+ declare function createProviderAdapter<TProvider>(provider: TProvider, options?: RetryPolicyOptions): ProviderAdapter<TProvider>;
118
+ //#endregion
119
+ //#region src/core/inference-executors/env.d.ts
120
+ /**
121
+ * Supported env value coercion types.
122
+ */
123
+ type EnvValueType = 'string';
124
+ /**
125
+ * Common options for env readers.
126
+ */
127
+ interface EnvFromOptions {
128
+ /**
129
+ * Expected env value type.
130
+ */
131
+ type: EnvValueType;
132
+ /**
133
+ * Whether an empty or missing value should throw.
134
+ *
135
+ * @default false
136
+ */
137
+ required?: boolean;
138
+ /**
139
+ * Optional key name used for clearer error messages.
140
+ */
141
+ name?: string;
142
+ }
143
+ /**
144
+ * Env options used by the required helper.
145
+ *
146
+ * `required` is intentionally omitted because this helper is always required.
147
+ */
148
+ type RequiredEnvFromOptions = Omit<EnvFromOptions, 'required'>;
149
+ /**
150
+ * Parses one env value with optional required behavior.
151
+ *
152
+ * Example:
153
+ * `const apiKey = envFrom(process.env.OPENAI_API_KEY, { type: 'string', required: true, name: 'OPENAI_API_KEY' })`
154
+ */
155
+ declare function envFrom(value: string | undefined, options: EnvFromOptions): string | undefined;
156
+ /**
157
+ * Parses one required env value.
158
+ *
159
+ * Example:
160
+ * `const apiKey = requiredEnvFrom(process.env.OPENAI_API_KEY, { type: 'string', name: 'OPENAI_API_KEY' })`
161
+ */
162
+ declare function requiredEnvFrom(value: string | undefined, options: RequiredEnvFromOptions): string;
163
+ //#endregion
164
+ //#region src/core/inference-executors/remote-providers/openai/index.d.ts
165
+ /**
166
+ * Represents the OpenAI provider instance returned by xsai.
167
+ */
168
+ type OpenAIProvider = ReturnType<typeof createOpenAI>;
169
+ /**
170
+ * Represents the OpenAI adapter used by vieval.
171
+ */
172
+ type OpenAIProviderAdapter = ProviderAdapter<OpenAIProvider>;
173
+ /**
174
+ * Configures env key names and source for OpenAI provider setup.
175
+ */
176
+ interface OpenAIEnvSourceOptions {
177
+ /**
178
+ * Environment object used for variable lookup.
179
+ *
180
+ * @default process.env
181
+ */
182
+ env?: NodeJS.ProcessEnv;
183
+ /**
184
+ * Env key name for API key.
185
+ *
186
+ * @default 'OPENAI_API_KEY'
187
+ */
188
+ apiKey?: string;
189
+ /**
190
+ * Env key name for base URL.
191
+ *
192
+ * @default 'OPENAI_BASE_URL'
193
+ */
194
+ baseURL?: string;
195
+ /**
196
+ * Env key name for model.
197
+ *
198
+ * @default 'OPENAI_MODEL'
199
+ */
200
+ model?: string;
201
+ }
202
+ /**
203
+ * Configures fallback defaults when env values are missing.
204
+ */
205
+ interface OpenAIFromEnvDefaultOptions {
206
+ /**
207
+ * API key fallback value.
208
+ */
209
+ apiKey?: string;
210
+ /**
211
+ * Base URL fallback value.
212
+ */
213
+ baseURL?: string;
214
+ /**
215
+ * Model fallback value.
216
+ */
217
+ model?: string;
218
+ /**
219
+ * Retry policy override passed to provider adapter.
220
+ */
221
+ retryOptions?: RetryPolicyOptions;
222
+ }
223
+ /**
224
+ * Result produced by `createOpenAIFromEnv`.
225
+ */
226
+ interface OpenAIFromEnvResult {
227
+ adapter: OpenAIProviderAdapter;
228
+ apiKey: string;
229
+ baseURL?: string;
230
+ model: string;
231
+ }
232
+ /**
233
+ * Minimal response shape returned by text-generation calls.
234
+ */
235
+ interface OpenAITextGenerationResult {
236
+ /**
237
+ * Text output from the provider.
238
+ *
239
+ * Some OpenAI-compatible implementations may return `null`.
240
+ */
241
+ text?: string | null;
242
+ }
243
+ /**
244
+ * Normalizes provider text output to a safe string.
245
+ *
246
+ * Before: `{ text: null }`
247
+ * After: `''`
248
+ *
249
+ * Before: `{ text: 'hello' }`
250
+ * After: `'hello'`
251
+ */
252
+ declare function normalizeOpenAITextOutput(result: OpenAITextGenerationResult): string;
253
+ /**
254
+ * Creates an OpenAI provider adapter using environment variables with defaults.
255
+ *
256
+ * Example:
257
+ * `const runtime = createOpenAIFromEnv({}, { model: 'gpt-4.1-mini' })`
258
+ */
259
+ declare function createOpenAIFromEnv(source?: OpenAIEnvSourceOptions, defaults?: OpenAIFromEnvDefaultOptions): OpenAIFromEnvResult;
260
+ /**
261
+ * Creates an OpenAI provider adapter for eval-time requests.
262
+ *
263
+ * Use when:
264
+ * - an eval needs the OpenAI SDK surface plus the shared retry runner
265
+ *
266
+ * Expects:
267
+ * - `apiKey` and `baseURL` to point at an OpenAI-compatible endpoint
268
+ * - `retryOptions` to follow the same invariants as `createRetryPolicy`
269
+ */
270
+ declare function createOpenAIProviderAdapter(apiKey: string, baseURL?: string, retryOptions?: RetryPolicyOptions): OpenAIProviderAdapter;
271
+ //#endregion
272
+ export { EnvFromOptions, EnvValueType, OpenAIEnvSourceOptions, OpenAIFromEnvDefaultOptions, OpenAIFromEnvResult, OpenAIProvider, OpenAIProviderAdapter, OpenAITextGenerationResult, ProviderAdapter, RequiredEnvFromOptions, RetryPolicy, RetryPolicyOptions, createOpenAIFromEnv, createOpenAIProviderAdapter, createProviderAdapter, createRetryPolicy, envFrom, isRetriableProviderError, normalizeOpenAITextOutput, requiredEnvFrom, runWithRetry };
273
+ //# sourceMappingURL=index.d.mts.map