@vitest-evals/core 0.13.1 → 0.15.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/node.js CHANGED
@@ -32,13 +32,13 @@ var import_promises = require("fs/promises");
32
32
  var import_node_path = require("path");
33
33
 
34
34
  // src/report/workspace.ts
35
- var import_zod6 = require("zod");
35
+ var import_zod8 = require("zod");
36
36
 
37
37
  // src/report/metadata.ts
38
- var import_zod4 = require("zod");
38
+ var import_zod6 = require("zod");
39
39
 
40
40
  // src/harness/index.ts
41
- var import_zod3 = require("zod");
41
+ var import_zod5 = require("zod");
42
42
 
43
43
  // src/json.ts
44
44
  var import_zod = require("zod");
@@ -86,10 +86,52 @@ function isRecord(value) {
86
86
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
87
87
  }
88
88
 
89
+ // src/harness/errors.ts
90
+ var import_zod3 = require("zod");
91
+ var NormalizedErrorSchema = import_zod3.z.object({
92
+ message: import_zod3.z.string(),
93
+ type: import_zod3.z.string().optional()
94
+ }).catchall(JsonValueSchema);
95
+
96
+ // src/harness/transcript.ts
97
+ var import_zod4 = require("zod");
98
+ var TranscriptToolCallEventSchema = import_zod4.z.object({
99
+ type: import_zod4.z.literal("tool_call"),
100
+ id: import_zod4.z.string(),
101
+ name: import_zod4.z.string(),
102
+ arguments: JsonObjectSchema.optional(),
103
+ startedAt: import_zod4.z.string().optional(),
104
+ finishedAt: import_zod4.z.string().optional(),
105
+ durationMs: FiniteNumberSchema.optional(),
106
+ metadata: JsonObjectSchema.optional()
107
+ }).strict();
108
+ var TranscriptMessageEventSchema = import_zod4.z.object({
109
+ type: import_zod4.z.literal("message"),
110
+ role: import_zod4.z.enum(["system", "user", "assistant"]),
111
+ content: JsonValueSchema.optional(),
112
+ metadata: JsonObjectSchema.optional()
113
+ }).strict();
114
+ var TranscriptToolResultEventSchema = import_zod4.z.object({
115
+ type: import_zod4.z.literal("tool_result"),
116
+ toolCallId: import_zod4.z.string(),
117
+ name: import_zod4.z.string().optional(),
118
+ content: JsonValueSchema.optional(),
119
+ error: NormalizedErrorSchema.optional(),
120
+ startedAt: import_zod4.z.string().optional(),
121
+ finishedAt: import_zod4.z.string().optional(),
122
+ durationMs: FiniteNumberSchema.optional(),
123
+ metadata: JsonObjectSchema.optional()
124
+ }).strict();
125
+ var TranscriptEventSchema = import_zod4.z.discriminatedUnion("type", [
126
+ TranscriptMessageEventSchema,
127
+ TranscriptToolCallEventSchema,
128
+ TranscriptToolResultEventSchema
129
+ ]);
130
+
89
131
  // src/harness/index.ts
90
- var UsageSummarySchema = import_zod3.z.object({
91
- provider: import_zod3.z.string().optional(),
92
- model: import_zod3.z.string().optional(),
132
+ var UsageSummarySchema = import_zod5.z.object({
133
+ provider: import_zod5.z.string().optional(),
134
+ model: import_zod5.z.string().optional(),
93
135
  inputTokens: FiniteNumberSchema.optional(),
94
136
  outputTokens: FiniteNumberSchema.optional(),
95
137
  reasoningTokens: FiniteNumberSchema.optional(),
@@ -98,141 +140,111 @@ var UsageSummarySchema = import_zod3.z.object({
98
140
  retries: FiniteNumberSchema.optional(),
99
141
  metadata: JsonObjectSchema.optional()
100
142
  }).strict();
101
- var TimingSummarySchema = import_zod3.z.object({
143
+ var TimingSummarySchema = import_zod5.z.object({
102
144
  totalMs: FiniteNumberSchema.optional(),
103
145
  metadata: JsonObjectSchema.optional()
104
146
  }).strict();
105
- var NormalizedErrorSchema = import_zod3.z.object({
106
- message: import_zod3.z.string(),
107
- type: import_zod3.z.string().optional()
108
- }).catchall(JsonValueSchema);
109
- var ToolCallRecordSchema = import_zod3.z.object({
110
- id: import_zod3.z.string().optional(),
111
- name: import_zod3.z.string(),
112
- arguments: JsonObjectSchema.optional(),
113
- result: JsonValueSchema.optional(),
114
- error: NormalizedErrorSchema.optional(),
115
- startedAt: import_zod3.z.string().optional(),
116
- finishedAt: import_zod3.z.string().optional(),
117
- durationMs: FiniteNumberSchema.optional(),
118
- metadata: JsonObjectSchema.optional()
119
- }).strict();
120
- var NormalizedMessageSchema = import_zod3.z.object({
121
- role: import_zod3.z.enum(["system", "user", "assistant", "tool"]),
122
- content: JsonValueSchema.optional(),
123
- toolCalls: import_zod3.z.array(ToolCallRecordSchema).optional(),
124
- metadata: JsonObjectSchema.optional()
147
+ var ToolCallBaseSchema = import_zod5.z.object({
148
+ name: import_zod5.z.string(),
149
+ arguments: JsonObjectSchema.optional()
125
150
  }).strict();
126
- var NormalizedSessionSchema = import_zod3.z.object({
127
- messages: import_zod3.z.array(NormalizedMessageSchema).default([]),
128
- provider: import_zod3.z.string().optional(),
129
- model: import_zod3.z.string().optional(),
151
+ var ToolCallSchema = import_zod5.z.discriminatedUnion("status", [
152
+ ToolCallBaseSchema.extend({
153
+ status: import_zod5.z.literal("pending")
154
+ }).strict(),
155
+ ToolCallBaseSchema.extend({
156
+ status: import_zod5.z.literal("ok"),
157
+ result: JsonValueSchema.optional()
158
+ }).strict(),
159
+ ToolCallBaseSchema.extend({
160
+ status: import_zod5.z.literal("error"),
161
+ error: NormalizedErrorSchema
162
+ }).strict()
163
+ ]);
164
+ var NormalizedSessionSchema = import_zod5.z.object({
165
+ events: import_zod5.z.array(TranscriptEventSchema),
166
+ provider: import_zod5.z.string().optional(),
167
+ model: import_zod5.z.string().optional(),
130
168
  metadata: JsonObjectSchema.optional()
131
169
  }).strict();
132
170
  var NormalizedSpanAttributesSchema = JsonObjectSchema;
133
- var NormalizedSpanEventSchema = import_zod3.z.object({
134
- name: import_zod3.z.string(),
135
- timestamp: import_zod3.z.string().optional(),
171
+ var NormalizedSpanEventSchema = import_zod5.z.object({
172
+ name: import_zod5.z.string(),
173
+ timestamp: import_zod5.z.string().optional(),
136
174
  attributes: NormalizedSpanAttributesSchema.optional()
137
175
  }).strict();
138
- var NormalizedSpanSchema = import_zod3.z.object({
139
- id: import_zod3.z.string().optional(),
140
- traceId: import_zod3.z.string().optional(),
141
- parentId: import_zod3.z.string().optional(),
142
- name: import_zod3.z.string(),
143
- kind: import_zod3.z.enum(["run", "agent", "model", "tool", "guardrail", "handoff", "custom"]).optional(),
144
- startedAt: import_zod3.z.string().optional(),
145
- finishedAt: import_zod3.z.string().optional(),
176
+ var NormalizedSpanSchema = import_zod5.z.object({
177
+ id: import_zod5.z.string().optional(),
178
+ traceId: import_zod5.z.string().optional(),
179
+ parentId: import_zod5.z.string().optional(),
180
+ name: import_zod5.z.string(),
181
+ kind: import_zod5.z.enum(["run", "agent", "model", "tool", "guardrail", "handoff", "custom"]).optional(),
182
+ startedAt: import_zod5.z.string().optional(),
183
+ finishedAt: import_zod5.z.string().optional(),
146
184
  durationMs: FiniteNumberSchema.optional(),
147
- status: import_zod3.z.enum(["ok", "error"]).optional(),
185
+ status: import_zod5.z.enum(["ok", "error"]).optional(),
148
186
  error: NormalizedErrorSchema.optional(),
149
187
  attributes: NormalizedSpanAttributesSchema.optional(),
150
- events: import_zod3.z.array(NormalizedSpanEventSchema).optional()
188
+ events: import_zod5.z.array(NormalizedSpanEventSchema).optional()
151
189
  }).strict();
152
- var NormalizedTraceSchema = import_zod3.z.object({
153
- id: import_zod3.z.string().optional(),
154
- name: import_zod3.z.string().optional(),
155
- startedAt: import_zod3.z.string().optional(),
156
- finishedAt: import_zod3.z.string().optional(),
190
+ var NormalizedTraceSchema = import_zod5.z.object({
191
+ id: import_zod5.z.string().optional(),
192
+ name: import_zod5.z.string().optional(),
193
+ startedAt: import_zod5.z.string().optional(),
194
+ finishedAt: import_zod5.z.string().optional(),
157
195
  durationMs: FiniteNumberSchema.optional(),
158
196
  metadata: JsonObjectSchema.optional(),
159
- spans: import_zod3.z.array(NormalizedSpanSchema).default([])
197
+ spans: import_zod5.z.array(NormalizedSpanSchema)
160
198
  }).strict();
161
- var HarnessRunSchema = import_zod3.z.object({
199
+ var HarnessRunSchema = import_zod5.z.object({
162
200
  output: JsonValueSchema.optional(),
163
201
  session: NormalizedSessionSchema,
164
202
  usage: UsageSummarySchema,
165
203
  timings: TimingSummarySchema.optional(),
166
204
  artifacts: JsonObjectSchema.optional(),
167
- traces: import_zod3.z.array(NormalizedTraceSchema).optional(),
168
- errors: import_zod3.z.array(JsonObjectSchema).default([])
205
+ traces: import_zod5.z.array(NormalizedTraceSchema).optional(),
206
+ errors: import_zod5.z.array(JsonObjectSchema)
169
207
  }).strict();
170
208
 
171
209
  // src/report/metadata.ts
172
- var HarnessMetaSchema = import_zod4.z.object({
173
- name: import_zod4.z.string().optional(),
210
+ var HarnessMetaSchema = import_zod6.z.object({
211
+ name: import_zod6.z.string().optional(),
174
212
  run: HarnessRunSchema.optional()
175
213
  }).strict();
176
- var EvalScoreSchema = import_zod4.z.object({
177
- name: import_zod4.z.string().optional(),
214
+ var EvalScoreSchema = import_zod6.z.object({
215
+ name: import_zod6.z.string().optional(),
178
216
  score: NullableFiniteNumberSchema,
179
217
  metadata: JsonObjectSchema.optional()
180
218
  }).strict();
181
- var EvalMetaSchema = import_zod4.z.object({
182
- scores: import_zod4.z.array(EvalScoreSchema).optional(),
219
+ var EvalMetaSchema = import_zod6.z.object({
220
+ scores: import_zod6.z.array(EvalScoreSchema).optional(),
183
221
  avgScore: NullableFiniteNumberSchema,
184
222
  output: JsonValueSchema.optional(),
185
- thresholdFailed: import_zod4.z.boolean().optional(),
186
- toolCalls: import_zod4.z.array(ToolCallRecordSchema).optional()
223
+ thresholdFailed: import_zod6.z.boolean().optional(),
224
+ toolCalls: import_zod6.z.array(ToolCallSchema).optional()
187
225
  }).strict();
188
- var EvalTaskMetaSchema = import_zod4.z.object({
226
+ var EvalTaskMetaSchema = import_zod6.z.object({
189
227
  eval: EvalMetaSchema.optional(),
190
228
  harness: HarnessMetaSchema.optional()
191
229
  }).strict();
192
- var LenientToolCallRecordSchema = ToolCallRecordSchema.strip();
193
- var LenientMessageSchema = NormalizedMessageSchema.extend({
194
- toolCalls: import_zod4.z.array(LenientToolCallRecordSchema).optional().catch(void 0)
195
- }).strip();
196
- var LenientSessionSchema = NormalizedSessionSchema.extend({
197
- messages: import_zod4.z.array(LenientMessageSchema).default([]).catch([])
198
- }).strip();
199
- var LenientSpanEventSchema = NormalizedSpanEventSchema.strip();
200
- var LenientSpanSchema = NormalizedSpanSchema.extend({
201
- events: import_zod4.z.array(LenientSpanEventSchema).optional().catch(void 0)
202
- }).strip();
203
- var LenientTraceSchema = NormalizedTraceSchema.extend({
204
- spans: import_zod4.z.array(LenientSpanSchema).default([]).catch([])
205
- }).strip();
206
- var LenientHarnessRunSchema = HarnessRunSchema.extend({
207
- session: LenientSessionSchema,
208
- usage: UsageSummarySchema.strip().default({}),
209
- timings: TimingSummarySchema.strip().optional(),
210
- traces: import_zod4.z.array(LenientTraceSchema).optional().catch(void 0)
211
- }).strip();
212
- var LenientHarnessMetaSchema = HarnessMetaSchema.extend({
213
- run: LenientHarnessRunSchema.optional().catch(void 0)
214
- }).strip();
215
- var LenientEvalScoreSchema = EvalScoreSchema.strip();
216
- var LenientEvalMetaSchema = EvalMetaSchema.extend({
217
- scores: import_zod4.z.array(LenientEvalScoreSchema).optional().catch(void 0),
218
- toolCalls: import_zod4.z.array(LenientToolCallRecordSchema).optional().catch(void 0)
219
- }).strip();
220
230
  function readEvalTaskMeta(input) {
221
231
  if (!isJsonObject(input)) {
222
232
  return void 0;
223
233
  }
224
- const evalResult = LenientEvalMetaSchema.safeParse(input.eval);
225
- const harnessResult = LenientHarnessMetaSchema.safeParse(input.harness);
226
234
  const meta = {
227
- ...evalResult.success && input.eval !== void 0 ? { eval: evalResult.data } : {},
228
- ...harnessResult.success && input.harness !== void 0 ? { harness: harnessResult.data } : {}
235
+ ...input.eval !== void 0 ? { eval: input.eval } : {},
236
+ ...input.harness !== void 0 ? { harness: input.harness } : {}
229
237
  };
230
- return meta.eval || meta.harness ? meta : void 0;
238
+ if (!("eval" in meta) && !("harness" in meta)) {
239
+ return void 0;
240
+ }
241
+ const result = EvalTaskMetaSchema.safeParse(meta);
242
+ return result.success ? result.data : void 0;
231
243
  }
232
244
 
233
245
  // src/report/vitest-json.ts
234
- var import_zod5 = require("zod");
235
- var VitestJsonStatusSchema = import_zod5.z.enum([
246
+ var import_zod7 = require("zod");
247
+ var VitestJsonStatusSchema = import_zod7.z.enum([
236
248
  "passed",
237
249
  "failed",
238
250
  "skipped",
@@ -240,38 +252,38 @@ var VitestJsonStatusSchema = import_zod5.z.enum([
240
252
  "todo",
241
253
  "disabled"
242
254
  ]);
243
- var VitestJsonLocationSchema = import_zod5.z.object({
255
+ var VitestJsonLocationSchema = import_zod7.z.object({
244
256
  line: FiniteNumberSchema,
245
257
  column: FiniteNumberSchema
246
258
  }).passthrough();
247
- var VitestJsonAssertionSchema = import_zod5.z.object({
248
- ancestorTitles: import_zod5.z.array(import_zod5.z.string()).default([]),
249
- fullName: import_zod5.z.string(),
259
+ var VitestJsonAssertionSchema = import_zod7.z.object({
260
+ ancestorTitles: import_zod7.z.array(import_zod7.z.string()).default([]),
261
+ fullName: import_zod7.z.string(),
250
262
  status: VitestJsonStatusSchema,
251
- title: import_zod5.z.string(),
252
- meta: import_zod5.z.unknown().optional(),
263
+ title: import_zod7.z.string(),
264
+ meta: import_zod7.z.unknown().optional(),
253
265
  duration: FiniteNumberSchema.nullable().optional(),
254
- failureMessages: import_zod5.z.array(import_zod5.z.string()).nullable().optional(),
266
+ failureMessages: import_zod7.z.array(import_zod7.z.string()).nullable().optional(),
255
267
  location: VitestJsonLocationSchema.nullable().optional(),
256
- tags: import_zod5.z.array(import_zod5.z.string()).optional()
268
+ tags: import_zod7.z.array(import_zod7.z.string()).optional()
257
269
  }).passthrough();
258
- var VitestJsonFileSchema = import_zod5.z.object({
259
- message: import_zod5.z.string(),
260
- name: import_zod5.z.string(),
261
- status: import_zod5.z.enum(["failed", "passed"]),
270
+ var VitestJsonFileSchema = import_zod7.z.object({
271
+ message: import_zod7.z.string(),
272
+ name: import_zod7.z.string(),
273
+ status: import_zod7.z.enum(["failed", "passed"]),
262
274
  startTime: OptionalFiniteNumberSchema,
263
275
  endTime: OptionalFiniteNumberSchema,
264
- assertionResults: import_zod5.z.array(VitestJsonAssertionSchema).default([])
276
+ assertionResults: import_zod7.z.array(VitestJsonAssertionSchema).default([])
265
277
  }).passthrough();
266
- var VitestJsonReportSchema = import_zod5.z.object({
278
+ var VitestJsonReportSchema = import_zod7.z.object({
267
279
  numFailedTests: FiniteNumberSchema,
268
280
  numPassedTests: FiniteNumberSchema,
269
281
  numPendingTests: FiniteNumberSchema,
270
282
  numTodoTests: FiniteNumberSchema,
271
283
  numTotalTests: FiniteNumberSchema,
272
284
  startTime: FiniteNumberSchema,
273
- success: import_zod5.z.boolean(),
274
- testResults: import_zod5.z.array(VitestJsonFileSchema).default([])
285
+ success: import_zod7.z.boolean(),
286
+ testResults: import_zod7.z.array(VitestJsonFileSchema).default([])
275
287
  }).passthrough();
276
288
  function parseVitestJsonReport(input) {
277
289
  return parseWithSchema(VitestJsonReportSchema, input, "Vitest JSON report");
@@ -279,13 +291,13 @@ function parseVitestJsonReport(input) {
279
291
 
280
292
  // src/report/workspace.ts
281
293
  var REPORT_WORKSPACE_SCHEMA_VERSION = 1;
282
- var ReportRunSchema = import_zod6.z.object({
283
- id: import_zod6.z.string(),
284
- source: import_zod6.z.string().optional(),
285
- status: import_zod6.z.enum(["passed", "failed"]),
294
+ var ReportRunSchema = import_zod8.z.object({
295
+ id: import_zod8.z.string(),
296
+ source: import_zod8.z.string().optional(),
297
+ status: import_zod8.z.enum(["passed", "failed"]),
286
298
  startedAt: FiniteNumberSchema.optional(),
287
299
  durationMs: FiniteNumberSchema.optional(),
288
- totals: import_zod6.z.object({
300
+ totals: import_zod8.z.object({
289
301
  total: FiniteNumberSchema,
290
302
  passed: FiniteNumberSchema,
291
303
  failed: FiniteNumberSchema,
@@ -295,28 +307,28 @@ var ReportRunSchema = import_zod6.z.object({
295
307
  evalFailed: FiniteNumberSchema
296
308
  })
297
309
  }).strict();
298
- var ReportCaseSchema = import_zod6.z.object({
299
- id: import_zod6.z.string(),
300
- runId: import_zod6.z.string(),
301
- source: import_zod6.z.string().optional(),
302
- file: import_zod6.z.string(),
303
- displayFile: import_zod6.z.string(),
304
- title: import_zod6.z.string(),
305
- fullName: import_zod6.z.string(),
306
- ancestorTitles: import_zod6.z.array(import_zod6.z.string()),
307
- tags: import_zod6.z.array(import_zod6.z.string()).optional(),
308
- displayName: import_zod6.z.string(),
310
+ var ReportCaseSchema = import_zod8.z.object({
311
+ id: import_zod8.z.string(),
312
+ runId: import_zod8.z.string(),
313
+ source: import_zod8.z.string().optional(),
314
+ file: import_zod8.z.string(),
315
+ displayFile: import_zod8.z.string(),
316
+ title: import_zod8.z.string(),
317
+ fullName: import_zod8.z.string(),
318
+ ancestorTitles: import_zod8.z.array(import_zod8.z.string()),
319
+ tags: import_zod8.z.array(import_zod8.z.string()).optional(),
320
+ displayName: import_zod8.z.string(),
309
321
  status: VitestJsonStatusSchema,
310
322
  durationMs: FiniteNumberSchema.optional(),
311
323
  location: VitestJsonLocationSchema.optional(),
312
- failureMessages: import_zod6.z.array(import_zod6.z.string()).default([]),
324
+ failureMessages: import_zod8.z.array(import_zod8.z.string()).default([]),
313
325
  eval: EvalMetaSchema.optional(),
314
326
  harness: HarnessMetaSchema.optional()
315
327
  }).strict();
316
- var ReportWorkspaceSchema = import_zod6.z.object({
317
- schemaVersion: import_zod6.z.literal(REPORT_WORKSPACE_SCHEMA_VERSION),
318
- runs: import_zod6.z.array(ReportRunSchema),
319
- cases: import_zod6.z.array(ReportCaseSchema)
328
+ var ReportWorkspaceSchema = import_zod8.z.object({
329
+ schemaVersion: import_zod8.z.literal(REPORT_WORKSPACE_SCHEMA_VERSION),
330
+ runs: import_zod8.z.array(ReportRunSchema),
331
+ cases: import_zod8.z.array(ReportCaseSchema)
320
332
  }).strict();
321
333
  function collectReportWorkspace(input, options = {}) {
322
334
  const entries = Array.isArray(input) ? input : [input];
@@ -332,6 +344,11 @@ function collectReportWorkspace(input, options = {}) {
332
344
  if (!meta) {
333
345
  continue;
334
346
  }
347
+ const evalMeta = meta.eval ?? (meta.harness ? {
348
+ avgScore: assertion.status === "passed" ? 1 : assertion.status === "failed" ? 0 : null,
349
+ scores: [],
350
+ thresholdFailed: false
351
+ } : void 0);
335
352
  runCases.push({
336
353
  id: createCaseId(runId, file.name, assertion),
337
354
  runId,
@@ -347,7 +364,7 @@ function collectReportWorkspace(input, options = {}) {
347
364
  ...typeof assertion.duration === "number" ? { durationMs: assertion.duration } : {},
348
365
  ...assertion.location ? { location: assertion.location } : {},
349
366
  failureMessages: assertion.failureMessages ?? [],
350
- ...meta.eval ? { eval: meta.eval } : {},
367
+ ...evalMeta ? { eval: evalMeta } : {},
351
368
  ...meta.harness ? { harness: meta.harness } : {}
352
369
  });
353
370
  }