@vitest-evals/core 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs ADDED
@@ -0,0 +1,489 @@
1
+ // src/json.ts
2
+ import { z } from "zod";
3
+ var JsonPrimitiveSchema = z.union([
4
+ z.string(),
5
+ z.number().finite(),
6
+ z.boolean(),
7
+ z.null()
8
+ ]);
9
+ var JsonValueSchema = z.lazy(
10
+ () => z.union([
11
+ JsonPrimitiveSchema,
12
+ z.array(JsonValueSchema),
13
+ z.record(z.string(), JsonValueSchema)
14
+ ])
15
+ );
16
+ var JsonObjectSchema = z.record(z.string(), JsonValueSchema);
17
+
18
+ // src/harness/index.ts
19
+ import { z as z3 } from "zod";
20
+
21
+ // src/schema-utils.ts
22
+ import { z as z2 } from "zod";
23
+ var FiniteNumberSchema = z2.number().finite();
24
+ var OptionalFiniteNumberSchema = z2.preprocess(
25
+ (value) => value === null || typeof value === "number" && !Number.isFinite(value) ? void 0 : value,
26
+ FiniteNumberSchema.optional()
27
+ );
28
+ var NullableFiniteNumberSchema = z2.preprocess(
29
+ (value) => typeof value === "number" && !Number.isFinite(value) ? null : value,
30
+ FiniteNumberSchema.nullable().optional()
31
+ );
32
+ function parseWithSchema(schema, input, label) {
33
+ const parsed = schema.safeParse(input);
34
+ if (parsed.success) {
35
+ return parsed.data;
36
+ }
37
+ const reason = parsed.error.issues.slice(0, 3).map((issue) => {
38
+ const path = issue.path.length > 0 ? issue.path.join(".") : "<root>";
39
+ return `${path}: ${issue.message}`;
40
+ }).join("; ");
41
+ throw new Error(`Invalid ${label}: ${reason}`);
42
+ }
43
+ function isJsonObject(value) {
44
+ return isRecord(value);
45
+ }
46
+ function isRecord(value) {
47
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
48
+ }
49
+
50
+ // src/harness/index.ts
51
+ var UsageSummarySchema = z3.object({
52
+ provider: z3.string().optional(),
53
+ model: z3.string().optional(),
54
+ inputTokens: FiniteNumberSchema.optional(),
55
+ outputTokens: FiniteNumberSchema.optional(),
56
+ reasoningTokens: FiniteNumberSchema.optional(),
57
+ totalTokens: FiniteNumberSchema.optional(),
58
+ toolCalls: FiniteNumberSchema.optional(),
59
+ retries: FiniteNumberSchema.optional(),
60
+ metadata: JsonObjectSchema.optional()
61
+ }).strict();
62
+ var TimingSummarySchema = z3.object({
63
+ totalMs: FiniteNumberSchema.optional(),
64
+ metadata: JsonObjectSchema.optional()
65
+ }).strict();
66
+ var NormalizedErrorSchema = z3.object({
67
+ message: z3.string(),
68
+ type: z3.string().optional()
69
+ }).catchall(JsonValueSchema);
70
+ var ToolCallRecordSchema = z3.object({
71
+ id: z3.string().optional(),
72
+ name: z3.string(),
73
+ arguments: JsonObjectSchema.optional(),
74
+ result: JsonValueSchema.optional(),
75
+ error: NormalizedErrorSchema.optional(),
76
+ startedAt: z3.string().optional(),
77
+ finishedAt: z3.string().optional(),
78
+ durationMs: FiniteNumberSchema.optional(),
79
+ metadata: JsonObjectSchema.optional()
80
+ }).strict();
81
+ var NormalizedMessageSchema = z3.object({
82
+ role: z3.enum(["system", "user", "assistant", "tool"]),
83
+ content: JsonValueSchema.optional(),
84
+ toolCalls: z3.array(ToolCallRecordSchema).optional(),
85
+ metadata: JsonObjectSchema.optional()
86
+ }).strict();
87
+ var NormalizedSessionSchema = z3.object({
88
+ messages: z3.array(NormalizedMessageSchema).default([]),
89
+ provider: z3.string().optional(),
90
+ model: z3.string().optional(),
91
+ metadata: JsonObjectSchema.optional()
92
+ }).strict();
93
+ var NormalizedSpanAttributesSchema = JsonObjectSchema;
94
+ var NormalizedSpanEventSchema = z3.object({
95
+ name: z3.string(),
96
+ timestamp: z3.string().optional(),
97
+ attributes: NormalizedSpanAttributesSchema.optional()
98
+ }).strict();
99
+ var NormalizedSpanSchema = z3.object({
100
+ id: z3.string().optional(),
101
+ traceId: z3.string().optional(),
102
+ parentId: z3.string().optional(),
103
+ name: z3.string(),
104
+ kind: z3.enum(["run", "agent", "model", "tool", "guardrail", "handoff", "custom"]).optional(),
105
+ startedAt: z3.string().optional(),
106
+ finishedAt: z3.string().optional(),
107
+ durationMs: FiniteNumberSchema.optional(),
108
+ status: z3.enum(["ok", "error"]).optional(),
109
+ error: NormalizedErrorSchema.optional(),
110
+ attributes: NormalizedSpanAttributesSchema.optional(),
111
+ events: z3.array(NormalizedSpanEventSchema).optional()
112
+ }).strict();
113
+ var NormalizedTraceSchema = z3.object({
114
+ id: z3.string().optional(),
115
+ name: z3.string().optional(),
116
+ startedAt: z3.string().optional(),
117
+ finishedAt: z3.string().optional(),
118
+ durationMs: FiniteNumberSchema.optional(),
119
+ metadata: JsonObjectSchema.optional(),
120
+ spans: z3.array(NormalizedSpanSchema).default([])
121
+ }).strict();
122
+ var HarnessRunSchema = z3.object({
123
+ output: JsonValueSchema.optional(),
124
+ session: NormalizedSessionSchema,
125
+ usage: UsageSummarySchema,
126
+ timings: TimingSummarySchema.optional(),
127
+ artifacts: JsonObjectSchema.optional(),
128
+ traces: z3.array(NormalizedTraceSchema).optional(),
129
+ errors: z3.array(JsonObjectSchema).default([])
130
+ }).strict();
131
+
132
+ // src/harness/helpers.ts
133
+ function toolCalls(session) {
134
+ return session.messages.flatMap((message) => message.toolCalls ?? []);
135
+ }
136
+ function spans(run) {
137
+ return (run.traces ?? []).flatMap((trace) => trace.spans);
138
+ }
139
+ function traceSpans(run) {
140
+ return spans(run);
141
+ }
142
+ function spansByKind(run, kind) {
143
+ return spans(run).filter((span) => span.kind === kind);
144
+ }
145
+ function failedSpans(run) {
146
+ return spans(run).filter(
147
+ (span) => span.status === "error" || span.error !== void 0
148
+ );
149
+ }
150
+ function messagesByRole(session, role) {
151
+ return session.messages.filter((message) => message.role === role);
152
+ }
153
+ function systemMessages(session) {
154
+ return messagesByRole(session, "system");
155
+ }
156
+ function userMessages(session) {
157
+ return messagesByRole(session, "user");
158
+ }
159
+ function assistantMessages(session) {
160
+ return messagesByRole(session, "assistant");
161
+ }
162
+ function latestAssistantMessageContent(session) {
163
+ return [...assistantMessages(session)].reverse().find(hasNonEmptyMessageContent)?.content;
164
+ }
165
+ function toolMessages(session) {
166
+ return messagesByRole(session, "tool");
167
+ }
168
+ function hasNonEmptyMessageContent(message) {
169
+ return message.content !== void 0 && (typeof message.content !== "string" || message.content.trim().length > 0);
170
+ }
171
+
172
+ // src/report/metadata.ts
173
+ import { z as z4 } from "zod";
174
+ var HarnessMetaSchema = z4.object({
175
+ name: z4.string().optional(),
176
+ run: HarnessRunSchema.optional()
177
+ }).strict();
178
+ var EvalScoreSchema = z4.object({
179
+ name: z4.string().optional(),
180
+ score: NullableFiniteNumberSchema,
181
+ metadata: JsonObjectSchema.optional()
182
+ }).strict();
183
+ var EvalMetaSchema = z4.object({
184
+ scores: z4.array(EvalScoreSchema).optional(),
185
+ avgScore: NullableFiniteNumberSchema,
186
+ output: JsonValueSchema.optional(),
187
+ thresholdFailed: z4.boolean().optional(),
188
+ toolCalls: z4.array(ToolCallRecordSchema).optional()
189
+ }).strict();
190
+ var EvalTaskMetaSchema = z4.object({
191
+ eval: EvalMetaSchema.optional(),
192
+ harness: HarnessMetaSchema.optional()
193
+ }).strict();
194
+ var LenientToolCallRecordSchema = ToolCallRecordSchema.strip();
195
+ var LenientMessageSchema = NormalizedMessageSchema.extend({
196
+ toolCalls: z4.array(LenientToolCallRecordSchema).optional().catch(void 0)
197
+ }).strip();
198
+ var LenientSessionSchema = NormalizedSessionSchema.extend({
199
+ messages: z4.array(LenientMessageSchema).default([]).catch([])
200
+ }).strip();
201
+ var LenientSpanEventSchema = NormalizedSpanEventSchema.strip();
202
+ var LenientSpanSchema = NormalizedSpanSchema.extend({
203
+ events: z4.array(LenientSpanEventSchema).optional().catch(void 0)
204
+ }).strip();
205
+ var LenientTraceSchema = NormalizedTraceSchema.extend({
206
+ spans: z4.array(LenientSpanSchema).default([]).catch([])
207
+ }).strip();
208
+ var LenientHarnessRunSchema = HarnessRunSchema.extend({
209
+ session: LenientSessionSchema,
210
+ usage: UsageSummarySchema.strip().default({}),
211
+ timings: TimingSummarySchema.strip().optional(),
212
+ traces: z4.array(LenientTraceSchema).optional().catch(void 0)
213
+ }).strip();
214
+ var LenientHarnessMetaSchema = HarnessMetaSchema.extend({
215
+ run: LenientHarnessRunSchema.optional().catch(void 0)
216
+ }).strip();
217
+ var LenientEvalScoreSchema = EvalScoreSchema.strip();
218
+ var LenientEvalMetaSchema = EvalMetaSchema.extend({
219
+ scores: z4.array(LenientEvalScoreSchema).optional().catch(void 0),
220
+ toolCalls: z4.array(LenientToolCallRecordSchema).optional().catch(void 0)
221
+ }).strip();
222
+ function readEvalTaskMeta(input) {
223
+ if (!isJsonObject(input)) {
224
+ return void 0;
225
+ }
226
+ const evalResult = LenientEvalMetaSchema.safeParse(input.eval);
227
+ const harnessResult = LenientHarnessMetaSchema.safeParse(input.harness);
228
+ const meta = {
229
+ ...evalResult.success && input.eval !== void 0 ? { eval: evalResult.data } : {},
230
+ ...harnessResult.success && input.harness !== void 0 ? { harness: harnessResult.data } : {}
231
+ };
232
+ return meta.eval || meta.harness ? meta : void 0;
233
+ }
234
+
235
+ // src/report/vitest-json.ts
236
+ import { z as z5 } from "zod";
237
+ var VitestJsonStatusSchema = z5.enum([
238
+ "passed",
239
+ "failed",
240
+ "skipped",
241
+ "pending",
242
+ "todo",
243
+ "disabled"
244
+ ]);
245
+ var VitestJsonLocationSchema = z5.object({
246
+ line: FiniteNumberSchema,
247
+ column: FiniteNumberSchema
248
+ }).passthrough();
249
+ var VitestJsonAssertionSchema = z5.object({
250
+ ancestorTitles: z5.array(z5.string()).default([]),
251
+ fullName: z5.string(),
252
+ status: VitestJsonStatusSchema,
253
+ title: z5.string(),
254
+ meta: z5.unknown().optional(),
255
+ duration: FiniteNumberSchema.nullable().optional(),
256
+ failureMessages: z5.array(z5.string()).nullable().optional(),
257
+ location: VitestJsonLocationSchema.nullable().optional(),
258
+ tags: z5.array(z5.string()).optional()
259
+ }).passthrough();
260
+ var VitestJsonFileSchema = z5.object({
261
+ message: z5.string(),
262
+ name: z5.string(),
263
+ status: z5.enum(["failed", "passed"]),
264
+ startTime: OptionalFiniteNumberSchema,
265
+ endTime: OptionalFiniteNumberSchema,
266
+ assertionResults: z5.array(VitestJsonAssertionSchema).default([])
267
+ }).passthrough();
268
+ var VitestJsonReportSchema = z5.object({
269
+ numFailedTests: FiniteNumberSchema,
270
+ numPassedTests: FiniteNumberSchema,
271
+ numPendingTests: FiniteNumberSchema,
272
+ numTodoTests: FiniteNumberSchema,
273
+ numTotalTests: FiniteNumberSchema,
274
+ startTime: FiniteNumberSchema,
275
+ success: z5.boolean(),
276
+ testResults: z5.array(VitestJsonFileSchema).default([])
277
+ }).passthrough();
278
+ function parseVitestJsonReport(input) {
279
+ return parseWithSchema(VitestJsonReportSchema, input, "Vitest JSON report");
280
+ }
281
+
282
+ // src/report/workspace.ts
283
+ import { z as z6 } from "zod";
284
+ var REPORT_WORKSPACE_SCHEMA_VERSION = 1;
285
+ var ReportRunSchema = z6.object({
286
+ id: z6.string(),
287
+ source: z6.string().optional(),
288
+ status: z6.enum(["passed", "failed"]),
289
+ startedAt: FiniteNumberSchema.optional(),
290
+ durationMs: FiniteNumberSchema.optional(),
291
+ totals: z6.object({
292
+ total: FiniteNumberSchema,
293
+ passed: FiniteNumberSchema,
294
+ failed: FiniteNumberSchema,
295
+ skipped: FiniteNumberSchema,
296
+ evalTotal: FiniteNumberSchema,
297
+ evalPassed: FiniteNumberSchema,
298
+ evalFailed: FiniteNumberSchema
299
+ })
300
+ }).strict();
301
+ var ReportCaseSchema = z6.object({
302
+ id: z6.string(),
303
+ runId: z6.string(),
304
+ source: z6.string().optional(),
305
+ file: z6.string(),
306
+ displayFile: z6.string(),
307
+ title: z6.string(),
308
+ fullName: z6.string(),
309
+ ancestorTitles: z6.array(z6.string()),
310
+ tags: z6.array(z6.string()).optional(),
311
+ displayName: z6.string(),
312
+ status: VitestJsonStatusSchema,
313
+ durationMs: FiniteNumberSchema.optional(),
314
+ location: VitestJsonLocationSchema.optional(),
315
+ failureMessages: z6.array(z6.string()).default([]),
316
+ eval: EvalMetaSchema.optional(),
317
+ harness: HarnessMetaSchema.optional()
318
+ }).strict();
319
+ var ReportWorkspaceSchema = z6.object({
320
+ schemaVersion: z6.literal(REPORT_WORKSPACE_SCHEMA_VERSION),
321
+ runs: z6.array(ReportRunSchema),
322
+ cases: z6.array(ReportCaseSchema)
323
+ }).strict();
324
+ function parseReportWorkspace(input) {
325
+ return parseWithSchema(ReportWorkspaceSchema, input, "report workspace");
326
+ }
327
+ function collectReportWorkspace(input, options = {}) {
328
+ const entries = Array.isArray(input) ? input : [input];
329
+ const runs = [];
330
+ const cases = [];
331
+ entries.forEach((entry, index) => {
332
+ const { report, source } = normalizeWorkspaceInput(entry);
333
+ const runId = source ?? `run-${index + 1}`;
334
+ const runCases = [];
335
+ for (const file of report.testResults) {
336
+ for (const assertion of file.assertionResults) {
337
+ const meta = readEvalTaskMeta(assertion.meta);
338
+ if (!meta) {
339
+ continue;
340
+ }
341
+ runCases.push({
342
+ id: createCaseId(runId, file.name, assertion),
343
+ runId,
344
+ ...source ? { source } : {},
345
+ file: file.name,
346
+ displayFile: normalizeReportPath(file.name, options.workspace),
347
+ title: assertion.title,
348
+ fullName: assertion.fullName,
349
+ ancestorTitles: assertion.ancestorTitles,
350
+ ...assertion.tags ? { tags: assertion.tags } : {},
351
+ displayName: formatDisplayName(assertion),
352
+ status: assertion.status,
353
+ ...typeof assertion.duration === "number" ? { durationMs: assertion.duration } : {},
354
+ ...assertion.location ? { location: assertion.location } : {},
355
+ failureMessages: assertion.failureMessages ?? [],
356
+ ...meta.eval ? { eval: meta.eval } : {},
357
+ ...meta.harness ? { harness: meta.harness } : {}
358
+ });
359
+ }
360
+ }
361
+ runs.push({
362
+ id: runId,
363
+ ...source ? { source } : {},
364
+ status: report.success && runCases.every((testCase) => testCase.status !== "failed") ? "passed" : "failed",
365
+ startedAt: report.startTime,
366
+ durationMs: resolveRunDuration(report),
367
+ totals: {
368
+ total: report.numTotalTests,
369
+ passed: report.numPassedTests,
370
+ failed: report.numFailedTests,
371
+ skipped: report.numPendingTests + report.numTodoTests,
372
+ evalTotal: runCases.length,
373
+ evalPassed: runCases.filter((testCase) => testCase.status === "passed").length,
374
+ evalFailed: runCases.filter((testCase) => testCase.status === "failed").length
375
+ }
376
+ });
377
+ cases.push(...runCases);
378
+ });
379
+ return {
380
+ schemaVersion: REPORT_WORKSPACE_SCHEMA_VERSION,
381
+ runs,
382
+ cases
383
+ };
384
+ }
385
+ function normalizeWorkspaceInput(input) {
386
+ if (isVitestJsonReportLike(input)) {
387
+ return {
388
+ report: parseVitestJsonReport(input)
389
+ };
390
+ }
391
+ if (isRecord(input) && "report" in input) {
392
+ return {
393
+ report: parseVitestJsonReport(input.report),
394
+ source: typeof input.source === "string" ? input.source : void 0
395
+ };
396
+ }
397
+ return {
398
+ report: parseVitestJsonReport(input)
399
+ };
400
+ }
401
+ function isVitestJsonReportLike(input) {
402
+ return isRecord(input) && Array.isArray(input.testResults);
403
+ }
404
+ function createCaseId(runId, file, assertion) {
405
+ return [runId, file, assertion.location?.line ?? 0, assertion.fullName].join(
406
+ ":"
407
+ );
408
+ }
409
+ function formatDisplayName(assertion) {
410
+ return [...assertion.ancestorTitles, assertion.title].filter((part) => part.length > 0).join(" > ");
411
+ }
412
+ function resolveRunDuration(report) {
413
+ const intervals = report.testResults.map((file) => {
414
+ const start = file.startTime;
415
+ const end = file.endTime;
416
+ if (!isFiniteNumber(start) || !isFiniteNumber(end) || end < start) {
417
+ return void 0;
418
+ }
419
+ return {
420
+ start,
421
+ end
422
+ };
423
+ }).filter(
424
+ (interval) => Boolean(interval)
425
+ );
426
+ if (intervals.length === 0) {
427
+ return void 0;
428
+ }
429
+ return Math.max(...intervals.map((interval) => interval.end)) - Math.min(...intervals.map((interval) => interval.start));
430
+ }
431
+ function isFiniteNumber(value) {
432
+ return typeof value === "number" && Number.isFinite(value);
433
+ }
434
+ function normalizeReportPath(path, workspace) {
435
+ const normalized = path.replace(/\\/g, "/");
436
+ if (!workspace) {
437
+ return normalized;
438
+ }
439
+ const workspacePath = workspace.replace(/\\/g, "/").replace(/\/+$/, "");
440
+ if (normalized !== workspacePath && !normalized.startsWith(`${workspacePath}/`)) {
441
+ return normalized;
442
+ }
443
+ return normalized.slice(workspacePath.length).replace(/^\/+/, "");
444
+ }
445
+ export {
446
+ EvalMetaSchema,
447
+ EvalScoreSchema,
448
+ EvalTaskMetaSchema,
449
+ HarnessMetaSchema,
450
+ HarnessRunSchema,
451
+ JsonObjectSchema,
452
+ JsonPrimitiveSchema,
453
+ JsonValueSchema,
454
+ NormalizedErrorSchema,
455
+ NormalizedMessageSchema,
456
+ NormalizedSessionSchema,
457
+ NormalizedSpanAttributesSchema,
458
+ NormalizedSpanEventSchema,
459
+ NormalizedSpanSchema,
460
+ NormalizedTraceSchema,
461
+ REPORT_WORKSPACE_SCHEMA_VERSION,
462
+ ReportCaseSchema,
463
+ ReportRunSchema,
464
+ ReportWorkspaceSchema,
465
+ TimingSummarySchema,
466
+ ToolCallRecordSchema,
467
+ UsageSummarySchema,
468
+ VitestJsonAssertionSchema,
469
+ VitestJsonFileSchema,
470
+ VitestJsonLocationSchema,
471
+ VitestJsonReportSchema,
472
+ VitestJsonStatusSchema,
473
+ assistantMessages,
474
+ collectReportWorkspace,
475
+ failedSpans,
476
+ latestAssistantMessageContent,
477
+ messagesByRole,
478
+ parseReportWorkspace,
479
+ parseVitestJsonReport,
480
+ readEvalTaskMeta,
481
+ spans,
482
+ spansByKind,
483
+ systemMessages,
484
+ toolCalls,
485
+ toolMessages,
486
+ traceSpans,
487
+ userMessages
488
+ };
489
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/json.ts","../src/harness/index.ts","../src/schema-utils.ts","../src/harness/helpers.ts","../src/report/metadata.ts","../src/report/vitest-json.ts","../src/report/workspace.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/** Primitive scalar values allowed in persisted vitest-evals JSON artifacts. */\nexport type JsonPrimitive = string | number | boolean | null;\n\n/** JSON-safe value shape used by reports, normalized sessions, and traces. */\nexport type JsonValue =\n | JsonPrimitive\n | JsonValue[]\n | { [key: string]: JsonValue };\n\n/** Schema for primitive scalar values in persisted report artifacts. */\nexport const JsonPrimitiveSchema = z.union([\n z.string(),\n z.number().finite(),\n z.boolean(),\n z.null(),\n]);\n\n/** Schema for any JSON-safe value in persisted report artifacts. */\nexport const JsonValueSchema: z.ZodType<JsonValue> = z.lazy(() =>\n z.union([\n JsonPrimitiveSchema,\n z.array(JsonValueSchema),\n z.record(z.string(), JsonValueSchema),\n ]),\n);\n\n/** Schema for JSON-safe object records in persisted report artifacts. */\nexport const JsonObjectSchema = z.record(z.string(), JsonValueSchema);\n","import { z } from \"zod\";\nimport type { NormalizedSpanAttributes } from \"../genai\";\nimport { JsonObjectSchema, JsonValueSchema, type JsonValue } from \"../json\";\nimport { FiniteNumberSchema } from \"../schema-utils\";\n\n/** Normalized error attached to tool calls and spans. */\nexport type NormalizedError = {\n /** Human-readable failure message. */\n message: string;\n /** Optional provider or runtime error type. */\n type?: string;\n /** Extra JSON-safe error metadata. */\n [key: string]: JsonValue | undefined;\n};\n\n/** Usage values normalized by vitest-evals harnesses. */\nexport const UsageSummarySchema = z\n .object({\n provider: z.string().optional(),\n model: z.string().optional(),\n inputTokens: FiniteNumberSchema.optional(),\n outputTokens: FiniteNumberSchema.optional(),\n reasoningTokens: FiniteNumberSchema.optional(),\n totalTokens: FiniteNumberSchema.optional(),\n toolCalls: FiniteNumberSchema.optional(),\n retries: FiniteNumberSchema.optional(),\n metadata: JsonObjectSchema.optional(),\n })\n .strict();\n\n/** Usage values normalized by vitest-evals harnesses. */\nexport type UsageSummary = {\n /** Provider that served the application run. */\n provider?: string;\n /** Model used for the application run. */\n model?: string;\n /** Input, prompt, or request tokens consumed by the run. */\n inputTokens?: number;\n /** Output or completion tokens produced by the run. */\n outputTokens?: number;\n /** Reasoning tokens reported by providers that expose them. */\n reasoningTokens?: number;\n /** Total token count reported by the provider or adapter. */\n totalTokens?: number;\n /** Count of tool calls observed during the run. */\n toolCalls?: number;\n /** Retry count observed during the run. */\n retries?: number;\n /** Provider-specific JSON-safe usage details. Cost estimates belong here. */\n metadata?: Record<string, JsonValue>;\n};\n\n/** Timing values normalized by vitest-evals harnesses. */\nexport const TimingSummarySchema = z\n .object({\n totalMs: FiniteNumberSchema.optional(),\n metadata: JsonObjectSchema.optional(),\n })\n .strict();\n\n/** Timing values normalized by vitest-evals harnesses. */\nexport type TimingSummary = {\n /** End-to-end run duration in milliseconds. */\n totalMs?: number;\n /** Extra JSON-safe timing metadata. */\n metadata?: Record<string, JsonValue>;\n};\n\n/** Normalized error object captured in a tool call or trace span. */\nexport const NormalizedErrorSchema = z\n .object({\n message: z.string(),\n type: z.string().optional(),\n })\n .catchall(JsonValueSchema);\n\n/** Normalized tool call captured in a harness session. */\nexport const ToolCallRecordSchema = z\n .object({\n id: z.string().optional(),\n name: z.string(),\n arguments: JsonObjectSchema.optional(),\n result: JsonValueSchema.optional(),\n error: NormalizedErrorSchema.optional(),\n startedAt: z.string().optional(),\n finishedAt: z.string().optional(),\n durationMs: FiniteNumberSchema.optional(),\n metadata: JsonObjectSchema.optional(),\n })\n .strict();\n\n/** Normalized tool call captured in a harness session. */\nexport type ToolCallRecord = {\n /** Provider or runtime tool-call id when one is available. */\n id?: string;\n /** Tool name as exposed to the agent or application runtime. */\n name: string;\n /** JSON-safe tool arguments after provider/runtime normalization. */\n arguments?: Record<string, JsonValue>;\n /** JSON-safe tool result returned by the application tool. */\n result?: JsonValue;\n /** Normalized tool error when execution failed. */\n error?: NormalizedError;\n /** ISO timestamp for the start of tool execution. */\n startedAt?: string;\n /** ISO timestamp for the end of tool execution. */\n finishedAt?: string;\n /** Tool execution duration in milliseconds. */\n durationMs?: number;\n /** Extra JSON-safe tool metadata for reporters and custom judges. */\n metadata?: Record<string, JsonValue>;\n};\n\n/** Normalized transcript message captured in a harness session. */\nexport const NormalizedMessageSchema = z\n .object({\n role: z.enum([\"system\", \"user\", \"assistant\", \"tool\"]),\n content: JsonValueSchema.optional(),\n toolCalls: z.array(ToolCallRecordSchema).optional(),\n metadata: JsonObjectSchema.optional(),\n })\n .strict();\n\n/** Normalized transcript message captured in a harness session. */\nexport type NormalizedMessage = {\n /** Transcript role for the normalized message. */\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n /** JSON-safe message content. */\n content?: JsonValue;\n /** Tool calls associated with this message. */\n toolCalls?: ToolCallRecord[];\n /** Extra JSON-safe message metadata. */\n metadata?: Record<string, JsonValue>;\n};\n\n/** Normalized transcript produced by an application harness. */\nexport const NormalizedSessionSchema = z\n .object({\n messages: z.array(NormalizedMessageSchema).default([]),\n provider: z.string().optional(),\n model: z.string().optional(),\n metadata: JsonObjectSchema.optional(),\n })\n .strict();\n\n/** Normalized transcript produced by an application harness. */\nexport type NormalizedSession = {\n /** Ordered normalized transcript messages. */\n messages: NormalizedMessage[];\n /** Provider that produced the session when known. */\n provider?: string;\n /** Model that produced the session when known. */\n model?: string;\n /** Extra JSON-safe session metadata. */\n metadata?: Record<string, JsonValue>;\n};\n\n/** Attribute schema attached to normalized traces, spans, and events. */\nexport const NormalizedSpanAttributesSchema = JsonObjectSchema;\n\n/** Event attached to a normalized span. */\nexport const NormalizedSpanEventSchema = z\n .object({\n name: z.string(),\n timestamp: z.string().optional(),\n attributes: NormalizedSpanAttributesSchema.optional(),\n })\n .strict();\n\n/** Event attached to a normalized span. */\nexport type NormalizedSpanEvent = {\n /** Event name emitted by the runtime or harness. */\n name: string;\n /** ISO timestamp for the event when available. */\n timestamp?: string;\n /** JSON-safe event attributes. */\n attributes?: NormalizedSpanAttributes;\n};\n\n/** Normalized operation span captured during a harness run. */\nexport const NormalizedSpanSchema = z\n .object({\n id: z.string().optional(),\n traceId: z.string().optional(),\n parentId: z.string().optional(),\n name: z.string(),\n kind: z\n .enum([\"run\", \"agent\", \"model\", \"tool\", \"guardrail\", \"handoff\", \"custom\"])\n .optional(),\n startedAt: z.string().optional(),\n finishedAt: z.string().optional(),\n durationMs: FiniteNumberSchema.optional(),\n status: z.enum([\"ok\", \"error\"]).optional(),\n error: NormalizedErrorSchema.optional(),\n attributes: NormalizedSpanAttributesSchema.optional(),\n events: z.array(NormalizedSpanEventSchema).optional(),\n })\n .strict();\n\n/** Normalized operation span captured during a harness run. */\nexport type NormalizedSpan = {\n /** Runtime or provider span id when one is available. */\n id?: string;\n /** Trace id this span belongs to. */\n traceId?: string;\n /** Parent span id when the runtime exposes hierarchy. */\n parentId?: string;\n /** Human-readable operation name. */\n name: string;\n /** Coarse operation kind used by reporters and judges. */\n kind?:\n | \"run\"\n | \"agent\"\n | \"model\"\n | \"tool\"\n | \"guardrail\"\n | \"handoff\"\n | \"custom\";\n /** ISO timestamp for the start of the span. */\n startedAt?: string;\n /** ISO timestamp for the end of the span. */\n finishedAt?: string;\n /** Span duration in milliseconds. */\n durationMs?: number;\n /** Success or failure status for the span. */\n status?: \"ok\" | \"error\";\n /** Normalized error when the span failed. */\n error?: NormalizedError;\n /** JSON-safe operation attributes. */\n attributes?: NormalizedSpanAttributes;\n /** Events observed inside this span. */\n events?: NormalizedSpanEvent[];\n};\n\n/** Normalized trace captured during a harness run. */\nexport const NormalizedTraceSchema = z\n .object({\n id: z.string().optional(),\n name: z.string().optional(),\n startedAt: z.string().optional(),\n finishedAt: z.string().optional(),\n durationMs: FiniteNumberSchema.optional(),\n metadata: JsonObjectSchema.optional(),\n spans: z.array(NormalizedSpanSchema).default([]),\n })\n .strict();\n\n/** Normalized trace captured during a harness run. */\nexport type NormalizedTrace = {\n /** Runtime or provider trace id when one is available. */\n id?: string;\n /** Human-readable trace or workflow name. */\n name?: string;\n /** ISO timestamp for the start of the trace. */\n startedAt?: string;\n /** ISO timestamp for the end of the trace. */\n finishedAt?: string;\n /** Trace duration in milliseconds. */\n durationMs?: number;\n /** Extra JSON-safe trace metadata. */\n metadata?: Record<string, JsonValue>;\n /** Spans that make up this trace. */\n spans: NormalizedSpan[];\n};\n\n/** Full normalized harness run as stored in Vitest assertion metadata. */\nexport const HarnessRunSchema = z\n .object({\n output: JsonValueSchema.optional(),\n session: NormalizedSessionSchema,\n usage: UsageSummarySchema,\n timings: TimingSummarySchema.optional(),\n artifacts: JsonObjectSchema.optional(),\n traces: z.array(NormalizedTraceSchema).optional(),\n errors: z.array(JsonObjectSchema).default([]),\n })\n .strict();\n\ntype OutputField<TOutput extends JsonValue | undefined> =\n undefined extends TOutput ? { output?: TOutput } : { output: TOutput };\n\n/**\n * Normalized result returned by every harness execution.\n *\n * @example\n * ```ts\n * const run: HarnessRun<{ status: \"approved\" }> = {\n * output: { status: \"approved\" },\n * session: {\n * messages: [\n * { role: \"user\", content: \"Refund invoice inv_123\" },\n * { role: \"assistant\", content: { status: \"approved\" } },\n * ],\n * },\n * usage: { totalTokens: 260 },\n * errors: [],\n * };\n * ```\n */\nexport type HarnessRun<\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = OutputField<TOutput> & {\n /** Normalized transcript and provider/session metadata. */\n session: NormalizedSession;\n /** Stable provider usage units such as tokens, tools, and retries. */\n usage: UsageSummary;\n /** Optional timing summary for the run. */\n timings?: TimingSummary;\n /** JSON-safe run artifacts captured by the harness or test context. */\n artifacts?: Record<string, JsonValue>;\n /** Normalized traces and spans captured during execution. */\n traces?: NormalizedTrace[];\n /** Normalized errors captured during execution. */\n errors: Array<Record<string, JsonValue>>;\n};\n\n/** Error value with an attached partial or complete normalized harness run. */\nexport type HarnessRunError = Error & {\n /** Attached normalized harness run recovered from a thrown error. */\n vitestEvalsRun: HarnessRun;\n};\n","import { z } from \"zod\";\nimport type { JsonValue } from \"./json\";\n\nexport const FiniteNumberSchema = z.number().finite();\n\nexport const OptionalFiniteNumberSchema = z.preprocess(\n (value) =>\n value === null || (typeof value === \"number\" && !Number.isFinite(value))\n ? undefined\n : value,\n FiniteNumberSchema.optional(),\n);\n\nexport const NullableFiniteNumberSchema = z.preprocess(\n (value) =>\n typeof value === \"number\" && !Number.isFinite(value) ? null : value,\n FiniteNumberSchema.nullable().optional(),\n);\n\nexport function parseWithSchema<T>(\n schema: z.ZodType<T>,\n input: unknown,\n label: string,\n) {\n const parsed = schema.safeParse(input);\n if (parsed.success) {\n return parsed.data;\n }\n\n const reason = parsed.error.issues\n .slice(0, 3)\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join(\".\") : \"<root>\";\n return `${path}: ${issue.message}`;\n })\n .join(\"; \");\n throw new Error(`Invalid ${label}: ${reason}`);\n}\n\nexport function isJsonObject(\n value: unknown,\n): value is Record<string, JsonValue> {\n return isRecord(value);\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n","import type {\n HarnessRun,\n NormalizedMessage,\n NormalizedSession,\n NormalizedSpan,\n ToolCallRecord,\n} from \"./index\";\n\n/**\n * Flattens every recorded tool call from a normalized session.\n *\n * @param session - Normalized session produced by a harness run.\n *\n * @example\n * ```ts\n * const names = toolCalls(result.session).map((call) => call.name);\n *\n * expect(names).toEqual([\"lookupInvoice\", \"createRefund\"]);\n * ```\n */\nexport function toolCalls(session: NormalizedSession): ToolCallRecord[] {\n return session.messages.flatMap((message) => message.toolCalls ?? []);\n}\n\n/**\n * Flattens every recorded span from a normalized harness run.\n *\n * @param run - Normalized harness run produced by a harness.\n *\n * @example\n * ```ts\n * const modelSpans = spans(result).filter((span) => span.kind === \"model\");\n * ```\n */\nexport function spans(run: HarnessRun): NormalizedSpan[] {\n return (run.traces ?? []).flatMap((trace) => trace.spans);\n}\n\n/**\n * Alias for `spans(...)` for consumers that prefer trace-oriented naming.\n *\n * @param run - Normalized harness run produced by a harness.\n */\nexport function traceSpans(run: HarnessRun): NormalizedSpan[] {\n return spans(run);\n}\n\n/**\n * Returns spans of one coarse operation kind from a normalized run.\n *\n * @param run - Normalized harness run produced by a harness.\n * @param kind - Span kind to keep.\n */\nexport function spansByKind(\n run: HarnessRun,\n kind: NonNullable<NormalizedSpan[\"kind\"]>,\n): NormalizedSpan[] {\n return spans(run).filter((span) => span.kind === kind);\n}\n\n/**\n * Returns every span that explicitly failed or carries a normalized error.\n *\n * @param run - Normalized harness run produced by a harness.\n */\nexport function failedSpans(run: HarnessRun): NormalizedSpan[] {\n return spans(run).filter(\n (span) => span.status === \"error\" || span.error !== undefined,\n );\n}\n\n/**\n * Filters normalized session messages by role.\n *\n * @param session - Normalized session produced by a harness run.\n * @param role - Message role to keep.\n *\n * @example\n * ```ts\n * const assistantText = messagesByRole(result.session, \"assistant\")\n * .map((message) => message.content)\n * .join(\"\\n\");\n * ```\n */\nexport function messagesByRole(\n session: NormalizedSession,\n role: NormalizedMessage[\"role\"],\n): NormalizedMessage[] {\n return session.messages.filter((message) => message.role === role);\n}\n\n/**\n * Returns every normalized system message from a session.\n *\n * @param session - Normalized session produced by a harness run.\n *\n * @example\n * ```ts\n * const systemPrompts = systemMessages(result.session);\n * ```\n */\nexport function systemMessages(session: NormalizedSession) {\n return messagesByRole(session, \"system\");\n}\n\n/**\n * Returns every normalized user message from a session.\n *\n * @param session - Normalized session produced by a harness run.\n *\n * @example\n * ```ts\n * const firstPrompt = userMessages(result.session)[0]?.content;\n * ```\n */\nexport function userMessages(session: NormalizedSession) {\n return messagesByRole(session, \"user\");\n}\n\n/**\n * Returns every normalized assistant message from a session.\n *\n * @param session - Normalized session produced by a harness run.\n *\n * @example\n * ```ts\n * const finalAnswer = assistantMessages(session).at(-1)?.content;\n * ```\n */\nexport function assistantMessages(\n session: NormalizedSession,\n): NormalizedMessage[] {\n return messagesByRole(session, \"assistant\");\n}\n\n/**\n * Returns the latest assistant message content, ignoring empty text messages.\n *\n * @param session - Normalized session produced by a harness run.\n *\n * @example\n * ```ts\n * const finalAnswer = latestAssistantMessageContent(result.session);\n * ```\n */\nexport function latestAssistantMessageContent(session: NormalizedSession) {\n return [...assistantMessages(session)]\n .reverse()\n .find(hasNonEmptyMessageContent)?.content;\n}\n\n/**\n * Returns every normalized tool message from a session.\n *\n * @param session - Normalized session produced by a harness run.\n *\n * @example\n * ```ts\n * const toolOutputs = toolMessages(session).map((message) => message.content);\n * ```\n */\nexport function toolMessages(session: NormalizedSession) {\n return messagesByRole(session, \"tool\");\n}\n\nfunction hasNonEmptyMessageContent(message: NormalizedMessage) {\n return (\n message.content !== undefined &&\n (typeof message.content !== \"string\" || message.content.trim().length > 0)\n );\n}\n","import { z } from \"zod\";\nimport {\n HarnessRunSchema,\n NormalizedMessageSchema,\n NormalizedSessionSchema,\n NormalizedSpanEventSchema,\n NormalizedSpanSchema,\n NormalizedTraceSchema,\n TimingSummarySchema,\n ToolCallRecordSchema,\n UsageSummarySchema,\n} from \"../harness\";\nimport { JsonObjectSchema, JsonValueSchema } from \"../json\";\nimport { isJsonObject, NullableFiniteNumberSchema } from \"../schema-utils\";\n\n/** Harness metadata stored by vitest-evals on Vitest task metadata. */\nexport const HarnessMetaSchema = z\n .object({\n name: z.string().optional(),\n run: HarnessRunSchema.optional(),\n })\n .strict();\n\n/** Harness metadata stored by vitest-evals on Vitest task metadata. */\nexport type HarnessMeta = z.infer<typeof HarnessMetaSchema>;\n\n/** Score record stored by vitest-evals on Vitest task metadata. */\nexport const EvalScoreSchema = z\n .object({\n name: z.string().optional(),\n score: NullableFiniteNumberSchema,\n metadata: JsonObjectSchema.optional(),\n })\n .strict();\n\n/** Score record stored by vitest-evals on Vitest task metadata. */\nexport type EvalScore = z.infer<typeof EvalScoreSchema>;\n\n/** Eval metadata stored by vitest-evals on Vitest task metadata. */\nexport const EvalMetaSchema = z\n .object({\n scores: z.array(EvalScoreSchema).optional(),\n avgScore: NullableFiniteNumberSchema,\n output: JsonValueSchema.optional(),\n thresholdFailed: z.boolean().optional(),\n toolCalls: z.array(ToolCallRecordSchema).optional(),\n })\n .strict();\n\n/** Eval metadata stored by vitest-evals on Vitest task metadata. */\nexport type EvalMeta = z.infer<typeof EvalMetaSchema>;\n\n/** Combined eval and harness metadata stored on a Vitest assertion. */\nexport const EvalTaskMetaSchema = z\n .object({\n eval: EvalMetaSchema.optional(),\n harness: HarnessMetaSchema.optional(),\n })\n .strict();\n\n/** Combined eval and harness metadata stored on a Vitest assertion. */\nexport type EvalTaskMeta = z.infer<typeof EvalTaskMetaSchema>;\n\nconst LenientToolCallRecordSchema = ToolCallRecordSchema.strip();\nconst LenientMessageSchema = NormalizedMessageSchema.extend({\n toolCalls: z.array(LenientToolCallRecordSchema).optional().catch(undefined),\n}).strip();\nconst LenientSessionSchema = NormalizedSessionSchema.extend({\n messages: z.array(LenientMessageSchema).default([]).catch([]),\n}).strip();\nconst LenientSpanEventSchema = NormalizedSpanEventSchema.strip();\nconst LenientSpanSchema = NormalizedSpanSchema.extend({\n events: z.array(LenientSpanEventSchema).optional().catch(undefined),\n}).strip();\nconst LenientTraceSchema = NormalizedTraceSchema.extend({\n spans: z.array(LenientSpanSchema).default([]).catch([]),\n}).strip();\nconst LenientHarnessRunSchema = HarnessRunSchema.extend({\n session: LenientSessionSchema,\n usage: UsageSummarySchema.strip().default({}),\n timings: TimingSummarySchema.strip().optional(),\n traces: z.array(LenientTraceSchema).optional().catch(undefined),\n}).strip();\nconst LenientHarnessMetaSchema = HarnessMetaSchema.extend({\n run: LenientHarnessRunSchema.optional().catch(undefined),\n}).strip();\nconst LenientEvalScoreSchema = EvalScoreSchema.strip();\nconst LenientEvalMetaSchema = EvalMetaSchema.extend({\n scores: z.array(LenientEvalScoreSchema).optional().catch(undefined),\n toolCalls: z.array(LenientToolCallRecordSchema).optional().catch(undefined),\n}).strip();\n\n/** Reads eval metadata from an arbitrary Vitest assertion meta value. */\nexport function readEvalTaskMeta(input: unknown): EvalTaskMeta | undefined {\n if (!isJsonObject(input)) {\n return undefined;\n }\n\n const evalResult = LenientEvalMetaSchema.safeParse(input.eval);\n const harnessResult = LenientHarnessMetaSchema.safeParse(input.harness);\n const meta: EvalTaskMeta = {\n ...(evalResult.success && input.eval !== undefined\n ? { eval: evalResult.data }\n : {}),\n ...(harnessResult.success && input.harness !== undefined\n ? { harness: harnessResult.data }\n : {}),\n };\n\n return meta.eval || meta.harness ? meta : undefined;\n}\n","import { z } from \"zod\";\nimport {\n FiniteNumberSchema,\n OptionalFiniteNumberSchema,\n parseWithSchema,\n} from \"../schema-utils\";\n\n/** Status values emitted by Vitest JSON reports. */\nexport const VitestJsonStatusSchema = z.enum([\n \"passed\",\n \"failed\",\n \"skipped\",\n \"pending\",\n \"todo\",\n \"disabled\",\n]);\n\n/** Status values emitted by Vitest JSON reports. */\nexport type VitestJsonStatus = z.infer<typeof VitestJsonStatusSchema>;\n\n/** Source location attached to one Vitest assertion. */\nexport const VitestJsonLocationSchema = z\n .object({\n line: FiniteNumberSchema,\n column: FiniteNumberSchema,\n })\n .passthrough();\n\n/** Source location attached to one Vitest assertion. */\nexport type VitestJsonLocation = z.infer<typeof VitestJsonLocationSchema>;\n\n/** Assertion record read from Vitest's JSON reporter output. */\nexport const VitestJsonAssertionSchema = z\n .object({\n ancestorTitles: z.array(z.string()).default([]),\n fullName: z.string(),\n status: VitestJsonStatusSchema,\n title: z.string(),\n meta: z.unknown().optional(),\n duration: FiniteNumberSchema.nullable().optional(),\n failureMessages: z.array(z.string()).nullable().optional(),\n location: VitestJsonLocationSchema.nullable().optional(),\n tags: z.array(z.string()).optional(),\n })\n .passthrough();\n\n/** Assertion record read from Vitest's JSON reporter output. */\nexport type VitestJsonAssertion = z.infer<typeof VitestJsonAssertionSchema>;\n\n/** Test-file record read from Vitest's JSON reporter output. */\nexport const VitestJsonFileSchema = z\n .object({\n message: z.string(),\n name: z.string(),\n status: z.enum([\"failed\", \"passed\"]),\n startTime: OptionalFiniteNumberSchema,\n endTime: OptionalFiniteNumberSchema,\n assertionResults: z.array(VitestJsonAssertionSchema).default([]),\n })\n .passthrough();\n\n/** Test-file record read from Vitest's JSON reporter output. */\nexport type VitestJsonFile = z.infer<typeof VitestJsonFileSchema>;\n\n/** Top-level Vitest JSON reporter payload. */\nexport const VitestJsonReportSchema = z\n .object({\n numFailedTests: FiniteNumberSchema,\n numPassedTests: FiniteNumberSchema,\n numPendingTests: FiniteNumberSchema,\n numTodoTests: FiniteNumberSchema,\n numTotalTests: FiniteNumberSchema,\n startTime: FiniteNumberSchema,\n success: z.boolean(),\n testResults: z.array(VitestJsonFileSchema).default([]),\n })\n .passthrough();\n\n/** Top-level Vitest JSON reporter payload. */\nexport type VitestJsonReport = z.infer<typeof VitestJsonReportSchema>;\n\n/** Parses and validates an unknown value as a Vitest JSON report artifact. */\nexport function parseVitestJsonReport(input: unknown): VitestJsonReport {\n return parseWithSchema(VitestJsonReportSchema, input, \"Vitest JSON report\");\n}\n","import { z } from \"zod\";\nimport {\n EvalMetaSchema,\n HarnessMetaSchema,\n readEvalTaskMeta,\n} from \"./metadata\";\nimport { FiniteNumberSchema, parseWithSchema, isRecord } from \"../schema-utils\";\nimport {\n parseVitestJsonReport,\n VitestJsonLocationSchema,\n type VitestJsonAssertion,\n type VitestJsonReport,\n} from \"./vitest-json\";\nimport { VitestJsonStatusSchema } from \"./vitest-json\";\n\n/** Current schema version for collected report workspaces. */\nexport const REPORT_WORKSPACE_SCHEMA_VERSION = 1;\n\n/** One collected Vitest JSON report source in a multi-run workspace. */\nexport const ReportRunSchema = z\n .object({\n id: z.string(),\n source: z.string().optional(),\n status: z.enum([\"passed\", \"failed\"]),\n startedAt: FiniteNumberSchema.optional(),\n durationMs: FiniteNumberSchema.optional(),\n totals: z.object({\n total: FiniteNumberSchema,\n passed: FiniteNumberSchema,\n failed: FiniteNumberSchema,\n skipped: FiniteNumberSchema,\n evalTotal: FiniteNumberSchema,\n evalPassed: FiniteNumberSchema,\n evalFailed: FiniteNumberSchema,\n }),\n })\n .strict();\n\n/** One collected Vitest JSON report source in a multi-run workspace. */\nexport type ReportRun = z.infer<typeof ReportRunSchema>;\n\n/** One eval or harness-backed test case collected from Vitest JSON. */\nexport const ReportCaseSchema = z\n .object({\n id: z.string(),\n runId: z.string(),\n source: z.string().optional(),\n file: z.string(),\n displayFile: z.string(),\n title: z.string(),\n fullName: z.string(),\n ancestorTitles: z.array(z.string()),\n tags: z.array(z.string()).optional(),\n displayName: z.string(),\n status: VitestJsonStatusSchema,\n durationMs: FiniteNumberSchema.optional(),\n location: VitestJsonLocationSchema.optional(),\n failureMessages: z.array(z.string()).default([]),\n eval: EvalMetaSchema.optional(),\n harness: HarnessMetaSchema.optional(),\n })\n .strict();\n\n/** One eval or harness-backed test case collected from Vitest JSON. */\nexport type ReportCase = z.infer<typeof ReportCaseSchema>;\n\n/** Full multi-run report workspace consumed by rich report UIs. */\nexport const ReportWorkspaceSchema = z\n .object({\n schemaVersion: z.literal(REPORT_WORKSPACE_SCHEMA_VERSION),\n runs: z.array(ReportRunSchema),\n cases: z.array(ReportCaseSchema),\n })\n .strict();\n\n/** Full multi-run report workspace consumed by rich report UIs. */\nexport type ReportWorkspace = z.infer<typeof ReportWorkspaceSchema>;\n\n/** Input accepted when collecting one Vitest JSON report into a workspace. */\nexport type ReportWorkspaceInput =\n | VitestJsonReport\n | {\n report: VitestJsonReport;\n source?: string;\n };\n\n/** Options for collecting one or more Vitest JSON reports. */\nexport type CollectReportWorkspaceOptions = {\n /** Workspace prefix used to render source files as relative paths. */\n workspace?: string;\n};\n\n/** Parses and validates an unknown value as a collected report workspace. */\nexport function parseReportWorkspace(input: unknown): ReportWorkspace {\n return parseWithSchema(ReportWorkspaceSchema, input, \"report workspace\");\n}\n\n/** Collects eval and harness metadata from one or more Vitest JSON reports. */\nexport function collectReportWorkspace(\n input: ReportWorkspaceInput | ReportWorkspaceInput[],\n options: CollectReportWorkspaceOptions = {},\n): ReportWorkspace {\n const entries = Array.isArray(input) ? input : [input];\n const runs: ReportRun[] = [];\n const cases: ReportCase[] = [];\n\n entries.forEach((entry, index) => {\n const { report, source } = normalizeWorkspaceInput(entry);\n const runId = source ?? `run-${index + 1}`;\n const runCases: ReportCase[] = [];\n\n for (const file of report.testResults) {\n for (const assertion of file.assertionResults) {\n const meta = readEvalTaskMeta(assertion.meta);\n if (!meta) {\n continue;\n }\n\n runCases.push({\n id: createCaseId(runId, file.name, assertion),\n runId,\n ...(source ? { source } : {}),\n file: file.name,\n displayFile: normalizeReportPath(file.name, options.workspace),\n title: assertion.title,\n fullName: assertion.fullName,\n ancestorTitles: assertion.ancestorTitles,\n ...(assertion.tags ? { tags: assertion.tags } : {}),\n displayName: formatDisplayName(assertion),\n status: assertion.status,\n ...(typeof assertion.duration === \"number\"\n ? { durationMs: assertion.duration }\n : {}),\n ...(assertion.location ? { location: assertion.location } : {}),\n failureMessages: assertion.failureMessages ?? [],\n ...(meta.eval ? { eval: meta.eval } : {}),\n ...(meta.harness ? { harness: meta.harness } : {}),\n });\n }\n }\n\n runs.push({\n id: runId,\n ...(source ? { source } : {}),\n status:\n report.success &&\n runCases.every((testCase) => testCase.status !== \"failed\")\n ? \"passed\"\n : \"failed\",\n startedAt: report.startTime,\n durationMs: resolveRunDuration(report),\n totals: {\n total: report.numTotalTests,\n passed: report.numPassedTests,\n failed: report.numFailedTests,\n skipped: report.numPendingTests + report.numTodoTests,\n evalTotal: runCases.length,\n evalPassed: runCases.filter((testCase) => testCase.status === \"passed\")\n .length,\n evalFailed: runCases.filter((testCase) => testCase.status === \"failed\")\n .length,\n },\n });\n cases.push(...runCases);\n });\n\n return {\n schemaVersion: REPORT_WORKSPACE_SCHEMA_VERSION,\n runs,\n cases,\n };\n}\n\nfunction normalizeWorkspaceInput(input: ReportWorkspaceInput) {\n if (isVitestJsonReportLike(input)) {\n return {\n report: parseVitestJsonReport(input),\n };\n }\n\n if (isRecord(input) && \"report\" in input) {\n return {\n report: parseVitestJsonReport(input.report),\n source: typeof input.source === \"string\" ? input.source : undefined,\n };\n }\n\n return {\n report: parseVitestJsonReport(input),\n };\n}\n\nfunction isVitestJsonReportLike(input: unknown) {\n return isRecord(input) && Array.isArray(input.testResults);\n}\n\nfunction createCaseId(\n runId: string,\n file: string,\n assertion: VitestJsonAssertion,\n) {\n return [runId, file, assertion.location?.line ?? 0, assertion.fullName].join(\n \":\",\n );\n}\n\nfunction formatDisplayName(assertion: VitestJsonAssertion) {\n return [...assertion.ancestorTitles, assertion.title]\n .filter((part) => part.length > 0)\n .join(\" > \");\n}\n\nfunction resolveRunDuration(report: VitestJsonReport) {\n const intervals = report.testResults\n .map((file) => {\n const start = file.startTime;\n const end = file.endTime;\n if (!isFiniteNumber(start) || !isFiniteNumber(end) || end < start) {\n return undefined;\n }\n\n return {\n start,\n end,\n };\n })\n .filter((interval): interval is { start: number; end: number } =>\n Boolean(interval),\n );\n\n if (intervals.length === 0) {\n return undefined;\n }\n\n return (\n Math.max(...intervals.map((interval) => interval.end)) -\n Math.min(...intervals.map((interval) => interval.start))\n );\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction normalizeReportPath(path: string, workspace?: string) {\n const normalized = path.replace(/\\\\/g, \"/\");\n if (!workspace) {\n return normalized;\n }\n\n const workspacePath = workspace.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n if (\n normalized !== workspacePath &&\n !normalized.startsWith(`${workspacePath}/`)\n ) {\n return normalized;\n }\n\n return normalized.slice(workspacePath.length).replace(/^\\/+/, \"\");\n}\n"],"mappings":";AAAA,SAAS,SAAS;AAYX,IAAM,sBAAsB,EAAE,MAAM;AAAA,EACzC,EAAE,OAAO;AAAA,EACT,EAAE,OAAO,EAAE,OAAO;AAAA,EAClB,EAAE,QAAQ;AAAA,EACV,EAAE,KAAK;AACT,CAAC;AAGM,IAAM,kBAAwC,EAAE;AAAA,EAAK,MAC1D,EAAE,MAAM;AAAA,IACN;AAAA,IACA,EAAE,MAAM,eAAe;AAAA,IACvB,EAAE,OAAO,EAAE,OAAO,GAAG,eAAe;AAAA,EACtC,CAAC;AACH;AAGO,IAAM,mBAAmB,EAAE,OAAO,EAAE,OAAO,GAAG,eAAe;;;AC7BpE,SAAS,KAAAA,UAAS;;;ACAlB,SAAS,KAAAC,UAAS;AAGX,IAAM,qBAAqBA,GAAE,OAAO,EAAE,OAAO;AAE7C,IAAM,6BAA6BA,GAAE;AAAA,EAC1C,CAAC,UACC,UAAU,QAAS,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,IAClE,SACA;AAAA,EACN,mBAAmB,SAAS;AAC9B;AAEO,IAAM,6BAA6BA,GAAE;AAAA,EAC1C,CAAC,UACC,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,IAAI,OAAO;AAAA,EAChE,mBAAmB,SAAS,EAAE,SAAS;AACzC;AAEO,SAAS,gBACd,QACA,OACA,OACA;AACA,QAAM,SAAS,OAAO,UAAU,KAAK;AACrC,MAAI,OAAO,SAAS;AAClB,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,SAAS,OAAO,MAAM,OACzB,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,UAAU;AACd,UAAM,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,GAAG,IAAI;AAC5D,WAAO,GAAG,IAAI,KAAK,MAAM,OAAO;AAAA,EAClC,CAAC,EACA,KAAK,IAAI;AACZ,QAAM,IAAI,MAAM,WAAW,KAAK,KAAK,MAAM,EAAE;AAC/C;AAEO,SAAS,aACd,OACoC;AACpC,SAAO,SAAS,KAAK;AACvB;AAEO,SAAS,SAAS,OAAkD;AACzE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AD/BO,IAAM,qBAAqBC,GAC/B,OAAO;AAAA,EACN,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,aAAa,mBAAmB,SAAS;AAAA,EACzC,cAAc,mBAAmB,SAAS;AAAA,EAC1C,iBAAiB,mBAAmB,SAAS;AAAA,EAC7C,aAAa,mBAAmB,SAAS;AAAA,EACzC,WAAW,mBAAmB,SAAS;AAAA,EACvC,SAAS,mBAAmB,SAAS;AAAA,EACrC,UAAU,iBAAiB,SAAS;AACtC,CAAC,EACA,OAAO;AAyBH,IAAM,sBAAsBA,GAChC,OAAO;AAAA,EACN,SAAS,mBAAmB,SAAS;AAAA,EACrC,UAAU,iBAAiB,SAAS;AACtC,CAAC,EACA,OAAO;AAWH,IAAM,wBAAwBA,GAClC,OAAO;AAAA,EACN,SAASA,GAAE,OAAO;AAAA,EAClB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAC5B,CAAC,EACA,SAAS,eAAe;AAGpB,IAAM,uBAAuBA,GACjC,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,EACxB,MAAMA,GAAE,OAAO;AAAA,EACf,WAAW,iBAAiB,SAAS;AAAA,EACrC,QAAQ,gBAAgB,SAAS;AAAA,EACjC,OAAO,sBAAsB,SAAS;AAAA,EACtC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,YAAY,mBAAmB,SAAS;AAAA,EACxC,UAAU,iBAAiB,SAAS;AACtC,CAAC,EACA,OAAO;AAyBH,IAAM,0BAA0BA,GACpC,OAAO;AAAA,EACN,MAAMA,GAAE,KAAK,CAAC,UAAU,QAAQ,aAAa,MAAM,CAAC;AAAA,EACpD,SAAS,gBAAgB,SAAS;AAAA,EAClC,WAAWA,GAAE,MAAM,oBAAoB,EAAE,SAAS;AAAA,EAClD,UAAU,iBAAiB,SAAS;AACtC,CAAC,EACA,OAAO;AAeH,IAAM,0BAA0BA,GACpC,OAAO;AAAA,EACN,UAAUA,GAAE,MAAM,uBAAuB,EAAE,QAAQ,CAAC,CAAC;AAAA,EACrD,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,UAAU,iBAAiB,SAAS;AACtC,CAAC,EACA,OAAO;AAeH,IAAM,iCAAiC;AAGvC,IAAM,4BAA4BA,GACtC,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO;AAAA,EACf,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,YAAY,+BAA+B,SAAS;AACtD,CAAC,EACA,OAAO;AAaH,IAAM,uBAAuBA,GACjC,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,EACxB,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,MAAMA,GAAE,OAAO;AAAA,EACf,MAAMA,GACH,KAAK,CAAC,OAAO,SAAS,SAAS,QAAQ,aAAa,WAAW,QAAQ,CAAC,EACxE,SAAS;AAAA,EACZ,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,YAAY,mBAAmB,SAAS;AAAA,EACxC,QAAQA,GAAE,KAAK,CAAC,MAAM,OAAO,CAAC,EAAE,SAAS;AAAA,EACzC,OAAO,sBAAsB,SAAS;AAAA,EACtC,YAAY,+BAA+B,SAAS;AAAA,EACpD,QAAQA,GAAE,MAAM,yBAAyB,EAAE,SAAS;AACtD,CAAC,EACA,OAAO;AAsCH,IAAM,wBAAwBA,GAClC,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,EACxB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,YAAY,mBAAmB,SAAS;AAAA,EACxC,UAAU,iBAAiB,SAAS;AAAA,EACpC,OAAOA,GAAE,MAAM,oBAAoB,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC,EACA,OAAO;AAqBH,IAAM,mBAAmBA,GAC7B,OAAO;AAAA,EACN,QAAQ,gBAAgB,SAAS;AAAA,EACjC,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS,oBAAoB,SAAS;AAAA,EACtC,WAAW,iBAAiB,SAAS;AAAA,EACrC,QAAQA,GAAE,MAAM,qBAAqB,EAAE,SAAS;AAAA,EAChD,QAAQA,GAAE,MAAM,gBAAgB,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC,EACA,OAAO;;;AEhQH,SAAS,UAAU,SAA8C;AACtE,SAAO,QAAQ,SAAS,QAAQ,CAAC,YAAY,QAAQ,aAAa,CAAC,CAAC;AACtE;AAYO,SAAS,MAAM,KAAmC;AACvD,UAAQ,IAAI,UAAU,CAAC,GAAG,QAAQ,CAAC,UAAU,MAAM,KAAK;AAC1D;AAOO,SAAS,WAAW,KAAmC;AAC5D,SAAO,MAAM,GAAG;AAClB;AAQO,SAAS,YACd,KACA,MACkB;AAClB,SAAO,MAAM,GAAG,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI;AACvD;AAOO,SAAS,YAAY,KAAmC;AAC7D,SAAO,MAAM,GAAG,EAAE;AAAA,IAChB,CAAC,SAAS,KAAK,WAAW,WAAW,KAAK,UAAU;AAAA,EACtD;AACF;AAeO,SAAS,eACd,SACA,MACqB;AACrB,SAAO,QAAQ,SAAS,OAAO,CAAC,YAAY,QAAQ,SAAS,IAAI;AACnE;AAYO,SAAS,eAAe,SAA4B;AACzD,SAAO,eAAe,SAAS,QAAQ;AACzC;AAYO,SAAS,aAAa,SAA4B;AACvD,SAAO,eAAe,SAAS,MAAM;AACvC;AAYO,SAAS,kBACd,SACqB;AACrB,SAAO,eAAe,SAAS,WAAW;AAC5C;AAYO,SAAS,8BAA8B,SAA4B;AACxE,SAAO,CAAC,GAAG,kBAAkB,OAAO,CAAC,EAClC,QAAQ,EACR,KAAK,yBAAyB,GAAG;AACtC;AAYO,SAAS,aAAa,SAA4B;AACvD,SAAO,eAAe,SAAS,MAAM;AACvC;AAEA,SAAS,0BAA0B,SAA4B;AAC7D,SACE,QAAQ,YAAY,WACnB,OAAO,QAAQ,YAAY,YAAY,QAAQ,QAAQ,KAAK,EAAE,SAAS;AAE5E;;;AC1KA,SAAS,KAAAC,UAAS;AAgBX,IAAM,oBAAoBC,GAC9B,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,KAAK,iBAAiB,SAAS;AACjC,CAAC,EACA,OAAO;AAMH,IAAM,kBAAkBA,GAC5B,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAO;AAAA,EACP,UAAU,iBAAiB,SAAS;AACtC,CAAC,EACA,OAAO;AAMH,IAAM,iBAAiBA,GAC3B,OAAO;AAAA,EACN,QAAQA,GAAE,MAAM,eAAe,EAAE,SAAS;AAAA,EAC1C,UAAU;AAAA,EACV,QAAQ,gBAAgB,SAAS;AAAA,EACjC,iBAAiBA,GAAE,QAAQ,EAAE,SAAS;AAAA,EACtC,WAAWA,GAAE,MAAM,oBAAoB,EAAE,SAAS;AACpD,CAAC,EACA,OAAO;AAMH,IAAM,qBAAqBA,GAC/B,OAAO;AAAA,EACN,MAAM,eAAe,SAAS;AAAA,EAC9B,SAAS,kBAAkB,SAAS;AACtC,CAAC,EACA,OAAO;AAKV,IAAM,8BAA8B,qBAAqB,MAAM;AAC/D,IAAM,uBAAuB,wBAAwB,OAAO;AAAA,EAC1D,WAAWA,GAAE,MAAM,2BAA2B,EAAE,SAAS,EAAE,MAAM,MAAS;AAC5E,CAAC,EAAE,MAAM;AACT,IAAM,uBAAuB,wBAAwB,OAAO;AAAA,EAC1D,UAAUA,GAAE,MAAM,oBAAoB,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC9D,CAAC,EAAE,MAAM;AACT,IAAM,yBAAyB,0BAA0B,MAAM;AAC/D,IAAM,oBAAoB,qBAAqB,OAAO;AAAA,EACpD,QAAQA,GAAE,MAAM,sBAAsB,EAAE,SAAS,EAAE,MAAM,MAAS;AACpE,CAAC,EAAE,MAAM;AACT,IAAM,qBAAqB,sBAAsB,OAAO;AAAA,EACtD,OAAOA,GAAE,MAAM,iBAAiB,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC,EAAE,MAAM;AACT,IAAM,0BAA0B,iBAAiB,OAAO;AAAA,EACtD,SAAS;AAAA,EACT,OAAO,mBAAmB,MAAM,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC5C,SAAS,oBAAoB,MAAM,EAAE,SAAS;AAAA,EAC9C,QAAQA,GAAE,MAAM,kBAAkB,EAAE,SAAS,EAAE,MAAM,MAAS;AAChE,CAAC,EAAE,MAAM;AACT,IAAM,2BAA2B,kBAAkB,OAAO;AAAA,EACxD,KAAK,wBAAwB,SAAS,EAAE,MAAM,MAAS;AACzD,CAAC,EAAE,MAAM;AACT,IAAM,yBAAyB,gBAAgB,MAAM;AACrD,IAAM,wBAAwB,eAAe,OAAO;AAAA,EAClD,QAAQA,GAAE,MAAM,sBAAsB,EAAE,SAAS,EAAE,MAAM,MAAS;AAAA,EAClE,WAAWA,GAAE,MAAM,2BAA2B,EAAE,SAAS,EAAE,MAAM,MAAS;AAC5E,CAAC,EAAE,MAAM;AAGF,SAAS,iBAAiB,OAA0C;AACzE,MAAI,CAAC,aAAa,KAAK,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,sBAAsB,UAAU,MAAM,IAAI;AAC7D,QAAM,gBAAgB,yBAAyB,UAAU,MAAM,OAAO;AACtE,QAAM,OAAqB;AAAA,IACzB,GAAI,WAAW,WAAW,MAAM,SAAS,SACrC,EAAE,MAAM,WAAW,KAAK,IACxB,CAAC;AAAA,IACL,GAAI,cAAc,WAAW,MAAM,YAAY,SAC3C,EAAE,SAAS,cAAc,KAAK,IAC9B,CAAC;AAAA,EACP;AAEA,SAAO,KAAK,QAAQ,KAAK,UAAU,OAAO;AAC5C;;;AC9GA,SAAS,KAAAC,UAAS;AAQX,IAAM,yBAAyBC,GAAE,KAAK;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,2BAA2BA,GACrC,OAAO;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AACV,CAAC,EACA,YAAY;AAMR,IAAM,4BAA4BA,GACtC,OAAO;AAAA,EACN,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC9C,UAAUA,GAAE,OAAO;AAAA,EACnB,QAAQ;AAAA,EACR,OAAOA,GAAE,OAAO;AAAA,EAChB,MAAMA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC3B,UAAU,mBAAmB,SAAS,EAAE,SAAS;AAAA,EACjD,iBAAiBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,EACzD,UAAU,yBAAyB,SAAS,EAAE,SAAS;AAAA,EACvD,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AACrC,CAAC,EACA,YAAY;AAMR,IAAM,uBAAuBA,GACjC,OAAO;AAAA,EACN,SAASA,GAAE,OAAO;AAAA,EAClB,MAAMA,GAAE,OAAO;AAAA,EACf,QAAQA,GAAE,KAAK,CAAC,UAAU,QAAQ,CAAC;AAAA,EACnC,WAAW;AAAA,EACX,SAAS;AAAA,EACT,kBAAkBA,GAAE,MAAM,yBAAyB,EAAE,QAAQ,CAAC,CAAC;AACjE,CAAC,EACA,YAAY;AAMR,IAAM,yBAAyBA,GACnC,OAAO;AAAA,EACN,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,WAAW;AAAA,EACX,SAASA,GAAE,QAAQ;AAAA,EACnB,aAAaA,GAAE,MAAM,oBAAoB,EAAE,QAAQ,CAAC,CAAC;AACvD,CAAC,EACA,YAAY;AAMR,SAAS,sBAAsB,OAAkC;AACtE,SAAO,gBAAgB,wBAAwB,OAAO,oBAAoB;AAC5E;;;ACpFA,SAAS,KAAAC,UAAS;AAgBX,IAAM,kCAAkC;AAGxC,IAAM,kBAAkBC,GAC5B,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO;AAAA,EACb,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,QAAQA,GAAE,KAAK,CAAC,UAAU,QAAQ,CAAC;AAAA,EACnC,WAAW,mBAAmB,SAAS;AAAA,EACvC,YAAY,mBAAmB,SAAS;AAAA,EACxC,QAAQA,GAAE,OAAO;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,EACd,CAAC;AACH,CAAC,EACA,OAAO;AAMH,IAAM,mBAAmBA,GAC7B,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO;AAAA,EACb,OAAOA,GAAE,OAAO;AAAA,EAChB,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,MAAMA,GAAE,OAAO;AAAA,EACf,aAAaA,GAAE,OAAO;AAAA,EACtB,OAAOA,GAAE,OAAO;AAAA,EAChB,UAAUA,GAAE,OAAO;AAAA,EACnB,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EAClC,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,aAAaA,GAAE,OAAO;AAAA,EACtB,QAAQ;AAAA,EACR,YAAY,mBAAmB,SAAS;AAAA,EACxC,UAAU,yBAAyB,SAAS;AAAA,EAC5C,iBAAiBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC/C,MAAM,eAAe,SAAS;AAAA,EAC9B,SAAS,kBAAkB,SAAS;AACtC,CAAC,EACA,OAAO;AAMH,IAAM,wBAAwBA,GAClC,OAAO;AAAA,EACN,eAAeA,GAAE,QAAQ,+BAA+B;AAAA,EACxD,MAAMA,GAAE,MAAM,eAAe;AAAA,EAC7B,OAAOA,GAAE,MAAM,gBAAgB;AACjC,CAAC,EACA,OAAO;AAoBH,SAAS,qBAAqB,OAAiC;AACpE,SAAO,gBAAgB,uBAAuB,OAAO,kBAAkB;AACzE;AAGO,SAAS,uBACd,OACA,UAAyC,CAAC,GACzB;AACjB,QAAM,UAAU,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACrD,QAAM,OAAoB,CAAC;AAC3B,QAAM,QAAsB,CAAC;AAE7B,UAAQ,QAAQ,CAAC,OAAO,UAAU;AAChC,UAAM,EAAE,QAAQ,OAAO,IAAI,wBAAwB,KAAK;AACxD,UAAM,QAAQ,UAAU,OAAO,QAAQ,CAAC;AACxC,UAAM,WAAyB,CAAC;AAEhC,eAAW,QAAQ,OAAO,aAAa;AACrC,iBAAW,aAAa,KAAK,kBAAkB;AAC7C,cAAM,OAAO,iBAAiB,UAAU,IAAI;AAC5C,YAAI,CAAC,MAAM;AACT;AAAA,QACF;AAEA,iBAAS,KAAK;AAAA,UACZ,IAAI,aAAa,OAAO,KAAK,MAAM,SAAS;AAAA,UAC5C;AAAA,UACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,UAC3B,MAAM,KAAK;AAAA,UACX,aAAa,oBAAoB,KAAK,MAAM,QAAQ,SAAS;AAAA,UAC7D,OAAO,UAAU;AAAA,UACjB,UAAU,UAAU;AAAA,UACpB,gBAAgB,UAAU;AAAA,UAC1B,GAAI,UAAU,OAAO,EAAE,MAAM,UAAU,KAAK,IAAI,CAAC;AAAA,UACjD,aAAa,kBAAkB,SAAS;AAAA,UACxC,QAAQ,UAAU;AAAA,UAClB,GAAI,OAAO,UAAU,aAAa,WAC9B,EAAE,YAAY,UAAU,SAAS,IACjC,CAAC;AAAA,UACL,GAAI,UAAU,WAAW,EAAE,UAAU,UAAU,SAAS,IAAI,CAAC;AAAA,UAC7D,iBAAiB,UAAU,mBAAmB,CAAC;AAAA,UAC/C,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,UACvC,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,QAClD,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,KAAK;AAAA,MACR,IAAI;AAAA,MACJ,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MAC3B,QACE,OAAO,WACP,SAAS,MAAM,CAAC,aAAa,SAAS,WAAW,QAAQ,IACrD,WACA;AAAA,MACN,WAAW,OAAO;AAAA,MAClB,YAAY,mBAAmB,MAAM;AAAA,MACrC,QAAQ;AAAA,QACN,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,QACf,SAAS,OAAO,kBAAkB,OAAO;AAAA,QACzC,WAAW,SAAS;AAAA,QACpB,YAAY,SAAS,OAAO,CAAC,aAAa,SAAS,WAAW,QAAQ,EACnE;AAAA,QACH,YAAY,SAAS,OAAO,CAAC,aAAa,SAAS,WAAW,QAAQ,EACnE;AAAA,MACL;AAAA,IACF,CAAC;AACD,UAAM,KAAK,GAAG,QAAQ;AAAA,EACxB,CAAC;AAED,SAAO;AAAA,IACL,eAAe;AAAA,IACf;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,OAA6B;AAC5D,MAAI,uBAAuB,KAAK,GAAG;AACjC,WAAO;AAAA,MACL,QAAQ,sBAAsB,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,MAAI,SAAS,KAAK,KAAK,YAAY,OAAO;AACxC,WAAO;AAAA,MACL,QAAQ,sBAAsB,MAAM,MAAM;AAAA,MAC1C,QAAQ,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAAA,IAC5D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,sBAAsB,KAAK;AAAA,EACrC;AACF;AAEA,SAAS,uBAAuB,OAAgB;AAC9C,SAAO,SAAS,KAAK,KAAK,MAAM,QAAQ,MAAM,WAAW;AAC3D;AAEA,SAAS,aACP,OACA,MACA,WACA;AACA,SAAO,CAAC,OAAO,MAAM,UAAU,UAAU,QAAQ,GAAG,UAAU,QAAQ,EAAE;AAAA,IACtE;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,WAAgC;AACzD,SAAO,CAAC,GAAG,UAAU,gBAAgB,UAAU,KAAK,EACjD,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAChC,KAAK,KAAK;AACf;AAEA,SAAS,mBAAmB,QAA0B;AACpD,QAAM,YAAY,OAAO,YACtB,IAAI,CAAC,SAAS;AACb,UAAM,QAAQ,KAAK;AACnB,UAAM,MAAM,KAAK;AACjB,QAAI,CAAC,eAAe,KAAK,KAAK,CAAC,eAAe,GAAG,KAAK,MAAM,OAAO;AACjE,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC,EACA;AAAA,IAAO,CAAC,aACP,QAAQ,QAAQ;AAAA,EAClB;AAEF,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,SACE,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,aAAa,SAAS,GAAG,CAAC,IACrD,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,aAAa,SAAS,KAAK,CAAC;AAE3D;AAEA,SAAS,eAAe,OAAiC;AACvD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AAC3D;AAEA,SAAS,oBAAoB,MAAc,WAAoB;AAC7D,QAAM,aAAa,KAAK,QAAQ,OAAO,GAAG;AAC1C,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,UAAU,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,EAAE;AACtE,MACE,eAAe,iBACf,CAAC,WAAW,WAAW,GAAG,aAAa,GAAG,GAC1C;AACA,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,MAAM,cAAc,MAAM,EAAE,QAAQ,QAAQ,EAAE;AAClE;","names":["z","z","z","z","z","z","z","z","z"]}
@@ -0,0 +1,33 @@
1
+ import { C as CollectReportWorkspaceOptions, l as VitestJsonReport, v as ReportWorkspace } from './workspace-BNgjyW7W.mjs';
2
+ import 'zod';
3
+
4
+ /** Options for resolving eval result file paths. */
5
+ type ResolveReportFilesOptions = {
6
+ /** Directory used to resolve relative paths and globs. */
7
+ cwd?: string;
8
+ /** File extensions included when an input resolves to a directory. */
9
+ extensions?: string[];
10
+ };
11
+ /** Options for reading Vitest JSON reports into a collected workspace. */
12
+ type ReadReportWorkspaceOptions = ResolveReportFilesOptions & CollectReportWorkspaceOptions;
13
+ /**
14
+ * Resolves result files from explicit paths, directories, and simple glob
15
+ * patterns. Nonexistent explicit paths are preserved so callers can surface a
16
+ * useful read error with the original filename.
17
+ */
18
+ declare function resolveReportFiles(patterns: string[], options?: ResolveReportFilesOptions): Promise<string[]>;
19
+ /** Backwards-compatible alias for consumers that call them Vitest result files. */
20
+ declare const resolveResultFiles: typeof resolveReportFiles;
21
+ /** Splits a newline-separated report input into path and glob entries. */
22
+ declare function splitReportInput(value: string | undefined): string[];
23
+ /** Backwards-compatible alias for GitHub Action result inputs. */
24
+ declare const splitResultsInput: typeof splitReportInput;
25
+ /** Reads and parses one Vitest JSON report file. */
26
+ declare function readVitestJsonReportFile(resultFile: string): Promise<VitestJsonReport>;
27
+ /** Resolves result inputs and collects them into a report workspace. */
28
+ declare function readReportWorkspace(patterns: string[], options?: ReadReportWorkspaceOptions): Promise<{
29
+ workspace: ReportWorkspace;
30
+ resultFiles: string[];
31
+ }>;
32
+
33
+ export { type ReadReportWorkspaceOptions, type ResolveReportFilesOptions, readReportWorkspace, readVitestJsonReportFile, resolveReportFiles, resolveResultFiles, splitReportInput, splitResultsInput };
package/dist/node.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ import { C as CollectReportWorkspaceOptions, l as VitestJsonReport, v as ReportWorkspace } from './workspace-BNgjyW7W.js';
2
+ import 'zod';
3
+
4
+ /** Options for resolving eval result file paths. */
5
+ type ResolveReportFilesOptions = {
6
+ /** Directory used to resolve relative paths and globs. */
7
+ cwd?: string;
8
+ /** File extensions included when an input resolves to a directory. */
9
+ extensions?: string[];
10
+ };
11
+ /** Options for reading Vitest JSON reports into a collected workspace. */
12
+ type ReadReportWorkspaceOptions = ResolveReportFilesOptions & CollectReportWorkspaceOptions;
13
+ /**
14
+ * Resolves result files from explicit paths, directories, and simple glob
15
+ * patterns. Nonexistent explicit paths are preserved so callers can surface a
16
+ * useful read error with the original filename.
17
+ */
18
+ declare function resolveReportFiles(patterns: string[], options?: ResolveReportFilesOptions): Promise<string[]>;
19
+ /** Backwards-compatible alias for consumers that call them Vitest result files. */
20
+ declare const resolveResultFiles: typeof resolveReportFiles;
21
+ /** Splits a newline-separated report input into path and glob entries. */
22
+ declare function splitReportInput(value: string | undefined): string[];
23
+ /** Backwards-compatible alias for GitHub Action result inputs. */
24
+ declare const splitResultsInput: typeof splitReportInput;
25
+ /** Reads and parses one Vitest JSON report file. */
26
+ declare function readVitestJsonReportFile(resultFile: string): Promise<VitestJsonReport>;
27
+ /** Resolves result inputs and collects them into a report workspace. */
28
+ declare function readReportWorkspace(patterns: string[], options?: ReadReportWorkspaceOptions): Promise<{
29
+ workspace: ReportWorkspace;
30
+ resultFiles: string[];
31
+ }>;
32
+
33
+ export { type ReadReportWorkspaceOptions, type ResolveReportFilesOptions, readReportWorkspace, readVitestJsonReportFile, resolveReportFiles, resolveResultFiles, splitReportInput, splitResultsInput };