@m4trix/evals 0.20.0 → 0.21.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.
- package/dist/cli-simple.cjs +222 -28
- package/dist/cli-simple.cjs.map +1 -1
- package/dist/cli-simple.js +221 -27
- package/dist/cli-simple.js.map +1 -1
- package/dist/cli.cjs +115 -5
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +114 -5
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +117 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +10 -2
- package/dist/index.js +114 -5
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.tsx","../src/cli/app.tsx","../src/cli/components/Breadcrumbs.tsx","../src/cli/components/Footer.tsx","../src/cli/components/ListItem.tsx","../src/cli/components/Pane.tsx","../src/cli/components/RunsSidebar.tsx","../src/cli/components/SectionHeader.tsx","../src/cli/components/StatusText.tsx","../src/cli/components/Sparkline.tsx","../src/cli/components/TextBar.tsx","../src/cli/keys.ts","../src/cli/data.mock.json","../src/cli/state.ts","../src/cli/views/datasets/DatasetsView.tsx","../src/runner/api.ts","../src/runner/config.ts","../src/runner/config-loader.ts","../src/runner/discovery.ts","../src/runner/execution.ts","../src/evals/diff.ts","../src/evals/metric.ts","../src/evals/score.ts","../src/evals/aggregators.ts","../src/evals/metrics/standard.ts","../src/evals/scores/standard.ts","../src/runner/score-utils.ts","../src/runner/artifact-loader.ts","../src/runner/persistence.ts","../src/runner/search.ts","../src/cli/views/runs/RunsView.tsx","../src/cli/views/details/RunDetailsView.tsx","../src/cli/views/new-evaluation/NewEvaluationView.tsx"],"names":["useEffect","useMemo","useState","Box","Text","jsxs","jsx","Fragment","resolve","randomUUID","Effect","Queue","createJiti","jitiModule","loaded","registry","passed","readdir","join","LEFT_PANE_WIDTH","React"],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { withFullScreen } from 'fullscreen-ink';\n\nimport { EvalsCliApp } from './cli/app';\nimport { loadMockData, loadRunnerData, parseStartupArgs } from './cli/state';\nimport { createRunner } from './runner';\n\nasync function main(): Promise<void> {\n const args = parseStartupArgs(process.argv.slice(2));\n const runner = createRunner();\n const data = await loadRunnerData(runner).catch(() => loadMockData());\n\n process.on('SIGINT', () => {\n void runner.shutdown().finally(() => process.exit(0));\n });\n process.on('SIGTERM', () => {\n void runner.shutdown().finally(() => process.exit(0));\n });\n\n withFullScreen(\n <EvalsCliApp data={data} args={args} runner={runner} />,\n ).start();\n}\n\nvoid main();\n","/** @jsxImportSource react */\nimport React, { useEffect, useMemo, useReducer, useRef, useState } from 'react';\nimport { Box, Text, useApp, useInput } from 'ink';\nimport { useScreenSize } from 'fullscreen-ink';\n\nimport { getBreadcrumbText, getFooterText } from './components';\nimport {\n isBackKey,\n isPrintableCharacter,\n isQuitInput,\n isSearchInput,\n} from './keys';\nimport {\n createInitialState,\n applyRunnerEvent,\n getDatasetByMenuIndex,\n getFilteredDatasets,\n getRunByMenuIndex,\n reduceCliState,\n} from './state';\nimport type { CliState, EvalsData, StartupArgs } from './types';\nimport type { RunnerApi } from '../runner';\nimport {\n DatasetsView,\n NewEvaluationView,\n OVERVIEW_PAGE_SIZE,\n RunDetailsView,\n RunsView,\n} from './views';\n\ninterface EvalsCliAppProps {\n data: EvalsData;\n args: StartupArgs;\n runner?: RunnerApi;\n}\n\nfunction clampCursor(\n state: CliState,\n filteredDatasetsLength: number,\n selectedRunCount: number,\n): CliState {\n const datasetMax = filteredDatasetsLength;\n const runMax = selectedRunCount;\n const evaluatorMax = 3;\n return {\n ...state,\n datasetMenuIndex: Math.max(0, Math.min(state.datasetMenuIndex, datasetMax)),\n runMenuIndex: Math.max(0, Math.min(state.runMenuIndex, runMax)),\n evaluatorMenuIndex: Math.max(\n 0,\n Math.min(state.evaluatorMenuIndex, evaluatorMax),\n ),\n };\n}\n\nexport function EvalsCliApp({\n data,\n args,\n runner,\n}: EvalsCliAppProps): React.ReactNode {\n const { exit } = useApp();\n const { width: stdoutWidth, height: stdoutHeight } = useScreenSize();\n const [liveData, setLiveData] = useState<EvalsData>(data);\n const [runtimeMessage, setRuntimeMessage] = useState<string | undefined>();\n const overviewRowCountRef = useRef(0);\n const [state, dispatch] = useReducer(\n reduceCliState,\n createInitialState(data, args),\n );\n\n useEffect(() => {\n setLiveData(data);\n }, [data]);\n\n useEffect(() => {\n if (!runner) {\n return undefined;\n }\n return runner.subscribeRunEvents((event) => {\n setLiveData((current) => applyRunnerEvent(current, event, runner));\n if (event.type === 'RunQueued') {\n setRuntimeMessage(`Queued ${event.runId} with ${event.totalTestCases} test cases.`);\n }\n if (event.type === 'RunCompleted') {\n setRuntimeMessage(\n `Completed ${event.runId}: ${event.passedTestCases}/${event.totalTestCases} passed.`,\n );\n }\n if (event.type === 'RunFailed') {\n setRuntimeMessage(`Run failed: ${event.errorMessage}`);\n }\n });\n }, [runner]);\n\n const filteredDatasets = useMemo(\n () => getFilteredDatasets(liveData, state.searchQuery),\n [liveData, state.searchQuery],\n );\n const clampedState = clampCursor(\n state,\n filteredDatasets.length,\n getDatasetByMenuIndex(filteredDatasets, state.datasetMenuIndex)?.runs\n .length ?? 0,\n );\n const selectedDataset = getDatasetByMenuIndex(\n filteredDatasets,\n clampedState.datasetMenuIndex,\n );\n const selectedRun = getRunByMenuIndex(\n selectedDataset,\n clampedState.runMenuIndex,\n );\n const visibleEvaluators = liveData.evaluators.filter((evaluator) =>\n evaluator.name\n .toLowerCase()\n .includes(clampedState.searchQuery.toLowerCase()),\n );\n\n useInput((input, key) => {\n if (isQuitInput(input) || key.escape) {\n exit();\n return;\n }\n\n if (key.tab) {\n dispatch({ type: 'TOGGLE_FOCUS' });\n return;\n }\n\n if (isSearchInput(input)) {\n dispatch({ type: 'START_SEARCH' });\n return;\n }\n\n if (clampedState.searchMode) {\n if (key.return) {\n dispatch({ type: 'END_SEARCH' });\n return;\n }\n if (isBackKey(key)) {\n dispatch({ type: 'REMOVE_SEARCH_CHAR' });\n return;\n }\n if (isPrintableCharacter(input)) {\n dispatch({ type: 'APPEND_SEARCH', value: input });\n }\n return;\n }\n\n if (key.upArrow) {\n const max =\n clampedState.level === 'details'\n ? 100\n : clampedState.level === 'new-evaluation'\n ? visibleEvaluators.length - 1\n : 100;\n dispatch({ type: 'MOVE_UP', max });\n return;\n }\n\n if (key.downArrow) {\n let max: number;\n if (clampedState.level === 'datasets') {\n max =\n clampedState.focus === 'right'\n ? Math.max(0, overviewRowCountRef.current - OVERVIEW_PAGE_SIZE)\n : filteredDatasets.length;\n } else if (clampedState.level === 'runs') {\n max = selectedDataset?.runs.length ?? 0;\n } else if (clampedState.level === 'new-evaluation') {\n max = Math.max(0, visibleEvaluators.length - 1);\n } else {\n max = 100;\n }\n dispatch({ type: 'MOVE_DOWN', max });\n return;\n }\n\n if (key.return) {\n dispatch({\n type: 'ENTER',\n hasDataset: Boolean(selectedDataset),\n hasRun: Boolean(selectedRun),\n });\n if (clampedState.level === 'new-evaluation') {\n const evaluator = visibleEvaluators[clampedState.evaluatorMenuIndex];\n if (evaluator) {\n dispatch({ type: 'TOGGLE_EVALUATOR', evaluatorId: evaluator.id });\n }\n }\n return;\n }\n\n if (isBackKey(key) || input === '\\x7f' || input === '\\b') {\n dispatch({ type: 'BACK' });\n return;\n }\n\n if (input.toLowerCase() === 'c') {\n dispatch({ type: 'CLEAR_WARNINGS' });\n setRuntimeMessage(undefined);\n return;\n }\n\n if (input.toLowerCase() === 's' && clampedState.level === 'new-evaluation') {\n if (!runner) {\n setRuntimeMessage('Runner unavailable: cannot start evaluation.');\n return;\n }\n if (!selectedDataset) {\n setRuntimeMessage('Select a dataset before starting a new evaluation.');\n return;\n }\n if (clampedState.selectedEvaluatorIds.length === 0) {\n setRuntimeMessage('Select at least one evaluator before starting.');\n return;\n }\n\n void runner\n .runDatasetWith({\n datasetId: selectedDataset.id,\n evaluatorIds: clampedState.selectedEvaluatorIds,\n })\n .then((snapshot) => {\n setRuntimeMessage(\n `Started ${snapshot.runId} on ${selectedDataset.name} (${snapshot.totalTestCases} cases).`,\n );\n })\n .catch((error) => {\n setRuntimeMessage(\n error instanceof Error ? error.message : 'Failed to start evaluation.',\n );\n });\n }\n });\n\n const renderContent = () => {\n if (clampedState.level === 'new-evaluation') {\n return (\n <NewEvaluationView\n state={clampedState}\n data={liveData}\n visibleEvaluators={visibleEvaluators}\n />\n );\n }\n if (clampedState.level === 'datasets') {\n return (\n <DatasetsView\n state={clampedState}\n filteredDatasets={filteredDatasets}\n selectedDataset={selectedDataset}\n overviewRowCountRef={overviewRowCountRef}\n />\n );\n }\n if (clampedState.level === 'runs') {\n return (\n <RunsView\n state={clampedState}\n dataset={selectedDataset}\n selectedRun={selectedRun}\n />\n );\n }\n return (\n <RunDetailsView\n state={clampedState}\n dataset={selectedDataset}\n selectedRun={selectedRun}\n evaluators={liveData.evaluators}\n />\n );\n };\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n width={stdoutWidth}\n height={stdoutHeight}\n >\n <Box\n borderStyle=\"round\"\n borderColor=\"cyan\"\n paddingX={1}\n width={stdoutWidth}\n >\n <Text>\n {getBreadcrumbText(\n clampedState,\n selectedDataset?.name,\n selectedRun?.label,\n )}\n </Text>\n </Box>\n\n {clampedState.startupWarnings.length > 0 && (\n <Box\n marginTop={1}\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n flexDirection=\"column\"\n width={stdoutWidth}\n >\n <Text color=\"yellow\">Startup warnings:</Text>\n {clampedState.startupWarnings.map((warning, index) => (\n <Text key={`${warning}-${index}`}>{warning}</Text>\n ))}\n </Box>\n )}\n\n {clampedState.searchMode && (\n <Box\n marginTop={1}\n borderStyle=\"round\"\n borderColor=\"magenta\"\n paddingX={1}\n width={stdoutWidth}\n >\n <Text color=\"magenta\" bold>Search: </Text>\n <Text color=\"white\">{clampedState.searchQuery}</Text>\n </Box>\n )}\n\n {runtimeMessage && (\n <Box\n marginTop={1}\n borderStyle=\"round\"\n borderColor=\"blue\"\n paddingX={1}\n width={stdoutWidth}\n >\n <Text color=\"blue\">{runtimeMessage}</Text>\n </Box>\n )}\n\n <Box\n marginTop={1}\n flexGrow={1}\n width={stdoutWidth}\n flexDirection=\"row\"\n >\n {renderContent()}\n </Box>\n\n <Box marginTop={1} paddingX={1}>\n <Text color=\"gray\">{getFooterText(clampedState)}</Text>\n </Box>\n </Box>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\nimport type { CliState } from '../types';\n\nconst SEP = ' ';\nconst ARROW = '›';\n\nexport function getBreadcrumbText(\n state: CliState,\n datasetName?: string,\n runLabel?: string,\n): React.ReactNode {\n const dim = (s: string, k?: string) => (\n <Text key={k ?? s} color=\"gray\">\n {s}\n </Text>\n );\n const accent = (s: string) => (\n <Text key={s} color=\"cyan\" bold>\n {s}\n </Text>\n );\n\n if (state.level === 'datasets') {\n return (\n <>\n {dim('Evaluations')}\n {SEP}\n {dim(ARROW, 'a1')}\n {SEP}\n {accent('Datasets')}\n </>\n );\n }\n if (state.level === 'runs') {\n return (\n <>\n {dim('Evaluations')}\n {SEP}\n {dim(ARROW, 'a1')}\n {SEP}\n {dim('Dataset:')}{' '}\n <Text key=\"ds\" color=\"white\">\n {datasetName ?? '-'}\n </Text>\n {SEP}\n {dim(ARROW, 'a2')}\n {SEP}\n {accent('Runs')}\n </>\n );\n }\n if (state.level === 'details') {\n return (\n <>\n {dim('Evaluations')}\n {SEP}\n {dim(ARROW, 'a1')}\n {SEP}\n {dim('Dataset:')}{' '}\n <Text key=\"ds\" color=\"white\">\n {datasetName ?? '-'}\n </Text>\n {SEP}\n {dim(ARROW, 'a2')}\n {SEP}\n {dim('Run:')}{' '}\n <Text key=\"rl\" color=\"white\">\n {runLabel ?? '-'}\n </Text>\n {SEP}\n {dim(ARROW, 'a3')}\n {SEP}\n {accent('Details')}\n </>\n );\n }\n return (\n <>\n {dim('Evaluations')}\n {SEP}\n {dim(ARROW, 'a1')}\n {SEP}\n {accent('New evaluation')}\n {SEP}\n {dim(ARROW, 'a2')}\n {SEP}\n {dim('Select evaluators', 'sel')}\n </>\n );\n}\n","/** @jsxImportSource react */\nimport type { CliState } from '../types';\n\nexport function getFooterText(state: CliState): string {\n if (state.level === 'datasets') {\n return state.focus === 'right'\n ? '↑↓ scroll Tab focus left / search q quit'\n : '↑↓ move Enter open Tab focus right / search q quit';\n }\n if (state.level === 'runs') {\n return '↑↓ move Enter details Backspace datasets Tab focus q quit';\n }\n if (state.level === 'details') {\n return '↑↓ scroll Backspace runs Tab focus q quit';\n }\n return '↑↓ move Enter add/remove S start run / search Esc cancel q quit';\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\n\ninterface ListItemProps {\n selected: boolean;\n label: string;\n itemKey: string;\n}\n\nexport function ListItem({\n selected,\n label,\n itemKey,\n}: ListItemProps): React.ReactNode {\n return (\n <Text key={itemKey} color={selected ? 'cyan' : 'gray'} bold={selected}>\n {selected ? '▸ ' : ' '}\n {label}\n </Text>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Box } from 'ink';\n\ninterface PaneProps {\n children: React.ReactNode;\n width?: number;\n flexGrow?: number;\n marginLeft?: number;\n focused?: boolean;\n}\n\nexport function Pane({\n children,\n width,\n flexGrow,\n marginLeft,\n focused = false,\n}: PaneProps): React.ReactNode {\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n flexGrow={flexGrow}\n marginLeft={marginLeft}\n borderStyle={focused ? 'single' : 'round'}\n borderColor={focused ? 'cyan' : 'gray'}\n paddingX={1}\n >\n {children}\n </Box>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\nimport type { CliState, EvalDataset, EvalRun } from '../types';\nimport { ListItem } from './ListItem';\nimport { Pane } from './Pane';\nimport { SectionHeader } from './SectionHeader';\nimport { StatusText } from './StatusText';\n\nconst LEFT_PANE_WIDTH = 44;\n\ninterface RunsSidebarProps {\n state: CliState;\n dataset: EvalDataset | undefined;\n runs: EvalRun[];\n}\n\nexport function RunsSidebar({\n state,\n runs,\n}: RunsSidebarProps): React.ReactNode {\n const focused = state.focus === 'left';\n return (\n <Pane width={LEFT_PANE_WIDTH} focused={focused}>\n <SectionHeader>Runs</SectionHeader>\n <ListItem\n selected={state.runMenuIndex === 0}\n label=\"New evaluation\"\n itemKey=\"runs-new-eval\"\n />\n {runs.map((run, index) => (\n <Text\n key={run.id}\n color={state.runMenuIndex === index + 1 ? 'cyan' : 'gray'}\n bold={state.runMenuIndex === index + 1}\n >\n {state.runMenuIndex === index + 1 ? '▸ ' : ' '}\n {run.label} <StatusText status={run.status} />\n </Text>\n ))}\n </Pane>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\n\ninterface SectionHeaderProps {\n children: React.ReactNode;\n}\n\nexport function SectionHeader({\n children,\n}: SectionHeaderProps): React.ReactNode {\n return (\n <Text color=\"cyan\" bold>\n {children}\n </Text>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\nimport type { EvalStatus } from '../types';\n\ninterface StatusTextProps {\n status: EvalStatus;\n}\n\nexport function StatusText({ status }: StatusTextProps): React.ReactNode {\n const color = status === 'PASS' ? 'green' : status === 'RUNNING' ? 'yellow' : 'red';\n return <Text color={color}>({status})</Text>;\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\n\n/** Block characters for sparkline: ▁▂▃▄▅▆▇█ (8 levels) */\nconst BLOCKS = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];\n\ninterface SparklineProps {\n /** Values to plot (e.g. latency in ms) */\n data: number[];\n /** Max width in chars (default: data length or 24) */\n width?: number;\n /** Optional label prefix */\n label?: string;\n}\n\nexport function Sparkline({\n data,\n width,\n label,\n}: SparklineProps): React.ReactNode {\n if (data.length === 0) return null;\n\n const max = Math.max(...data);\n const min = Math.min(...data);\n const range = max - min || 1;\n const targetWidth = width ?? Math.min(data.length, 24);\n\n let values: number[];\n if (data.length <= targetWidth) {\n values = data;\n } else {\n const step = data.length / targetWidth;\n values = Array.from({ length: targetWidth }, (_, i) => {\n const start = Math.floor(i * step);\n const end = Math.floor((i + 1) * step);\n const slice = data.slice(start, end);\n return slice.reduce((a, b) => a + b, 0) / slice.length;\n });\n }\n\n const spark = values\n .map((v) => {\n const normalized = (v - min) / range;\n const idx = Math.min(7, Math.floor(normalized * 8));\n return BLOCKS[idx];\n })\n .join('');\n\n return (\n <Text>\n {label !== undefined && label !== '' ? (\n <Text color=\"gray\">{label.padEnd(14)} </Text>\n ) : null}\n <Text color=\"cyan\">{spark}</Text>\n </Text>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\n\ninterface TextBarProps {\n label: string;\n value: number;\n max?: number;\n /** Label width (default 14 to match inspiration) */\n labelWidth?: number;\n /** Bar width in chars (default 20) */\n barWidth?: number;\n /** Format value for display (e.g. v => `${v}%`) */\n format?: (v: number) => string;\n /** Color bar by value: green > 70, yellow 40-70, red < 40 */\n colorByValue?: boolean;\n}\n\nfunction barColor(pct: number): 'green' | 'yellow' | 'red' | undefined {\n if (pct >= 70) return 'green';\n if (pct >= 40) return 'yellow';\n return 'red';\n}\n\nexport function TextBar({\n label,\n value,\n max = 100,\n labelWidth = 14,\n barWidth = 20,\n format = (v) => String(v),\n colorByValue = true,\n}: TextBarProps): React.ReactNode {\n const clamped = Math.max(0, Math.min(max, value));\n const pct = max > 0 ? (clamped / max) * 100 : 0;\n const filled = Math.round((clamped / max) * barWidth);\n const filledBar = '█'.repeat(filled);\n const emptyBar = '░'.repeat(Math.max(0, barWidth - filled));\n const color = colorByValue ? barColor(pct) : undefined;\n\n return (\n <Text>\n <Text color=\"gray\">{label.padEnd(labelWidth)}</Text>\n {' ['}\n {color ? (\n <>\n <Text color={color}>{filledBar}</Text>\n <Text color=\"gray\">{emptyBar}</Text>\n </>\n ) : (\n filledBar + emptyBar\n )}\n {'] '}\n <Text color={color ?? 'white'} bold>{format(value)}</Text>\n </Text>\n );\n}\n","import type { Key } from 'ink';\n\nexport function isQuitInput(input: string): boolean {\n return input.toLowerCase() === 'q';\n}\n\nexport function isSearchInput(input: string): boolean {\n return input === '/';\n}\n\nexport function isPrintableCharacter(input: string): boolean {\n return input.length === 1 && input >= ' ' && input !== '\\u007f';\n}\n\nexport function isBackKey(key: Key): boolean {\n return key.backspace || key.delete;\n}\n","{\n \"datasets\": [\n {\n \"id\": \"onboarding-flows\",\n \"name\": \"onboarding-flows\",\n \"overview\": \"Evaluate first-user journeys and schema compliance for generated onboarding payloads.\",\n \"runs\": [\n {\n \"id\": \"run_2026-02-17_2044\",\n \"label\": \"2026-02-17 20:44\",\n \"status\": \"FAILED\",\n \"performance\": {\n \"passRate\": 96,\n \"avgScore\": 0.91,\n \"latencyP95Ms\": 710,\n \"latencyAvgMs\": 502,\n \"tokensAvg\": 171,\n \"tokensP95\": 230,\n \"costUsd\": 0.0024,\n \"latencyHistoryMs\": [380, 420, 510, 480, 550, 620, 590, 710, 520, 480, 530, 600]\n },\n \"dimensions\": [\n { \"name\": \"correctness\", \"score\": 82 },\n { \"name\": \"faithfulness\", \"score\": 79 },\n { \"name\": \"brevity\", \"score\": 68 },\n { \"name\": \"style\", \"score\": 90 }\n ],\n \"checks\": [\n { \"name\": \"json_schema\", \"passed\": false, \"detail\": \"3 violations\" },\n { \"name\": \"tool_calls\", \"passed\": true, \"detail\": \"0 unexpected\" },\n { \"name\": \"pii_leak\", \"passed\": true },\n { \"name\": \"jailbreak\", \"passed\": true }\n ],\n \"failures\": [\n { \"title\": \"product_parser › conforms to schema (price: string)\" },\n { \"title\": \"checkout › tool-call count mismatch\" }\n ],\n \"meta\": {\n \"model\": \"gpt-4o-mini\",\n \"provider\": \"OpenAI\",\n \"commit\": \"2f3c1a9\",\n \"branch\": \"main\",\n \"seed\": 42,\n \"concurrency\": 4,\n \"duration\": \"00:01:12\",\n \"artifact\": \"./eval-results/run_2026-02-17.jsonl\"\n }\n },\n {\n \"id\": \"run_2026-02-16_1112\",\n \"label\": \"2026-02-16 11:12\",\n \"status\": \"PASS\",\n \"performance\": {\n \"passRate\": 99,\n \"avgScore\": 0.95,\n \"latencyP95Ms\": 650,\n \"latencyAvgMs\": 488,\n \"tokensAvg\": 168,\n \"tokensP95\": 220,\n \"costUsd\": 0.002,\n \"latencyHistoryMs\": [420, 450, 480, 460, 520, 490, 510, 650, 440, 470, 500, 480]\n },\n \"dimensions\": [\n { \"name\": \"correctness\", \"score\": 89 },\n { \"name\": \"faithfulness\", \"score\": 88 },\n { \"name\": \"brevity\", \"score\": 72 },\n { \"name\": \"style\", \"score\": 93 }\n ],\n \"checks\": [\n { \"name\": \"json_schema\", \"passed\": true, \"detail\": \"0 violations\" },\n { \"name\": \"tool_calls\", \"passed\": true, \"detail\": \"0 unexpected\" },\n { \"name\": \"pii_leak\", \"passed\": true },\n { \"name\": \"jailbreak\", \"passed\": true }\n ],\n \"failures\": [],\n \"meta\": {\n \"model\": \"gpt-4o-mini\",\n \"provider\": \"OpenAI\",\n \"commit\": \"0d24f8f\",\n \"branch\": \"main\",\n \"seed\": 42,\n \"concurrency\": 4,\n \"duration\": \"00:01:06\",\n \"artifact\": \"./eval-results/run_2026-02-16.jsonl\"\n }\n },\n {\n \"id\": \"run_2026-02-15_0921\",\n \"label\": \"2026-02-15 09:21\",\n \"status\": \"PASS\",\n \"performance\": {\n \"passRate\": 98,\n \"avgScore\": 0.93,\n \"latencyP95Ms\": 680,\n \"latencyAvgMs\": 495,\n \"tokensAvg\": 175,\n \"tokensP95\": 235,\n \"costUsd\": 0.0022,\n \"latencyHistoryMs\": [450, 480, 520, 490, 550, 580, 620, 680, 510, 470, 530, 560]\n },\n \"dimensions\": [\n { \"name\": \"correctness\", \"score\": 86 },\n { \"name\": \"faithfulness\", \"score\": 84 },\n { \"name\": \"brevity\", \"score\": 70 },\n { \"name\": \"style\", \"score\": 91 }\n ],\n \"checks\": [\n { \"name\": \"json_schema\", \"passed\": true, \"detail\": \"0 violations\" },\n { \"name\": \"tool_calls\", \"passed\": true, \"detail\": \"0 unexpected\" },\n { \"name\": \"pii_leak\", \"passed\": true },\n { \"name\": \"jailbreak\", \"passed\": true }\n ],\n \"failures\": [],\n \"meta\": {\n \"model\": \"gpt-4o-mini\",\n \"provider\": \"OpenAI\",\n \"commit\": \"a1b2c3d\",\n \"branch\": \"main\",\n \"seed\": 42,\n \"concurrency\": 4,\n \"duration\": \"00:01:08\",\n \"artifact\": \"./eval-results/run_2026-02-15.jsonl\"\n }\n }\n ]\n },\n {\n \"id\": \"tool-calls\",\n \"name\": \"tool-calls\",\n \"overview\": \"Validate function-call conformance and unexpected tool invocation behavior.\",\n \"runs\": [\n {\n \"id\": \"run_2026-02-14_1530\",\n \"label\": \"2026-02-14 15:30\",\n \"status\": \"PASS\",\n \"performance\": {\n \"passRate\": 100,\n \"avgScore\": 1.0,\n \"latencyP95Ms\": 320,\n \"latencyAvgMs\": 280,\n \"tokensAvg\": 45,\n \"tokensP95\": 62,\n \"costUsd\": 0.0008,\n \"latencyHistoryMs\": [250, 270, 290, 280, 310, 320, 265, 290, 300, 275]\n },\n \"dimensions\": [\n { \"name\": \"contract_match\", \"score\": 100 },\n { \"name\": \"arg_validity\", \"score\": 100 }\n ],\n \"checks\": [\n { \"name\": \"tool_calls\", \"passed\": true, \"detail\": \"0 unexpected\" }\n ],\n \"failures\": [],\n \"meta\": {\n \"model\": \"gpt-4o-mini\",\n \"provider\": \"OpenAI\",\n \"commit\": \"e4f5g6h\",\n \"branch\": \"feat/tools\",\n \"seed\": 42,\n \"concurrency\": 8,\n \"duration\": \"00:00:45\",\n \"artifact\": \"./eval-results/tool-calls_2026-02-14.jsonl\"\n }\n }\n ]\n },\n {\n \"id\": \"json-schema\",\n \"name\": \"json-schema\",\n \"overview\": \"Stress-test schema fidelity across generated extraction payloads.\",\n \"runs\": []\n }\n ],\n \"evaluators\": [\n { \"id\": \"json-schema-validator\", \"name\": \"JSON Schema Validator\", \"configPreview\": \"strict=true\" },\n { \"id\": \"tool-call-contract-checker\", \"name\": \"Tool-call Contract Checker\", \"configPreview\": \"unexpectedCalls=error\" },\n { \"id\": \"rubric-judge\", \"name\": \"Rubric Judge (LLM)\", \"configPreview\": \"model=gpt-4o-mini; scale=0-100\" },\n { \"id\": \"pii-leak-detector\", \"name\": \"PII Leak Detector\", \"configPreview\": \"redact=false\" }\n ]\n}\n","import type { CliState, EvalsData, EvalDataset, EvalRun, StartupArgs } from './types';\nimport type {\n CollectedDataset,\n CollectedEvaluator,\n RunSnapshot,\n RunnerApi,\n RunnerEvent,\n} from '../runner';\n\nimport mockData from './data.mock.json';\n\nexport function loadMockData(): EvalsData {\n return mockData as EvalsData;\n}\n\nfunction toSlug(input: string): string {\n return input.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');\n}\n\nfunction toEvalRun(snapshot: RunSnapshot): EvalRun {\n const total = snapshot.totalTestCases === 0 ? 1 : snapshot.totalTestCases;\n const passRate = Math.round((snapshot.passedTestCases / total) * 100);\n const avgScore = snapshot.passedTestCases / total;\n const durationMs = snapshot.finishedAt\n ? snapshot.finishedAt - (snapshot.startedAt ?? snapshot.queuedAt)\n : Date.now() - (snapshot.startedAt ?? snapshot.queuedAt);\n\n return {\n id: snapshot.runId,\n label: snapshot.runId.slice(0, 12),\n status:\n snapshot.status === 'completed'\n ? 'PASS'\n : snapshot.status === 'failed'\n ? 'FAILED'\n : 'RUNNING',\n performance: {\n passRate,\n avgScore,\n latencyP95Ms: Math.max(1, Math.floor(durationMs / Math.max(1, total))),\n latencyAvgMs: Math.max(1, Math.floor(durationMs / Math.max(1, total))),\n tokensAvg: 0,\n tokensP95: 0,\n costUsd: 0,\n latencyHistoryMs: [durationMs],\n },\n dimensions: [\n { name: 'passed', score: Math.round((snapshot.passedTestCases / total) * 100) },\n { name: 'failed', score: Math.round((snapshot.failedTestCases / total) * 100) },\n ],\n checks: [\n {\n name: 'run_status',\n passed: snapshot.status === 'completed',\n detail: snapshot.status,\n },\n ],\n failures:\n snapshot.errorMessage && snapshot.errorMessage.length > 0\n ? [{ title: snapshot.errorMessage }]\n : [],\n meta: {\n model: 'n/a',\n provider: 'runner',\n commit: 'local',\n branch: 'local',\n seed: 0,\n concurrency: 1,\n duration: `${durationMs}ms`,\n artifact: snapshot.artifactPath,\n },\n };\n}\n\nfunction toEvalDataset(\n item: CollectedDataset,\n snapshots: ReadonlyArray<RunSnapshot>,\n): EvalDataset {\n const runs = snapshots\n .filter((snapshot) => snapshot.datasetId === item.id)\n .sort((a, b) => b.queuedAt - a.queuedAt)\n .map(toEvalRun);\n\n return {\n id: item.id,\n name: item.dataset.getName(),\n overview: `Discovered from ${item.filePath}`,\n runs,\n };\n}\n\nfunction toEvaluatorOption(item: CollectedEvaluator): EvalsData['evaluators'][number] {\n return {\n id: item.id,\n name: item.evaluator.getName() ?? toSlug(item.id),\n configPreview: `Source: ${item.filePath}`,\n };\n}\n\nexport async function loadRunnerData(runner: RunnerApi): Promise<EvalsData> {\n const [datasets, evaluators, diskSnapshots] = await Promise.all([\n runner.collectDatasets(),\n runner.collectEvaluators(),\n runner.loadRunSnapshotsFromArtifacts(),\n ]);\n const memSnapshots = runner.getAllRunSnapshots();\n const seen = new Set(memSnapshots.map((s) => s.runId));\n const fromDisk = diskSnapshots.filter((s) => !seen.has(s.runId));\n const snapshots = [...memSnapshots, ...fromDisk].sort(\n (a, b) => b.queuedAt - a.queuedAt,\n );\n\n if (datasets.length === 0 && evaluators.length === 0) {\n return loadMockData();\n }\n\n return {\n datasets: datasets.map((dataset) => toEvalDataset(dataset, snapshots)),\n evaluators: evaluators.map(toEvaluatorOption),\n };\n}\n\nexport function applyRunnerEvent(\n data: EvalsData,\n event: RunnerEvent,\n runner: RunnerApi,\n): EvalsData {\n const snapshot = runner.getRunSnapshot(event.runId);\n if (!snapshot) {\n return data;\n }\n\n const dataset = data.datasets.find((item) => item.id === snapshot.datasetId);\n if (!dataset) {\n return data;\n }\n\n const run = toEvalRun(snapshot);\n const hasRun = dataset.runs.some((item) => item.id === run.id);\n const nextRuns = hasRun\n ? dataset.runs.map((item) => (item.id === run.id ? run : item))\n : [run, ...dataset.runs];\n\n return {\n ...data,\n datasets: data.datasets.map((item) =>\n item.id === dataset.id ? { ...item, runs: nextRuns } : item,\n ),\n };\n}\n\nexport function parseStartupArgs(argv: string[]): StartupArgs {\n const args: StartupArgs = { unknownArgs: [] };\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (token === '--dataset' && argv[index + 1]) {\n args.datasetId = argv[index + 1];\n index += 1;\n continue;\n }\n if (token === '--run' && argv[index + 1]) {\n args.runId = argv[index + 1];\n index += 1;\n continue;\n }\n if (token === '--search' && argv[index + 1]) {\n args.search = argv[index + 1];\n index += 1;\n continue;\n }\n args.unknownArgs.push(token);\n }\n return args;\n}\n\nexport function getFilteredDatasets(data: EvalsData, searchQuery: string): EvalDataset[] {\n const query = searchQuery.trim().toLowerCase();\n if (!query) {\n return data.datasets;\n }\n return data.datasets.filter((dataset) => dataset.name.toLowerCase().includes(query));\n}\n\nexport function getDatasetByMenuIndex(datasets: EvalDataset[], menuIndex: number): EvalDataset | undefined {\n if (menuIndex <= 0) {\n return undefined;\n }\n return datasets[menuIndex - 1];\n}\n\nexport function getRunByMenuIndex(dataset: EvalDataset | undefined, menuIndex: number): EvalRun | undefined {\n if (!dataset || menuIndex <= 0) {\n return undefined;\n }\n return dataset.runs[menuIndex - 1];\n}\n\nexport function createInitialState(data: EvalsData, args: StartupArgs): CliState {\n const warnings: string[] = [];\n if (args.unknownArgs.length > 0) {\n warnings.push(`Unknown args: ${args.unknownArgs.join(', ')}`);\n warnings.push('Supported: --dataset <id>, --run <id>, --search <term>');\n }\n\n const searchQuery = args.search ?? '';\n const filteredDatasets = getFilteredDatasets(data, searchQuery);\n const datasetByArg = filteredDatasets.find((dataset) => dataset.id === args.datasetId);\n const datasetMenuIndex = datasetByArg ? filteredDatasets.indexOf(datasetByArg) + 1 : 0;\n\n let level: CliState['level'] = 'datasets';\n let runMenuIndex = 0;\n\n if (datasetByArg) {\n level = 'runs';\n } else if (args.datasetId) {\n warnings.push(`Dataset \"${args.datasetId}\" not found.`);\n }\n\n if (datasetByArg && args.runId) {\n const runIndex = datasetByArg.runs.findIndex((run) => run.id === args.runId);\n if (runIndex >= 0) {\n runMenuIndex = runIndex + 1;\n level = 'details';\n } else {\n warnings.push(`Run \"${args.runId}\" not found in dataset \"${datasetByArg.id}\".`);\n }\n }\n\n return {\n level,\n focus: 'left',\n datasetMenuIndex,\n runMenuIndex,\n detailsScrollOffset: 0,\n overviewScrollOffset: 0,\n selectedEvaluatorIds: data.evaluators.slice(0, 2).map((item) => item.id),\n evaluatorMenuIndex: 0,\n searchQuery,\n searchMode: false,\n startupWarnings: warnings,\n };\n}\n\nexport type CliAction =\n | { type: 'MOVE_UP'; max: number }\n | { type: 'MOVE_DOWN'; max: number }\n | { type: 'ENTER'; hasDataset: boolean; hasRun: boolean }\n | { type: 'BACK' }\n | { type: 'TOGGLE_FOCUS' }\n | { type: 'START_SEARCH' }\n | { type: 'END_SEARCH' }\n | { type: 'APPEND_SEARCH'; value: string }\n | { type: 'REMOVE_SEARCH_CHAR' }\n | { type: 'TOGGLE_EVALUATOR'; evaluatorId: string }\n | { type: 'CLEAR_WARNINGS' };\n\nexport function reduceCliState(state: CliState, action: CliAction): CliState {\n if (action.type === 'MOVE_UP') {\n if (state.searchMode) {\n return state;\n }\n if (state.level === 'details' && state.focus === 'right') {\n return { ...state, detailsScrollOffset: Math.max(0, state.detailsScrollOffset - 1) };\n }\n if (state.level === 'datasets' && state.focus === 'right') {\n return { ...state, overviewScrollOffset: Math.max(0, state.overviewScrollOffset - 1) };\n }\n if (state.level === 'datasets') {\n return { ...state, datasetMenuIndex: Math.max(0, state.datasetMenuIndex - 1), overviewScrollOffset: 0 };\n }\n if (state.level === 'runs') {\n return { ...state, runMenuIndex: Math.max(0, state.runMenuIndex - 1) };\n }\n if (state.level === 'new-evaluation') {\n return { ...state, evaluatorMenuIndex: Math.max(0, state.evaluatorMenuIndex - 1) };\n }\n return state;\n }\n\n if (action.type === 'MOVE_DOWN') {\n if (state.searchMode) {\n return state;\n }\n if (state.level === 'details' && state.focus === 'right') {\n return { ...state, detailsScrollOffset: Math.min(action.max, state.detailsScrollOffset + 1) };\n }\n if (state.level === 'datasets' && state.focus === 'right') {\n return { ...state, overviewScrollOffset: Math.min(action.max, state.overviewScrollOffset + 1) };\n }\n if (state.level === 'datasets') {\n return { ...state, datasetMenuIndex: Math.min(action.max, state.datasetMenuIndex + 1), overviewScrollOffset: 0 };\n }\n if (state.level === 'runs') {\n return { ...state, runMenuIndex: Math.min(action.max, state.runMenuIndex + 1) };\n }\n if (state.level === 'new-evaluation') {\n return { ...state, evaluatorMenuIndex: Math.min(action.max, state.evaluatorMenuIndex + 1) };\n }\n return state;\n }\n\n if (action.type === 'ENTER') {\n if (state.searchMode) {\n return { ...state, searchMode: false };\n }\n if (state.level === 'datasets') {\n if (state.datasetMenuIndex === 0) {\n return { ...state, level: 'new-evaluation' };\n }\n if (action.hasDataset) {\n return { ...state, level: 'runs', runMenuIndex: 0 };\n }\n return state;\n }\n if (state.level === 'runs') {\n if (state.runMenuIndex === 0) {\n return { ...state, level: 'new-evaluation' };\n }\n if (action.hasRun) {\n return { ...state, level: 'details', detailsScrollOffset: 0 };\n }\n return state;\n }\n if (state.level === 'new-evaluation') {\n return state;\n }\n return state;\n }\n\n if (action.type === 'BACK') {\n if (state.searchMode) {\n return { ...state, searchMode: false };\n }\n if (state.level === 'details') {\n return { ...state, level: 'runs' };\n }\n if (state.level === 'runs' || state.level === 'new-evaluation') {\n return { ...state, level: 'datasets' };\n }\n return state;\n }\n\n if (action.type === 'TOGGLE_FOCUS') {\n return { ...state, focus: state.focus === 'left' ? 'right' : 'left' };\n }\n\n if (action.type === 'START_SEARCH') {\n return { ...state, searchMode: true };\n }\n\n if (action.type === 'END_SEARCH') {\n return { ...state, searchMode: false };\n }\n\n if (action.type === 'APPEND_SEARCH') {\n return { ...state, searchQuery: `${state.searchQuery}${action.value}` };\n }\n\n if (action.type === 'REMOVE_SEARCH_CHAR') {\n return { ...state, searchQuery: state.searchQuery.slice(0, -1) };\n }\n\n if (action.type === 'TOGGLE_EVALUATOR') {\n const exists = state.selectedEvaluatorIds.includes(action.evaluatorId);\n return {\n ...state,\n selectedEvaluatorIds: exists\n ? state.selectedEvaluatorIds.filter((id) => id !== action.evaluatorId)\n : [...state.selectedEvaluatorIds, action.evaluatorId],\n };\n }\n\n if (action.type === 'CLEAR_WARNINGS') {\n return { ...state, startupWarnings: [] };\n }\n\n return state;\n}\n","/** @jsxImportSource react */\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { resolve } from 'node:path';\nimport { Box, Text } from 'ink';\nimport { LineGraph } from '@pppp606/ink-chart';\nimport {\n parseArtifactFile,\n type ParsedTestCaseProgress,\n} from '../../../runner';\nimport { toNumericScoreFromScores } from '../../../runner/score-utils';\nimport type { CliState, EvalDataset, EvalRun } from '../../types';\nimport { ListItem, Pane, SectionHeader, TextBar } from '../../components';\n\nconst LEFT_PANE_WIDTH = 44;\nconst MAX_RUNS_FOR_CHART = 12;\nconst MAX_RUNS_FOR_TREND = 20;\nconst TREND_BATCH_SIZE = 4;\n\ninterface RunScore {\n runId: string;\n label: string;\n value: number;\n}\n\nfunction extractRunAverageScore(\n testCases: ParsedTestCaseProgress[],\n): number | undefined {\n const scores: number[] = [];\n for (const tc of testCases) {\n for (const es of tc.evaluatorScores) {\n const n = toNumericScoreFromScores(es.scores);\n if (n !== undefined) {\n scores.push(n);\n }\n }\n }\n if (scores.length === 0) return undefined;\n return scores.reduce((a, b) => a + b, 0) / scores.length;\n}\n\nasync function loadRunScores(runs: EvalRun[]): Promise<RunScore[]> {\n const results: RunScore[] = [];\n for (const run of runs) {\n const artifact = run.meta?.artifact;\n if (!artifact) continue;\n try {\n const path = resolve(artifact);\n const testCases = await parseArtifactFile(path);\n const avg = extractRunAverageScore(testCases);\n if (avg !== undefined) {\n results.push({\n runId: run.id,\n label: run.label,\n value: avg,\n });\n }\n } catch {\n // Skip runs with unreadable artifacts\n }\n }\n return results;\n}\n\nfunction batchAverage(values: number[], batchSize: number): number[] {\n const batches: number[] = [];\n for (let i = 0; i < values.length; i += batchSize) {\n const slice = values.slice(i, i + batchSize);\n if (slice.length > 0) {\n batches.push(slice.reduce((a, b) => a + b, 0) / slice.length);\n }\n }\n return batches;\n}\n\nexport const OVERVIEW_PAGE_SIZE = 15;\n\ninterface DatasetsViewProps {\n state: CliState;\n filteredDatasets: EvalDataset[];\n selectedDataset: EvalDataset | undefined;\n /** Ref updated with overview row count for scroll max */\n overviewRowCountRef?: React.MutableRefObject<number>;\n}\n\nexport function DatasetsView({\n state,\n filteredDatasets,\n selectedDataset,\n overviewRowCountRef,\n}: DatasetsViewProps): React.ReactNode {\n const leftFocused = state.focus === 'left';\n const rightFocused = state.focus === 'right';\n const [runScores, setRunScores] = useState<RunScore[]>([]);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!selectedDataset?.runs?.length) {\n setRunScores([]);\n return;\n }\n setLoading(true);\n const runs = selectedDataset.runs.slice(0, MAX_RUNS_FOR_TREND);\n loadRunScores(runs)\n .then(setRunScores)\n .finally(() => setLoading(false));\n }, [selectedDataset?.id, selectedDataset?.runs?.length]);\n\n const barData = runScores.slice(0, MAX_RUNS_FOR_CHART).reverse();\n const trendValues = runScores\n .slice(0, MAX_RUNS_FOR_TREND)\n .map((r: RunScore) => r.value)\n .reverse();\n const trendBatched = batchAverage(trendValues, TREND_BATCH_SIZE);\n\n const overviewRows = useMemo((): React.ReactNode[] => {\n const rows: React.ReactNode[] = [];\n rows.push(\n <Text key=\"overview\" color=\"gray\">\n {selectedDataset?.overview ?? 'Select a dataset to inspect prior runs.'}\n </Text>,\n );\n if (selectedDataset && selectedDataset.runs.length > 0) {\n if (loading) {\n rows.push(\n <Text key=\"loading\" color=\"gray\">\n Loading run scores…\n </Text>,\n );\n } else if (runScores.length > 0) {\n rows.push(\n <Text key=\"scores-header\" color=\"gray\">\n Scores (last runs)\n </Text>,\n );\n for (const d of barData) {\n rows.push(\n <TextBar\n key={d.runId}\n label={d.label}\n value={d.value}\n labelWidth={14}\n barWidth={24}\n max={100}\n format={(v) => v.toFixed(1)}\n />,\n );\n }\n if (trendBatched.length > 0) {\n rows.push(\n <Text key=\"trend-header\" color=\"gray\">\n Avg trend (last 20, batched by 4)\n </Text>,\n );\n rows.push(\n <Box key=\"trend-graph\">\n <LineGraph\n data={[{ values: trendBatched, color: 'cyan' }]}\n height={5}\n width={45}\n showYAxis={true}\n xLabels={['older', 'newer']}\n />\n </Box>,\n );\n }\n }\n }\n return rows;\n }, [\n selectedDataset?.overview,\n selectedDataset?.runs?.length,\n loading,\n runScores,\n barData,\n trendBatched,\n ]);\n\n if (overviewRowCountRef) {\n overviewRowCountRef.current = overviewRows.length;\n }\n\n const offset = Math.max(0, state.overviewScrollOffset);\n const visibleRows = overviewRows.slice(offset, offset + OVERVIEW_PAGE_SIZE);\n\n return (\n <>\n <Pane width={LEFT_PANE_WIDTH} focused={leftFocused}>\n <SectionHeader>Datasets</SectionHeader>\n <ListItem\n selected={state.datasetMenuIndex === 0}\n label=\"New evaluation\"\n itemKey=\"datasets-new-eval\"\n />\n {filteredDatasets.map((dataset, index) => (\n <ListItem\n key={dataset.id}\n selected={state.datasetMenuIndex === index + 1}\n label={dataset.name}\n itemKey={`dataset-${dataset.id}`}\n />\n ))}\n </Pane>\n <Pane flexGrow={1} marginLeft={1} focused={rightFocused}>\n <SectionHeader>Overview</SectionHeader>\n <Box flexDirection=\"column\">\n {visibleRows.map((row, i) => (\n <Box key={offset + i}>{row}</Box>\n ))}\n </Box>\n </Pane>\n </>\n );\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { Effect, Fiber, PubSub, Queue } from 'effect';\n\nimport type { RunnerConfig, RunnerConfigOverrides } from './config';\nimport { withRunnerConfig } from './config';\nimport { loadRunnerConfigFile } from './config-loader';\nimport {\n collectDatasetsFromFiles,\n collectEvaluatorsFromFiles,\n collectTestCasesFromFiles,\n} from './discovery';\nimport { createArtifactPath, executeRunTask, type RunTask } from './execution';\nimport type {\n CollectedDataset,\n CollectedEvaluator,\n CollectedTestCase,\n RunDatasetRequest,\n RunSnapshot,\n RunnerEvent,\n SearchTestCasesQuery,\n} from './events';\nimport { loadRunSnapshotsFromArtifacts as loadSnapshotsFromArtifacts } from './artifact-loader';\nimport { createPersistenceWorker } from './persistence';\nimport { searchCollectedTestCases } from './search';\n\ninterface SubscribeOptions {\n runId?: string;\n}\n\nfunction parseRegexLiteral(\n pattern: string,\n): { source: string; flags: string } | undefined {\n if (!pattern.startsWith('/')) {\n return undefined;\n }\n const lastSlash = pattern.lastIndexOf('/');\n if (lastSlash <= 0) {\n return undefined;\n }\n return {\n source: pattern.slice(1, lastSlash),\n flags: pattern.slice(lastSlash + 1),\n };\n}\n\nfunction createNameMatcher(pattern: string): (value: string) => boolean {\n const normalizedPattern = pattern.trim();\n const regexLiteral = parseRegexLiteral(normalizedPattern);\n if (regexLiteral) {\n const regex = new RegExp(regexLiteral.source, regexLiteral.flags);\n return (value: string) => regex.test(value);\n }\n\n if (normalizedPattern.includes('*')) {\n const escaped = normalizedPattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*');\n const regex = new RegExp(`^${escaped}$`, 'i');\n return (value: string) => regex.test(value);\n }\n\n return (value: string) => value.toLowerCase() === normalizedPattern.toLowerCase();\n}\n\nexport interface RunnerApi {\n collectDatasets(): Promise<ReadonlyArray<CollectedDataset>>;\n collectEvaluators(): Promise<ReadonlyArray<CollectedEvaluator>>;\n resolveDatasetByName(name: string): Promise<CollectedDataset | undefined>;\n resolveEvaluatorsByNamePattern(\n pattern: string,\n ): Promise<ReadonlyArray<CollectedEvaluator>>;\n searchTestCases(\n query?: SearchTestCasesQuery,\n ): Promise<ReadonlyArray<CollectedTestCase>>;\n collectDatasetTestCases(datasetId: string): Promise<ReadonlyArray<CollectedTestCase>>;\n runDatasetWith(request: RunDatasetRequest): Promise<RunSnapshot>;\n subscribeRunEvents(\n listener: (event: RunnerEvent) => void,\n options?: SubscribeOptions,\n ): () => void;\n getRunSnapshot(runId: string): RunSnapshot | undefined;\n getAllRunSnapshots(): ReadonlyArray<RunSnapshot>;\n loadRunSnapshotsFromArtifacts(): Promise<ReadonlyArray<RunSnapshot>>;\n shutdown(): Promise<void>;\n}\n\nfunction mergeRunnerOverrides(\n base?: RunnerConfigOverrides,\n next?: RunnerConfigOverrides,\n): RunnerConfigOverrides | undefined {\n if (!base) {\n return next;\n }\n if (!next) {\n return base;\n }\n const discovery = base.discovery || next.discovery\n ? {\n ...(base.discovery ?? {}),\n ...(next.discovery ?? {}),\n }\n : undefined;\n return {\n ...base,\n ...next,\n discovery,\n };\n}\n\nexport function createRunner(overrides?: RunnerConfigOverrides): RunnerApi {\n const fileOverrides = loadRunnerConfigFile();\n const merged = mergeRunnerOverrides(fileOverrides, overrides);\n return new EffectRunner(withRunnerConfig(merged));\n}\n\nclass EffectRunner implements RunnerApi {\n private readonly config: RunnerConfig;\n\n private readonly eventBus = Effect.runSync(PubSub.unbounded<RunnerEvent>());\n\n private readonly runQueue = Effect.runSync(Queue.unbounded<RunTask>());\n\n private readonly persistenceQueue = Effect.runSync(\n Queue.unbounded<{\n runId: string;\n artifactPath: string;\n payload: unknown;\n }>(),\n );\n\n private readonly snapshots = new Map<string, RunSnapshot>();\n private readonly listeners = new Set<{\n runId?: string;\n listener: (event: RunnerEvent) => void;\n }>();\n\n private readonly datasetsById = new Map<string, CollectedDataset>();\n\n private readonly evaluatorsById = new Map<string, CollectedEvaluator>();\n\n private readonly schedulerFiber = Effect.runFork(\n this.createSchedulerEffect(),\n );\n\n private readonly persistenceFiber = Effect.runFork(\n createPersistenceWorker(this.persistenceQueue),\n );\n\n constructor(config: RunnerConfig) {\n this.config = config;\n }\n\n async collectDatasets(): Promise<ReadonlyArray<CollectedDataset>> {\n const datasets = await collectDatasetsFromFiles(this.config.discovery);\n this.datasetsById.clear();\n for (const dataset of datasets) {\n this.datasetsById.set(dataset.id, dataset);\n }\n return datasets;\n }\n\n async collectEvaluators(): Promise<ReadonlyArray<CollectedEvaluator>> {\n const evaluators = await collectEvaluatorsFromFiles(this.config.discovery);\n this.evaluatorsById.clear();\n for (const evaluator of evaluators) {\n this.evaluatorsById.set(evaluator.id, evaluator);\n }\n return evaluators;\n }\n\n async resolveDatasetByName(name: string): Promise<CollectedDataset | undefined> {\n if (this.datasetsById.size === 0) {\n await this.collectDatasets();\n }\n const normalized = name.trim().toLowerCase();\n return Array.from(this.datasetsById.values()).find(\n (item) => item.dataset.getName().toLowerCase() === normalized,\n );\n }\n\n async resolveEvaluatorsByNamePattern(\n pattern: string,\n ): Promise<ReadonlyArray<CollectedEvaluator>> {\n if (this.evaluatorsById.size === 0) {\n await this.collectEvaluators();\n }\n const matcher = createNameMatcher(pattern);\n return Array.from(this.evaluatorsById.values()).filter((item) =>\n matcher(item.evaluator.getName() ?? ''),\n );\n }\n\n async searchTestCases(\n query?: SearchTestCasesQuery,\n ): Promise<ReadonlyArray<CollectedTestCase>> {\n const testCases = await collectTestCasesFromFiles(this.config.discovery);\n return searchCollectedTestCases(testCases, query);\n }\n\n async collectDatasetTestCases(\n datasetId: string,\n ): Promise<ReadonlyArray<CollectedTestCase>> {\n if (this.datasetsById.size === 0) {\n await this.collectDatasets();\n }\n const dataset = this.datasetsById.get(datasetId);\n if (!dataset) {\n throw new Error(`Unknown dataset: ${datasetId}`);\n }\n const allTestCases = await collectTestCasesFromFiles(this.config.discovery);\n return allTestCases.filter((testCase) =>\n dataset.dataset.matchesTestCase(testCase.testCase, testCase.filePath),\n );\n }\n\n async runDatasetWith(request: RunDatasetRequest): Promise<RunSnapshot> {\n if (this.datasetsById.size === 0) {\n await this.collectDatasets();\n }\n if (this.evaluatorsById.size === 0) {\n await this.collectEvaluators();\n }\n\n const dataset = this.datasetsById.get(request.datasetId);\n if (!dataset) {\n throw new Error(`Unknown dataset: ${request.datasetId}`);\n }\n\n const selectedEvaluators = request.evaluatorIds\n .map((id) => this.evaluatorsById.get(id))\n .filter((value): value is CollectedEvaluator => Boolean(value))\n .map((value) => ({ id: value.id, evaluator: value.evaluator }));\n\n if (selectedEvaluators.length === 0) {\n throw new Error('No evaluators selected for run');\n }\n\n const selectedTestCases = await this.collectDatasetTestCases(request.datasetId);\n\n const totalEvaluations = selectedTestCases.reduce(\n (sum, tc) =>\n sum +\n (typeof tc.testCase.getReruns === 'function'\n ? tc.testCase.getReruns()\n : 1),\n 0,\n );\n\n const triggerId = request.triggerId ?? `trg-${randomUUID()}`;\n const runId = `run-${randomUUID()}`;\n const artifactPath = createArtifactPath(\n this.config.artifactDirectory,\n request.datasetId,\n runId,\n );\n const snapshot: RunSnapshot = {\n runId,\n datasetId: request.datasetId,\n datasetName: dataset.dataset.getName(),\n evaluatorIds: selectedEvaluators.map((item) => item.id),\n queuedAt: Date.now(),\n totalTestCases: totalEvaluations,\n completedTestCases: 0,\n passedTestCases: 0,\n failedTestCases: 0,\n status: 'queued',\n artifactPath,\n };\n\n this.snapshots.set(runId, snapshot);\n const queuedEvent: RunnerEvent = {\n type: 'RunQueued',\n runId,\n datasetId: request.datasetId,\n datasetName: dataset.dataset.getName(),\n evaluatorIds: selectedEvaluators.map((item) => item.id),\n totalTestCases: totalEvaluations,\n artifactPath,\n };\n await Effect.runPromise(this.publishEvent(queuedEvent));\n await Effect.runPromise(\n Queue.offer(this.persistenceQueue, {\n runId,\n artifactPath,\n payload: queuedEvent,\n }),\n );\n\n const maxConcurrency =\n request.concurrency ?? this.config.maxConcurrency ?? 1;\n\n await Effect.runPromise(\n Queue.offer(this.runQueue, {\n runId,\n triggerId,\n datasetId: request.datasetId,\n dataset: dataset.dataset,\n evaluators: selectedEvaluators,\n testCases: selectedTestCases,\n snapshot,\n maxConcurrency,\n }),\n );\n\n return snapshot;\n }\n\n subscribeRunEvents(\n listener: (event: RunnerEvent) => void,\n options?: SubscribeOptions,\n ): () => void {\n const entry = { runId: options?.runId, listener };\n this.listeners.add(entry);\n return () => {\n this.listeners.delete(entry);\n };\n }\n\n getRunSnapshot(runId: string): RunSnapshot | undefined {\n return this.snapshots.get(runId);\n }\n\n getAllRunSnapshots(): ReadonlyArray<RunSnapshot> {\n return Array.from(this.snapshots.values()).sort(\n (a, b) => b.queuedAt - a.queuedAt,\n );\n }\n\n async loadRunSnapshotsFromArtifacts(): Promise<ReadonlyArray<RunSnapshot>> {\n return loadSnapshotsFromArtifacts(this.config);\n }\n\n async shutdown(): Promise<void> {\n await Effect.runPromise(Fiber.interrupt(this.schedulerFiber));\n await Effect.runPromise(Fiber.interrupt(this.persistenceFiber));\n await Effect.runPromise(Queue.shutdown(this.runQueue));\n await Effect.runPromise(Queue.shutdown(this.persistenceQueue));\n await Effect.runPromise(PubSub.shutdown(this.eventBus));\n }\n\n private createSchedulerEffect() {\n const self = this;\n return Effect.forever(\n Effect.gen(function* () {\n const task = yield* Queue.take(self.runQueue);\n yield* Effect.fork(\n executeRunTask(\n task,\n self.publishEvent.bind(self),\n self.persistenceQueue,\n self.updateSnapshot.bind(self),\n ),\n );\n }),\n );\n }\n\n private updateSnapshot(\n runId: string,\n updater: (snapshot: RunSnapshot) => RunSnapshot,\n ): void {\n const existing = this.snapshots.get(runId);\n if (!existing) {\n return;\n }\n this.snapshots.set(runId, updater(existing));\n }\n\n private publishEvent(event: RunnerEvent): Effect.Effect<void, never, never> {\n return Effect.sync(() => {\n for (const entry of this.listeners) {\n if (entry.runId && entry.runId !== event.runId) {\n continue;\n }\n entry.listener(event);\n }\n }).pipe(\n Effect.flatMap(() => PubSub.publish(this.eventBus, event)),\n Effect.asVoid,\n );\n }\n}\n","export interface RunnerDiscoveryConfig {\n rootDir: string;\n datasetSuffixes: ReadonlyArray<string>;\n evaluatorSuffixes: ReadonlyArray<string>;\n testCaseSuffixes: ReadonlyArray<string>;\n excludeDirectories: ReadonlyArray<string>;\n}\n\nexport interface RunnerConfig {\n discovery: RunnerDiscoveryConfig;\n artifactDirectory: string;\n /** Max concurrent test cases per run. Default: 1 (sequential). */\n maxConcurrency: number;\n}\n\nexport type RunnerConfigOverrides = Omit<Partial<RunnerConfig>, 'discovery'> & {\n discovery?: Partial<RunnerDiscoveryConfig>;\n};\n\nexport interface M4trixEvalConfigDiscovery {\n rootDir?: string;\n datasetFilePatterns?: ReadonlyArray<string>;\n evaluatorFilePatterns?: ReadonlyArray<string>;\n testCaseFilePatterns?: ReadonlyArray<string>;\n datasetSuffixes?: ReadonlyArray<string>;\n evaluatorSuffixes?: ReadonlyArray<string>;\n testCaseSuffixes?: ReadonlyArray<string>;\n excludeDirectories?: ReadonlyArray<string>;\n}\n\nexport interface M4trixEvalConfig {\n discovery?: M4trixEvalConfigDiscovery;\n artifactDirectory?: string;\n /** Max concurrent test cases per run. Default: 1 (sequential). */\n maxConcurrency?: number;\n}\n\nexport type ConfigType = M4trixEvalConfig;\n\nexport type M4trixEvalConfigFactory<TConfig extends ConfigType = ConfigType> = () => TConfig;\n\nexport function defineConfig<TConfig extends ConfigType>(\n factory: M4trixEvalConfigFactory<TConfig>,\n): M4trixEvalConfigFactory<TConfig> {\n return factory;\n}\n\nexport const defaultRunnerConfig: RunnerConfig = {\n discovery: {\n rootDir: process.cwd(),\n datasetSuffixes: ['.dataset.ts', '.dataset.tsx', '.dataset.js', '.dataset.mjs'],\n evaluatorSuffixes: [\n '.evaluator.ts',\n '.evaluator.tsx',\n '.evaluator.js',\n '.evaluator.mjs',\n ],\n testCaseSuffixes: [\n '.test-case.ts',\n '.test-case.tsx',\n '.test-case.js',\n '.test-case.mjs',\n ],\n excludeDirectories: ['node_modules', 'dist', '.next', '.git', '.pnpm-store'],\n },\n artifactDirectory: '.eval-results',\n maxConcurrency: 1,\n};\n\nexport function toRunnerConfigOverrides(\n config?: ConfigType,\n): RunnerConfigOverrides | undefined {\n if (!config) {\n return undefined;\n }\n\n const rawDiscovery = config.discovery;\n const discovery: Partial<RunnerDiscoveryConfig> = {};\n if (rawDiscovery?.rootDir !== undefined) {\n discovery.rootDir = rawDiscovery.rootDir;\n }\n if (rawDiscovery?.datasetFilePatterns !== undefined) {\n discovery.datasetSuffixes = rawDiscovery.datasetFilePatterns;\n } else if (rawDiscovery?.datasetSuffixes !== undefined) {\n discovery.datasetSuffixes = rawDiscovery.datasetSuffixes;\n }\n if (rawDiscovery?.evaluatorFilePatterns !== undefined) {\n discovery.evaluatorSuffixes = rawDiscovery.evaluatorFilePatterns;\n } else if (rawDiscovery?.evaluatorSuffixes !== undefined) {\n discovery.evaluatorSuffixes = rawDiscovery.evaluatorSuffixes;\n }\n if (rawDiscovery?.testCaseFilePatterns !== undefined) {\n discovery.testCaseSuffixes = rawDiscovery.testCaseFilePatterns;\n } else if (rawDiscovery?.testCaseSuffixes !== undefined) {\n discovery.testCaseSuffixes = rawDiscovery.testCaseSuffixes;\n }\n if (rawDiscovery?.excludeDirectories !== undefined) {\n discovery.excludeDirectories = rawDiscovery.excludeDirectories;\n }\n\n const overrides: RunnerConfigOverrides = {};\n if (config.artifactDirectory !== undefined) {\n overrides.artifactDirectory = config.artifactDirectory;\n }\n if (config.maxConcurrency !== undefined) {\n overrides.maxConcurrency = config.maxConcurrency;\n }\n if (Object.keys(discovery).length > 0) {\n overrides.discovery = discovery;\n }\n return overrides;\n}\n\nexport function withRunnerConfig(overrides?: RunnerConfigOverrides): RunnerConfig {\n if (!overrides) {\n return defaultRunnerConfig;\n }\n const discovery = overrides.discovery\n ? {\n ...defaultRunnerConfig.discovery,\n ...overrides.discovery,\n }\n : defaultRunnerConfig.discovery;\n\n return {\n ...defaultRunnerConfig,\n ...overrides,\n discovery,\n };\n}\n","import { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport * as jitiModule from 'jiti';\n\nimport type { RunnerConfigOverrides } from './config';\nimport {\n toRunnerConfigOverrides,\n type ConfigType,\n type M4trixEvalConfigFactory,\n} from './config';\n\nconst CONFIG_FILE_NAME = 'm4trix-eval.config.ts';\n\ntype JitiLoader = {\n (id: string): unknown;\n import?: (id: string) => Promise<unknown> | unknown;\n};\n\nlet cachedLoader: JitiLoader | undefined;\n\nfunction getJitiLoader(): JitiLoader {\n if (cachedLoader) {\n return cachedLoader;\n }\n const createJiti =\n (jitiModule as { createJiti?: unknown; default?: unknown }).createJiti ??\n (jitiModule as { default?: unknown }).default;\n if (typeof createJiti !== 'function') {\n throw new Error(\n 'Failed to initialize jiti for m4trix eval config loading.',\n );\n }\n cachedLoader = (\n createJiti as (id: string, options?: Record<string, unknown>) => JitiLoader\n )(import.meta.url, {\n interopDefault: true,\n moduleCache: true,\n });\n return cachedLoader;\n}\n\nfunction resolveConfigModuleExport(loadedModule: unknown): unknown {\n if (\n loadedModule &&\n typeof loadedModule === 'object' &&\n 'default' in loadedModule\n ) {\n return (loadedModule as { default: unknown }).default;\n }\n return loadedModule;\n}\n\nfunction resolveConfigValue(value: unknown): ConfigType | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value === 'function') {\n return (value as M4trixEvalConfigFactory<ConfigType>)();\n }\n if (typeof value !== 'object') {\n throw new Error(\n 'Invalid m4trix eval config export. Expected an object or defineConfig(() => config).',\n );\n }\n return value as ConfigType;\n}\n\nexport function loadRunnerConfigFile(\n cwd = process.cwd(),\n): RunnerConfigOverrides | undefined {\n const configPath = resolve(cwd, CONFIG_FILE_NAME);\n if (!existsSync(configPath)) {\n return undefined;\n }\n const loader = getJitiLoader();\n const loaded = loader(configPath);\n const exportedValue = resolveConfigModuleExport(loaded);\n const config = resolveConfigValue(exportedValue);\n return toRunnerConfigOverrides(config);\n}\n","import { Dirent } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { resolve, relative } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport type { Dataset } from '../evals/dataset';\nimport type { Evaluator } from '../evals/evaluator';\nimport type { TestCase } from '../evals/test-case';\nimport type {\n CollectedDataset,\n CollectedEvaluator,\n CollectedTestCase,\n} from './events';\nimport type { RunnerDiscoveryConfig } from './config';\n\ntype JitiModuleLoader = {\n (id: string): unknown;\n import?: (id: string) => Promise<unknown> | unknown;\n};\n\nlet jitiLoader: JitiModuleLoader | undefined;\n\nfunction toId(prefix: string, filePath: string, name?: string): string {\n const stable = name && name.trim().length > 0 ? name : filePath;\n return `${prefix}:${stable}`\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nfunction hasMethod(value: unknown, methodName: string): boolean {\n return (\n typeof value === 'object' &&\n value !== null &&\n methodName in value &&\n typeof (value as Record<string, unknown>)[methodName] === 'function'\n );\n}\n\nfunction isDatasetLike(value: unknown): value is Dataset {\n return hasMethod(value, 'getName') && hasMethod(value, 'matchesTestCase');\n}\n\nfunction isEvaluatorLike(\n value: unknown,\n): value is Evaluator<unknown, unknown, unknown, unknown> {\n return (\n hasMethod(value, 'getName') &&\n hasMethod(value, 'resolveContext') &&\n hasMethod(value, 'getEvaluateFn')\n );\n}\n\nfunction isTestCaseLike(value: unknown): value is TestCase<unknown> {\n return (\n hasMethod(value, 'getName') &&\n hasMethod(value, 'getTags') &&\n hasMethod(value, 'getInput')\n );\n}\n\nasync function walkDirectory(\n rootDir: string,\n excludeDirectories: ReadonlyArray<string>,\n): Promise<string[]> {\n const out: string[] = [];\n\n async function walk(currentDir: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n await Promise.all(\n entries.map(async (entry) => {\n const absolute = resolve(currentDir, entry.name);\n if (entry.isDirectory()) {\n if (excludeDirectories.includes(entry.name)) {\n return;\n }\n await walk(absolute);\n return;\n }\n\n if (entry.isFile()) {\n out.push(absolute);\n }\n }),\n );\n }\n\n await walk(rootDir);\n return out;\n}\n\nfunction hasOneSuffix(\n filePath: string,\n suffixes: ReadonlyArray<string>,\n): boolean {\n return suffixes.some((suffix) => filePath.endsWith(suffix));\n}\n\nasync function loadModuleExports(filePath: string): Promise<unknown[]> {\n if (filePath.endsWith('.ts') || filePath.endsWith('.tsx')) {\n if (!jitiLoader) {\n const jitiModule = (await import('jiti')) as unknown as {\n createJiti?: (filename: string, opts?: Record<string, unknown>) => JitiModuleLoader;\n default?: (filename: string, opts?: Record<string, unknown>) => JitiModuleLoader;\n };\n const createJiti = jitiModule.createJiti ?? jitiModule.default;\n if (!createJiti) {\n throw new Error('Failed to initialize jiti TypeScript loader');\n }\n jitiLoader = createJiti(import.meta.url, {\n interopDefault: true,\n moduleCache: true,\n }) as JitiModuleLoader;\n }\n const loaded = jitiLoader.import\n ? await jitiLoader.import(filePath)\n : await Promise.resolve(jitiLoader(filePath));\n return Object.values(loaded as Record<string, unknown>);\n }\n\n const moduleUrl = pathToFileURL(filePath).href;\n const loaded = (await import(moduleUrl)) as Record<string, unknown>;\n return Object.values(loaded);\n}\n\nexport async function collectDatasetsFromFiles(\n config: RunnerDiscoveryConfig,\n): Promise<ReadonlyArray<CollectedDataset>> {\n const files = await walkDirectory(config.rootDir, config.excludeDirectories);\n const matched = files.filter((filePath) =>\n hasOneSuffix(filePath, config.datasetSuffixes),\n );\n\n const found = await Promise.all(\n matched.map(async (absolutePath) => {\n const exports = await loadModuleExports(absolutePath);\n const datasets = exports.filter(isDatasetLike);\n const relPath = relative(config.rootDir, absolutePath);\n return datasets.map((dataset) => ({\n id: toId('dataset', relPath, dataset.getName()),\n filePath: relPath,\n dataset,\n }));\n }),\n );\n\n return found.flat();\n}\n\nexport async function collectEvaluatorsFromFiles(\n config: RunnerDiscoveryConfig,\n): Promise<ReadonlyArray<CollectedEvaluator>> {\n const files = await walkDirectory(config.rootDir, config.excludeDirectories);\n const matched = files.filter((filePath) =>\n hasOneSuffix(filePath, config.evaluatorSuffixes),\n );\n\n const found = await Promise.all(\n matched.map(async (absolutePath) => {\n const exports = await loadModuleExports(absolutePath);\n const evaluators = exports.filter(isEvaluatorLike);\n const relPath = relative(config.rootDir, absolutePath);\n return evaluators.map((evaluator) => ({\n id: toId('evaluator', relPath, evaluator.getName()),\n filePath: relPath,\n evaluator,\n }));\n }),\n );\n\n return found.flat();\n}\n\nexport async function collectTestCasesFromFiles(\n config: RunnerDiscoveryConfig,\n): Promise<ReadonlyArray<CollectedTestCase>> {\n const files = await walkDirectory(config.rootDir, config.excludeDirectories);\n const matched = files.filter((filePath) =>\n hasOneSuffix(filePath, config.testCaseSuffixes),\n );\n\n const found = await Promise.all(\n matched.map(async (absolutePath) => {\n const exports = await loadModuleExports(absolutePath);\n const testCases = exports.filter(isTestCaseLike);\n const relPath = relative(config.rootDir, absolutePath);\n return testCases.map((testCase) => ({\n id: toId('test-case', relPath, testCase.getName()),\n filePath: relPath,\n testCase,\n }));\n }),\n );\n\n return found.flat();\n}\n","import { randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\n\nimport { Effect, Queue, Ref } from 'effect';\n\nimport type {\n CreateDiffLogEntryOptions,\n EvaluatorLogEntry,\n} from '../evals/diff';\nimport { createDiffLogEntry, createLogEntry } from '../evals/diff';\nimport type { Dataset } from '../evals/dataset';\nimport type { Evaluator } from '../evals/evaluator';\nimport type { MetricItem } from '../evals/metric';\nimport type { ScoreItem } from '../evals/score';\nimport type { CollectedTestCase, RunSnapshot, RunnerEvent } from './events';\nimport type { PersistenceMessage } from './persistence';\nimport { toNumericScoreFromScores } from './score-utils';\n\nconst evaluatorErrorLogEntryKey = '__m4trixEvaluatorLogEntry';\n\ntype EvaluatorCreatedError = Error & {\n [evaluatorErrorLogEntryKey]?: EvaluatorLogEntry;\n};\n\nfunction computeEvaluatorPassed(\n evaluator: Evaluator<unknown, unknown, unknown, unknown>,\n result: unknown,\n scores: ReadonlyArray<ScoreItem>,\n): boolean {\n const scoresWithPassed = scores.filter((s) => 'passed' in s && s.passed !== undefined);\n if (scoresWithPassed.length > 0) {\n return scoresWithPassed.every((s) => s.passed === true);\n }\n const passCriterion = evaluator.getPassCriterion();\n if (passCriterion) {\n return passCriterion(result);\n }\n const passThreshold = evaluator.getPassThreshold();\n if (passThreshold !== undefined) {\n const numeric = toNumericScoreFromScores(scores);\n return numeric !== undefined && numeric >= passThreshold;\n }\n return true;\n}\n\nfunction normalizeResult(\n result: unknown,\n): {\n scores: ReadonlyArray<ScoreItem>;\n metrics?: ReadonlyArray<MetricItem>;\n} {\n if (typeof result !== 'object' || result === null) {\n return { scores: [] };\n }\n const obj = result as Record<string, unknown>;\n const scores = Array.isArray(obj.scores)\n ? (obj.scores as ReadonlyArray<ScoreItem>)\n : [];\n const metrics = Array.isArray(obj.metrics)\n ? (obj.metrics as ReadonlyArray<MetricItem>)\n : undefined;\n return { scores, metrics };\n}\n\nfunction readOutput(testCase: CollectedTestCase['testCase']): unknown {\n const candidate = testCase as unknown as { getOutput?: () => unknown };\n if (typeof candidate.getOutput !== 'function') {\n return undefined;\n }\n return candidate.getOutput();\n}\n\nexport interface RunTask {\n runId: string;\n triggerId: string;\n datasetId: string;\n dataset: Dataset;\n evaluators: ReadonlyArray<{\n id: string;\n evaluator: Evaluator<unknown, unknown, unknown, unknown>;\n }>;\n testCases: ReadonlyArray<CollectedTestCase>;\n snapshot: RunSnapshot;\n maxConcurrency: number;\n}\n\nfunction nowIsoForFile(): string {\n return new Date().toISOString().replace(/[:.]/g, '-');\n}\n\nexport function createArtifactPath(\n artifactDirectory: string,\n datasetId: string,\n runId: string,\n): string {\n return join(\n artifactDirectory,\n `${datasetId}_${runId}_${nowIsoForFile()}.jsonl`,\n );\n}\n\nfunction processOneTestCase(\n task: RunTask,\n testCaseItem: CollectedTestCase,\n totalEvaluations: number,\n publishEvent: (event: RunnerEvent) => Effect.Effect<void, never, never>,\n persistenceQueue: Queue.Queue<PersistenceMessage>,\n updateSnapshot: (\n runId: string,\n updater: (snapshot: RunSnapshot) => RunSnapshot,\n ) => void,\n completedRef: Ref.Ref<number>,\n passedRef: Ref.Ref<number>,\n failedRef: Ref.Ref<number>,\n): Effect.Effect<void, never, never> {\n return Effect.gen(function* () {\n const reruns =\n typeof testCaseItem.testCase.getReruns === 'function'\n ? testCaseItem.testCase.getReruns()\n : 1;\n const rerunPassed: boolean[] = [];\n\n for (let r = 0; r < reruns; r++) {\n const evaluatorRunId = `run-${randomUUID()}`;\n const started = Date.now();\n const evaluatorScores: Array<{\n evaluatorId: string;\n scores: ReadonlyArray<ScoreItem>;\n passed: boolean;\n metrics?: ReadonlyArray<MetricItem>;\n logs?: ReadonlyArray<EvaluatorLogEntry>;\n }> = [];\n let testCaseError: string | undefined;\n const output = readOutput(testCaseItem.testCase);\n\n for (const { id: evaluatorId, evaluator } of task.evaluators) {\n const evaluateFn = evaluator.getEvaluateFn();\n if (!evaluateFn) {\n continue;\n }\n\n const logs: EvaluatorLogEntry[] = [];\n const logDiff = (\n expected: unknown,\n actual: unknown,\n options?: CreateDiffLogEntryOptions,\n ) => {\n logs.push(createDiffLogEntry(expected, actual, options));\n };\n const log = (message: unknown, options?: { label?: string }) => {\n logs.push(createLogEntry(message, options));\n };\n const createError = (\n message: unknown,\n options?: { label?: string },\n ): Error => {\n const entry = createLogEntry(message, options);\n const error =\n message instanceof Error ? message : new Error(entry.message);\n (\n error as EvaluatorCreatedError\n )[evaluatorErrorLogEntryKey] = entry;\n return error;\n };\n\n try {\n const ctx = yield* Effect.promise(() =>\n Promise.resolve(evaluator.resolveContext()),\n );\n const result = yield* Effect.promise(() =>\n Promise.resolve().then(() =>\n evaluateFn({\n input: testCaseItem.testCase.getInput(),\n ctx,\n output,\n meta: {\n triggerId: task.triggerId,\n runId: evaluatorRunId,\n datasetId: task.datasetId,\n },\n logDiff,\n log,\n createError,\n }),\n ),\n );\n if (result instanceof Error) {\n const evaluatorError = result as EvaluatorCreatedError;\n const taggedEntry = evaluatorError[evaluatorErrorLogEntryKey];\n logs.push(taggedEntry ?? createLogEntry(result));\n testCaseError = result.message;\n evaluatorScores.push({\n evaluatorId,\n scores: [],\n passed: false,\n logs: logs.length > 0 ? logs : undefined,\n });\n continue;\n }\n const { scores, metrics } = normalizeResult(result);\n const passed = computeEvaluatorPassed(evaluator, result, scores);\n evaluatorScores.push({\n evaluatorId,\n scores,\n passed,\n metrics,\n logs: logs.length > 0 ? logs : undefined,\n });\n } catch (error) {\n if (error instanceof Error) {\n const taggedEntry = (error as EvaluatorCreatedError)[\n evaluatorErrorLogEntryKey\n ];\n logs.push(taggedEntry ?? createLogEntry(error));\n }\n testCaseError =\n error instanceof Error\n ? error.message\n : 'Evaluator execution failed';\n evaluatorScores.push({\n evaluatorId,\n scores: [],\n passed: false,\n logs: logs.length > 0 ? logs : undefined,\n });\n }\n }\n\n const rerunPassedThis = evaluatorScores.every((s) => s.passed);\n rerunPassed.push(rerunPassedThis);\n const completedEvaluations = yield* Ref.modify(completedRef, (n) => [\n n + 1,\n n + 1,\n ]);\n\n const progressEvent: RunnerEvent = {\n type: 'TestCaseProgress',\n runId: task.runId,\n testCaseId: testCaseItem.id,\n testCaseName: testCaseItem.testCase.getName(),\n completedTestCases: completedEvaluations,\n totalTestCases: totalEvaluations,\n rerunIndex: r + 1,\n rerunTotal: reruns,\n passed: rerunPassedThis,\n durationMs: Date.now() - started,\n evaluatorScores,\n output,\n errorMessage: testCaseError,\n };\n\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n completedTestCases: completedEvaluations,\n }));\n\n yield* publishEvent(progressEvent);\n yield* Queue.offer(persistenceQueue, {\n runId: task.runId,\n artifactPath: task.snapshot.artifactPath,\n payload: progressEvent,\n });\n }\n\n const testCasePassed = rerunPassed.every(Boolean);\n if (testCasePassed) {\n yield* Ref.update(passedRef, (n) => n + 1);\n } else {\n yield* Ref.update(failedRef, (n) => n + 1);\n }\n\n const [passed, failed] = yield* Effect.all([\n Ref.get(passedRef),\n Ref.get(failedRef),\n ]);\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n passedTestCases: passed,\n failedTestCases: failed,\n }));\n });\n}\n\nexport const executeRunTask = (\n task: RunTask,\n publishEvent: (event: RunnerEvent) => Effect.Effect<void, never, never>,\n persistenceQueue: Queue.Queue<PersistenceMessage>,\n updateSnapshot: (\n runId: string,\n updater: (snapshot: RunSnapshot) => RunSnapshot,\n ) => void,\n): Effect.Effect<void, never, never> =>\n Effect.gen(function* () {\n const startedAt = Date.now();\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n status: 'running',\n startedAt,\n }));\n yield* publishEvent({\n type: 'RunStarted',\n runId: task.runId,\n startedAt,\n });\n\n const totalEvaluations = task.testCases.reduce(\n (sum, tc) =>\n sum +\n (typeof tc.testCase.getReruns === 'function'\n ? tc.testCase.getReruns()\n : 1),\n 0,\n );\n const maxConcurrency = Math.max(1, task.maxConcurrency ?? 1);\n\n const completedRef = yield* Ref.make(0);\n const passedRef = yield* Ref.make(0);\n const failedRef = yield* Ref.make(0);\n\n const processTestCase = (testCaseItem: CollectedTestCase) =>\n processOneTestCase(\n task,\n testCaseItem,\n totalEvaluations,\n publishEvent,\n persistenceQueue,\n updateSnapshot,\n completedRef,\n passedRef,\n failedRef,\n );\n\n yield* Effect.forEach(\n task.testCases,\n processTestCase,\n maxConcurrency > 1 ? { concurrency: maxConcurrency } : undefined,\n );\n\n const [completedEvaluations, passedUniqueTestCases, failedUniqueTestCases] =\n yield* Effect.all([\n Ref.get(completedRef),\n Ref.get(passedRef),\n Ref.get(failedRef),\n ]);\n\n const finishedAt = Date.now();\n const completedEvent: RunnerEvent = {\n type: 'RunCompleted',\n runId: task.runId,\n finishedAt,\n passedTestCases: passedUniqueTestCases,\n failedTestCases: failedUniqueTestCases,\n totalTestCases: task.testCases.length,\n artifactPath: task.snapshot.artifactPath,\n };\n\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n status: 'completed',\n completedTestCases: completedEvaluations,\n passedTestCases: passedUniqueTestCases,\n failedTestCases: failedUniqueTestCases,\n finishedAt,\n }));\n\n yield* publishEvent(completedEvent);\n yield* Queue.offer(persistenceQueue, {\n runId: task.runId,\n artifactPath: task.snapshot.artifactPath,\n payload: completedEvent,\n });\n yield* publishEvent({\n type: 'ArtifactFlushed',\n runId: task.runId,\n artifactPath: task.snapshot.artifactPath,\n });\n });\n","import { diffString } from 'json-diff';\n\n/**\n * Options for customizing JSON diff output. Passed to logDiff, createDiffLogEntry, and printJsonDiff.\n * @see https://www.npmjs.com/package/json-diff\n */\nexport interface JsonDiffOptions {\n /** Include equal sections of the document, not just deltas */\n full?: boolean;\n /** Sort primitive values in arrays before comparing */\n sort?: boolean;\n /** Compare only keys, ignore value differences */\n keysOnly?: boolean;\n /** Always output these keys when their parent object has any diff (comma-separated or array) */\n outputKeys?: string | string[];\n /** Output only new/updated values (no - lines) */\n outputNewOnly?: boolean;\n /** Exclude these keys from comparison (comma-separated or array) */\n excludeKeys?: string | string[];\n /** Include unchanged values in output */\n keepUnchangedValues?: boolean;\n /** Round floats to this many decimals before comparing */\n precision?: number;\n /** Max ... elisions in a row before collapsing */\n maxElisions?: number;\n}\n\nfunction createDiffString(\n expected: unknown,\n actual: unknown,\n diffOptions?: JsonDiffOptions,\n): string {\n const opts = { ...diffOptions, color: false };\n const result = diffString(expected, actual, opts);\n return typeof result === 'string' ? result : '';\n}\n\nexport interface DiffLogEntry {\n type: 'diff';\n label?: string;\n expected: unknown;\n actual: unknown;\n diff: string;\n}\n\nexport interface LogEntry {\n type: 'log';\n label?: string;\n message: string;\n}\n\nexport type EvaluatorLogEntry = DiffLogEntry | LogEntry;\n\nfunction formatLogMessage(msg: unknown): string {\n if (typeof msg === 'string') return msg;\n if (msg instanceof Error) return msg.stack ?? msg.message;\n try {\n if (msg !== null && typeof msg === 'object') {\n return JSON.stringify(msg, null, 2);\n }\n return String(msg);\n } catch {\n return String(msg);\n }\n}\n\n/**\n * Creates a LogEntry for storage in run artifacts. Use for logging objects or text.\n */\nexport function createLogEntry(\n message: unknown,\n options?: { label?: string },\n): LogEntry {\n return {\n type: 'log',\n label: options?.label,\n message: formatLogMessage(message),\n };\n}\n\n/**\n * Returns lines from a log entry for display.\n */\nexport function getLogLines(entry: LogEntry): string[] {\n return entry.message.split('\\n');\n}\n\nexport interface CreateDiffLogEntryOptions extends JsonDiffOptions {\n label?: string;\n}\n\nexport interface PrintJsonDiffOptions extends JsonDiffOptions {\n /** Enable ANSI colors (default: true) */\n color?: boolean;\n}\n\n/**\n * Creates a DiffLogEntry for storage in run artifacts (plain text, no ANSI).\n */\nexport function createDiffLogEntry(\n expected: unknown,\n actual: unknown,\n options?: CreateDiffLogEntryOptions,\n): DiffLogEntry {\n const { label, ...diffOpts } = options ?? {};\n const diff = createDiffString(expected, actual, diffOpts);\n return {\n type: 'diff',\n label,\n expected,\n actual,\n diff: diff || '(no differences)',\n };\n}\n\n/**\n * Returns the plain diff string. Use for storage or when applying colors separately.\n */\nexport function getDiffString(entry: DiffLogEntry): string {\n return entry.diff || '(no differences)';\n}\n\n/**\n * Returns lines from the diff, each with a type for color application.\n */\nexport function getDiffLines(entry: DiffLogEntry): Array<{ type: 'add' | 'remove' | 'context'; line: string }> {\n const raw = entry.diff || '(no differences)';\n return raw.split('\\n').map((line) => {\n const trimmed = line.trimStart();\n if (trimmed.startsWith('-') && !trimmed.startsWith('---')) {\n return { type: 'remove' as const, line };\n }\n if (trimmed.startsWith('+') && !trimmed.startsWith('+++')) {\n return { type: 'add' as const, line };\n }\n return { type: 'context' as const, line };\n });\n}\n\n/**\n * Prints a colorized JSON diff between two values to stdout.\n * Useful in evaluators to show expected vs actual output differences.\n * @param expected - The expected/reference value (shown as removed with -)\n * @param actual - The actual value (shown as added with +)\n * @returns The diff string (also printed to console)\n */\nexport function printJsonDiff(\n expected: unknown,\n actual: unknown,\n options: PrintJsonDiffOptions = {},\n): string {\n const { color = true, ...diffOpts } = options;\n const diff = createDiffString(expected, actual, diffOpts);\n if (color) {\n const lines = diff.split('\\n').map((line) => {\n const trimmed = line.trimStart();\n if (trimmed.startsWith('-') && !trimmed.startsWith('---')) {\n return `\\x1b[31m${line}\\x1b[0m`;\n }\n if (trimmed.startsWith('+') && !trimmed.startsWith('+++')) {\n return `\\x1b[32m${line}\\x1b[0m`;\n }\n return line;\n });\n const colored = lines.join('\\n');\n console.log(colored || '(no differences)');\n return colored;\n }\n console.log(diff || '(no differences)');\n return diff;\n}\n","const registry = new Map<string, MetricDef<unknown>>();\n\nexport interface MetricItem<TData = unknown> {\n readonly id: string;\n readonly data: TData;\n /** Per-item display name override (wins over def.name in rendering) */\n readonly name?: string;\n}\n\nexport interface FormatMetricOptions {\n isAggregated?: boolean;\n}\n\nexport interface MetricDef<TData = unknown> {\n readonly id: string;\n readonly name?: string;\n readonly aggregate?: (values: ReadonlyArray<TData>) => TData;\n format(data: TData, options?: FormatMetricOptions): string;\n make(data: TData, options?: { name?: string }): MetricItem<TData>;\n}\n\nexport const Metric = {\n of<TData>(config: {\n id: string;\n name?: string;\n format: (data: TData, options?: FormatMetricOptions) => string;\n aggregate?: (values: ReadonlyArray<TData>) => TData;\n }): MetricDef<TData> {\n const def: MetricDef<TData> = {\n id: config.id,\n name: config.name,\n aggregate: config.aggregate,\n format: config.format,\n make: (data: TData, options?: { name?: string }) => ({\n id: config.id,\n data,\n ...(options?.name !== undefined && { name: options.name }),\n }),\n };\n registry.set(config.id, def as MetricDef<unknown>);\n return def;\n },\n};\n\nexport function getMetricById(id: string): MetricDef<unknown> | undefined {\n return registry.get(id);\n}\n","const registry = new Map<string, ScoreDef<unknown>>();\n\nexport type ScoreDisplayStrategy = 'bar' | 'number' | 'passFail';\n\nexport interface ScoreItem<TData = unknown> {\n readonly id: string;\n readonly data: TData;\n readonly passed?: boolean;\n /** Per-item display name override (wins over def.name in rendering) */\n readonly name?: string;\n /** Attached def for formatting/aggregation without registry lookup (avoids n/a across module boundaries) */\n readonly def?: ScoreDef<TData>;\n}\n\nexport interface FormatScoreOptions {\n isAggregated?: boolean;\n}\n\nexport interface ScoreDef<TData = unknown> {\n readonly id: string;\n readonly name?: string;\n readonly displayStrategy: ScoreDisplayStrategy;\n readonly formatValue: (data: TData) => string;\n readonly formatAggregate: (data: TData) => string;\n readonly aggregateValues: (values: ReadonlyArray<TData>) => TData;\n make(\n data: TData,\n options?: { definePassed?: (data: TData) => boolean; name?: string },\n ): ScoreItem<TData>;\n}\n\n/** Helper to format using the right method based on isAggregated (for consumers that need a single entry point) */\nexport function formatScoreData<TData>(\n def: ScoreDef<TData>,\n data: TData,\n options?: FormatScoreOptions,\n): string {\n return options?.isAggregated\n ? def.formatAggregate(data)\n : def.formatValue(data);\n}\n\n/** Aggregate helpers for common patterns. Use with aggregateValues in Score.of(). */\nexport const ScoreAggregate = {\n /** Average numeric fields. Use for scores like { value, delta }. */\n averageFields<K extends string>(\n fields: readonly K[],\n ): (values: ReadonlyArray<Record<K, number>>) => Record<K, number> {\n return (values) => {\n const count = values.length || 1;\n const result = {} as Record<string, number>;\n for (const field of fields) {\n result[field] =\n values.reduce(\n (s, v) => s + ((v as Record<string, number>)[field] ?? 0),\n 0,\n ) / count;\n }\n return result as unknown as Record<K, number>;\n };\n },\n\n /** Average selected numeric fields, with sample std dev tracked for `value`. */\n averageWithVariance<K extends string>(\n fields: readonly K[],\n ): (\n values: ReadonlyArray<Record<K, number>>,\n ) => Record<K, number> & { stdDev?: number; count: number } {\n return (values) => {\n const count = values.length;\n const result = {} as Record<string, number>;\n\n for (const field of fields) {\n result[field] =\n count === 0\n ? 0\n : values.reduce(\n (sum, item) => sum + ((item as Record<string, number>)[field] ?? 0),\n 0,\n ) / count;\n }\n\n const valueField = 'value' as K;\n const hasValueField = fields.includes(valueField);\n\n if (count === 0) {\n if (hasValueField) {\n result[valueField] = 0;\n }\n return {\n ...(result as Record<K, number>),\n stdDev: undefined,\n count: 0,\n };\n }\n\n let stdDev: number | undefined;\n if (hasValueField && count >= 2) {\n const sum = values.reduce(\n (s, v) => s + ((v as Record<string, number>)[valueField] ?? 0),\n 0,\n );\n const sumSq = values.reduce(\n (s, v) => {\n const value = (v as Record<string, number>)[valueField] ?? 0;\n return s + value * value;\n },\n 0,\n );\n const mean = sum / count;\n const variance = (sumSq - count * mean * mean) / (count - 1);\n stdDev = variance > 0 ? Math.sqrt(variance) : 0;\n }\n\n return {\n ...values[0],\n ...(result as Record<K, number>),\n stdDev,\n count,\n };\n };\n },\n\n /** All runs must pass. Use for binary scores. */\n all<T extends { passed: boolean }>(\n values: ReadonlyArray<T>,\n ): T & { passedCount?: number; totalCount?: number } {\n const total = values.length;\n const passedCount = values.filter((v) => v.passed).length;\n return {\n ...values[0],\n passed: total > 0 && values.every((v) => v.passed),\n passedCount,\n totalCount: total,\n } as T & { passedCount?: number; totalCount?: number };\n },\n\n /** Take last value (no aggregation). Use when aggregation is not meaningful. */\n last<T>(values: ReadonlyArray<T>): T {\n return values[values.length - 1] ?? ({} as T);\n },\n};\n\nexport const Score = {\n aggregate: ScoreAggregate,\n\n of<TData>(config: {\n id: string;\n name?: string;\n displayStrategy: ScoreDisplayStrategy;\n formatValue: (data: TData) => string;\n formatAggregate: (data: TData) => string;\n aggregateValues: (values: ReadonlyArray<TData>) => TData;\n }): ScoreDef<TData> {\n const def: ScoreDef<TData> = {\n id: config.id,\n name: config.name,\n displayStrategy: config.displayStrategy,\n formatValue: config.formatValue,\n formatAggregate: config.formatAggregate,\n aggregateValues: config.aggregateValues,\n make: (\n data: TData,\n options?: { definePassed?: (data: TData) => boolean; name?: string },\n ) => {\n const passed =\n options?.definePassed !== undefined\n ? options.definePassed(data)\n : undefined;\n return {\n id: config.id,\n data,\n ...(passed !== undefined && { passed }),\n ...(options?.name !== undefined && { name: options.name }),\n def, // Attach def so rendering/aggregation works without registry lookup\n };\n },\n };\n registry.set(config.id, def as ScoreDef<unknown>);\n return def;\n },\n};\n\nexport function getScoreById(id: string): ScoreDef<unknown> | undefined {\n return registry.get(id);\n}\n","/** Average of numeric `value` fields (e.g. for percentScore) */\nexport function aggregateAverage(values: ReadonlyArray<{ value: number }>): {\n value: number;\n} {\n if (values.length === 0) {\n return { value: 0 };\n }\n const sum = values.reduce((s, v) => s + v.value, 0);\n return { value: sum / values.length };\n}\n\n/** Average with sample std dev (for percentScore when aggregated) */\nexport function aggregateAverageWithVariance(\n values: ReadonlyArray<{ value: number }>,\n): { value: number; stdDev?: number; count: number } {\n if (values.length === 0) {\n return { value: 0, count: 0 };\n }\n const sum = values.reduce((s, v) => s + v.value, 0);\n const sumSq = values.reduce((s, v) => s + v.value * v.value, 0);\n const mean = sum / values.length;\n let stdDev: number | undefined;\n if (values.length >= 2) {\n const variance = (sumSq - values.length * mean * mean) / (values.length - 1);\n stdDev = variance > 0 ? Math.sqrt(variance) : 0;\n }\n return { value: mean, stdDev, count: values.length };\n}\n\n/** All runs must pass (for binaryScore). Returns passed and count for spread display. */\nexport function aggregateAll(values: ReadonlyArray<{ passed: boolean }>): {\n passed: boolean;\n passedCount?: number;\n totalCount?: number;\n} {\n const total = values.length;\n const passedCount = values.filter((v) => v.passed).length;\n return {\n passed: total > 0 && values.every((v) => v.passed),\n passedCount,\n totalCount: total,\n };\n}\n\ntype TokenCountSum = {\n input: number;\n output: number;\n inputCached: number;\n outputCached: number;\n};\n\n/** Sum token counts across reruns */\nexport function aggregateTokenCountSum(\n values: ReadonlyArray<{\n input?: number;\n output?: number;\n inputCached?: number;\n outputCached?: number;\n }>,\n): TokenCountSum {\n const initial: TokenCountSum = {\n input: 0,\n output: 0,\n inputCached: 0,\n outputCached: 0,\n };\n return values.reduce<TokenCountSum>(\n (acc, v) => ({\n input: acc.input + (v.input ?? 0),\n output: acc.output + (v.output ?? 0),\n inputCached: acc.inputCached + (v.inputCached ?? 0),\n outputCached: acc.outputCached + (v.outputCached ?? 0),\n }),\n initial,\n );\n}\n\n/** Average latency across reruns */\nexport function aggregateLatencyAverage(\n values: ReadonlyArray<{ ms: number }>,\n): { ms: number } {\n if (values.length === 0) {\n return { ms: 0 };\n }\n const sum = values.reduce((s, v) => s + v.ms, 0);\n return { ms: sum / values.length };\n}\n","import { aggregateLatencyAverage, aggregateTokenCountSum } from '../aggregators';\nimport { Metric } from '../metric';\n\nexport interface TokenCountData {\n input?: number;\n output?: number;\n inputCached?: number;\n outputCached?: number;\n}\n\nexport const tokenCountMetric = Metric.of<TokenCountData>({\n id: 'token-count',\n name: 'Tokens',\n aggregate: aggregateTokenCountSum,\n format: (data, options) => {\n const input = data.input ?? 0;\n const output = data.output ?? 0;\n const inputCached = data.inputCached ?? 0;\n const outputCached = data.outputCached ?? 0;\n const cached = inputCached + outputCached;\n const base = `in:${input} out:${output} cached:${cached}`;\n return options?.isAggregated ? `Total: ${base}` : base;\n },\n});\n\nexport interface LatencyData {\n ms: number;\n}\n\nexport const latencyMetric = Metric.of<LatencyData>({\n id: 'latency',\n name: 'Latency',\n aggregate: aggregateLatencyAverage,\n format: (data, options) =>\n options?.isAggregated ? `Avg: ${data.ms}ms` : `${data.ms}ms`,\n});\n","import { Score } from '../score';\n\nexport interface PercentScoreData {\n value: number;\n stdDev?: number;\n count?: number;\n}\n\nexport const percentScore = Score.of<PercentScoreData>({\n id: 'percent',\n name: 'Score',\n displayStrategy: 'bar',\n formatValue: (data) => data.value.toFixed(2),\n formatAggregate: (data) =>\n data.stdDev != null\n ? `Avg: ${data.value.toFixed(2)} ± ${data.stdDev.toFixed(2)}`\n : `Avg: ${data.value.toFixed(2)}`,\n aggregateValues: Score.aggregate.averageWithVariance(['value']),\n});\n\nexport interface DeltaScoreData {\n value: number;\n delta: number;\n}\n\nexport const deltaScore = Score.of<DeltaScoreData>({\n id: 'delta',\n name: 'Delta',\n displayStrategy: 'number',\n formatValue: (data) =>\n `${data.value.toFixed(2)} (${data.delta >= 0 ? '+' : ''}${data.delta.toFixed(2)} vs baseline)`,\n formatAggregate: (data) =>\n `Avg: ${data.value.toFixed(2)} (Delta: ${data.delta >= 0 ? '+' : ''}${data.delta.toFixed(2)})`,\n aggregateValues: Score.aggregate.averageFields(['value', 'delta']),\n});\n\nexport interface BinaryScoreData {\n passed: boolean;\n passedCount?: number;\n totalCount?: number;\n}\n\nexport const binaryScore = Score.of<BinaryScoreData>({\n id: 'binary',\n name: 'Result',\n displayStrategy: 'passFail',\n formatValue: (data) => (data.passed ? 'PASSED' : 'NOT PASSED'),\n formatAggregate: (data) => {\n const base = data.passed ? 'All: PASSED' : 'Some: FAILED';\n if (\n data.passedCount != null &&\n data.totalCount != null &&\n data.totalCount > 1\n ) {\n return `${base} (${data.passedCount}/${data.totalCount})`;\n }\n return base;\n },\n aggregateValues: Score.aggregate.all,\n});\n","import type { MetricItem } from '../evals/metric';\nimport type { ScoreDef, ScoreItem } from '../evals/score';\nimport { getMetricById, getScoreById } from '../evals';\n\nfunction getScoreDef(item: ScoreItem): ScoreDef<unknown> | undefined {\n return item.def ?? getScoreById(item.id);\n}\n\nfunction lastNonEmptyName(items: ReadonlyArray<{ name?: string }>): string | undefined {\n for (let i = items.length - 1; i >= 0; i--) {\n const n = items[i].name;\n if (n != null && n.trim().length > 0) return n;\n }\n return undefined;\n}\n\nexport function aggregateScoreItems(\n items: ReadonlyArray<ScoreItem>,\n): ScoreItem | undefined {\n if (items.length === 0) return undefined;\n const def = getScoreDef(items[0]);\n if (!def?.aggregateValues) return items[items.length - 1];\n const aggregated = def.aggregateValues(items.map((i) => i.data as never));\n const nameOverride = lastNonEmptyName(items);\n return {\n ...items[0],\n data: aggregated,\n def,\n ...(nameOverride !== undefined && { name: nameOverride }),\n };\n}\n\nexport function aggregateMetricItems(\n items: ReadonlyArray<MetricItem>,\n): MetricItem | undefined {\n if (items.length === 0) return undefined;\n const def = getMetricById(items[0].id);\n if (!def?.aggregate) return items[items.length - 1];\n const aggregated = def.aggregate(items.map((i) => i.data as never));\n const nameOverride = lastNonEmptyName(items);\n return {\n ...items[0],\n data: aggregated,\n ...(nameOverride !== undefined && { name: nameOverride }),\n };\n}\n\nexport function toNumericScoreFromScores(\n scores: ReadonlyArray<ScoreItem>,\n): number | undefined {\n for (const item of scores) {\n const def = getScoreDef(item);\n if (def && def.displayStrategy === 'bar' && typeof item.data === 'object' && item.data !== null && 'value' in item.data) {\n const value = (item.data as { value: unknown }).value;\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n }\n const numeric = toNumericScore(item.data);\n if (numeric !== undefined) {\n return numeric;\n }\n }\n return undefined;\n}\n\nexport function toNumericScore(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value !== 'object' || value === null) {\n return undefined;\n }\n const obj = value as Record<string, unknown>;\n if (\n 'score' in obj &&\n typeof obj.score === 'number' &&\n Number.isFinite(obj.score)\n ) {\n return obj.score;\n }\n const numberValues = Object.values(value).filter(\n (entry): entry is number =>\n typeof entry === 'number' && Number.isFinite(entry),\n );\n if (numberValues.length === 0) {\n return undefined;\n }\n return (\n numberValues.reduce((sum, entry) => sum + entry, 0) / numberValues.length\n );\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\n\nimport type { RunnerConfig } from './config';\nimport type { RunSnapshot } from './events';\n\nexport interface ParsedTestCaseProgress {\n testCaseId: string;\n testCaseName: string;\n completedTestCases: number;\n totalTestCases: number;\n rerunIndex?: number;\n rerunTotal?: number;\n passed: boolean;\n durationMs: number;\n evaluatorScores: ReadonlyArray<{\n evaluatorId: string;\n scores: ReadonlyArray<{\n id: string;\n data: unknown;\n passed?: boolean;\n name?: string;\n }>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown; name?: string }>;\n logs?: ReadonlyArray<\n | { type: 'diff'; label?: string; expected: unknown; actual: unknown; diff: string }\n | { type: 'log'; label?: string; message: string }\n >;\n }>;\n}\n\nexport async function loadRunSnapshotsFromArtifacts(\n config: RunnerConfig,\n): Promise<RunSnapshot[]> {\n const baseDir = resolve(config.artifactDirectory);\n let entries: string[];\n try {\n entries = await readdir(baseDir);\n } catch {\n return [];\n }\n\n const jsonlFiles = entries.filter((name) => name.endsWith('.jsonl'));\n const snapshots: RunSnapshot[] = [];\n\n for (const fileName of jsonlFiles) {\n const filePath = join(baseDir, fileName);\n try {\n const snapshot = await parseArtifactToSnapshot(filePath, config);\n if (snapshot) {\n snapshots.push(snapshot);\n }\n } catch {\n // Skip malformed or unreadable files\n }\n }\n\n return snapshots.sort((a, b) => b.queuedAt - a.queuedAt);\n}\n\nasync function parseArtifactToSnapshot(\n filePath: string,\n _config: RunnerConfig,\n): Promise<RunSnapshot | null> {\n const content = await readFile(filePath, 'utf8');\n const lines = content.split('\\n').filter((line) => line.trim().length > 0);\n if (lines.length === 0) {\n return null;\n }\n\n let runQueued: {\n runId: string;\n datasetId: string;\n datasetName: string;\n evaluatorIds: ReadonlyArray<string>;\n totalTestCases: number;\n artifactPath: string;\n ts?: number;\n } | null = null;\n\n let runCompleted: {\n passedTestCases: number;\n failedTestCases: number;\n totalTestCases: number;\n finishedAt: number;\n } | null = null;\n\n let runFailed: { finishedAt: number; errorMessage: string } | null = null;\n let runStarted: { startedAt: number } | null = null;\n\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as Record<string, unknown>;\n const type = event.type as string;\n\n if (type === 'RunQueued') {\n runQueued = {\n runId: event.runId as string,\n datasetId: event.datasetId as string,\n datasetName: event.datasetName as string,\n evaluatorIds: event.evaluatorIds as ReadonlyArray<string>,\n totalTestCases: (event.totalTestCases as number) ?? 0,\n artifactPath: (event.artifactPath as string) ?? filePath,\n ts: event.ts as number | undefined,\n };\n }\n if (type === 'RunStarted') {\n runStarted = { startedAt: event.startedAt as number };\n }\n if (type === 'RunCompleted') {\n runCompleted = {\n passedTestCases: event.passedTestCases as number,\n failedTestCases: event.failedTestCases as number,\n totalTestCases: event.totalTestCases as number,\n finishedAt: event.finishedAt as number,\n };\n }\n if (type === 'RunFailed') {\n runFailed = {\n finishedAt: event.finishedAt as number,\n errorMessage: event.errorMessage as string,\n };\n }\n } catch {\n // Skip malformed lines\n }\n }\n\n if (!runQueued) {\n return null;\n }\n\n const artifactPath = filePath;\n\n const status = runFailed\n ? 'failed'\n : runCompleted\n ? 'completed'\n : runStarted\n ? 'running'\n : 'queued';\n\n const progress = aggregateTestCaseProgress(lines);\n const completedTestCases = runCompleted\n ? runQueued.totalTestCases\n : progress.completedTestCases;\n const passedTestCases =\n runCompleted?.passedTestCases ?? progress.passedTestCases;\n const failedTestCases =\n runCompleted?.failedTestCases ?? progress.failedTestCases;\n\n return {\n runId: runQueued.runId,\n datasetId: runQueued.datasetId,\n datasetName: runQueued.datasetName,\n evaluatorIds: runQueued.evaluatorIds,\n queuedAt: runQueued.ts ?? 0,\n startedAt: runStarted?.startedAt,\n finishedAt: runCompleted?.finishedAt ?? runFailed?.finishedAt,\n totalTestCases: runQueued.totalTestCases,\n completedTestCases,\n passedTestCases,\n failedTestCases,\n status,\n artifactPath,\n errorMessage: runFailed?.errorMessage,\n };\n}\n\nfunction aggregateTestCaseProgress(lines: string[]): {\n completedTestCases: number;\n passedTestCases: number;\n failedTestCases: number;\n} {\n let completedTestCases = 0;\n const testCasePassedBy = new Map<string, boolean>();\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as Record<string, unknown>;\n if (event.type === 'TestCaseProgress') {\n const ev = event as {\n testCaseId: string;\n completedTestCases: number;\n passed: boolean;\n };\n completedTestCases = ev.completedTestCases ?? completedTestCases;\n const id = ev.testCaseId;\n const current = testCasePassedBy.get(id);\n testCasePassedBy.set(id, current === undefined ? ev.passed : current && ev.passed);\n }\n } catch {\n // skip\n }\n }\n let passedTestCases = 0;\n let failedTestCases = 0;\n for (const passed of testCasePassedBy.values()) {\n if (passed) {\n passedTestCases += 1;\n } else {\n failedTestCases += 1;\n }\n }\n return { completedTestCases, passedTestCases, failedTestCases };\n}\n\nexport async function parseArtifactFile(\n artifactPath: string,\n): Promise<ParsedTestCaseProgress[]> {\n try {\n const content = await readFile(artifactPath, 'utf8');\n const lines = content.split('\\n').filter((line) => line.trim().length > 0);\n const results: ParsedTestCaseProgress[] = [];\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as Record<string, unknown>;\n if (event.type === 'TestCaseProgress') {\n const ev = event as {\n testCaseId: string;\n testCaseName: string;\n completedTestCases: number;\n totalTestCases: number;\n rerunIndex?: number;\n rerunTotal?: number;\n passed: boolean;\n durationMs: number;\n evaluatorScores: ReadonlyArray<{\n evaluatorId: string;\n scores: ReadonlyArray<{\n id: string;\n data: unknown;\n passed?: boolean;\n name?: string;\n }>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown; name?: string }>;\n logs?: ReadonlyArray<\n | { type: 'diff'; label?: string; expected: unknown; actual: unknown; diff: string }\n | { type: 'log'; label?: string; message: string }\n >;\n }>;\n };\n results.push({\n testCaseId: ev.testCaseId,\n testCaseName: ev.testCaseName,\n completedTestCases: ev.completedTestCases,\n totalTestCases: ev.totalTestCases,\n rerunIndex: ev.rerunIndex,\n rerunTotal: ev.rerunTotal,\n passed: ev.passed,\n durationMs: ev.durationMs,\n evaluatorScores: ev.evaluatorScores ?? [],\n });\n }\n } catch {\n // skip malformed lines\n }\n }\n return results;\n } catch {\n return [];\n }\n}\n","import { appendFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\nimport { Effect, Queue } from 'effect';\n\nexport interface PersistenceMessage {\n runId: string;\n artifactPath: string;\n payload: unknown;\n}\n\nasync function appendJsonLine(\n artifactPath: string,\n payload: unknown,\n): Promise<void> {\n await mkdir(dirname(artifactPath), { recursive: true });\n await appendFile(artifactPath, `${JSON.stringify(payload)}\\n`, 'utf8');\n}\n\nexport const createPersistenceWorker = (\n queue: Queue.Queue<PersistenceMessage>,\n): Effect.Effect<never, never, never> =>\n Effect.forever(\n Effect.gen(function* () {\n const message = yield* Queue.take(queue);\n yield* Effect.promise(() =>\n appendJsonLine(message.artifactPath, {\n runId: message.runId,\n ts: Date.now(),\n ...(typeof message.payload === 'object' &&\n message.payload !== null &&\n !Array.isArray(message.payload)\n ? message.payload\n : {}),\n }),\n );\n }),\n );\n","import type { CollectedTestCase, SearchTestCasesQuery } from './events';\n\nfunction matchesAny(\n value: string,\n matchers: ReadonlyArray<string | RegExp> | undefined,\n): boolean {\n if (!matchers || matchers.length === 0) {\n return true;\n }\n return matchers.some((matcher) =>\n typeof matcher === 'string' ? matcher === value : matcher.test(value),\n );\n}\n\nfunction matchesPath(\n value: string,\n matchers: ReadonlyArray<string | RegExp> | undefined,\n): boolean {\n if (!matchers || matchers.length === 0) {\n return true;\n }\n return matchers.some((matcher) => {\n if (typeof matcher === 'string') {\n return value.includes(matcher);\n }\n return matcher.test(value);\n });\n}\n\nexport function searchCollectedTestCases(\n all: ReadonlyArray<CollectedTestCase>,\n query?: SearchTestCasesQuery,\n): ReadonlyArray<CollectedTestCase> {\n if (!query) {\n return all;\n }\n\n return all.filter((item) => {\n const tags = item.testCase.getTags();\n\n if (\n query.excludedTags &&\n tags.some((tag) => matchesAny(tag, query.excludedTags))\n ) {\n return false;\n }\n if (\n query.excludedPaths &&\n matchesPath(item.filePath, query.excludedPaths)\n ) {\n return false;\n }\n\n const includedTagsMatch =\n !query.includedTags ||\n query.includedTags.length === 0 ||\n tags.some((tag) => matchesAny(tag, query.includedTags));\n\n const includedPathsMatch =\n !query.includedPaths ||\n query.includedPaths.length === 0 ||\n matchesPath(item.filePath, query.includedPaths);\n\n return includedTagsMatch && includedPathsMatch;\n });\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport type { CliState, EvalDataset, EvalRun } from '../../types';\nimport { Pane, RunsSidebar, SectionHeader, Sparkline, StatusText, TextBar } from '../../components';\n\ninterface RunsViewProps {\n state: CliState;\n dataset: EvalDataset | undefined;\n selectedRun: EvalRun | undefined;\n}\n\nexport function RunsView({\n state,\n dataset,\n selectedRun,\n}: RunsViewProps): React.ReactNode {\n const runs = dataset?.runs ?? [];\n const rightFocused = state.focus === 'right';\n\n return (\n <>\n <RunsSidebar state={state} dataset={dataset} runs={runs} />\n <Pane flexGrow={1} marginLeft={1} focused={rightFocused}>\n {!selectedRun ? (\n <Text color=\"gray\">Select a run to see summary metrics.</Text>\n ) : (\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"gray\">Run:</Text> {selectedRun.label}{' '}\n <StatusText status={selectedRun.status} />\n </Text>\n <Text color=\"gray\">\n Commit: {selectedRun.meta.commit} Branch: {selectedRun.meta.branch}{' '}\n Seed: {selectedRun.meta.seed}\n </Text>\n <Text> </Text>\n <SectionHeader>Overall</SectionHeader>\n <TextBar\n label=\"pass rate\"\n value={selectedRun.performance.passRate}\n format={(v) => `${v}%`}\n />\n <TextBar\n label=\"avg score\"\n value={Math.round(selectedRun.performance.avgScore * 100)}\n />\n <Text> </Text>\n <SectionHeader>Dimensions</SectionHeader>\n {selectedRun.dimensions.map((dimension) => (\n <TextBar\n key={dimension.name}\n label={dimension.name}\n value={dimension.score}\n />\n ))}\n <Text> </Text>\n <SectionHeader>Latency trend</SectionHeader>\n <Sparkline\n data={\n selectedRun.performance.latencyHistoryMs ?? [\n selectedRun.performance.latencyAvgMs - 40,\n selectedRun.performance.latencyAvgMs - 10,\n selectedRun.performance.latencyAvgMs + 20,\n selectedRun.performance.latencyP95Ms - 80,\n selectedRun.performance.latencyP95Ms,\n ]\n }\n width={24}\n />\n </Box>\n )}\n </Pane>\n </>\n );\n}\n","/** @jsxImportSource react */\nimport React, { useEffect, useState } from 'react';\nimport { resolve } from 'node:path';\nimport { Box, Text } from 'ink';\nimport {\n formatScoreData,\n getDiffLines,\n getLogLines,\n getMetricById,\n getScoreById,\n type ScoreDef,\n} from '../../../evals';\nimport { toNumericScore } from '../../../runner/score-utils';\nimport {\n parseArtifactFile,\n type ParsedTestCaseProgress,\n} from '../../../runner';\nimport type {\n CliState,\n EvalDataset,\n EvalRun,\n EvaluatorOption,\n} from '../../types';\nimport {\n Pane,\n RunsSidebar,\n SectionHeader,\n Sparkline,\n TextBar,\n} from '../../components';\n\nconst DETAILS_PAGE_SIZE = 20;\n\nfunction scoreColor(score: number): 'green' | 'yellow' | 'red' {\n if (score >= 80) return 'green';\n if (score >= 50) return 'yellow';\n return 'red';\n}\n\nfunction formatScorePart(item: {\n id: string;\n data: unknown;\n def?: ScoreDef<unknown>;\n}): string {\n const def: ScoreDef<unknown> | undefined = item.def ?? getScoreById(item.id);\n if (!def) {\n const numeric = toNumericScore(item.data);\n return numeric !== undefined ? `${numeric.toFixed(2)}` : 'n/a';\n }\n const formatted = formatScoreData(def, item.data);\n if (def.displayStrategy === 'bar') {\n const numeric =\n typeof item.data === 'object' &&\n item.data !== null &&\n 'value' in item.data\n ? (item.data as { value: unknown }).value\n : toNumericScore(item.data);\n if (typeof numeric === 'number' && Number.isFinite(numeric)) {\n const barWidth = 14;\n const filled = Math.round((numeric / 100) * barWidth);\n const bar = '█'.repeat(filled) + '░'.repeat(barWidth - filled);\n return `${formatted} ${bar}`;\n }\n }\n return formatted;\n}\n\ninterface RunDetailsViewProps {\n state: CliState;\n dataset: EvalDataset | undefined;\n selectedRun: EvalRun | undefined;\n evaluators: ReadonlyArray<EvaluatorOption>;\n}\n\nfunction CheckRow({\n name,\n passed,\n detail,\n}: {\n name: string;\n passed: boolean;\n detail?: string;\n}): React.ReactNode {\n const status = passed ? 'PASSED' : 'FAILED';\n const color = passed ? 'green' : 'red';\n return (\n <Text>\n <Text color=\"gray\">{name.padEnd(14)}</Text>{' '}\n <Text color={color} bold>\n {status}\n </Text>\n {detail ? <Text color=\"gray\"> ({detail})</Text> : null}\n </Text>\n );\n}\n\nfunction buildDetailRows(\n run: EvalRun,\n testCases: ParsedTestCaseProgress[],\n evaluatorNameById: Map<string, string>,\n): React.ReactNode[] {\n const { performance, dimensions, checks, failures, meta } = run;\n const latencyHistory = performance.latencyHistoryMs ?? [\n performance.latencyAvgMs - 40,\n performance.latencyAvgMs - 10,\n performance.latencyAvgMs + 20,\n performance.latencyP95Ms - 80,\n performance.latencyP95Ms,\n ];\n\n const rows: React.ReactNode[] = [\n <SectionHeader key=\"meta-h\">Meta</SectionHeader>,\n <Text key=\"meta-1\" color=\"gray\">\n Model: {meta.model} Provider: {meta.provider}\n </Text>,\n <Text key=\"meta-2\" color=\"gray\">\n Commit: {meta.commit} Branch: {meta.branch} Seed: {meta.seed}\n </Text>,\n <Text key=\"meta-3\" color=\"gray\">\n Duration: {meta.duration} Concurrency: {meta.concurrency}\n </Text>,\n <Text key=\"meta-4\" color=\"gray\">\n Artifact: {meta.artifact}\n </Text>,\n <Text key=\"sp1\"> </Text>,\n <SectionHeader key=\"scores-h\">Scores (0–100)</SectionHeader>,\n ...dimensions.map((d) => (\n <TextBar key={`dim-${d.name}`} label={d.name} value={d.score} />\n )),\n <Text key=\"sp2\"> </Text>,\n <SectionHeader key=\"checks-h\">Checks (boolean)</SectionHeader>,\n ...checks.map((c) => (\n <CheckRow\n key={`chk-${c.name}`}\n name={c.name}\n passed={c.passed}\n detail={c.detail}\n />\n )),\n <Text key=\"sp3\"> </Text>,\n <SectionHeader key=\"perf-h\">Performance</SectionHeader>,\n <TextBar\n key=\"perf-rate\"\n label=\"pass rate\"\n value={performance.passRate}\n format={(v) => `${v}%`}\n />,\n <Text key=\"perf-lat\" color=\"gray\">\n latency avg {performance.latencyAvgMs}ms p95 {performance.latencyP95Ms}ms\n </Text>,\n <Text key=\"perf-tok\" color=\"gray\">\n tokens avg {performance.tokensAvg} p95 {performance.tokensP95}\n </Text>,\n <Text key=\"sp4\"> </Text>,\n <SectionHeader key=\"spark-h\">Latency trend</SectionHeader>,\n <Sparkline key=\"spark\" data={latencyHistory} width={20} />,\n ];\n\n if (failures.length > 0) {\n rows.push(<Text key=\"sp5\"> </Text>);\n rows.push(<SectionHeader key=\"fail-h\">Failures (top)</SectionHeader>);\n failures.forEach((f, i) => {\n rows.push(\n <Text key={`fail-${i}`} color=\"red\">\n {i + 1}) {f.title}\n </Text>,\n );\n });\n }\n\n if (testCases.length > 0) {\n rows.push(<Text key=\"sp6\"> </Text>);\n rows.push(<SectionHeader key=\"tc-h\">Test cases</SectionHeader>);\n for (const tc of testCases) {\n const rerunPart =\n tc.rerunTotal != null && tc.rerunIndex != null\n ? ` (${tc.rerunIndex}/${tc.rerunTotal})`\n : '';\n rows.push(\n <Text key={`tc-${tc.testCaseId}-${tc.rerunIndex ?? 0}`}>\n <Text color=\"cyan\">\n [{tc.completedTestCases}/{tc.totalTestCases}]\n </Text>{' '}\n {tc.testCaseName}\n {rerunPart ? <Text color=\"cyan\">{rerunPart}</Text> : null}\n <Text color=\"gray\"> ({tc.durationMs}ms)</Text>\n </Text>,\n );\n for (const item of tc.evaluatorScores) {\n const name =\n evaluatorNameById.get(item.evaluatorId) ?? item.evaluatorId;\n rows.push(\n <Text key={`tc-${tc.testCaseId}-${item.evaluatorId}`}>\n {' '}\n {name}:{' '}\n <Text color={item.passed ? 'green' : 'red'} bold>\n {item.passed ? 'PASS' : 'FAIL'}\n </Text>\n {item.metrics && item.metrics.length > 0 ? (\n <>\n {' '}\n {item.metrics.map((m) => {\n const def = getMetricById(m.id);\n if (!def) return null;\n const formatted = def.format(m.data);\n const label = m.name ?? def.name;\n return (\n <Text key={m.id} color=\"gray\">\n [{label ? `${label}: ` : ''}\n {formatted}]{' '}\n </Text>\n );\n })}\n </>\n ) : null}\n </Text>,\n );\n if (item.scores.length > 0) {\n for (let sIdx = 0; sIdx < item.scores.length; sIdx++) {\n const s = item.scores[sIdx];\n const def: ScoreDef<unknown> | undefined =\n (s as { def?: ScoreDef<unknown> }).def ?? getScoreById(s.id);\n const scoreLabel = s.name ?? def?.name ?? def?.id ?? s.id;\n rows.push(\n <Text\n key={`tc-${tc.testCaseId}-${item.evaluatorId}-score-${sIdx}`}\n color={scoreColor(toNumericScore(s.data) ?? 0)}\n >\n {' '}\n {scoreLabel}: {formatScorePart(s)}\n </Text>,\n );\n }\n } else {\n rows.push(\n <Text\n key={`tc-${tc.testCaseId}-${item.evaluatorId}-n/a`}\n color=\"gray\"\n >\n {' '}\n n/a\n </Text>,\n );\n }\n if (!item.passed && item.logs && item.logs.length > 0) {\n for (let logIdx = 0; logIdx < item.logs.length; logIdx++) {\n const log = item.logs[logIdx];\n if (log.type === 'diff') {\n const lines = getDiffLines(log);\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const { type, line } = lines[lineIdx];\n rows.push(\n <Text\n key={`tc-${tc.testCaseId}-${item.evaluatorId}-${logIdx}-${lineIdx}`}\n color={\n type === 'remove'\n ? 'red'\n : type === 'add'\n ? 'green'\n : 'gray'\n }\n >\n {' '}\n {line}\n </Text>,\n );\n }\n } else if (log.type === 'log') {\n const logLines = getLogLines(log);\n for (let lineIdx = 0; lineIdx < logLines.length; lineIdx++) {\n rows.push(\n <Text\n key={`tc-${tc.testCaseId}-${item.evaluatorId}-${logIdx}-${lineIdx}`}\n color=\"gray\"\n >\n {' '}\n {logLines[lineIdx]}\n </Text>,\n );\n }\n }\n }\n }\n }\n }\n }\n\n return rows;\n}\n\nexport function RunDetailsView({\n state,\n dataset,\n selectedRun,\n evaluators,\n}: RunDetailsViewProps): React.ReactNode {\n const runs = dataset?.runs ?? [];\n const rightFocused = state.focus === 'right';\n const [testCases, setTestCases] = useState<ParsedTestCaseProgress[]>([]);\n\n const evaluatorNameById = React.useMemo(\n () => new Map(evaluators.map((e) => [e.id, e.name])),\n [evaluators],\n );\n\n useEffect(() => {\n if (!selectedRun?.meta?.artifact) {\n setTestCases([]);\n return;\n }\n const artifactPath = resolve(selectedRun.meta.artifact);\n parseArtifactFile(artifactPath).then(setTestCases);\n }, [selectedRun?.meta?.artifact]);\n\n if (!selectedRun) {\n return (\n <>\n <RunsSidebar state={state} dataset={dataset} runs={runs} />\n <Pane flexGrow={1} marginLeft={1} focused={rightFocused}>\n <Text color=\"gray\">Select a run to inspect details.</Text>\n </Pane>\n </>\n );\n }\n\n const rows = buildDetailRows(selectedRun, testCases, evaluatorNameById);\n const offset = Math.max(0, state.detailsScrollOffset);\n const visible = rows.slice(offset, offset + DETAILS_PAGE_SIZE);\n\n return (\n <>\n <RunsSidebar state={state} dataset={dataset} runs={runs} />\n <Pane flexGrow={1} marginLeft={1} focused={rightFocused}>\n <Box flexDirection=\"column\">\n {visible.map((row, i) => (\n <React.Fragment key={i}>{row}</React.Fragment>\n ))}\n </Box>\n </Pane>\n </>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\nimport type { CliState, EvalsData } from '../../types';\nimport { Pane, SectionHeader } from '../../components';\n\nconst LEFT_PANE_WIDTH = 44;\n\ninterface NewEvaluationViewProps {\n state: CliState;\n data: EvalsData;\n visibleEvaluators: EvalsData['evaluators'];\n}\n\nexport function NewEvaluationView({\n state,\n data,\n visibleEvaluators,\n}: NewEvaluationViewProps): React.ReactNode {\n const selectedCount = state.selectedEvaluatorIds.length;\n const focusedEvaluator = visibleEvaluators[state.evaluatorMenuIndex];\n const leftFocused = state.focus === 'left';\n const rightFocused = state.focus === 'right';\n\n return (\n <>\n <Pane width={LEFT_PANE_WIDTH} focused={leftFocused}>\n <SectionHeader>Available Evaluators</SectionHeader>\n <Text color=\"gray\">Search: {state.searchQuery || '(none)'}</Text>\n {visibleEvaluators.map((evaluator, index) => {\n const selected = index === state.evaluatorMenuIndex;\n const inSelection = state.selectedEvaluatorIds.includes(evaluator.id);\n return (\n <Text\n key={evaluator.id}\n color={selected ? 'cyan' : 'gray'}\n bold={selected}\n >\n {selected ? '▸ ' : ' '}\n {inSelection ? '[x] ' : '[ ] '}\n {evaluator.name}\n </Text>\n );\n })}\n </Pane>\n <Pane flexGrow={1} marginLeft={1} focused={rightFocused}>\n <SectionHeader>Selected ({selectedCount})</SectionHeader>\n {state.selectedEvaluatorIds.map((id, index) => {\n const evaluator = data.evaluators.find((item) => item.id === id);\n if (!evaluator) return null;\n return (\n <Text key={id}>\n {index + 1}) {evaluator.name}\n </Text>\n );\n })}\n <SectionHeader>Config preview</SectionHeader>\n <Text color=\"gray\">\n {focusedEvaluator?.configPreview ??\n 'Select an evaluator to inspect config.'}\n </Text>\n </Pane>\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.tsx","../src/cli/app.tsx","../src/cli/components/Breadcrumbs.tsx","../src/cli/components/Footer.tsx","../src/cli/components/ListItem.tsx","../src/cli/components/Pane.tsx","../src/cli/components/RunsSidebar.tsx","../src/cli/components/SectionHeader.tsx","../src/cli/components/StatusText.tsx","../src/cli/components/Sparkline.tsx","../src/cli/components/TextBar.tsx","../src/cli/keys.ts","../src/cli/data.mock.json","../src/cli/state.ts","../src/cli/views/datasets/DatasetsView.tsx","../src/runner/api.ts","../src/runner/config.ts","../src/runner/config-loader.ts","../src/runner/discovery.ts","../src/runner/execution.ts","../src/evals/diff.ts","../src/evals/metric.ts","../src/evals/score.ts","../src/evals/aggregators.ts","../src/evals/metrics/standard.ts","../src/evals/scores/standard.ts","../src/runner/score-utils.ts","../src/runner/artifact-loader.ts","../src/runner/persistence.ts","../src/runner/search.ts","../src/cli/views/runs/RunsView.tsx","../src/cli/views/details/RunDetailsView.tsx","../src/cli/views/new-evaluation/NewEvaluationView.tsx"],"names":["useEffect","useMemo","useState","Box","Text","jsxs","jsx","Fragment","resolve","randomUUID","Effect","Queue","createJiti","jitiModule","loaded","parts","registry","passed","readdir","join","LEFT_PANE_WIDTH","React"],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { withFullScreen } from 'fullscreen-ink';\n\nimport { EvalsCliApp } from './cli/app';\nimport { loadMockData, loadRunnerData, parseStartupArgs } from './cli/state';\nimport { createRunner } from './runner';\n\nasync function main(): Promise<void> {\n const args = parseStartupArgs(process.argv.slice(2));\n const runner = createRunner();\n const data = await loadRunnerData(runner).catch(() => loadMockData());\n\n process.on('SIGINT', () => {\n void runner.shutdown().finally(() => process.exit(0));\n });\n process.on('SIGTERM', () => {\n void runner.shutdown().finally(() => process.exit(0));\n });\n\n withFullScreen(\n <EvalsCliApp data={data} args={args} runner={runner} />,\n ).start();\n}\n\nvoid main();\n","/** @jsxImportSource react */\nimport React, { useEffect, useMemo, useReducer, useRef, useState } from 'react';\nimport { Box, Text, useApp, useInput } from 'ink';\nimport { useScreenSize } from 'fullscreen-ink';\n\nimport { getBreadcrumbText, getFooterText } from './components';\nimport {\n isBackKey,\n isPrintableCharacter,\n isQuitInput,\n isSearchInput,\n} from './keys';\nimport {\n createInitialState,\n applyRunnerEvent,\n getDatasetByMenuIndex,\n getFilteredDatasets,\n getRunByMenuIndex,\n reduceCliState,\n} from './state';\nimport type { CliState, EvalsData, StartupArgs } from './types';\nimport type { RunnerApi } from '../runner';\nimport {\n DatasetsView,\n NewEvaluationView,\n OVERVIEW_PAGE_SIZE,\n RunDetailsView,\n RunsView,\n} from './views';\n\ninterface EvalsCliAppProps {\n data: EvalsData;\n args: StartupArgs;\n runner?: RunnerApi;\n}\n\nfunction clampCursor(\n state: CliState,\n filteredDatasetsLength: number,\n selectedRunCount: number,\n): CliState {\n const datasetMax = filteredDatasetsLength;\n const runMax = selectedRunCount;\n const evaluatorMax = 3;\n return {\n ...state,\n datasetMenuIndex: Math.max(0, Math.min(state.datasetMenuIndex, datasetMax)),\n runMenuIndex: Math.max(0, Math.min(state.runMenuIndex, runMax)),\n evaluatorMenuIndex: Math.max(\n 0,\n Math.min(state.evaluatorMenuIndex, evaluatorMax),\n ),\n };\n}\n\nexport function EvalsCliApp({\n data,\n args,\n runner,\n}: EvalsCliAppProps): React.ReactNode {\n const { exit } = useApp();\n const { width: stdoutWidth, height: stdoutHeight } = useScreenSize();\n const [liveData, setLiveData] = useState<EvalsData>(data);\n const [runtimeMessage, setRuntimeMessage] = useState<string | undefined>();\n const overviewRowCountRef = useRef(0);\n const [state, dispatch] = useReducer(\n reduceCliState,\n createInitialState(data, args),\n );\n\n useEffect(() => {\n setLiveData(data);\n }, [data]);\n\n useEffect(() => {\n if (!runner) {\n return undefined;\n }\n return runner.subscribeRunEvents((event) => {\n setLiveData((current) => applyRunnerEvent(current, event, runner));\n if (event.type === 'RunQueued') {\n setRuntimeMessage(`Queued ${event.runId} with ${event.totalTestCases} test cases.`);\n }\n if (event.type === 'RunCompleted') {\n setRuntimeMessage(\n `Completed ${event.runId}: ${event.passedTestCases}/${event.totalTestCases} passed.`,\n );\n }\n if (event.type === 'RunFailed') {\n setRuntimeMessage(`Run failed: ${event.errorMessage}`);\n }\n });\n }, [runner]);\n\n const filteredDatasets = useMemo(\n () => getFilteredDatasets(liveData, state.searchQuery),\n [liveData, state.searchQuery],\n );\n const clampedState = clampCursor(\n state,\n filteredDatasets.length,\n getDatasetByMenuIndex(filteredDatasets, state.datasetMenuIndex)?.runs\n .length ?? 0,\n );\n const selectedDataset = getDatasetByMenuIndex(\n filteredDatasets,\n clampedState.datasetMenuIndex,\n );\n const selectedRun = getRunByMenuIndex(\n selectedDataset,\n clampedState.runMenuIndex,\n );\n const visibleEvaluators = liveData.evaluators.filter((evaluator) =>\n evaluator.name\n .toLowerCase()\n .includes(clampedState.searchQuery.toLowerCase()),\n );\n\n useInput((input, key) => {\n if (isQuitInput(input) || key.escape) {\n exit();\n return;\n }\n\n if (key.tab) {\n dispatch({ type: 'TOGGLE_FOCUS' });\n return;\n }\n\n if (isSearchInput(input)) {\n dispatch({ type: 'START_SEARCH' });\n return;\n }\n\n if (clampedState.searchMode) {\n if (key.return) {\n dispatch({ type: 'END_SEARCH' });\n return;\n }\n if (isBackKey(key)) {\n dispatch({ type: 'REMOVE_SEARCH_CHAR' });\n return;\n }\n if (isPrintableCharacter(input)) {\n dispatch({ type: 'APPEND_SEARCH', value: input });\n }\n return;\n }\n\n if (key.upArrow) {\n const max =\n clampedState.level === 'details'\n ? 100\n : clampedState.level === 'new-evaluation'\n ? visibleEvaluators.length - 1\n : 100;\n dispatch({ type: 'MOVE_UP', max });\n return;\n }\n\n if (key.downArrow) {\n let max: number;\n if (clampedState.level === 'datasets') {\n max =\n clampedState.focus === 'right'\n ? Math.max(0, overviewRowCountRef.current - OVERVIEW_PAGE_SIZE)\n : filteredDatasets.length;\n } else if (clampedState.level === 'runs') {\n max = selectedDataset?.runs.length ?? 0;\n } else if (clampedState.level === 'new-evaluation') {\n max = Math.max(0, visibleEvaluators.length - 1);\n } else {\n max = 100;\n }\n dispatch({ type: 'MOVE_DOWN', max });\n return;\n }\n\n if (key.return) {\n dispatch({\n type: 'ENTER',\n hasDataset: Boolean(selectedDataset),\n hasRun: Boolean(selectedRun),\n });\n if (clampedState.level === 'new-evaluation') {\n const evaluator = visibleEvaluators[clampedState.evaluatorMenuIndex];\n if (evaluator) {\n dispatch({ type: 'TOGGLE_EVALUATOR', evaluatorId: evaluator.id });\n }\n }\n return;\n }\n\n if (isBackKey(key) || input === '\\x7f' || input === '\\b') {\n dispatch({ type: 'BACK' });\n return;\n }\n\n if (input.toLowerCase() === 'c') {\n dispatch({ type: 'CLEAR_WARNINGS' });\n setRuntimeMessage(undefined);\n return;\n }\n\n if (input.toLowerCase() === 's' && clampedState.level === 'new-evaluation') {\n if (!runner) {\n setRuntimeMessage('Runner unavailable: cannot start evaluation.');\n return;\n }\n if (!selectedDataset) {\n setRuntimeMessage('Select a dataset before starting a new evaluation.');\n return;\n }\n if (clampedState.selectedEvaluatorIds.length === 0) {\n setRuntimeMessage('Select at least one evaluator before starting.');\n return;\n }\n\n void runner\n .runDatasetWith({\n datasetId: selectedDataset.id,\n evaluatorIds: clampedState.selectedEvaluatorIds,\n })\n .then((snapshot) => {\n setRuntimeMessage(\n `Started ${snapshot.runId} on ${selectedDataset.name} (${snapshot.totalTestCases} cases).`,\n );\n })\n .catch((error) => {\n setRuntimeMessage(\n error instanceof Error ? error.message : 'Failed to start evaluation.',\n );\n });\n }\n });\n\n const renderContent = () => {\n if (clampedState.level === 'new-evaluation') {\n return (\n <NewEvaluationView\n state={clampedState}\n data={liveData}\n visibleEvaluators={visibleEvaluators}\n />\n );\n }\n if (clampedState.level === 'datasets') {\n return (\n <DatasetsView\n state={clampedState}\n filteredDatasets={filteredDatasets}\n selectedDataset={selectedDataset}\n overviewRowCountRef={overviewRowCountRef}\n />\n );\n }\n if (clampedState.level === 'runs') {\n return (\n <RunsView\n state={clampedState}\n dataset={selectedDataset}\n selectedRun={selectedRun}\n />\n );\n }\n return (\n <RunDetailsView\n state={clampedState}\n dataset={selectedDataset}\n selectedRun={selectedRun}\n evaluators={liveData.evaluators}\n />\n );\n };\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n width={stdoutWidth}\n height={stdoutHeight}\n >\n <Box\n borderStyle=\"round\"\n borderColor=\"cyan\"\n paddingX={1}\n width={stdoutWidth}\n >\n <Text>\n {getBreadcrumbText(\n clampedState,\n selectedDataset?.name,\n selectedRun?.label,\n )}\n </Text>\n </Box>\n\n {clampedState.startupWarnings.length > 0 && (\n <Box\n marginTop={1}\n borderStyle=\"round\"\n borderColor=\"yellow\"\n paddingX={1}\n flexDirection=\"column\"\n width={stdoutWidth}\n >\n <Text color=\"yellow\">Startup warnings:</Text>\n {clampedState.startupWarnings.map((warning, index) => (\n <Text key={`${warning}-${index}`}>{warning}</Text>\n ))}\n </Box>\n )}\n\n {clampedState.searchMode && (\n <Box\n marginTop={1}\n borderStyle=\"round\"\n borderColor=\"magenta\"\n paddingX={1}\n width={stdoutWidth}\n >\n <Text color=\"magenta\" bold>Search: </Text>\n <Text color=\"white\">{clampedState.searchQuery}</Text>\n </Box>\n )}\n\n {runtimeMessage && (\n <Box\n marginTop={1}\n borderStyle=\"round\"\n borderColor=\"blue\"\n paddingX={1}\n width={stdoutWidth}\n >\n <Text color=\"blue\">{runtimeMessage}</Text>\n </Box>\n )}\n\n <Box\n marginTop={1}\n flexGrow={1}\n width={stdoutWidth}\n flexDirection=\"row\"\n >\n {renderContent()}\n </Box>\n\n <Box marginTop={1} paddingX={1}>\n <Text color=\"gray\">{getFooterText(clampedState)}</Text>\n </Box>\n </Box>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\nimport type { CliState } from '../types';\n\nconst SEP = ' ';\nconst ARROW = '›';\n\nexport function getBreadcrumbText(\n state: CliState,\n datasetName?: string,\n runLabel?: string,\n): React.ReactNode {\n const dim = (s: string, k?: string) => (\n <Text key={k ?? s} color=\"gray\">\n {s}\n </Text>\n );\n const accent = (s: string) => (\n <Text key={s} color=\"cyan\" bold>\n {s}\n </Text>\n );\n\n if (state.level === 'datasets') {\n return (\n <>\n {dim('Evaluations')}\n {SEP}\n {dim(ARROW, 'a1')}\n {SEP}\n {accent('Datasets')}\n </>\n );\n }\n if (state.level === 'runs') {\n return (\n <>\n {dim('Evaluations')}\n {SEP}\n {dim(ARROW, 'a1')}\n {SEP}\n {dim('Dataset:')}{' '}\n <Text key=\"ds\" color=\"white\">\n {datasetName ?? '-'}\n </Text>\n {SEP}\n {dim(ARROW, 'a2')}\n {SEP}\n {accent('Runs')}\n </>\n );\n }\n if (state.level === 'details') {\n return (\n <>\n {dim('Evaluations')}\n {SEP}\n {dim(ARROW, 'a1')}\n {SEP}\n {dim('Dataset:')}{' '}\n <Text key=\"ds\" color=\"white\">\n {datasetName ?? '-'}\n </Text>\n {SEP}\n {dim(ARROW, 'a2')}\n {SEP}\n {dim('Run:')}{' '}\n <Text key=\"rl\" color=\"white\">\n {runLabel ?? '-'}\n </Text>\n {SEP}\n {dim(ARROW, 'a3')}\n {SEP}\n {accent('Details')}\n </>\n );\n }\n return (\n <>\n {dim('Evaluations')}\n {SEP}\n {dim(ARROW, 'a1')}\n {SEP}\n {accent('New evaluation')}\n {SEP}\n {dim(ARROW, 'a2')}\n {SEP}\n {dim('Select evaluators', 'sel')}\n </>\n );\n}\n","/** @jsxImportSource react */\nimport type { CliState } from '../types';\n\nexport function getFooterText(state: CliState): string {\n if (state.level === 'datasets') {\n return state.focus === 'right'\n ? '↑↓ scroll Tab focus left / search q quit'\n : '↑↓ move Enter open Tab focus right / search q quit';\n }\n if (state.level === 'runs') {\n return '↑↓ move Enter details Backspace datasets Tab focus q quit';\n }\n if (state.level === 'details') {\n return '↑↓ scroll Backspace runs Tab focus q quit';\n }\n return '↑↓ move Enter add/remove S start run / search Esc cancel q quit';\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\n\ninterface ListItemProps {\n selected: boolean;\n label: string;\n itemKey: string;\n}\n\nexport function ListItem({\n selected,\n label,\n itemKey,\n}: ListItemProps): React.ReactNode {\n return (\n <Text key={itemKey} color={selected ? 'cyan' : 'gray'} bold={selected}>\n {selected ? '▸ ' : ' '}\n {label}\n </Text>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Box } from 'ink';\n\ninterface PaneProps {\n children: React.ReactNode;\n width?: number;\n flexGrow?: number;\n marginLeft?: number;\n focused?: boolean;\n}\n\nexport function Pane({\n children,\n width,\n flexGrow,\n marginLeft,\n focused = false,\n}: PaneProps): React.ReactNode {\n return (\n <Box\n flexDirection=\"column\"\n width={width}\n flexGrow={flexGrow}\n marginLeft={marginLeft}\n borderStyle={focused ? 'single' : 'round'}\n borderColor={focused ? 'cyan' : 'gray'}\n paddingX={1}\n >\n {children}\n </Box>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\nimport type { CliState, EvalDataset, EvalRun } from '../types';\nimport { ListItem } from './ListItem';\nimport { Pane } from './Pane';\nimport { SectionHeader } from './SectionHeader';\nimport { StatusText } from './StatusText';\n\nconst LEFT_PANE_WIDTH = 44;\n\ninterface RunsSidebarProps {\n state: CliState;\n dataset: EvalDataset | undefined;\n runs: EvalRun[];\n}\n\nexport function RunsSidebar({\n state,\n runs,\n}: RunsSidebarProps): React.ReactNode {\n const focused = state.focus === 'left';\n return (\n <Pane width={LEFT_PANE_WIDTH} focused={focused}>\n <SectionHeader>Runs</SectionHeader>\n <ListItem\n selected={state.runMenuIndex === 0}\n label=\"New evaluation\"\n itemKey=\"runs-new-eval\"\n />\n {runs.map((run, index) => (\n <Text\n key={run.id}\n color={state.runMenuIndex === index + 1 ? 'cyan' : 'gray'}\n bold={state.runMenuIndex === index + 1}\n >\n {state.runMenuIndex === index + 1 ? '▸ ' : ' '}\n {run.label} <StatusText status={run.status} />\n </Text>\n ))}\n </Pane>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\n\ninterface SectionHeaderProps {\n children: React.ReactNode;\n}\n\nexport function SectionHeader({\n children,\n}: SectionHeaderProps): React.ReactNode {\n return (\n <Text color=\"cyan\" bold>\n {children}\n </Text>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\nimport type { EvalStatus } from '../types';\n\ninterface StatusTextProps {\n status: EvalStatus;\n}\n\nexport function StatusText({ status }: StatusTextProps): React.ReactNode {\n const color = status === 'PASS' ? 'green' : status === 'RUNNING' ? 'yellow' : 'red';\n return <Text color={color}>({status})</Text>;\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\n\n/** Block characters for sparkline: ▁▂▃▄▅▆▇█ (8 levels) */\nconst BLOCKS = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];\n\ninterface SparklineProps {\n /** Values to plot (e.g. latency in ms) */\n data: number[];\n /** Max width in chars (default: data length or 24) */\n width?: number;\n /** Optional label prefix */\n label?: string;\n}\n\nexport function Sparkline({\n data,\n width,\n label,\n}: SparklineProps): React.ReactNode {\n if (data.length === 0) return null;\n\n const max = Math.max(...data);\n const min = Math.min(...data);\n const range = max - min || 1;\n const targetWidth = width ?? Math.min(data.length, 24);\n\n let values: number[];\n if (data.length <= targetWidth) {\n values = data;\n } else {\n const step = data.length / targetWidth;\n values = Array.from({ length: targetWidth }, (_, i) => {\n const start = Math.floor(i * step);\n const end = Math.floor((i + 1) * step);\n const slice = data.slice(start, end);\n return slice.reduce((a, b) => a + b, 0) / slice.length;\n });\n }\n\n const spark = values\n .map((v) => {\n const normalized = (v - min) / range;\n const idx = Math.min(7, Math.floor(normalized * 8));\n return BLOCKS[idx];\n })\n .join('');\n\n return (\n <Text>\n {label !== undefined && label !== '' ? (\n <Text color=\"gray\">{label.padEnd(14)} </Text>\n ) : null}\n <Text color=\"cyan\">{spark}</Text>\n </Text>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\n\ninterface TextBarProps {\n label: string;\n value: number;\n max?: number;\n /** Label width (default 14 to match inspiration) */\n labelWidth?: number;\n /** Bar width in chars (default 20) */\n barWidth?: number;\n /** Format value for display (e.g. v => `${v}%`) */\n format?: (v: number) => string;\n /** Color bar by value: green > 70, yellow 40-70, red < 40 */\n colorByValue?: boolean;\n}\n\nfunction barColor(pct: number): 'green' | 'yellow' | 'red' | undefined {\n if (pct >= 70) return 'green';\n if (pct >= 40) return 'yellow';\n return 'red';\n}\n\nexport function TextBar({\n label,\n value,\n max = 100,\n labelWidth = 14,\n barWidth = 20,\n format = (v) => String(v),\n colorByValue = true,\n}: TextBarProps): React.ReactNode {\n const clamped = Math.max(0, Math.min(max, value));\n const pct = max > 0 ? (clamped / max) * 100 : 0;\n const filled = Math.round((clamped / max) * barWidth);\n const filledBar = '█'.repeat(filled);\n const emptyBar = '░'.repeat(Math.max(0, barWidth - filled));\n const color = colorByValue ? barColor(pct) : undefined;\n\n return (\n <Text>\n <Text color=\"gray\">{label.padEnd(labelWidth)}</Text>\n {' ['}\n {color ? (\n <>\n <Text color={color}>{filledBar}</Text>\n <Text color=\"gray\">{emptyBar}</Text>\n </>\n ) : (\n filledBar + emptyBar\n )}\n {'] '}\n <Text color={color ?? 'white'} bold>{format(value)}</Text>\n </Text>\n );\n}\n","import type { Key } from 'ink';\n\nexport function isQuitInput(input: string): boolean {\n return input.toLowerCase() === 'q';\n}\n\nexport function isSearchInput(input: string): boolean {\n return input === '/';\n}\n\nexport function isPrintableCharacter(input: string): boolean {\n return input.length === 1 && input >= ' ' && input !== '\\u007f';\n}\n\nexport function isBackKey(key: Key): boolean {\n return key.backspace || key.delete;\n}\n","{\n \"datasets\": [\n {\n \"id\": \"onboarding-flows\",\n \"name\": \"onboarding-flows\",\n \"overview\": \"Evaluate first-user journeys and schema compliance for generated onboarding payloads.\",\n \"runs\": [\n {\n \"id\": \"run_2026-02-17_2044\",\n \"label\": \"2026-02-17 20:44\",\n \"status\": \"FAILED\",\n \"performance\": {\n \"passRate\": 96,\n \"avgScore\": 0.91,\n \"latencyP95Ms\": 710,\n \"latencyAvgMs\": 502,\n \"tokensAvg\": 171,\n \"tokensP95\": 230,\n \"costUsd\": 0.0024,\n \"latencyHistoryMs\": [380, 420, 510, 480, 550, 620, 590, 710, 520, 480, 530, 600]\n },\n \"dimensions\": [\n { \"name\": \"correctness\", \"score\": 82 },\n { \"name\": \"faithfulness\", \"score\": 79 },\n { \"name\": \"brevity\", \"score\": 68 },\n { \"name\": \"style\", \"score\": 90 }\n ],\n \"checks\": [\n { \"name\": \"json_schema\", \"passed\": false, \"detail\": \"3 violations\" },\n { \"name\": \"tool_calls\", \"passed\": true, \"detail\": \"0 unexpected\" },\n { \"name\": \"pii_leak\", \"passed\": true },\n { \"name\": \"jailbreak\", \"passed\": true }\n ],\n \"failures\": [\n { \"title\": \"product_parser › conforms to schema (price: string)\" },\n { \"title\": \"checkout › tool-call count mismatch\" }\n ],\n \"meta\": {\n \"model\": \"gpt-4o-mini\",\n \"provider\": \"OpenAI\",\n \"commit\": \"2f3c1a9\",\n \"branch\": \"main\",\n \"seed\": 42,\n \"concurrency\": 4,\n \"duration\": \"00:01:12\",\n \"artifact\": \"./eval-results/run_2026-02-17.jsonl\"\n }\n },\n {\n \"id\": \"run_2026-02-16_1112\",\n \"label\": \"2026-02-16 11:12\",\n \"status\": \"PASS\",\n \"performance\": {\n \"passRate\": 99,\n \"avgScore\": 0.95,\n \"latencyP95Ms\": 650,\n \"latencyAvgMs\": 488,\n \"tokensAvg\": 168,\n \"tokensP95\": 220,\n \"costUsd\": 0.002,\n \"latencyHistoryMs\": [420, 450, 480, 460, 520, 490, 510, 650, 440, 470, 500, 480]\n },\n \"dimensions\": [\n { \"name\": \"correctness\", \"score\": 89 },\n { \"name\": \"faithfulness\", \"score\": 88 },\n { \"name\": \"brevity\", \"score\": 72 },\n { \"name\": \"style\", \"score\": 93 }\n ],\n \"checks\": [\n { \"name\": \"json_schema\", \"passed\": true, \"detail\": \"0 violations\" },\n { \"name\": \"tool_calls\", \"passed\": true, \"detail\": \"0 unexpected\" },\n { \"name\": \"pii_leak\", \"passed\": true },\n { \"name\": \"jailbreak\", \"passed\": true }\n ],\n \"failures\": [],\n \"meta\": {\n \"model\": \"gpt-4o-mini\",\n \"provider\": \"OpenAI\",\n \"commit\": \"0d24f8f\",\n \"branch\": \"main\",\n \"seed\": 42,\n \"concurrency\": 4,\n \"duration\": \"00:01:06\",\n \"artifact\": \"./eval-results/run_2026-02-16.jsonl\"\n }\n },\n {\n \"id\": \"run_2026-02-15_0921\",\n \"label\": \"2026-02-15 09:21\",\n \"status\": \"PASS\",\n \"performance\": {\n \"passRate\": 98,\n \"avgScore\": 0.93,\n \"latencyP95Ms\": 680,\n \"latencyAvgMs\": 495,\n \"tokensAvg\": 175,\n \"tokensP95\": 235,\n \"costUsd\": 0.0022,\n \"latencyHistoryMs\": [450, 480, 520, 490, 550, 580, 620, 680, 510, 470, 530, 560]\n },\n \"dimensions\": [\n { \"name\": \"correctness\", \"score\": 86 },\n { \"name\": \"faithfulness\", \"score\": 84 },\n { \"name\": \"brevity\", \"score\": 70 },\n { \"name\": \"style\", \"score\": 91 }\n ],\n \"checks\": [\n { \"name\": \"json_schema\", \"passed\": true, \"detail\": \"0 violations\" },\n { \"name\": \"tool_calls\", \"passed\": true, \"detail\": \"0 unexpected\" },\n { \"name\": \"pii_leak\", \"passed\": true },\n { \"name\": \"jailbreak\", \"passed\": true }\n ],\n \"failures\": [],\n \"meta\": {\n \"model\": \"gpt-4o-mini\",\n \"provider\": \"OpenAI\",\n \"commit\": \"a1b2c3d\",\n \"branch\": \"main\",\n \"seed\": 42,\n \"concurrency\": 4,\n \"duration\": \"00:01:08\",\n \"artifact\": \"./eval-results/run_2026-02-15.jsonl\"\n }\n }\n ]\n },\n {\n \"id\": \"tool-calls\",\n \"name\": \"tool-calls\",\n \"overview\": \"Validate function-call conformance and unexpected tool invocation behavior.\",\n \"runs\": [\n {\n \"id\": \"run_2026-02-14_1530\",\n \"label\": \"2026-02-14 15:30\",\n \"status\": \"PASS\",\n \"performance\": {\n \"passRate\": 100,\n \"avgScore\": 1.0,\n \"latencyP95Ms\": 320,\n \"latencyAvgMs\": 280,\n \"tokensAvg\": 45,\n \"tokensP95\": 62,\n \"costUsd\": 0.0008,\n \"latencyHistoryMs\": [250, 270, 290, 280, 310, 320, 265, 290, 300, 275]\n },\n \"dimensions\": [\n { \"name\": \"contract_match\", \"score\": 100 },\n { \"name\": \"arg_validity\", \"score\": 100 }\n ],\n \"checks\": [\n { \"name\": \"tool_calls\", \"passed\": true, \"detail\": \"0 unexpected\" }\n ],\n \"failures\": [],\n \"meta\": {\n \"model\": \"gpt-4o-mini\",\n \"provider\": \"OpenAI\",\n \"commit\": \"e4f5g6h\",\n \"branch\": \"feat/tools\",\n \"seed\": 42,\n \"concurrency\": 8,\n \"duration\": \"00:00:45\",\n \"artifact\": \"./eval-results/tool-calls_2026-02-14.jsonl\"\n }\n }\n ]\n },\n {\n \"id\": \"json-schema\",\n \"name\": \"json-schema\",\n \"overview\": \"Stress-test schema fidelity across generated extraction payloads.\",\n \"runs\": []\n }\n ],\n \"evaluators\": [\n { \"id\": \"json-schema-validator\", \"name\": \"JSON Schema Validator\", \"configPreview\": \"strict=true\" },\n { \"id\": \"tool-call-contract-checker\", \"name\": \"Tool-call Contract Checker\", \"configPreview\": \"unexpectedCalls=error\" },\n { \"id\": \"rubric-judge\", \"name\": \"Rubric Judge (LLM)\", \"configPreview\": \"model=gpt-4o-mini; scale=0-100\" },\n { \"id\": \"pii-leak-detector\", \"name\": \"PII Leak Detector\", \"configPreview\": \"redact=false\" }\n ]\n}\n","import type { CliState, EvalsData, EvalDataset, EvalRun, StartupArgs } from './types';\nimport type {\n CollectedDataset,\n CollectedEvaluator,\n RunSnapshot,\n RunnerApi,\n RunnerEvent,\n} from '../runner';\n\nimport mockData from './data.mock.json';\n\nexport function loadMockData(): EvalsData {\n return mockData as EvalsData;\n}\n\nfunction toSlug(input: string): string {\n return input.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');\n}\n\nfunction toEvalRun(snapshot: RunSnapshot): EvalRun {\n const total = snapshot.totalTestCases === 0 ? 1 : snapshot.totalTestCases;\n const passRate = Math.round((snapshot.passedTestCases / total) * 100);\n const avgScore = snapshot.passedTestCases / total;\n const durationMs = snapshot.finishedAt\n ? snapshot.finishedAt - (snapshot.startedAt ?? snapshot.queuedAt)\n : Date.now() - (snapshot.startedAt ?? snapshot.queuedAt);\n\n return {\n id: snapshot.runId,\n label: snapshot.runId.slice(0, 12),\n status:\n snapshot.status === 'completed'\n ? 'PASS'\n : snapshot.status === 'failed'\n ? 'FAILED'\n : 'RUNNING',\n performance: {\n passRate,\n avgScore,\n latencyP95Ms: Math.max(1, Math.floor(durationMs / Math.max(1, total))),\n latencyAvgMs: Math.max(1, Math.floor(durationMs / Math.max(1, total))),\n tokensAvg: 0,\n tokensP95: 0,\n costUsd: 0,\n latencyHistoryMs: [durationMs],\n },\n dimensions: [\n { name: 'passed', score: Math.round((snapshot.passedTestCases / total) * 100) },\n { name: 'failed', score: Math.round((snapshot.failedTestCases / total) * 100) },\n ],\n checks: [\n {\n name: 'run_status',\n passed: snapshot.status === 'completed',\n detail: snapshot.status,\n },\n ],\n failures:\n snapshot.errorMessage && snapshot.errorMessage.length > 0\n ? [{ title: snapshot.errorMessage }]\n : [],\n meta: {\n model: 'n/a',\n provider: 'runner',\n commit: 'local',\n branch: 'local',\n seed: 0,\n concurrency: 1,\n duration: `${durationMs}ms`,\n artifact: snapshot.artifactPath,\n },\n };\n}\n\nfunction toEvalDataset(\n item: CollectedDataset,\n snapshots: ReadonlyArray<RunSnapshot>,\n): EvalDataset {\n const runs = snapshots\n .filter((snapshot) => snapshot.datasetId === item.id)\n .sort((a, b) => b.queuedAt - a.queuedAt)\n .map(toEvalRun);\n\n return {\n id: item.id,\n name: item.dataset.getName(),\n overview: `Discovered from ${item.filePath}`,\n runs,\n };\n}\n\nfunction toEvaluatorOption(item: CollectedEvaluator): EvalsData['evaluators'][number] {\n return {\n id: item.id,\n name: item.evaluator.getName() ?? toSlug(item.id),\n configPreview: `Source: ${item.filePath}`,\n };\n}\n\nexport async function loadRunnerData(runner: RunnerApi): Promise<EvalsData> {\n const [datasets, evaluators, diskSnapshots] = await Promise.all([\n runner.collectDatasets(),\n runner.collectEvaluators(),\n runner.loadRunSnapshotsFromArtifacts(),\n ]);\n const memSnapshots = runner.getAllRunSnapshots();\n const seen = new Set(memSnapshots.map((s) => s.runId));\n const fromDisk = diskSnapshots.filter((s) => !seen.has(s.runId));\n const snapshots = [...memSnapshots, ...fromDisk].sort(\n (a, b) => b.queuedAt - a.queuedAt,\n );\n\n if (datasets.length === 0 && evaluators.length === 0) {\n return loadMockData();\n }\n\n return {\n datasets: datasets.map((dataset) => toEvalDataset(dataset, snapshots)),\n evaluators: evaluators.map(toEvaluatorOption),\n };\n}\n\nexport function applyRunnerEvent(\n data: EvalsData,\n event: RunnerEvent,\n runner: RunnerApi,\n): EvalsData {\n const snapshot = runner.getRunSnapshot(event.runId);\n if (!snapshot) {\n return data;\n }\n\n const dataset = data.datasets.find((item) => item.id === snapshot.datasetId);\n if (!dataset) {\n return data;\n }\n\n const run = toEvalRun(snapshot);\n const hasRun = dataset.runs.some((item) => item.id === run.id);\n const nextRuns = hasRun\n ? dataset.runs.map((item) => (item.id === run.id ? run : item))\n : [run, ...dataset.runs];\n\n return {\n ...data,\n datasets: data.datasets.map((item) =>\n item.id === dataset.id ? { ...item, runs: nextRuns } : item,\n ),\n };\n}\n\nexport function parseStartupArgs(argv: string[]): StartupArgs {\n const args: StartupArgs = { unknownArgs: [] };\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (token === '--dataset' && argv[index + 1]) {\n args.datasetId = argv[index + 1];\n index += 1;\n continue;\n }\n if (token === '--run' && argv[index + 1]) {\n args.runId = argv[index + 1];\n index += 1;\n continue;\n }\n if (token === '--search' && argv[index + 1]) {\n args.search = argv[index + 1];\n index += 1;\n continue;\n }\n args.unknownArgs.push(token);\n }\n return args;\n}\n\nexport function getFilteredDatasets(data: EvalsData, searchQuery: string): EvalDataset[] {\n const query = searchQuery.trim().toLowerCase();\n if (!query) {\n return data.datasets;\n }\n return data.datasets.filter((dataset) => dataset.name.toLowerCase().includes(query));\n}\n\nexport function getDatasetByMenuIndex(datasets: EvalDataset[], menuIndex: number): EvalDataset | undefined {\n if (menuIndex <= 0) {\n return undefined;\n }\n return datasets[menuIndex - 1];\n}\n\nexport function getRunByMenuIndex(dataset: EvalDataset | undefined, menuIndex: number): EvalRun | undefined {\n if (!dataset || menuIndex <= 0) {\n return undefined;\n }\n return dataset.runs[menuIndex - 1];\n}\n\nexport function createInitialState(data: EvalsData, args: StartupArgs): CliState {\n const warnings: string[] = [];\n if (args.unknownArgs.length > 0) {\n warnings.push(`Unknown args: ${args.unknownArgs.join(', ')}`);\n warnings.push('Supported: --dataset <id>, --run <id>, --search <term>');\n }\n\n const searchQuery = args.search ?? '';\n const filteredDatasets = getFilteredDatasets(data, searchQuery);\n const datasetByArg = filteredDatasets.find((dataset) => dataset.id === args.datasetId);\n const datasetMenuIndex = datasetByArg ? filteredDatasets.indexOf(datasetByArg) + 1 : 0;\n\n let level: CliState['level'] = 'datasets';\n let runMenuIndex = 0;\n\n if (datasetByArg) {\n level = 'runs';\n } else if (args.datasetId) {\n warnings.push(`Dataset \"${args.datasetId}\" not found.`);\n }\n\n if (datasetByArg && args.runId) {\n const runIndex = datasetByArg.runs.findIndex((run) => run.id === args.runId);\n if (runIndex >= 0) {\n runMenuIndex = runIndex + 1;\n level = 'details';\n } else {\n warnings.push(`Run \"${args.runId}\" not found in dataset \"${datasetByArg.id}\".`);\n }\n }\n\n return {\n level,\n focus: 'left',\n datasetMenuIndex,\n runMenuIndex,\n detailsScrollOffset: 0,\n overviewScrollOffset: 0,\n selectedEvaluatorIds: data.evaluators.slice(0, 2).map((item) => item.id),\n evaluatorMenuIndex: 0,\n searchQuery,\n searchMode: false,\n startupWarnings: warnings,\n };\n}\n\nexport type CliAction =\n | { type: 'MOVE_UP'; max: number }\n | { type: 'MOVE_DOWN'; max: number }\n | { type: 'ENTER'; hasDataset: boolean; hasRun: boolean }\n | { type: 'BACK' }\n | { type: 'TOGGLE_FOCUS' }\n | { type: 'START_SEARCH' }\n | { type: 'END_SEARCH' }\n | { type: 'APPEND_SEARCH'; value: string }\n | { type: 'REMOVE_SEARCH_CHAR' }\n | { type: 'TOGGLE_EVALUATOR'; evaluatorId: string }\n | { type: 'CLEAR_WARNINGS' };\n\nexport function reduceCliState(state: CliState, action: CliAction): CliState {\n if (action.type === 'MOVE_UP') {\n if (state.searchMode) {\n return state;\n }\n if (state.level === 'details' && state.focus === 'right') {\n return { ...state, detailsScrollOffset: Math.max(0, state.detailsScrollOffset - 1) };\n }\n if (state.level === 'datasets' && state.focus === 'right') {\n return { ...state, overviewScrollOffset: Math.max(0, state.overviewScrollOffset - 1) };\n }\n if (state.level === 'datasets') {\n return { ...state, datasetMenuIndex: Math.max(0, state.datasetMenuIndex - 1), overviewScrollOffset: 0 };\n }\n if (state.level === 'runs') {\n return { ...state, runMenuIndex: Math.max(0, state.runMenuIndex - 1) };\n }\n if (state.level === 'new-evaluation') {\n return { ...state, evaluatorMenuIndex: Math.max(0, state.evaluatorMenuIndex - 1) };\n }\n return state;\n }\n\n if (action.type === 'MOVE_DOWN') {\n if (state.searchMode) {\n return state;\n }\n if (state.level === 'details' && state.focus === 'right') {\n return { ...state, detailsScrollOffset: Math.min(action.max, state.detailsScrollOffset + 1) };\n }\n if (state.level === 'datasets' && state.focus === 'right') {\n return { ...state, overviewScrollOffset: Math.min(action.max, state.overviewScrollOffset + 1) };\n }\n if (state.level === 'datasets') {\n return { ...state, datasetMenuIndex: Math.min(action.max, state.datasetMenuIndex + 1), overviewScrollOffset: 0 };\n }\n if (state.level === 'runs') {\n return { ...state, runMenuIndex: Math.min(action.max, state.runMenuIndex + 1) };\n }\n if (state.level === 'new-evaluation') {\n return { ...state, evaluatorMenuIndex: Math.min(action.max, state.evaluatorMenuIndex + 1) };\n }\n return state;\n }\n\n if (action.type === 'ENTER') {\n if (state.searchMode) {\n return { ...state, searchMode: false };\n }\n if (state.level === 'datasets') {\n if (state.datasetMenuIndex === 0) {\n return { ...state, level: 'new-evaluation' };\n }\n if (action.hasDataset) {\n return { ...state, level: 'runs', runMenuIndex: 0 };\n }\n return state;\n }\n if (state.level === 'runs') {\n if (state.runMenuIndex === 0) {\n return { ...state, level: 'new-evaluation' };\n }\n if (action.hasRun) {\n return { ...state, level: 'details', detailsScrollOffset: 0 };\n }\n return state;\n }\n if (state.level === 'new-evaluation') {\n return state;\n }\n return state;\n }\n\n if (action.type === 'BACK') {\n if (state.searchMode) {\n return { ...state, searchMode: false };\n }\n if (state.level === 'details') {\n return { ...state, level: 'runs' };\n }\n if (state.level === 'runs' || state.level === 'new-evaluation') {\n return { ...state, level: 'datasets' };\n }\n return state;\n }\n\n if (action.type === 'TOGGLE_FOCUS') {\n return { ...state, focus: state.focus === 'left' ? 'right' : 'left' };\n }\n\n if (action.type === 'START_SEARCH') {\n return { ...state, searchMode: true };\n }\n\n if (action.type === 'END_SEARCH') {\n return { ...state, searchMode: false };\n }\n\n if (action.type === 'APPEND_SEARCH') {\n return { ...state, searchQuery: `${state.searchQuery}${action.value}` };\n }\n\n if (action.type === 'REMOVE_SEARCH_CHAR') {\n return { ...state, searchQuery: state.searchQuery.slice(0, -1) };\n }\n\n if (action.type === 'TOGGLE_EVALUATOR') {\n const exists = state.selectedEvaluatorIds.includes(action.evaluatorId);\n return {\n ...state,\n selectedEvaluatorIds: exists\n ? state.selectedEvaluatorIds.filter((id) => id !== action.evaluatorId)\n : [...state.selectedEvaluatorIds, action.evaluatorId],\n };\n }\n\n if (action.type === 'CLEAR_WARNINGS') {\n return { ...state, startupWarnings: [] };\n }\n\n return state;\n}\n","/** @jsxImportSource react */\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { resolve } from 'node:path';\nimport { Box, Text } from 'ink';\nimport { LineGraph } from '@pppp606/ink-chart';\nimport {\n parseArtifactFile,\n type ParsedTestCaseProgress,\n} from '../../../runner';\nimport { toNumericScoreFromScores } from '../../../runner/score-utils';\nimport type { CliState, EvalDataset, EvalRun } from '../../types';\nimport { ListItem, Pane, SectionHeader, TextBar } from '../../components';\n\nconst LEFT_PANE_WIDTH = 44;\nconst MAX_RUNS_FOR_CHART = 12;\nconst MAX_RUNS_FOR_TREND = 20;\nconst TREND_BATCH_SIZE = 4;\n\ninterface RunScore {\n runId: string;\n label: string;\n value: number;\n}\n\nfunction extractRunAverageScore(\n testCases: ParsedTestCaseProgress[],\n): number | undefined {\n const scores: number[] = [];\n for (const tc of testCases) {\n for (const es of tc.evaluatorScores) {\n const n = toNumericScoreFromScores(es.scores);\n if (n !== undefined) {\n scores.push(n);\n }\n }\n }\n if (scores.length === 0) return undefined;\n return scores.reduce((a, b) => a + b, 0) / scores.length;\n}\n\nasync function loadRunScores(runs: EvalRun[]): Promise<RunScore[]> {\n const results: RunScore[] = [];\n for (const run of runs) {\n const artifact = run.meta?.artifact;\n if (!artifact) continue;\n try {\n const path = resolve(artifact);\n const testCases = await parseArtifactFile(path);\n const avg = extractRunAverageScore(testCases);\n if (avg !== undefined) {\n results.push({\n runId: run.id,\n label: run.label,\n value: avg,\n });\n }\n } catch {\n // Skip runs with unreadable artifacts\n }\n }\n return results;\n}\n\nfunction batchAverage(values: number[], batchSize: number): number[] {\n const batches: number[] = [];\n for (let i = 0; i < values.length; i += batchSize) {\n const slice = values.slice(i, i + batchSize);\n if (slice.length > 0) {\n batches.push(slice.reduce((a, b) => a + b, 0) / slice.length);\n }\n }\n return batches;\n}\n\nexport const OVERVIEW_PAGE_SIZE = 15;\n\ninterface DatasetsViewProps {\n state: CliState;\n filteredDatasets: EvalDataset[];\n selectedDataset: EvalDataset | undefined;\n /** Ref updated with overview row count for scroll max */\n overviewRowCountRef?: React.MutableRefObject<number>;\n}\n\nexport function DatasetsView({\n state,\n filteredDatasets,\n selectedDataset,\n overviewRowCountRef,\n}: DatasetsViewProps): React.ReactNode {\n const leftFocused = state.focus === 'left';\n const rightFocused = state.focus === 'right';\n const [runScores, setRunScores] = useState<RunScore[]>([]);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!selectedDataset?.runs?.length) {\n setRunScores([]);\n return;\n }\n setLoading(true);\n const runs = selectedDataset.runs.slice(0, MAX_RUNS_FOR_TREND);\n loadRunScores(runs)\n .then(setRunScores)\n .finally(() => setLoading(false));\n }, [selectedDataset?.id, selectedDataset?.runs?.length]);\n\n const barData = runScores.slice(0, MAX_RUNS_FOR_CHART).reverse();\n const trendValues = runScores\n .slice(0, MAX_RUNS_FOR_TREND)\n .map((r: RunScore) => r.value)\n .reverse();\n const trendBatched = batchAverage(trendValues, TREND_BATCH_SIZE);\n\n const overviewRows = useMemo((): React.ReactNode[] => {\n const rows: React.ReactNode[] = [];\n rows.push(\n <Text key=\"overview\" color=\"gray\">\n {selectedDataset?.overview ?? 'Select a dataset to inspect prior runs.'}\n </Text>,\n );\n if (selectedDataset && selectedDataset.runs.length > 0) {\n if (loading) {\n rows.push(\n <Text key=\"loading\" color=\"gray\">\n Loading run scores…\n </Text>,\n );\n } else if (runScores.length > 0) {\n rows.push(\n <Text key=\"scores-header\" color=\"gray\">\n Scores (last runs)\n </Text>,\n );\n for (const d of barData) {\n rows.push(\n <TextBar\n key={d.runId}\n label={d.label}\n value={d.value}\n labelWidth={14}\n barWidth={24}\n max={100}\n format={(v) => v.toFixed(1)}\n />,\n );\n }\n if (trendBatched.length > 0) {\n rows.push(\n <Text key=\"trend-header\" color=\"gray\">\n Avg trend (last 20, batched by 4)\n </Text>,\n );\n rows.push(\n <Box key=\"trend-graph\">\n <LineGraph\n data={[{ values: trendBatched, color: 'cyan' }]}\n height={5}\n width={45}\n showYAxis={true}\n xLabels={['older', 'newer']}\n />\n </Box>,\n );\n }\n }\n }\n return rows;\n }, [\n selectedDataset?.overview,\n selectedDataset?.runs?.length,\n loading,\n runScores,\n barData,\n trendBatched,\n ]);\n\n if (overviewRowCountRef) {\n overviewRowCountRef.current = overviewRows.length;\n }\n\n const offset = Math.max(0, state.overviewScrollOffset);\n const visibleRows = overviewRows.slice(offset, offset + OVERVIEW_PAGE_SIZE);\n\n return (\n <>\n <Pane width={LEFT_PANE_WIDTH} focused={leftFocused}>\n <SectionHeader>Datasets</SectionHeader>\n <ListItem\n selected={state.datasetMenuIndex === 0}\n label=\"New evaluation\"\n itemKey=\"datasets-new-eval\"\n />\n {filteredDatasets.map((dataset, index) => (\n <ListItem\n key={dataset.id}\n selected={state.datasetMenuIndex === index + 1}\n label={dataset.name}\n itemKey={`dataset-${dataset.id}`}\n />\n ))}\n </Pane>\n <Pane flexGrow={1} marginLeft={1} focused={rightFocused}>\n <SectionHeader>Overview</SectionHeader>\n <Box flexDirection=\"column\">\n {visibleRows.map((row, i) => (\n <Box key={offset + i}>{row}</Box>\n ))}\n </Box>\n </Pane>\n </>\n );\n}\n","import { randomUUID } from 'node:crypto';\n\nimport { Effect, Fiber, PubSub, Queue } from 'effect';\n\nimport type { RunnerConfig, RunnerConfigOverrides } from './config';\nimport { withRunnerConfig } from './config';\nimport { loadRunnerConfigFile } from './config-loader';\nimport {\n collectDatasetsFromFiles,\n collectEvaluatorsFromFiles,\n collectTestCasesFromFiles,\n} from './discovery';\nimport { createArtifactPath, executeRunTask, type RunTask } from './execution';\nimport type {\n CollectedDataset,\n CollectedEvaluator,\n CollectedTestCase,\n RunDatasetRequest,\n RunSnapshot,\n RunnerEvent,\n SearchTestCasesQuery,\n} from './events';\nimport { loadRunSnapshotsFromArtifacts as loadSnapshotsFromArtifacts } from './artifact-loader';\nimport { createPersistenceWorker } from './persistence';\nimport { searchCollectedTestCases } from './search';\n\ninterface SubscribeOptions {\n runId?: string;\n}\n\nfunction parseRegexLiteral(\n pattern: string,\n): { source: string; flags: string } | undefined {\n if (!pattern.startsWith('/')) {\n return undefined;\n }\n const lastSlash = pattern.lastIndexOf('/');\n if (lastSlash <= 0) {\n return undefined;\n }\n return {\n source: pattern.slice(1, lastSlash),\n flags: pattern.slice(lastSlash + 1),\n };\n}\n\nfunction createNameMatcher(pattern: string): (value: string) => boolean {\n const normalizedPattern = pattern.trim();\n const regexLiteral = parseRegexLiteral(normalizedPattern);\n if (regexLiteral) {\n const regex = new RegExp(regexLiteral.source, regexLiteral.flags);\n return (value: string) => regex.test(value);\n }\n\n if (normalizedPattern.includes('*')) {\n const escaped = normalizedPattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*');\n const regex = new RegExp(`^${escaped}$`, 'i');\n return (value: string) => regex.test(value);\n }\n\n return (value: string) => value.toLowerCase() === normalizedPattern.toLowerCase();\n}\n\nexport interface RunnerApi {\n collectDatasets(): Promise<ReadonlyArray<CollectedDataset>>;\n collectEvaluators(): Promise<ReadonlyArray<CollectedEvaluator>>;\n resolveDatasetByName(name: string): Promise<CollectedDataset | undefined>;\n resolveEvaluatorsByNamePattern(\n pattern: string,\n ): Promise<ReadonlyArray<CollectedEvaluator>>;\n searchTestCases(\n query?: SearchTestCasesQuery,\n ): Promise<ReadonlyArray<CollectedTestCase>>;\n collectDatasetTestCases(datasetId: string): Promise<ReadonlyArray<CollectedTestCase>>;\n runDatasetWith(request: RunDatasetRequest): Promise<RunSnapshot>;\n subscribeRunEvents(\n listener: (event: RunnerEvent) => void,\n options?: SubscribeOptions,\n ): () => void;\n getRunSnapshot(runId: string): RunSnapshot | undefined;\n getAllRunSnapshots(): ReadonlyArray<RunSnapshot>;\n loadRunSnapshotsFromArtifacts(): Promise<ReadonlyArray<RunSnapshot>>;\n shutdown(): Promise<void>;\n}\n\nfunction mergeRunnerOverrides(\n base?: RunnerConfigOverrides,\n next?: RunnerConfigOverrides,\n): RunnerConfigOverrides | undefined {\n if (!base) {\n return next;\n }\n if (!next) {\n return base;\n }\n const discovery = base.discovery || next.discovery\n ? {\n ...(base.discovery ?? {}),\n ...(next.discovery ?? {}),\n }\n : undefined;\n return {\n ...base,\n ...next,\n discovery,\n };\n}\n\nexport function createRunner(overrides?: RunnerConfigOverrides): RunnerApi {\n const fileOverrides = loadRunnerConfigFile();\n const merged = mergeRunnerOverrides(fileOverrides, overrides);\n return new EffectRunner(withRunnerConfig(merged));\n}\n\nclass EffectRunner implements RunnerApi {\n private readonly config: RunnerConfig;\n\n private readonly eventBus = Effect.runSync(PubSub.unbounded<RunnerEvent>());\n\n private readonly runQueue = Effect.runSync(Queue.unbounded<RunTask>());\n\n private readonly persistenceQueue = Effect.runSync(\n Queue.unbounded<{\n runId: string;\n artifactPath: string;\n payload: unknown;\n }>(),\n );\n\n private readonly snapshots = new Map<string, RunSnapshot>();\n private readonly listeners = new Set<{\n runId?: string;\n listener: (event: RunnerEvent) => void;\n }>();\n\n private readonly datasetsById = new Map<string, CollectedDataset>();\n\n private readonly evaluatorsById = new Map<string, CollectedEvaluator>();\n\n private readonly schedulerFiber = Effect.runFork(\n this.createSchedulerEffect(),\n );\n\n private readonly persistenceFiber = Effect.runFork(\n createPersistenceWorker(this.persistenceQueue),\n );\n\n constructor(config: RunnerConfig) {\n this.config = config;\n }\n\n async collectDatasets(): Promise<ReadonlyArray<CollectedDataset>> {\n const datasets = await collectDatasetsFromFiles(this.config.discovery);\n this.datasetsById.clear();\n for (const dataset of datasets) {\n this.datasetsById.set(dataset.id, dataset);\n }\n return datasets;\n }\n\n async collectEvaluators(): Promise<ReadonlyArray<CollectedEvaluator>> {\n const evaluators = await collectEvaluatorsFromFiles(this.config.discovery);\n this.evaluatorsById.clear();\n for (const evaluator of evaluators) {\n this.evaluatorsById.set(evaluator.id, evaluator);\n }\n return evaluators;\n }\n\n async resolveDatasetByName(name: string): Promise<CollectedDataset | undefined> {\n if (this.datasetsById.size === 0) {\n await this.collectDatasets();\n }\n const normalized = name.trim().toLowerCase();\n return Array.from(this.datasetsById.values()).find(\n (item) => item.dataset.getName().toLowerCase() === normalized,\n );\n }\n\n async resolveEvaluatorsByNamePattern(\n pattern: string,\n ): Promise<ReadonlyArray<CollectedEvaluator>> {\n if (this.evaluatorsById.size === 0) {\n await this.collectEvaluators();\n }\n const matcher = createNameMatcher(pattern);\n return Array.from(this.evaluatorsById.values()).filter((item) =>\n matcher(item.evaluator.getName() ?? ''),\n );\n }\n\n async searchTestCases(\n query?: SearchTestCasesQuery,\n ): Promise<ReadonlyArray<CollectedTestCase>> {\n const testCases = await collectTestCasesFromFiles(this.config.discovery);\n return searchCollectedTestCases(testCases, query);\n }\n\n async collectDatasetTestCases(\n datasetId: string,\n ): Promise<ReadonlyArray<CollectedTestCase>> {\n if (this.datasetsById.size === 0) {\n await this.collectDatasets();\n }\n const dataset = this.datasetsById.get(datasetId);\n if (!dataset) {\n throw new Error(`Unknown dataset: ${datasetId}`);\n }\n const allTestCases = await collectTestCasesFromFiles(this.config.discovery);\n return allTestCases.filter((testCase) =>\n dataset.dataset.matchesTestCase(testCase.testCase, testCase.filePath),\n );\n }\n\n async runDatasetWith(request: RunDatasetRequest): Promise<RunSnapshot> {\n if (this.datasetsById.size === 0) {\n await this.collectDatasets();\n }\n if (this.evaluatorsById.size === 0) {\n await this.collectEvaluators();\n }\n\n const dataset = this.datasetsById.get(request.datasetId);\n if (!dataset) {\n throw new Error(`Unknown dataset: ${request.datasetId}`);\n }\n\n const selectedEvaluators = request.evaluatorIds\n .map((id) => this.evaluatorsById.get(id))\n .filter((value): value is CollectedEvaluator => Boolean(value))\n .map((value) => ({ id: value.id, evaluator: value.evaluator }));\n\n if (selectedEvaluators.length === 0) {\n throw new Error('No evaluators selected for run');\n }\n\n const selectedTestCases = await this.collectDatasetTestCases(request.datasetId);\n\n const totalEvaluations = selectedTestCases.reduce(\n (sum, tc) =>\n sum +\n (typeof tc.testCase.getReruns === 'function'\n ? tc.testCase.getReruns()\n : 1),\n 0,\n );\n\n const triggerId = request.triggerId ?? `trg-${randomUUID()}`;\n const runId = `run-${randomUUID()}`;\n const artifactPath = createArtifactPath(\n this.config.artifactDirectory,\n request.datasetId,\n runId,\n );\n const snapshot: RunSnapshot = {\n runId,\n datasetId: request.datasetId,\n datasetName: dataset.dataset.getName(),\n evaluatorIds: selectedEvaluators.map((item) => item.id),\n queuedAt: Date.now(),\n totalTestCases: totalEvaluations,\n completedTestCases: 0,\n passedTestCases: 0,\n failedTestCases: 0,\n status: 'queued',\n artifactPath,\n };\n\n this.snapshots.set(runId, snapshot);\n const queuedEvent: RunnerEvent = {\n type: 'RunQueued',\n runId,\n datasetId: request.datasetId,\n datasetName: dataset.dataset.getName(),\n evaluatorIds: selectedEvaluators.map((item) => item.id),\n totalTestCases: totalEvaluations,\n artifactPath,\n };\n await Effect.runPromise(this.publishEvent(queuedEvent));\n await Effect.runPromise(\n Queue.offer(this.persistenceQueue, {\n runId,\n artifactPath,\n payload: queuedEvent,\n }),\n );\n\n const maxConcurrency =\n request.concurrency ?? this.config.maxConcurrency ?? 1;\n\n await Effect.runPromise(\n Queue.offer(this.runQueue, {\n runId,\n triggerId,\n datasetId: request.datasetId,\n dataset: dataset.dataset,\n evaluators: selectedEvaluators,\n testCases: selectedTestCases,\n snapshot,\n maxConcurrency,\n }),\n );\n\n return snapshot;\n }\n\n subscribeRunEvents(\n listener: (event: RunnerEvent) => void,\n options?: SubscribeOptions,\n ): () => void {\n const entry = { runId: options?.runId, listener };\n this.listeners.add(entry);\n return () => {\n this.listeners.delete(entry);\n };\n }\n\n getRunSnapshot(runId: string): RunSnapshot | undefined {\n return this.snapshots.get(runId);\n }\n\n getAllRunSnapshots(): ReadonlyArray<RunSnapshot> {\n return Array.from(this.snapshots.values()).sort(\n (a, b) => b.queuedAt - a.queuedAt,\n );\n }\n\n async loadRunSnapshotsFromArtifacts(): Promise<ReadonlyArray<RunSnapshot>> {\n return loadSnapshotsFromArtifacts(this.config);\n }\n\n async shutdown(): Promise<void> {\n await Effect.runPromise(Fiber.interrupt(this.schedulerFiber));\n await Effect.runPromise(Fiber.interrupt(this.persistenceFiber));\n await Effect.runPromise(Queue.shutdown(this.runQueue));\n await Effect.runPromise(Queue.shutdown(this.persistenceQueue));\n await Effect.runPromise(PubSub.shutdown(this.eventBus));\n }\n\n private createSchedulerEffect() {\n const self = this;\n return Effect.forever(\n Effect.gen(function* () {\n const task = yield* Queue.take(self.runQueue);\n yield* Effect.fork(\n executeRunTask(\n task,\n self.publishEvent.bind(self),\n self.persistenceQueue,\n self.updateSnapshot.bind(self),\n ),\n );\n }),\n );\n }\n\n private updateSnapshot(\n runId: string,\n updater: (snapshot: RunSnapshot) => RunSnapshot,\n ): void {\n const existing = this.snapshots.get(runId);\n if (!existing) {\n return;\n }\n this.snapshots.set(runId, updater(existing));\n }\n\n private publishEvent(event: RunnerEvent): Effect.Effect<void, never, never> {\n return Effect.sync(() => {\n for (const entry of this.listeners) {\n if (entry.runId && entry.runId !== event.runId) {\n continue;\n }\n entry.listener(event);\n }\n }).pipe(\n Effect.flatMap(() => PubSub.publish(this.eventBus, event)),\n Effect.asVoid,\n );\n }\n}\n","export interface RunnerDiscoveryConfig {\n rootDir: string;\n datasetSuffixes: ReadonlyArray<string>;\n evaluatorSuffixes: ReadonlyArray<string>;\n testCaseSuffixes: ReadonlyArray<string>;\n excludeDirectories: ReadonlyArray<string>;\n}\n\nexport interface RunnerConfig {\n discovery: RunnerDiscoveryConfig;\n artifactDirectory: string;\n /** Max concurrent test cases per run. Default: 1 (sequential). */\n maxConcurrency: number;\n}\n\nexport type RunnerConfigOverrides = Omit<Partial<RunnerConfig>, 'discovery'> & {\n discovery?: Partial<RunnerDiscoveryConfig>;\n};\n\nexport interface M4trixEvalConfigDiscovery {\n rootDir?: string;\n datasetFilePatterns?: ReadonlyArray<string>;\n evaluatorFilePatterns?: ReadonlyArray<string>;\n testCaseFilePatterns?: ReadonlyArray<string>;\n datasetSuffixes?: ReadonlyArray<string>;\n evaluatorSuffixes?: ReadonlyArray<string>;\n testCaseSuffixes?: ReadonlyArray<string>;\n excludeDirectories?: ReadonlyArray<string>;\n}\n\nexport interface M4trixEvalConfig {\n discovery?: M4trixEvalConfigDiscovery;\n artifactDirectory?: string;\n /** Max concurrent test cases per run. Default: 1 (sequential). */\n maxConcurrency?: number;\n}\n\nexport type ConfigType = M4trixEvalConfig;\n\nexport type M4trixEvalConfigFactory<TConfig extends ConfigType = ConfigType> = () => TConfig;\n\nexport function defineConfig<TConfig extends ConfigType>(\n factory: M4trixEvalConfigFactory<TConfig>,\n): M4trixEvalConfigFactory<TConfig> {\n return factory;\n}\n\nexport const defaultRunnerConfig: RunnerConfig = {\n discovery: {\n rootDir: process.cwd(),\n datasetSuffixes: ['.dataset.ts', '.dataset.tsx', '.dataset.js', '.dataset.mjs'],\n evaluatorSuffixes: [\n '.evaluator.ts',\n '.evaluator.tsx',\n '.evaluator.js',\n '.evaluator.mjs',\n ],\n testCaseSuffixes: [\n '.test-case.ts',\n '.test-case.tsx',\n '.test-case.js',\n '.test-case.mjs',\n ],\n excludeDirectories: ['node_modules', 'dist', '.next', '.git', '.pnpm-store'],\n },\n artifactDirectory: '.eval-results',\n maxConcurrency: 1,\n};\n\nexport function toRunnerConfigOverrides(\n config?: ConfigType,\n): RunnerConfigOverrides | undefined {\n if (!config) {\n return undefined;\n }\n\n const rawDiscovery = config.discovery;\n const discovery: Partial<RunnerDiscoveryConfig> = {};\n if (rawDiscovery?.rootDir !== undefined) {\n discovery.rootDir = rawDiscovery.rootDir;\n }\n if (rawDiscovery?.datasetFilePatterns !== undefined) {\n discovery.datasetSuffixes = rawDiscovery.datasetFilePatterns;\n } else if (rawDiscovery?.datasetSuffixes !== undefined) {\n discovery.datasetSuffixes = rawDiscovery.datasetSuffixes;\n }\n if (rawDiscovery?.evaluatorFilePatterns !== undefined) {\n discovery.evaluatorSuffixes = rawDiscovery.evaluatorFilePatterns;\n } else if (rawDiscovery?.evaluatorSuffixes !== undefined) {\n discovery.evaluatorSuffixes = rawDiscovery.evaluatorSuffixes;\n }\n if (rawDiscovery?.testCaseFilePatterns !== undefined) {\n discovery.testCaseSuffixes = rawDiscovery.testCaseFilePatterns;\n } else if (rawDiscovery?.testCaseSuffixes !== undefined) {\n discovery.testCaseSuffixes = rawDiscovery.testCaseSuffixes;\n }\n if (rawDiscovery?.excludeDirectories !== undefined) {\n discovery.excludeDirectories = rawDiscovery.excludeDirectories;\n }\n\n const overrides: RunnerConfigOverrides = {};\n if (config.artifactDirectory !== undefined) {\n overrides.artifactDirectory = config.artifactDirectory;\n }\n if (config.maxConcurrency !== undefined) {\n overrides.maxConcurrency = config.maxConcurrency;\n }\n if (Object.keys(discovery).length > 0) {\n overrides.discovery = discovery;\n }\n return overrides;\n}\n\nexport function withRunnerConfig(overrides?: RunnerConfigOverrides): RunnerConfig {\n if (!overrides) {\n return defaultRunnerConfig;\n }\n const discovery = overrides.discovery\n ? {\n ...defaultRunnerConfig.discovery,\n ...overrides.discovery,\n }\n : defaultRunnerConfig.discovery;\n\n return {\n ...defaultRunnerConfig,\n ...overrides,\n discovery,\n };\n}\n","import { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport * as jitiModule from 'jiti';\n\nimport type { RunnerConfigOverrides } from './config';\nimport {\n toRunnerConfigOverrides,\n type ConfigType,\n type M4trixEvalConfigFactory,\n} from './config';\n\nconst CONFIG_FILE_NAME = 'm4trix-eval.config.ts';\n\ntype JitiLoader = {\n (id: string): unknown;\n import?: (id: string) => Promise<unknown> | unknown;\n};\n\nlet cachedLoader: JitiLoader | undefined;\n\nfunction getJitiLoader(): JitiLoader {\n if (cachedLoader) {\n return cachedLoader;\n }\n const createJiti =\n (jitiModule as { createJiti?: unknown; default?: unknown }).createJiti ??\n (jitiModule as { default?: unknown }).default;\n if (typeof createJiti !== 'function') {\n throw new Error(\n 'Failed to initialize jiti for m4trix eval config loading.',\n );\n }\n cachedLoader = (\n createJiti as (id: string, options?: Record<string, unknown>) => JitiLoader\n )(import.meta.url, {\n interopDefault: true,\n moduleCache: true,\n });\n return cachedLoader;\n}\n\nfunction resolveConfigModuleExport(loadedModule: unknown): unknown {\n if (\n loadedModule &&\n typeof loadedModule === 'object' &&\n 'default' in loadedModule\n ) {\n return (loadedModule as { default: unknown }).default;\n }\n return loadedModule;\n}\n\nfunction resolveConfigValue(value: unknown): ConfigType | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value === 'function') {\n return (value as M4trixEvalConfigFactory<ConfigType>)();\n }\n if (typeof value !== 'object') {\n throw new Error(\n 'Invalid m4trix eval config export. Expected an object or defineConfig(() => config).',\n );\n }\n return value as ConfigType;\n}\n\nexport function loadRunnerConfigFile(\n cwd = process.cwd(),\n): RunnerConfigOverrides | undefined {\n const configPath = resolve(cwd, CONFIG_FILE_NAME);\n if (!existsSync(configPath)) {\n return undefined;\n }\n const loader = getJitiLoader();\n const loaded = loader(configPath);\n const exportedValue = resolveConfigModuleExport(loaded);\n const config = resolveConfigValue(exportedValue);\n return toRunnerConfigOverrides(config);\n}\n","import { Dirent } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { resolve, relative } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport type { Dataset } from '../evals/dataset';\nimport type { Evaluator } from '../evals/evaluator';\nimport type { TestCase } from '../evals/test-case';\nimport type {\n CollectedDataset,\n CollectedEvaluator,\n CollectedTestCase,\n} from './events';\nimport type { RunnerDiscoveryConfig } from './config';\n\ntype JitiModuleLoader = {\n (id: string): unknown;\n import?: (id: string) => Promise<unknown> | unknown;\n};\n\nlet jitiLoader: JitiModuleLoader | undefined;\n\nfunction toId(prefix: string, filePath: string, name?: string): string {\n const stable = name && name.trim().length > 0 ? name : filePath;\n return `${prefix}:${stable}`\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nfunction hasMethod(value: unknown, methodName: string): boolean {\n return (\n typeof value === 'object' &&\n value !== null &&\n methodName in value &&\n typeof (value as Record<string, unknown>)[methodName] === 'function'\n );\n}\n\nfunction isDatasetLike(value: unknown): value is Dataset {\n return hasMethod(value, 'getName') && hasMethod(value, 'matchesTestCase');\n}\n\nfunction isEvaluatorLike(\n value: unknown,\n): value is Evaluator<unknown, unknown, unknown, unknown> {\n return (\n hasMethod(value, 'getName') &&\n hasMethod(value, 'resolveContext') &&\n hasMethod(value, 'getEvaluateFn')\n );\n}\n\nfunction isTestCaseLike(value: unknown): value is TestCase<unknown> {\n return (\n hasMethod(value, 'getName') &&\n hasMethod(value, 'getTags') &&\n hasMethod(value, 'getInput')\n );\n}\n\nasync function walkDirectory(\n rootDir: string,\n excludeDirectories: ReadonlyArray<string>,\n): Promise<string[]> {\n const out: string[] = [];\n\n async function walk(currentDir: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n await Promise.all(\n entries.map(async (entry) => {\n const absolute = resolve(currentDir, entry.name);\n if (entry.isDirectory()) {\n if (excludeDirectories.includes(entry.name)) {\n return;\n }\n await walk(absolute);\n return;\n }\n\n if (entry.isFile()) {\n out.push(absolute);\n }\n }),\n );\n }\n\n await walk(rootDir);\n return out;\n}\n\nfunction hasOneSuffix(\n filePath: string,\n suffixes: ReadonlyArray<string>,\n): boolean {\n return suffixes.some((suffix) => filePath.endsWith(suffix));\n}\n\nasync function loadModuleExports(filePath: string): Promise<unknown[]> {\n if (filePath.endsWith('.ts') || filePath.endsWith('.tsx')) {\n if (!jitiLoader) {\n const jitiModule = (await import('jiti')) as unknown as {\n createJiti?: (filename: string, opts?: Record<string, unknown>) => JitiModuleLoader;\n default?: (filename: string, opts?: Record<string, unknown>) => JitiModuleLoader;\n };\n const createJiti = jitiModule.createJiti ?? jitiModule.default;\n if (!createJiti) {\n throw new Error('Failed to initialize jiti TypeScript loader');\n }\n jitiLoader = createJiti(import.meta.url, {\n interopDefault: true,\n moduleCache: true,\n }) as JitiModuleLoader;\n }\n const loaded = jitiLoader.import\n ? await jitiLoader.import(filePath)\n : await Promise.resolve(jitiLoader(filePath));\n return Object.values(loaded as Record<string, unknown>);\n }\n\n const moduleUrl = pathToFileURL(filePath).href;\n const loaded = (await import(moduleUrl)) as Record<string, unknown>;\n return Object.values(loaded);\n}\n\nexport async function collectDatasetsFromFiles(\n config: RunnerDiscoveryConfig,\n): Promise<ReadonlyArray<CollectedDataset>> {\n const files = await walkDirectory(config.rootDir, config.excludeDirectories);\n const matched = files.filter((filePath) =>\n hasOneSuffix(filePath, config.datasetSuffixes),\n );\n\n const found = await Promise.all(\n matched.map(async (absolutePath) => {\n const exports = await loadModuleExports(absolutePath);\n const datasets = exports.filter(isDatasetLike);\n const relPath = relative(config.rootDir, absolutePath);\n return datasets.map((dataset) => ({\n id: toId('dataset', relPath, dataset.getName()),\n filePath: relPath,\n dataset,\n }));\n }),\n );\n\n return found.flat();\n}\n\nexport async function collectEvaluatorsFromFiles(\n config: RunnerDiscoveryConfig,\n): Promise<ReadonlyArray<CollectedEvaluator>> {\n const files = await walkDirectory(config.rootDir, config.excludeDirectories);\n const matched = files.filter((filePath) =>\n hasOneSuffix(filePath, config.evaluatorSuffixes),\n );\n\n const found = await Promise.all(\n matched.map(async (absolutePath) => {\n const exports = await loadModuleExports(absolutePath);\n const evaluators = exports.filter(isEvaluatorLike);\n const relPath = relative(config.rootDir, absolutePath);\n return evaluators.map((evaluator) => ({\n id: toId('evaluator', relPath, evaluator.getName()),\n filePath: relPath,\n evaluator,\n }));\n }),\n );\n\n return found.flat();\n}\n\nexport async function collectTestCasesFromFiles(\n config: RunnerDiscoveryConfig,\n): Promise<ReadonlyArray<CollectedTestCase>> {\n const files = await walkDirectory(config.rootDir, config.excludeDirectories);\n const matched = files.filter((filePath) =>\n hasOneSuffix(filePath, config.testCaseSuffixes),\n );\n\n const found = await Promise.all(\n matched.map(async (absolutePath) => {\n const exports = await loadModuleExports(absolutePath);\n const testCases = exports.filter(isTestCaseLike);\n const relPath = relative(config.rootDir, absolutePath);\n return testCases.map((testCase) => ({\n id: toId('test-case', relPath, testCase.getName()),\n filePath: relPath,\n testCase,\n }));\n }),\n );\n\n return found.flat();\n}\n","import { randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\n\nimport { Effect, Queue, Ref } from 'effect';\n\nimport type {\n CreateDiffLogEntryOptions,\n EvaluatorLogEntry,\n} from '../evals/diff';\nimport { createDiffLogEntry, createLogEntry } from '../evals/diff';\nimport type { Dataset } from '../evals/dataset';\nimport type { Evaluator } from '../evals/evaluator';\nimport type { MetricItem } from '../evals/metric';\nimport type { ScoreItem } from '../evals/score';\nimport type { CollectedTestCase, RunSnapshot, RunnerEvent } from './events';\nimport type { PersistenceMessage } from './persistence';\nimport { toNumericScoreFromScores } from './score-utils';\n\nconst evaluatorErrorLogEntryKey = '__m4trixEvaluatorLogEntry';\n\ntype EvaluatorCreatedError = Error & {\n [evaluatorErrorLogEntryKey]?: EvaluatorLogEntry;\n};\n\nfunction computeEvaluatorPassed(\n evaluator: Evaluator<unknown, unknown, unknown, unknown>,\n result: unknown,\n scores: ReadonlyArray<ScoreItem>,\n): boolean {\n const scoresWithPassed = scores.filter((s) => 'passed' in s && s.passed !== undefined);\n if (scoresWithPassed.length > 0) {\n return scoresWithPassed.every((s) => s.passed === true);\n }\n const passCriterion = evaluator.getPassCriterion();\n if (passCriterion) {\n return passCriterion(result);\n }\n const passThreshold = evaluator.getPassThreshold();\n if (passThreshold !== undefined) {\n const numeric = toNumericScoreFromScores(scores);\n return numeric !== undefined && numeric >= passThreshold;\n }\n return true;\n}\n\nfunction normalizeResult(\n result: unknown,\n): {\n scores: ReadonlyArray<ScoreItem>;\n metrics?: ReadonlyArray<MetricItem>;\n} {\n if (typeof result !== 'object' || result === null) {\n return { scores: [] };\n }\n const obj = result as Record<string, unknown>;\n const scores = Array.isArray(obj.scores)\n ? (obj.scores as ReadonlyArray<ScoreItem>)\n : [];\n const metrics = Array.isArray(obj.metrics)\n ? (obj.metrics as ReadonlyArray<MetricItem>)\n : undefined;\n return { scores, metrics };\n}\n\nfunction readOutput(testCase: CollectedTestCase['testCase']): unknown {\n const candidate = testCase as unknown as { getOutput?: () => unknown };\n if (typeof candidate.getOutput !== 'function') {\n return undefined;\n }\n return candidate.getOutput();\n}\n\nexport interface RunTask {\n runId: string;\n triggerId: string;\n datasetId: string;\n dataset: Dataset;\n evaluators: ReadonlyArray<{\n id: string;\n evaluator: Evaluator<unknown, unknown, unknown, unknown>;\n }>;\n testCases: ReadonlyArray<CollectedTestCase>;\n snapshot: RunSnapshot;\n maxConcurrency: number;\n}\n\nfunction nowIsoForFile(): string {\n return new Date().toISOString().replace(/[:.]/g, '-');\n}\n\nexport function createArtifactPath(\n artifactDirectory: string,\n datasetId: string,\n runId: string,\n): string {\n return join(\n artifactDirectory,\n `${datasetId}_${runId}_${nowIsoForFile()}.jsonl`,\n );\n}\n\nfunction processOneTestCase(\n task: RunTask,\n testCaseItem: CollectedTestCase,\n totalEvaluations: number,\n publishEvent: (event: RunnerEvent) => Effect.Effect<void, never, never>,\n persistenceQueue: Queue.Queue<PersistenceMessage>,\n updateSnapshot: (\n runId: string,\n updater: (snapshot: RunSnapshot) => RunSnapshot,\n ) => void,\n startedRef: Ref.Ref<number>,\n completedRef: Ref.Ref<number>,\n passedRef: Ref.Ref<number>,\n failedRef: Ref.Ref<number>,\n): Effect.Effect<void, never, never> {\n return Effect.gen(function* () {\n const reruns =\n typeof testCaseItem.testCase.getReruns === 'function'\n ? testCaseItem.testCase.getReruns()\n : 1;\n const rerunPassed: boolean[] = [];\n\n for (let r = 0; r < reruns; r++) {\n const evaluatorRunId = `run-${randomUUID()}`;\n const started = Date.now();\n const startedEvaluations = yield* Ref.modify(startedRef, (n) => [\n n + 1,\n n + 1,\n ]);\n yield* publishEvent({\n type: 'TestCaseStarted',\n runId: task.runId,\n testCaseId: testCaseItem.id,\n testCaseName: testCaseItem.testCase.getName(),\n startedTestCases: startedEvaluations,\n totalTestCases: totalEvaluations,\n rerunIndex: r + 1,\n rerunTotal: reruns,\n });\n const evaluatorScores: Array<{\n evaluatorId: string;\n scores: ReadonlyArray<ScoreItem>;\n passed: boolean;\n metrics?: ReadonlyArray<MetricItem>;\n logs?: ReadonlyArray<EvaluatorLogEntry>;\n }> = [];\n let testCaseError: string | undefined;\n const output = readOutput(testCaseItem.testCase);\n\n for (const { id: evaluatorId, evaluator } of task.evaluators) {\n const evaluateFn = evaluator.getEvaluateFn();\n if (!evaluateFn) {\n continue;\n }\n\n const logs: EvaluatorLogEntry[] = [];\n const logDiff = (\n expected: unknown,\n actual: unknown,\n options?: CreateDiffLogEntryOptions,\n ) => {\n logs.push(createDiffLogEntry(expected, actual, options));\n };\n const log = (message: unknown, options?: { label?: string }) => {\n logs.push(createLogEntry(message, options));\n };\n const createError = (\n message: unknown,\n options?: { label?: string },\n ): Error => {\n const entry = createLogEntry(message, options);\n const error =\n message instanceof Error ? message : new Error(entry.message);\n (\n error as EvaluatorCreatedError\n )[evaluatorErrorLogEntryKey] = entry;\n return error;\n };\n\n try {\n const ctx = yield* Effect.promise(() =>\n Promise.resolve(evaluator.resolveContext()),\n );\n const result = yield* Effect.promise(() =>\n Promise.resolve().then(() =>\n evaluateFn({\n input: testCaseItem.testCase.getInput(),\n ctx,\n output,\n meta: {\n triggerId: task.triggerId,\n runId: evaluatorRunId,\n datasetId: task.datasetId,\n },\n logDiff,\n log,\n createError,\n }),\n ),\n );\n if (result instanceof Error) {\n const evaluatorError = result as EvaluatorCreatedError;\n const taggedEntry = evaluatorError[evaluatorErrorLogEntryKey];\n logs.push(taggedEntry ?? createLogEntry(result));\n testCaseError = result.message;\n evaluatorScores.push({\n evaluatorId,\n scores: [],\n passed: false,\n logs: logs.length > 0 ? logs : undefined,\n });\n continue;\n }\n const { scores, metrics } = normalizeResult(result);\n const passed = computeEvaluatorPassed(evaluator, result, scores);\n evaluatorScores.push({\n evaluatorId,\n scores,\n passed,\n metrics,\n logs: logs.length > 0 ? logs : undefined,\n });\n } catch (error) {\n if (error instanceof Error) {\n const taggedEntry = (error as EvaluatorCreatedError)[\n evaluatorErrorLogEntryKey\n ];\n logs.push(taggedEntry ?? createLogEntry(error));\n }\n testCaseError =\n error instanceof Error\n ? error.message\n : 'Evaluator execution failed';\n evaluatorScores.push({\n evaluatorId,\n scores: [],\n passed: false,\n logs: logs.length > 0 ? logs : undefined,\n });\n }\n }\n\n const rerunPassedThis = evaluatorScores.every((s) => s.passed);\n rerunPassed.push(rerunPassedThis);\n const completedEvaluations = yield* Ref.modify(completedRef, (n) => [\n n + 1,\n n + 1,\n ]);\n\n const progressEvent: RunnerEvent = {\n type: 'TestCaseProgress',\n runId: task.runId,\n testCaseId: testCaseItem.id,\n testCaseName: testCaseItem.testCase.getName(),\n completedTestCases: completedEvaluations,\n totalTestCases: totalEvaluations,\n rerunIndex: r + 1,\n rerunTotal: reruns,\n passed: rerunPassedThis,\n durationMs: Date.now() - started,\n evaluatorScores,\n output,\n errorMessage: testCaseError,\n };\n\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n completedTestCases: completedEvaluations,\n }));\n\n yield* publishEvent(progressEvent);\n yield* Queue.offer(persistenceQueue, {\n runId: task.runId,\n artifactPath: task.snapshot.artifactPath,\n payload: progressEvent,\n });\n }\n\n const testCasePassed = rerunPassed.every(Boolean);\n if (testCasePassed) {\n yield* Ref.update(passedRef, (n) => n + 1);\n } else {\n yield* Ref.update(failedRef, (n) => n + 1);\n }\n\n const [passed, failed] = yield* Effect.all([\n Ref.get(passedRef),\n Ref.get(failedRef),\n ]);\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n passedTestCases: passed,\n failedTestCases: failed,\n }));\n });\n}\n\nexport const executeRunTask = (\n task: RunTask,\n publishEvent: (event: RunnerEvent) => Effect.Effect<void, never, never>,\n persistenceQueue: Queue.Queue<PersistenceMessage>,\n updateSnapshot: (\n runId: string,\n updater: (snapshot: RunSnapshot) => RunSnapshot,\n ) => void,\n): Effect.Effect<void, never, never> =>\n Effect.gen(function* () {\n const startedAt = Date.now();\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n status: 'running',\n startedAt,\n }));\n yield* publishEvent({\n type: 'RunStarted',\n runId: task.runId,\n startedAt,\n });\n\n const totalEvaluations = task.testCases.reduce(\n (sum, tc) =>\n sum +\n (typeof tc.testCase.getReruns === 'function'\n ? tc.testCase.getReruns()\n : 1),\n 0,\n );\n const maxConcurrency = Math.max(1, task.maxConcurrency ?? 1);\n\n const completedRef = yield* Ref.make(0);\n const startedRef = yield* Ref.make(0);\n const passedRef = yield* Ref.make(0);\n const failedRef = yield* Ref.make(0);\n\n const processTestCase = (testCaseItem: CollectedTestCase) =>\n processOneTestCase(\n task,\n testCaseItem,\n totalEvaluations,\n publishEvent,\n persistenceQueue,\n updateSnapshot,\n startedRef,\n completedRef,\n passedRef,\n failedRef,\n );\n\n yield* Effect.forEach(\n task.testCases,\n processTestCase,\n maxConcurrency > 1 ? { concurrency: maxConcurrency } : undefined,\n );\n\n const [completedEvaluations, passedUniqueTestCases, failedUniqueTestCases] =\n yield* Effect.all([\n Ref.get(completedRef),\n Ref.get(passedRef),\n Ref.get(failedRef),\n ]);\n\n const finishedAt = Date.now();\n const completedEvent: RunnerEvent = {\n type: 'RunCompleted',\n runId: task.runId,\n finishedAt,\n passedTestCases: passedUniqueTestCases,\n failedTestCases: failedUniqueTestCases,\n totalTestCases: task.testCases.length,\n artifactPath: task.snapshot.artifactPath,\n };\n\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n status: 'completed',\n completedTestCases: completedEvaluations,\n passedTestCases: passedUniqueTestCases,\n failedTestCases: failedUniqueTestCases,\n finishedAt,\n }));\n\n yield* publishEvent(completedEvent);\n yield* Queue.offer(persistenceQueue, {\n runId: task.runId,\n artifactPath: task.snapshot.artifactPath,\n payload: completedEvent,\n });\n yield* publishEvent({\n type: 'ArtifactFlushed',\n runId: task.runId,\n artifactPath: task.snapshot.artifactPath,\n });\n });\n","import { diffLines } from 'diff';\nimport stringify from 'fast-json-stable-stringify';\n\n/**\n * Options for customizing JSON diff output. Passed to logDiff, createDiffLogEntry, and printJsonDiff.\n */\nexport interface JsonDiffOptions {\n /** Include equal sections of the document, not just deltas (always true with current implementation) */\n full?: boolean;\n /** Sort primitive values in arrays before comparing */\n sort?: boolean;\n /** Compare only keys, ignore value differences */\n keysOnly?: boolean;\n /** Always output these keys when their parent object has any diff (comma-separated or array) */\n outputKeys?: string | string[];\n /** Output only new/updated values (no - lines) */\n outputNewOnly?: boolean;\n /** Exclude these keys from comparison (comma-separated or array) */\n excludeKeys?: string | string[];\n /** Include unchanged values in output */\n keepUnchangedValues?: boolean;\n /** Round floats to this many decimals before comparing */\n precision?: number;\n /** Max ... elisions in a row before collapsing */\n maxElisions?: number;\n}\n\nfunction preprocessForDiff(value: unknown, options?: JsonDiffOptions): unknown {\n if (options?.sort && Array.isArray(value)) {\n return [...value]\n .sort((a, b) => {\n const aStr = stringify(preprocessForDiff(a, options));\n const bStr = stringify(preprocessForDiff(b, options));\n return aStr.localeCompare(bStr);\n })\n .map((item) => preprocessForDiff(item, options));\n }\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n options?.excludeKeys\n ) {\n const keys = Array.isArray(options.excludeKeys)\n ? options.excludeKeys\n : options.excludeKeys.split(',').map((k) => k.trim());\n const filtered: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n if (!keys.includes(k)) {\n filtered[k] = preprocessForDiff(v, options);\n }\n }\n return filtered;\n }\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = preprocessForDiff(v, options);\n }\n return result;\n }\n if (typeof value === 'number' && options?.precision !== undefined) {\n return Number(value.toFixed(options.precision));\n }\n return value;\n}\n\nfunction toPrettyJson(value: unknown): string {\n const str = stringify(value);\n try {\n const parsed = JSON.parse(str) as unknown;\n return JSON.stringify(parsed, null, 2);\n } catch {\n return str;\n }\n}\n\nfunction formatDiffParts(\n parts: Array<{ added?: boolean; removed?: boolean; value: string }>,\n): string {\n const lines: string[] = [];\n for (const part of parts) {\n const prefix = part.added ? '+ ' : part.removed ? '- ' : '';\n const partLines = part.value.split('\\n');\n for (let i = 0; i < partLines.length; i++) {\n const line = partLines[i]!;\n if (i === partLines.length - 1 && line === '') continue;\n lines.push(prefix + line);\n }\n }\n return lines.join('\\n');\n}\n\nfunction createDiffString(\n expected: unknown,\n actual: unknown,\n diffOptions?: JsonDiffOptions,\n): string {\n const expectedProcessed = preprocessForDiff(expected, diffOptions);\n const actualProcessed = preprocessForDiff(actual, diffOptions);\n\n if (diffOptions?.keysOnly) {\n const expectedKeys = JSON.stringify(\n extractKeys(expectedProcessed),\n null,\n 2,\n );\n const actualKeys = JSON.stringify(\n extractKeys(actualProcessed),\n null,\n 2,\n );\n const parts = diffLines(expectedKeys, actualKeys);\n return formatDiffParts(parts);\n }\n\n const expectedStr = toPrettyJson(expectedProcessed);\n const actualStr = toPrettyJson(actualProcessed);\n\n if (expectedStr === actualStr) {\n return '';\n }\n\n const parts = diffLines(expectedStr, actualStr);\n\n if (diffOptions?.outputNewOnly) {\n const filtered = parts.filter(\n (p: { added?: boolean }) => p.added === true,\n );\n return formatDiffParts(filtered);\n }\n\n return formatDiffParts(parts);\n}\n\nfunction extractKeys(value: unknown): unknown {\n if (value === null || typeof value !== 'object') {\n return '·';\n }\n if (Array.isArray(value)) {\n return value.map(extractKeys);\n }\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = extractKeys(v);\n }\n return result;\n}\n\nexport interface DiffLogEntry {\n type: 'diff';\n label?: string;\n expected: unknown;\n actual: unknown;\n diff: string;\n}\n\nexport interface LogEntry {\n type: 'log';\n label?: string;\n message: string;\n}\n\nexport type EvaluatorLogEntry = DiffLogEntry | LogEntry;\n\nfunction formatLogMessage(msg: unknown): string {\n if (typeof msg === 'string') return msg;\n if (msg instanceof Error) return msg.stack ?? msg.message;\n try {\n if (msg !== null && typeof msg === 'object') {\n return JSON.stringify(msg, null, 2);\n }\n return String(msg);\n } catch {\n return String(msg);\n }\n}\n\n/**\n * Creates a LogEntry for storage in run artifacts. Use for logging objects or text.\n */\nexport function createLogEntry(\n message: unknown,\n options?: { label?: string },\n): LogEntry {\n return {\n type: 'log',\n label: options?.label,\n message: formatLogMessage(message),\n };\n}\n\n/**\n * Returns lines from a log entry for display.\n */\nexport function getLogLines(entry: LogEntry): string[] {\n return entry.message.split('\\n');\n}\n\nexport interface CreateDiffLogEntryOptions extends JsonDiffOptions {\n label?: string;\n}\n\nexport interface PrintJsonDiffOptions extends JsonDiffOptions {\n /** Enable ANSI colors (default: true) */\n color?: boolean;\n}\n\n/**\n * Creates a DiffLogEntry for storage in run artifacts (plain text, no ANSI).\n */\nexport function createDiffLogEntry(\n expected: unknown,\n actual: unknown,\n options?: CreateDiffLogEntryOptions,\n): DiffLogEntry {\n const { label, ...diffOpts } = options ?? {};\n const diff = createDiffString(expected, actual, diffOpts);\n return {\n type: 'diff',\n label,\n expected,\n actual,\n diff: diff || '(no differences)',\n };\n}\n\n/**\n * Returns the plain diff string. Use for storage or when applying colors separately.\n */\nexport function getDiffString(entry: DiffLogEntry): string {\n return entry.diff || '(no differences)';\n}\n\n/**\n * Returns lines from the diff, each with a type for color application.\n */\nexport function getDiffLines(\n entry: DiffLogEntry,\n): Array<{ type: 'add' | 'remove' | 'context'; line: string }> {\n const raw = entry.diff || '(no differences)';\n return raw.split('\\n').map((line) => {\n const trimmed = line.trimStart();\n if (trimmed.startsWith('-') && !trimmed.startsWith('---')) {\n return { type: 'remove' as const, line };\n }\n if (trimmed.startsWith('+') && !trimmed.startsWith('+++')) {\n return { type: 'add' as const, line };\n }\n return { type: 'context' as const, line };\n });\n}\n\n/**\n * Prints a colorized JSON diff between two values to stdout.\n * Useful in evaluators to show expected vs actual output differences.\n * @param expected - The expected/reference value (shown as removed with -)\n * @param actual - The actual value (shown as added with +)\n * @returns The diff string (also printed to console)\n */\nexport function printJsonDiff(\n expected: unknown,\n actual: unknown,\n options: PrintJsonDiffOptions = {},\n): string {\n const { color = true, ...diffOpts } = options;\n const diff = createDiffString(expected, actual, diffOpts);\n if (color) {\n const lines = diff.split('\\n').map((line) => {\n const trimmed = line.trimStart();\n if (trimmed.startsWith('-') && !trimmed.startsWith('---')) {\n return `\\x1b[31m${line}\\x1b[0m`;\n }\n if (trimmed.startsWith('+') && !trimmed.startsWith('+++')) {\n return `\\x1b[32m${line}\\x1b[0m`;\n }\n return line;\n });\n const colored = lines.join('\\n');\n console.log(colored || '(no differences)');\n return colored;\n }\n console.log(diff || '(no differences)');\n return diff;\n}\n","const registry = new Map<string, MetricDef<unknown>>();\n\nexport interface MetricItem<TData = unknown> {\n readonly id: string;\n readonly data: TData;\n /** Per-item display name override (wins over def.name in rendering) */\n readonly name?: string;\n}\n\nexport interface FormatMetricOptions {\n isAggregated?: boolean;\n}\n\nexport interface MetricDef<TData = unknown> {\n readonly id: string;\n readonly name?: string;\n readonly aggregate?: (values: ReadonlyArray<TData>) => TData;\n format(data: TData, options?: FormatMetricOptions): string;\n make(data: TData, options?: { name?: string }): MetricItem<TData>;\n}\n\nexport const Metric = {\n of<TData>(config: {\n id: string;\n name?: string;\n format: (data: TData, options?: FormatMetricOptions) => string;\n aggregate?: (values: ReadonlyArray<TData>) => TData;\n }): MetricDef<TData> {\n const def: MetricDef<TData> = {\n id: config.id,\n name: config.name,\n aggregate: config.aggregate,\n format: config.format,\n make: (data: TData, options?: { name?: string }) => ({\n id: config.id,\n data,\n ...(options?.name !== undefined && { name: options.name }),\n }),\n };\n registry.set(config.id, def as MetricDef<unknown>);\n return def;\n },\n};\n\nexport function getMetricById(id: string): MetricDef<unknown> | undefined {\n return registry.get(id);\n}\n","const registry = new Map<string, ScoreDef<unknown>>();\n\nexport type ScoreDisplayStrategy = 'bar' | 'number' | 'passFail';\n\nexport interface ScoreItem<TData = unknown> {\n readonly id: string;\n readonly data: TData;\n readonly passed?: boolean;\n /** Per-item display name override (wins over def.name in rendering) */\n readonly name?: string;\n /** Attached def for formatting/aggregation without registry lookup (avoids n/a across module boundaries) */\n readonly def?: ScoreDef<TData>;\n}\n\nexport interface FormatScoreOptions {\n isAggregated?: boolean;\n}\n\nexport interface ScoreDef<TData = unknown> {\n readonly id: string;\n readonly name?: string;\n readonly displayStrategy: ScoreDisplayStrategy;\n readonly formatValue: (data: TData) => string;\n readonly formatAggregate: (data: TData) => string;\n readonly aggregateValues: (values: ReadonlyArray<TData>) => TData;\n make(\n data: TData,\n options?: { definePassed?: (data: TData) => boolean; name?: string },\n ): ScoreItem<TData>;\n}\n\n/** Helper to format using the right method based on isAggregated (for consumers that need a single entry point) */\nexport function formatScoreData<TData>(\n def: ScoreDef<TData>,\n data: TData,\n options?: FormatScoreOptions,\n): string {\n return options?.isAggregated\n ? def.formatAggregate(data)\n : def.formatValue(data);\n}\n\n/** Aggregate helpers for common patterns. Use with aggregateValues in Score.of(). */\nexport const ScoreAggregate = {\n /** Average numeric fields. Use for scores like { value, delta }. */\n averageFields<K extends string>(\n fields: readonly K[],\n ): (values: ReadonlyArray<Record<K, number>>) => Record<K, number> {\n return (values) => {\n const count = values.length || 1;\n const result = {} as Record<string, number>;\n for (const field of fields) {\n result[field] =\n values.reduce(\n (s, v) => s + ((v as Record<string, number>)[field] ?? 0),\n 0,\n ) / count;\n }\n return result as unknown as Record<K, number>;\n };\n },\n\n /** Average selected numeric fields, with sample std dev tracked for `value`. */\n averageWithVariance<K extends string>(\n fields: readonly K[],\n ): (\n values: ReadonlyArray<Record<K, number>>,\n ) => Record<K, number> & { stdDev?: number; count: number } {\n return (values) => {\n const count = values.length;\n const result = {} as Record<string, number>;\n\n for (const field of fields) {\n result[field] =\n count === 0\n ? 0\n : values.reduce(\n (sum, item) => sum + ((item as Record<string, number>)[field] ?? 0),\n 0,\n ) / count;\n }\n\n const valueField = 'value' as K;\n const hasValueField = fields.includes(valueField);\n\n if (count === 0) {\n if (hasValueField) {\n result[valueField] = 0;\n }\n return {\n ...(result as Record<K, number>),\n stdDev: undefined,\n count: 0,\n };\n }\n\n let stdDev: number | undefined;\n if (hasValueField && count >= 2) {\n const sum = values.reduce(\n (s, v) => s + ((v as Record<string, number>)[valueField] ?? 0),\n 0,\n );\n const sumSq = values.reduce(\n (s, v) => {\n const value = (v as Record<string, number>)[valueField] ?? 0;\n return s + value * value;\n },\n 0,\n );\n const mean = sum / count;\n const variance = (sumSq - count * mean * mean) / (count - 1);\n stdDev = variance > 0 ? Math.sqrt(variance) : 0;\n }\n\n return {\n ...values[0],\n ...(result as Record<K, number>),\n stdDev,\n count,\n };\n };\n },\n\n /** All runs must pass. Use for binary scores. */\n all<T extends { passed: boolean }>(\n values: ReadonlyArray<T>,\n ): T & { passedCount?: number; totalCount?: number } {\n const total = values.length;\n const passedCount = values.filter((v) => v.passed).length;\n return {\n ...values[0],\n passed: total > 0 && values.every((v) => v.passed),\n passedCount,\n totalCount: total,\n } as T & { passedCount?: number; totalCount?: number };\n },\n\n /** Take last value (no aggregation). Use when aggregation is not meaningful. */\n last<T>(values: ReadonlyArray<T>): T {\n return values[values.length - 1] ?? ({} as T);\n },\n};\n\nexport const Score = {\n aggregate: ScoreAggregate,\n\n of<TData>(config: {\n id: string;\n name?: string;\n displayStrategy: ScoreDisplayStrategy;\n formatValue: (data: TData) => string;\n formatAggregate: (data: TData) => string;\n aggregateValues: (values: ReadonlyArray<TData>) => TData;\n }): ScoreDef<TData> {\n const def: ScoreDef<TData> = {\n id: config.id,\n name: config.name,\n displayStrategy: config.displayStrategy,\n formatValue: config.formatValue,\n formatAggregate: config.formatAggregate,\n aggregateValues: config.aggregateValues,\n make: (\n data: TData,\n options?: { definePassed?: (data: TData) => boolean; name?: string },\n ) => {\n const passed =\n options?.definePassed !== undefined\n ? options.definePassed(data)\n : undefined;\n return {\n id: config.id,\n data,\n ...(passed !== undefined && { passed }),\n ...(options?.name !== undefined && { name: options.name }),\n def, // Attach def so rendering/aggregation works without registry lookup\n };\n },\n };\n registry.set(config.id, def as ScoreDef<unknown>);\n return def;\n },\n};\n\nexport function getScoreById(id: string): ScoreDef<unknown> | undefined {\n return registry.get(id);\n}\n","/** Average of numeric `value` fields (e.g. for percentScore) */\nexport function aggregateAverage(values: ReadonlyArray<{ value: number }>): {\n value: number;\n} {\n if (values.length === 0) {\n return { value: 0 };\n }\n const sum = values.reduce((s, v) => s + v.value, 0);\n return { value: sum / values.length };\n}\n\n/** Average with sample std dev (for percentScore when aggregated) */\nexport function aggregateAverageWithVariance(\n values: ReadonlyArray<{ value: number }>,\n): { value: number; stdDev?: number; count: number } {\n if (values.length === 0) {\n return { value: 0, count: 0 };\n }\n const sum = values.reduce((s, v) => s + v.value, 0);\n const sumSq = values.reduce((s, v) => s + v.value * v.value, 0);\n const mean = sum / values.length;\n let stdDev: number | undefined;\n if (values.length >= 2) {\n const variance = (sumSq - values.length * mean * mean) / (values.length - 1);\n stdDev = variance > 0 ? Math.sqrt(variance) : 0;\n }\n return { value: mean, stdDev, count: values.length };\n}\n\n/** All runs must pass (for binaryScore). Returns passed and count for spread display. */\nexport function aggregateAll(values: ReadonlyArray<{ passed: boolean }>): {\n passed: boolean;\n passedCount?: number;\n totalCount?: number;\n} {\n const total = values.length;\n const passedCount = values.filter((v) => v.passed).length;\n return {\n passed: total > 0 && values.every((v) => v.passed),\n passedCount,\n totalCount: total,\n };\n}\n\ntype TokenCountSum = {\n input: number;\n output: number;\n inputCached: number;\n outputCached: number;\n};\n\n/** Sum token counts across reruns */\nexport function aggregateTokenCountSum(\n values: ReadonlyArray<{\n input?: number;\n output?: number;\n inputCached?: number;\n outputCached?: number;\n }>,\n): TokenCountSum {\n const initial: TokenCountSum = {\n input: 0,\n output: 0,\n inputCached: 0,\n outputCached: 0,\n };\n return values.reduce<TokenCountSum>(\n (acc, v) => ({\n input: acc.input + (v.input ?? 0),\n output: acc.output + (v.output ?? 0),\n inputCached: acc.inputCached + (v.inputCached ?? 0),\n outputCached: acc.outputCached + (v.outputCached ?? 0),\n }),\n initial,\n );\n}\n\n/** Average latency across reruns */\nexport function aggregateLatencyAverage(\n values: ReadonlyArray<{ ms: number }>,\n): { ms: number } {\n if (values.length === 0) {\n return { ms: 0 };\n }\n const sum = values.reduce((s, v) => s + v.ms, 0);\n return { ms: sum / values.length };\n}\n","import { aggregateLatencyAverage, aggregateTokenCountSum } from '../aggregators';\nimport { Metric } from '../metric';\n\nexport interface TokenCountData {\n input?: number;\n output?: number;\n inputCached?: number;\n outputCached?: number;\n}\n\nexport const tokenCountMetric = Metric.of<TokenCountData>({\n id: 'token-count',\n name: 'Tokens',\n aggregate: aggregateTokenCountSum,\n format: (data, options) => {\n const input = data.input ?? 0;\n const output = data.output ?? 0;\n const inputCached = data.inputCached ?? 0;\n const outputCached = data.outputCached ?? 0;\n const cached = inputCached + outputCached;\n const base = `in:${input} out:${output} cached:${cached}`;\n return options?.isAggregated ? `Total: ${base}` : base;\n },\n});\n\nexport interface LatencyData {\n ms: number;\n}\n\nexport const latencyMetric = Metric.of<LatencyData>({\n id: 'latency',\n name: 'Latency',\n aggregate: aggregateLatencyAverage,\n format: (data, options) =>\n options?.isAggregated ? `Avg: ${data.ms}ms` : `${data.ms}ms`,\n});\n","import { Score } from '../score';\n\nexport interface PercentScoreData {\n value: number;\n stdDev?: number;\n count?: number;\n}\n\nexport const percentScore = Score.of<PercentScoreData>({\n id: 'percent',\n name: 'Score',\n displayStrategy: 'bar',\n formatValue: (data) => data.value.toFixed(2),\n formatAggregate: (data) =>\n data.stdDev != null\n ? `Avg: ${data.value.toFixed(2)} ± ${data.stdDev.toFixed(2)}`\n : `Avg: ${data.value.toFixed(2)}`,\n aggregateValues: Score.aggregate.averageWithVariance(['value']),\n});\n\nexport interface DeltaScoreData {\n value: number;\n delta: number;\n}\n\nexport const deltaScore = Score.of<DeltaScoreData>({\n id: 'delta',\n name: 'Delta',\n displayStrategy: 'number',\n formatValue: (data) =>\n `${data.value.toFixed(2)} (${data.delta >= 0 ? '+' : ''}${data.delta.toFixed(2)} vs baseline)`,\n formatAggregate: (data) =>\n `Avg: ${data.value.toFixed(2)} (Delta: ${data.delta >= 0 ? '+' : ''}${data.delta.toFixed(2)})`,\n aggregateValues: Score.aggregate.averageFields(['value', 'delta']),\n});\n\nexport interface BinaryScoreData {\n passed: boolean;\n passedCount?: number;\n totalCount?: number;\n}\n\nexport const binaryScore = Score.of<BinaryScoreData>({\n id: 'binary',\n name: 'Result',\n displayStrategy: 'passFail',\n formatValue: (data) => (data.passed ? 'PASSED' : 'NOT PASSED'),\n formatAggregate: (data) => {\n const base = data.passed ? 'All: PASSED' : 'Some: FAILED';\n if (\n data.passedCount != null &&\n data.totalCount != null &&\n data.totalCount > 1\n ) {\n return `${base} (${data.passedCount}/${data.totalCount})`;\n }\n return base;\n },\n aggregateValues: Score.aggregate.all,\n});\n","import type { MetricItem } from '../evals/metric';\nimport type { ScoreDef, ScoreItem } from '../evals/score';\nimport { getMetricById, getScoreById } from '../evals';\n\nfunction getScoreDef(item: ScoreItem): ScoreDef<unknown> | undefined {\n return item.def ?? getScoreById(item.id);\n}\n\nfunction lastNonEmptyName(items: ReadonlyArray<{ name?: string }>): string | undefined {\n for (let i = items.length - 1; i >= 0; i--) {\n const n = items[i].name;\n if (n != null && n.trim().length > 0) return n;\n }\n return undefined;\n}\n\nexport function aggregateScoreItems(\n items: ReadonlyArray<ScoreItem>,\n): ScoreItem | undefined {\n if (items.length === 0) return undefined;\n const def = getScoreDef(items[0]);\n if (!def?.aggregateValues) return items[items.length - 1];\n const aggregated = def.aggregateValues(items.map((i) => i.data as never));\n const nameOverride = lastNonEmptyName(items);\n return {\n ...items[0],\n data: aggregated,\n def,\n ...(nameOverride !== undefined && { name: nameOverride }),\n };\n}\n\nexport function aggregateMetricItems(\n items: ReadonlyArray<MetricItem>,\n): MetricItem | undefined {\n if (items.length === 0) return undefined;\n const def = getMetricById(items[0].id);\n if (!def?.aggregate) return items[items.length - 1];\n const aggregated = def.aggregate(items.map((i) => i.data as never));\n const nameOverride = lastNonEmptyName(items);\n return {\n ...items[0],\n data: aggregated,\n ...(nameOverride !== undefined && { name: nameOverride }),\n };\n}\n\nexport function toNumericScoreFromScores(\n scores: ReadonlyArray<ScoreItem>,\n): number | undefined {\n for (const item of scores) {\n const def = getScoreDef(item);\n if (def && def.displayStrategy === 'bar' && typeof item.data === 'object' && item.data !== null && 'value' in item.data) {\n const value = (item.data as { value: unknown }).value;\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n }\n const numeric = toNumericScore(item.data);\n if (numeric !== undefined) {\n return numeric;\n }\n }\n return undefined;\n}\n\nexport function toNumericScore(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value !== 'object' || value === null) {\n return undefined;\n }\n const obj = value as Record<string, unknown>;\n if (\n 'score' in obj &&\n typeof obj.score === 'number' &&\n Number.isFinite(obj.score)\n ) {\n return obj.score;\n }\n const numberValues = Object.values(value).filter(\n (entry): entry is number =>\n typeof entry === 'number' && Number.isFinite(entry),\n );\n if (numberValues.length === 0) {\n return undefined;\n }\n return (\n numberValues.reduce((sum, entry) => sum + entry, 0) / numberValues.length\n );\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\n\nimport type { RunnerConfig } from './config';\nimport type { RunSnapshot } from './events';\n\nexport interface ParsedTestCaseProgress {\n testCaseId: string;\n testCaseName: string;\n completedTestCases: number;\n totalTestCases: number;\n rerunIndex?: number;\n rerunTotal?: number;\n passed: boolean;\n durationMs: number;\n evaluatorScores: ReadonlyArray<{\n evaluatorId: string;\n scores: ReadonlyArray<{\n id: string;\n data: unknown;\n passed?: boolean;\n name?: string;\n }>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown; name?: string }>;\n logs?: ReadonlyArray<\n | { type: 'diff'; label?: string; expected: unknown; actual: unknown; diff: string }\n | { type: 'log'; label?: string; message: string }\n >;\n }>;\n}\n\nexport async function loadRunSnapshotsFromArtifacts(\n config: RunnerConfig,\n): Promise<RunSnapshot[]> {\n const baseDir = resolve(config.artifactDirectory);\n let entries: string[];\n try {\n entries = await readdir(baseDir);\n } catch {\n return [];\n }\n\n const jsonlFiles = entries.filter((name) => name.endsWith('.jsonl'));\n const snapshots: RunSnapshot[] = [];\n\n for (const fileName of jsonlFiles) {\n const filePath = join(baseDir, fileName);\n try {\n const snapshot = await parseArtifactToSnapshot(filePath, config);\n if (snapshot) {\n snapshots.push(snapshot);\n }\n } catch {\n // Skip malformed or unreadable files\n }\n }\n\n return snapshots.sort((a, b) => b.queuedAt - a.queuedAt);\n}\n\nasync function parseArtifactToSnapshot(\n filePath: string,\n _config: RunnerConfig,\n): Promise<RunSnapshot | null> {\n const content = await readFile(filePath, 'utf8');\n const lines = content.split('\\n').filter((line) => line.trim().length > 0);\n if (lines.length === 0) {\n return null;\n }\n\n let runQueued: {\n runId: string;\n datasetId: string;\n datasetName: string;\n evaluatorIds: ReadonlyArray<string>;\n totalTestCases: number;\n artifactPath: string;\n ts?: number;\n } | null = null;\n\n let runCompleted: {\n passedTestCases: number;\n failedTestCases: number;\n totalTestCases: number;\n finishedAt: number;\n } | null = null;\n\n let runFailed: { finishedAt: number; errorMessage: string } | null = null;\n let runStarted: { startedAt: number } | null = null;\n\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as Record<string, unknown>;\n const type = event.type as string;\n\n if (type === 'RunQueued') {\n runQueued = {\n runId: event.runId as string,\n datasetId: event.datasetId as string,\n datasetName: event.datasetName as string,\n evaluatorIds: event.evaluatorIds as ReadonlyArray<string>,\n totalTestCases: (event.totalTestCases as number) ?? 0,\n artifactPath: (event.artifactPath as string) ?? filePath,\n ts: event.ts as number | undefined,\n };\n }\n if (type === 'RunStarted') {\n runStarted = { startedAt: event.startedAt as number };\n }\n if (type === 'RunCompleted') {\n runCompleted = {\n passedTestCases: event.passedTestCases as number,\n failedTestCases: event.failedTestCases as number,\n totalTestCases: event.totalTestCases as number,\n finishedAt: event.finishedAt as number,\n };\n }\n if (type === 'RunFailed') {\n runFailed = {\n finishedAt: event.finishedAt as number,\n errorMessage: event.errorMessage as string,\n };\n }\n } catch {\n // Skip malformed lines\n }\n }\n\n if (!runQueued) {\n return null;\n }\n\n const artifactPath = filePath;\n\n const status = runFailed\n ? 'failed'\n : runCompleted\n ? 'completed'\n : runStarted\n ? 'running'\n : 'queued';\n\n const progress = aggregateTestCaseProgress(lines);\n const completedTestCases = runCompleted\n ? runQueued.totalTestCases\n : progress.completedTestCases;\n const passedTestCases =\n runCompleted?.passedTestCases ?? progress.passedTestCases;\n const failedTestCases =\n runCompleted?.failedTestCases ?? progress.failedTestCases;\n\n return {\n runId: runQueued.runId,\n datasetId: runQueued.datasetId,\n datasetName: runQueued.datasetName,\n evaluatorIds: runQueued.evaluatorIds,\n queuedAt: runQueued.ts ?? 0,\n startedAt: runStarted?.startedAt,\n finishedAt: runCompleted?.finishedAt ?? runFailed?.finishedAt,\n totalTestCases: runQueued.totalTestCases,\n completedTestCases,\n passedTestCases,\n failedTestCases,\n status,\n artifactPath,\n errorMessage: runFailed?.errorMessage,\n };\n}\n\nfunction aggregateTestCaseProgress(lines: string[]): {\n completedTestCases: number;\n passedTestCases: number;\n failedTestCases: number;\n} {\n let completedTestCases = 0;\n const testCasePassedBy = new Map<string, boolean>();\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as Record<string, unknown>;\n if (event.type === 'TestCaseProgress') {\n const ev = event as {\n testCaseId: string;\n completedTestCases: number;\n passed: boolean;\n };\n completedTestCases = ev.completedTestCases ?? completedTestCases;\n const id = ev.testCaseId;\n const current = testCasePassedBy.get(id);\n testCasePassedBy.set(id, current === undefined ? ev.passed : current && ev.passed);\n }\n } catch {\n // skip\n }\n }\n let passedTestCases = 0;\n let failedTestCases = 0;\n for (const passed of testCasePassedBy.values()) {\n if (passed) {\n passedTestCases += 1;\n } else {\n failedTestCases += 1;\n }\n }\n return { completedTestCases, passedTestCases, failedTestCases };\n}\n\nexport async function parseArtifactFile(\n artifactPath: string,\n): Promise<ParsedTestCaseProgress[]> {\n try {\n const content = await readFile(artifactPath, 'utf8');\n const lines = content.split('\\n').filter((line) => line.trim().length > 0);\n const results: ParsedTestCaseProgress[] = [];\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as Record<string, unknown>;\n if (event.type === 'TestCaseProgress') {\n const ev = event as {\n testCaseId: string;\n testCaseName: string;\n completedTestCases: number;\n totalTestCases: number;\n rerunIndex?: number;\n rerunTotal?: number;\n passed: boolean;\n durationMs: number;\n evaluatorScores: ReadonlyArray<{\n evaluatorId: string;\n scores: ReadonlyArray<{\n id: string;\n data: unknown;\n passed?: boolean;\n name?: string;\n }>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown; name?: string }>;\n logs?: ReadonlyArray<\n | { type: 'diff'; label?: string; expected: unknown; actual: unknown; diff: string }\n | { type: 'log'; label?: string; message: string }\n >;\n }>;\n };\n results.push({\n testCaseId: ev.testCaseId,\n testCaseName: ev.testCaseName,\n completedTestCases: ev.completedTestCases,\n totalTestCases: ev.totalTestCases,\n rerunIndex: ev.rerunIndex,\n rerunTotal: ev.rerunTotal,\n passed: ev.passed,\n durationMs: ev.durationMs,\n evaluatorScores: ev.evaluatorScores ?? [],\n });\n }\n } catch {\n // skip malformed lines\n }\n }\n return results;\n } catch {\n return [];\n }\n}\n","import { appendFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\nimport { Effect, Queue } from 'effect';\n\nexport interface PersistenceMessage {\n runId: string;\n artifactPath: string;\n payload: unknown;\n}\n\nasync function appendJsonLine(\n artifactPath: string,\n payload: unknown,\n): Promise<void> {\n await mkdir(dirname(artifactPath), { recursive: true });\n await appendFile(artifactPath, `${JSON.stringify(payload)}\\n`, 'utf8');\n}\n\nexport const createPersistenceWorker = (\n queue: Queue.Queue<PersistenceMessage>,\n): Effect.Effect<never, never, never> =>\n Effect.forever(\n Effect.gen(function* () {\n const message = yield* Queue.take(queue);\n yield* Effect.promise(() =>\n appendJsonLine(message.artifactPath, {\n runId: message.runId,\n ts: Date.now(),\n ...(typeof message.payload === 'object' &&\n message.payload !== null &&\n !Array.isArray(message.payload)\n ? message.payload\n : {}),\n }),\n );\n }),\n );\n","import type { CollectedTestCase, SearchTestCasesQuery } from './events';\n\nfunction matchesAny(\n value: string,\n matchers: ReadonlyArray<string | RegExp> | undefined,\n): boolean {\n if (!matchers || matchers.length === 0) {\n return true;\n }\n return matchers.some((matcher) =>\n typeof matcher === 'string' ? matcher === value : matcher.test(value),\n );\n}\n\nfunction matchesPath(\n value: string,\n matchers: ReadonlyArray<string | RegExp> | undefined,\n): boolean {\n if (!matchers || matchers.length === 0) {\n return true;\n }\n return matchers.some((matcher) => {\n if (typeof matcher === 'string') {\n return value.includes(matcher);\n }\n return matcher.test(value);\n });\n}\n\nexport function searchCollectedTestCases(\n all: ReadonlyArray<CollectedTestCase>,\n query?: SearchTestCasesQuery,\n): ReadonlyArray<CollectedTestCase> {\n if (!query) {\n return all;\n }\n\n return all.filter((item) => {\n const tags = item.testCase.getTags();\n\n if (\n query.excludedTags &&\n tags.some((tag) => matchesAny(tag, query.excludedTags))\n ) {\n return false;\n }\n if (\n query.excludedPaths &&\n matchesPath(item.filePath, query.excludedPaths)\n ) {\n return false;\n }\n\n const includedTagsMatch =\n !query.includedTags ||\n query.includedTags.length === 0 ||\n tags.some((tag) => matchesAny(tag, query.includedTags));\n\n const includedPathsMatch =\n !query.includedPaths ||\n query.includedPaths.length === 0 ||\n matchesPath(item.filePath, query.includedPaths);\n\n return includedTagsMatch && includedPathsMatch;\n });\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport type { CliState, EvalDataset, EvalRun } from '../../types';\nimport { Pane, RunsSidebar, SectionHeader, Sparkline, StatusText, TextBar } from '../../components';\n\ninterface RunsViewProps {\n state: CliState;\n dataset: EvalDataset | undefined;\n selectedRun: EvalRun | undefined;\n}\n\nexport function RunsView({\n state,\n dataset,\n selectedRun,\n}: RunsViewProps): React.ReactNode {\n const runs = dataset?.runs ?? [];\n const rightFocused = state.focus === 'right';\n\n return (\n <>\n <RunsSidebar state={state} dataset={dataset} runs={runs} />\n <Pane flexGrow={1} marginLeft={1} focused={rightFocused}>\n {!selectedRun ? (\n <Text color=\"gray\">Select a run to see summary metrics.</Text>\n ) : (\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"gray\">Run:</Text> {selectedRun.label}{' '}\n <StatusText status={selectedRun.status} />\n </Text>\n <Text color=\"gray\">\n Commit: {selectedRun.meta.commit} Branch: {selectedRun.meta.branch}{' '}\n Seed: {selectedRun.meta.seed}\n </Text>\n <Text> </Text>\n <SectionHeader>Overall</SectionHeader>\n <TextBar\n label=\"pass rate\"\n value={selectedRun.performance.passRate}\n format={(v) => `${v}%`}\n />\n <TextBar\n label=\"avg score\"\n value={Math.round(selectedRun.performance.avgScore * 100)}\n />\n <Text> </Text>\n <SectionHeader>Dimensions</SectionHeader>\n {selectedRun.dimensions.map((dimension) => (\n <TextBar\n key={dimension.name}\n label={dimension.name}\n value={dimension.score}\n />\n ))}\n <Text> </Text>\n <SectionHeader>Latency trend</SectionHeader>\n <Sparkline\n data={\n selectedRun.performance.latencyHistoryMs ?? [\n selectedRun.performance.latencyAvgMs - 40,\n selectedRun.performance.latencyAvgMs - 10,\n selectedRun.performance.latencyAvgMs + 20,\n selectedRun.performance.latencyP95Ms - 80,\n selectedRun.performance.latencyP95Ms,\n ]\n }\n width={24}\n />\n </Box>\n )}\n </Pane>\n </>\n );\n}\n","/** @jsxImportSource react */\nimport React, { useEffect, useState } from 'react';\nimport { resolve } from 'node:path';\nimport { Box, Text } from 'ink';\nimport {\n formatScoreData,\n getDiffLines,\n getLogLines,\n getMetricById,\n getScoreById,\n type ScoreDef,\n} from '../../../evals';\nimport { toNumericScore } from '../../../runner/score-utils';\nimport {\n parseArtifactFile,\n type ParsedTestCaseProgress,\n} from '../../../runner';\nimport type {\n CliState,\n EvalDataset,\n EvalRun,\n EvaluatorOption,\n} from '../../types';\nimport {\n Pane,\n RunsSidebar,\n SectionHeader,\n Sparkline,\n TextBar,\n} from '../../components';\n\nconst DETAILS_PAGE_SIZE = 20;\n\nfunction scoreColor(score: number): 'green' | 'yellow' | 'red' {\n if (score >= 80) return 'green';\n if (score >= 50) return 'yellow';\n return 'red';\n}\n\nfunction formatScorePart(item: {\n id: string;\n data: unknown;\n def?: ScoreDef<unknown>;\n}): string {\n const def: ScoreDef<unknown> | undefined = item.def ?? getScoreById(item.id);\n if (!def) {\n const numeric = toNumericScore(item.data);\n return numeric !== undefined ? `${numeric.toFixed(2)}` : 'n/a';\n }\n const formatted = formatScoreData(def, item.data);\n if (def.displayStrategy === 'bar') {\n const numeric =\n typeof item.data === 'object' &&\n item.data !== null &&\n 'value' in item.data\n ? (item.data as { value: unknown }).value\n : toNumericScore(item.data);\n if (typeof numeric === 'number' && Number.isFinite(numeric)) {\n const barWidth = 14;\n const filled = Math.round((numeric / 100) * barWidth);\n const bar = '█'.repeat(filled) + '░'.repeat(barWidth - filled);\n return `${formatted} ${bar}`;\n }\n }\n return formatted;\n}\n\ninterface RunDetailsViewProps {\n state: CliState;\n dataset: EvalDataset | undefined;\n selectedRun: EvalRun | undefined;\n evaluators: ReadonlyArray<EvaluatorOption>;\n}\n\nfunction CheckRow({\n name,\n passed,\n detail,\n}: {\n name: string;\n passed: boolean;\n detail?: string;\n}): React.ReactNode {\n const status = passed ? 'PASSED' : 'FAILED';\n const color = passed ? 'green' : 'red';\n return (\n <Text>\n <Text color=\"gray\">{name.padEnd(14)}</Text>{' '}\n <Text color={color} bold>\n {status}\n </Text>\n {detail ? <Text color=\"gray\"> ({detail})</Text> : null}\n </Text>\n );\n}\n\nfunction buildDetailRows(\n run: EvalRun,\n testCases: ParsedTestCaseProgress[],\n evaluatorNameById: Map<string, string>,\n): React.ReactNode[] {\n const { performance, dimensions, checks, failures, meta } = run;\n const latencyHistory = performance.latencyHistoryMs ?? [\n performance.latencyAvgMs - 40,\n performance.latencyAvgMs - 10,\n performance.latencyAvgMs + 20,\n performance.latencyP95Ms - 80,\n performance.latencyP95Ms,\n ];\n\n const rows: React.ReactNode[] = [\n <SectionHeader key=\"meta-h\">Meta</SectionHeader>,\n <Text key=\"meta-1\" color=\"gray\">\n Model: {meta.model} Provider: {meta.provider}\n </Text>,\n <Text key=\"meta-2\" color=\"gray\">\n Commit: {meta.commit} Branch: {meta.branch} Seed: {meta.seed}\n </Text>,\n <Text key=\"meta-3\" color=\"gray\">\n Duration: {meta.duration} Concurrency: {meta.concurrency}\n </Text>,\n <Text key=\"meta-4\" color=\"gray\">\n Artifact: {meta.artifact}\n </Text>,\n <Text key=\"sp1\"> </Text>,\n <SectionHeader key=\"scores-h\">Scores (0–100)</SectionHeader>,\n ...dimensions.map((d) => (\n <TextBar key={`dim-${d.name}`} label={d.name} value={d.score} />\n )),\n <Text key=\"sp2\"> </Text>,\n <SectionHeader key=\"checks-h\">Checks (boolean)</SectionHeader>,\n ...checks.map((c) => (\n <CheckRow\n key={`chk-${c.name}`}\n name={c.name}\n passed={c.passed}\n detail={c.detail}\n />\n )),\n <Text key=\"sp3\"> </Text>,\n <SectionHeader key=\"perf-h\">Performance</SectionHeader>,\n <TextBar\n key=\"perf-rate\"\n label=\"pass rate\"\n value={performance.passRate}\n format={(v) => `${v}%`}\n />,\n <Text key=\"perf-lat\" color=\"gray\">\n latency avg {performance.latencyAvgMs}ms p95 {performance.latencyP95Ms}ms\n </Text>,\n <Text key=\"perf-tok\" color=\"gray\">\n tokens avg {performance.tokensAvg} p95 {performance.tokensP95}\n </Text>,\n <Text key=\"sp4\"> </Text>,\n <SectionHeader key=\"spark-h\">Latency trend</SectionHeader>,\n <Sparkline key=\"spark\" data={latencyHistory} width={20} />,\n ];\n\n if (failures.length > 0) {\n rows.push(<Text key=\"sp5\"> </Text>);\n rows.push(<SectionHeader key=\"fail-h\">Failures (top)</SectionHeader>);\n failures.forEach((f, i) => {\n rows.push(\n <Text key={`fail-${i}`} color=\"red\">\n {i + 1}) {f.title}\n </Text>,\n );\n });\n }\n\n if (testCases.length > 0) {\n rows.push(<Text key=\"sp6\"> </Text>);\n rows.push(<SectionHeader key=\"tc-h\">Test cases</SectionHeader>);\n for (const tc of testCases) {\n const rerunPart =\n tc.rerunTotal != null && tc.rerunIndex != null\n ? ` (${tc.rerunIndex}/${tc.rerunTotal})`\n : '';\n rows.push(\n <Text key={`tc-${tc.testCaseId}-${tc.rerunIndex ?? 0}`}>\n <Text color=\"cyan\">\n [{tc.completedTestCases}/{tc.totalTestCases}]\n </Text>{' '}\n {tc.testCaseName}\n {rerunPart ? <Text color=\"cyan\">{rerunPart}</Text> : null}\n <Text color=\"gray\"> ({tc.durationMs}ms)</Text>\n </Text>,\n );\n for (const item of tc.evaluatorScores) {\n const name =\n evaluatorNameById.get(item.evaluatorId) ?? item.evaluatorId;\n rows.push(\n <Text key={`tc-${tc.testCaseId}-${item.evaluatorId}`}>\n {' '}\n {name}:{' '}\n <Text color={item.passed ? 'green' : 'red'} bold>\n {item.passed ? 'PASS' : 'FAIL'}\n </Text>\n {item.metrics && item.metrics.length > 0 ? (\n <>\n {' '}\n {item.metrics.map((m) => {\n const def = getMetricById(m.id);\n if (!def) return null;\n const formatted = def.format(m.data);\n const label = m.name ?? def.name;\n return (\n <Text key={m.id} color=\"gray\">\n [{label ? `${label}: ` : ''}\n {formatted}]{' '}\n </Text>\n );\n })}\n </>\n ) : null}\n </Text>,\n );\n if (item.scores.length > 0) {\n for (let sIdx = 0; sIdx < item.scores.length; sIdx++) {\n const s = item.scores[sIdx];\n const def: ScoreDef<unknown> | undefined =\n (s as { def?: ScoreDef<unknown> }).def ?? getScoreById(s.id);\n const scoreLabel = s.name ?? def?.name ?? def?.id ?? s.id;\n rows.push(\n <Text\n key={`tc-${tc.testCaseId}-${item.evaluatorId}-score-${sIdx}`}\n color={scoreColor(toNumericScore(s.data) ?? 0)}\n >\n {' '}\n {scoreLabel}: {formatScorePart(s)}\n </Text>,\n );\n }\n } else {\n rows.push(\n <Text\n key={`tc-${tc.testCaseId}-${item.evaluatorId}-n/a`}\n color=\"gray\"\n >\n {' '}\n n/a\n </Text>,\n );\n }\n if (!item.passed && item.logs && item.logs.length > 0) {\n for (let logIdx = 0; logIdx < item.logs.length; logIdx++) {\n const log = item.logs[logIdx];\n if (log.type === 'diff') {\n const lines = getDiffLines(log);\n for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n const { type, line } = lines[lineIdx];\n rows.push(\n <Text\n key={`tc-${tc.testCaseId}-${item.evaluatorId}-${logIdx}-${lineIdx}`}\n color={\n type === 'remove'\n ? 'red'\n : type === 'add'\n ? 'green'\n : 'gray'\n }\n >\n {' '}\n {line}\n </Text>,\n );\n }\n } else if (log.type === 'log') {\n const logLines = getLogLines(log);\n for (let lineIdx = 0; lineIdx < logLines.length; lineIdx++) {\n rows.push(\n <Text\n key={`tc-${tc.testCaseId}-${item.evaluatorId}-${logIdx}-${lineIdx}`}\n color=\"gray\"\n >\n {' '}\n {logLines[lineIdx]}\n </Text>,\n );\n }\n }\n }\n }\n }\n }\n }\n\n return rows;\n}\n\nexport function RunDetailsView({\n state,\n dataset,\n selectedRun,\n evaluators,\n}: RunDetailsViewProps): React.ReactNode {\n const runs = dataset?.runs ?? [];\n const rightFocused = state.focus === 'right';\n const [testCases, setTestCases] = useState<ParsedTestCaseProgress[]>([]);\n\n const evaluatorNameById = React.useMemo(\n () => new Map(evaluators.map((e) => [e.id, e.name])),\n [evaluators],\n );\n\n useEffect(() => {\n if (!selectedRun?.meta?.artifact) {\n setTestCases([]);\n return;\n }\n const artifactPath = resolve(selectedRun.meta.artifact);\n parseArtifactFile(artifactPath).then(setTestCases);\n }, [selectedRun?.meta?.artifact]);\n\n if (!selectedRun) {\n return (\n <>\n <RunsSidebar state={state} dataset={dataset} runs={runs} />\n <Pane flexGrow={1} marginLeft={1} focused={rightFocused}>\n <Text color=\"gray\">Select a run to inspect details.</Text>\n </Pane>\n </>\n );\n }\n\n const rows = buildDetailRows(selectedRun, testCases, evaluatorNameById);\n const offset = Math.max(0, state.detailsScrollOffset);\n const visible = rows.slice(offset, offset + DETAILS_PAGE_SIZE);\n\n return (\n <>\n <RunsSidebar state={state} dataset={dataset} runs={runs} />\n <Pane flexGrow={1} marginLeft={1} focused={rightFocused}>\n <Box flexDirection=\"column\">\n {visible.map((row, i) => (\n <React.Fragment key={i}>{row}</React.Fragment>\n ))}\n </Box>\n </Pane>\n </>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\nimport type { CliState, EvalsData } from '../../types';\nimport { Pane, SectionHeader } from '../../components';\n\nconst LEFT_PANE_WIDTH = 44;\n\ninterface NewEvaluationViewProps {\n state: CliState;\n data: EvalsData;\n visibleEvaluators: EvalsData['evaluators'];\n}\n\nexport function NewEvaluationView({\n state,\n data,\n visibleEvaluators,\n}: NewEvaluationViewProps): React.ReactNode {\n const selectedCount = state.selectedEvaluatorIds.length;\n const focusedEvaluator = visibleEvaluators[state.evaluatorMenuIndex];\n const leftFocused = state.focus === 'left';\n const rightFocused = state.focus === 'right';\n\n return (\n <>\n <Pane width={LEFT_PANE_WIDTH} focused={leftFocused}>\n <SectionHeader>Available Evaluators</SectionHeader>\n <Text color=\"gray\">Search: {state.searchQuery || '(none)'}</Text>\n {visibleEvaluators.map((evaluator, index) => {\n const selected = index === state.evaluatorMenuIndex;\n const inSelection = state.selectedEvaluatorIds.includes(evaluator.id);\n return (\n <Text\n key={evaluator.id}\n color={selected ? 'cyan' : 'gray'}\n bold={selected}\n >\n {selected ? '▸ ' : ' '}\n {inSelection ? '[x] ' : '[ ] '}\n {evaluator.name}\n </Text>\n );\n })}\n </Pane>\n <Pane flexGrow={1} marginLeft={1} focused={rightFocused}>\n <SectionHeader>Selected ({selectedCount})</SectionHeader>\n {state.selectedEvaluatorIds.map((id, index) => {\n const evaluator = data.evaluators.find((item) => item.id === id);\n if (!evaluator) return null;\n return (\n <Text key={id}>\n {index + 1}) {evaluator.name}\n </Text>\n );\n })}\n <SectionHeader>Config preview</SectionHeader>\n <Text color=\"gray\">\n {focusedEvaluator?.configPreview ??\n 'Select an evaluator to inspect config.'}\n </Text>\n </Pane>\n </>\n );\n}\n"]}
|