@kortyx/agent 0.38.1 → 0.40.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/evals.js CHANGED
@@ -24,6 +24,7 @@ __export(evals_exports, {
24
24
  EvalCostAmountSchema: () => EvalCostAmountSchema,
25
25
  EvalCostsSchema: () => EvalCostsSchema,
26
26
  EvalEvidencePolicySchema: () => EvalEvidencePolicySchema,
27
+ EvalExecutionSettingsSchema: () => EvalExecutionSettingsSchema,
27
28
  EvalIssueSchema: () => EvalIssueSchema,
28
29
  EvalJudgeIdentitySchema: () => EvalJudgeIdentitySchema,
29
30
  EvalJudgeUsageSchema: () => EvalJudgeUsageSchema,
@@ -33,11 +34,15 @@ __export(evals_exports, {
33
34
  EvalRemoteRunRequestSchema: () => EvalRemoteRunRequestSchema,
34
35
  EvalResumeResponseSchema: () => EvalResumeResponseSchema,
35
36
  EvalRunResultSchema: () => EvalRunResultSchema,
37
+ EvalSettingsResponseSchema: () => EvalSettingsResponseSchema,
38
+ EvalSettingsSchema: () => EvalSettingsSchema,
36
39
  EvalStepResultSchema: () => EvalStepResultSchema,
37
40
  EvalSuiteSchema: () => EvalSuiteSchema,
41
+ EvalTerminationSchema: () => EvalTerminationSchema,
38
42
  EvalVerdictSchema: () => EvalVerdictSchema,
39
43
  EvalWireEventSchema: () => EvalWireEventSchema,
40
44
  EvaluationMetadataSchema: () => EvaluationMetadataSchema,
45
+ ResolvedEvalSettingsSchema: () => ResolvedEvalSettingsSchema,
41
46
  StudioEvalDetailSchema: () => StudioEvalDetailSchema,
42
47
  StudioEvalHistorySchema: () => StudioEvalHistorySchema,
43
48
  StudioEvalJudgeRequestSchema: () => StudioEvalJudgeRequestSchema,
@@ -54,14 +59,16 @@ __export(evals_exports, {
54
59
  createStudioEvalJudge: () => createStudioEvalJudge,
55
60
  defineSuite: () => defineSuite,
56
61
  getEvalGradeEvidence: () => getEvalGradeEvidence,
57
- parseEvalSuite: () => parseEvalSuite
62
+ parseEvalSuite: () => parseEvalSuite,
63
+ resolveEvalSettings: () => resolveEvalSettings
58
64
  });
59
65
  module.exports = __toCommonJS(evals_exports);
60
66
 
61
67
  // src/evals/contracts.ts
62
68
  var import_errors = require("@kortyx/core/errors");
63
69
  var import_browser = require("@kortyx/prompts/browser");
64
- var import_zod2 = require("zod");
70
+ var import_telemetry_contracts = require("@kortyx/telemetry-contracts");
71
+ var import_zod3 = require("zod");
65
72
 
66
73
  // src/evals/evidence-policy.ts
67
74
  var import_zod = require("zod");
@@ -101,30 +108,126 @@ var EvalEvidencePolicySchema = import_zod.z.object({
101
108
  ]).optional()
102
109
  }).strict();
103
110
 
111
+ // src/evals/settings.ts
112
+ var import_zod2 = require("zod");
113
+ var timeout = import_zod2.z.number().int().min(1).max(2147483647);
114
+ var EvalSettingsSchema = import_zod2.z.object({
115
+ repetitions: import_zod2.z.number().int().min(1).max(20).optional(),
116
+ concurrency: import_zod2.z.number().int().min(1).max(20).optional(),
117
+ caseTimeoutMs: timeout.optional(),
118
+ runTimeoutMs: timeout.optional(),
119
+ judge: import_zod2.z.enum(["studio", "app"]).optional()
120
+ }).strict();
121
+ var EvalExecutionSettingsSchema = import_zod2.z.object({
122
+ defaults: EvalSettingsSchema.omit({ runTimeoutMs: true, judge: true }),
123
+ limits: import_zod2.z.object({
124
+ concurrency: import_zod2.z.number().int().positive().max(20).optional(),
125
+ caseTimeoutMs: timeout.optional()
126
+ }).strict(),
127
+ overrides: import_zod2.z.array(import_zod2.z.enum(["repetitions", "concurrency", "caseTimeoutMs"]))
128
+ }).strict();
129
+ var ResolvedEvalSettingsSchema = import_zod2.z.object({
130
+ values: EvalSettingsSchema.required(),
131
+ sources: import_zod2.z.record(
132
+ import_zod2.z.enum([
133
+ "repetitions",
134
+ "concurrency",
135
+ "caseTimeoutMs",
136
+ "runTimeoutMs",
137
+ "judge"
138
+ ]),
139
+ import_zod2.z.enum(["run", "studio", "sdk", "sdk-default", "studio-default"])
140
+ )
141
+ }).strict();
142
+ var EvalSettingsResponseSchema = import_zod2.z.object({
143
+ defaults: EvalSettingsSchema,
144
+ installation: EvalSettingsSchema,
145
+ maxRunTimeoutMs: timeout,
146
+ canEdit: import_zod2.z.boolean()
147
+ });
148
+ var EvalTerminationSchema = import_zod2.z.object({
149
+ code: import_zod2.z.enum([
150
+ "EVAL_RUN_TIMEOUT",
151
+ "EVAL_CANCELLED",
152
+ "EVAL_LEASE_LOST",
153
+ "EVAL_EXECUTION_UNKNOWN",
154
+ "EVAL_EXECUTOR_FAILED"
155
+ ]),
156
+ message: import_zod2.z.string(),
157
+ timeoutMs: timeout.optional(),
158
+ phase: import_zod2.z.string().optional(),
159
+ cleanup: import_zod2.z.enum(["signalled", "unknown"]).optional(),
160
+ diagnosticId: import_zod2.z.string().uuid().optional()
161
+ }).strict();
162
+ function resolveEvalSettings(overrides = {}, studio = {}, execution, installation = {}, maxRunTimeoutMs = 2147483647) {
163
+ const values = {
164
+ repetitions: 1,
165
+ concurrency: 1,
166
+ caseTimeoutMs: 6e4,
167
+ runTimeoutMs: 30 * 6e4,
168
+ judge: "studio"
169
+ };
170
+ const sources = {
171
+ repetitions: "sdk-default",
172
+ concurrency: "sdk-default",
173
+ caseTimeoutMs: "sdk-default",
174
+ runTimeoutMs: "studio-default",
175
+ judge: "studio-default"
176
+ };
177
+ for (const [input, source] of [
178
+ [execution?.defaults ?? {}, "sdk"],
179
+ [installation, "studio"],
180
+ [studio, "studio"],
181
+ [overrides, "run"]
182
+ ]) {
183
+ const parsed = EvalSettingsSchema.parse(input);
184
+ for (const key of Object.keys(parsed)) {
185
+ if (parsed[key] !== void 0) {
186
+ Object.assign(values, { [key]: parsed[key] });
187
+ sources[key] = source;
188
+ }
189
+ }
190
+ }
191
+ if (values.runTimeoutMs > maxRunTimeoutMs)
192
+ throw new Error(
193
+ `Evaluation timeout exceeds the administrator maximum of ${maxRunTimeoutMs} ms.`
194
+ );
195
+ for (const key of ["concurrency", "caseTimeoutMs"]) {
196
+ const max = execution?.limits[key];
197
+ if (max !== void 0 && values[key] > max)
198
+ throw new Error(`${key} exceeds the application maximum of ${max}.`);
199
+ }
200
+ if (!execution?.overrides.includes("caseTimeoutMs") && (overrides.caseTimeoutMs !== void 0 || studio.caseTimeoutMs !== void 0 || installation.caseTimeoutMs !== void 0))
201
+ throw new Error(
202
+ "Update the consumer SDK to support case timeout overrides."
203
+ );
204
+ return { values, sources };
205
+ }
206
+
104
207
  // src/evals/contracts.ts
105
- var id2 = import_zod2.z.string().trim().min(1).max(256);
106
- var failureDescriptor = import_zod2.z.custom(import_errors.isFailureDescriptor).transform(
208
+ var id2 = import_zod3.z.string().trim().min(1).max(256);
209
+ var failureDescriptor = import_zod3.z.custom(import_errors.isFailureDescriptor).transform(
107
210
  (value) => JSON.parse(JSON.stringify((0, import_errors.serializeFailure)(value)))
108
211
  );
109
- var handler = import_zod2.z.object({ using: id2, params: import_zod2.z.json().optional() }).strict();
110
- var EvalResumeResponseSchema = import_zod2.z.discriminatedUnion("type", [
111
- import_zod2.z.object({ type: import_zod2.z.literal("text"), text: import_zod2.z.string() }).strict(),
112
- import_zod2.z.object({ type: import_zod2.z.literal("select"), ids: import_zod2.z.array(import_zod2.z.string()) }).strict(),
113
- import_zod2.z.object({ type: import_zod2.z.literal("value"), value: import_zod2.z.json() }).strict(),
114
- import_zod2.z.object({ type: import_zod2.z.literal("cancel") }).strict()
212
+ var handler = import_zod3.z.object({ using: id2, params: import_zod3.z.json().optional() }).strict();
213
+ var EvalResumeResponseSchema = import_zod3.z.discriminatedUnion("type", [
214
+ import_zod3.z.object({ type: import_zod3.z.literal("text"), text: import_zod3.z.string() }).strict(),
215
+ import_zod3.z.object({ type: import_zod3.z.literal("select"), ids: import_zod3.z.array(import_zod3.z.string()) }).strict(),
216
+ import_zod3.z.object({ type: import_zod3.z.literal("value"), value: import_zod3.z.json() }).strict(),
217
+ import_zod3.z.object({ type: import_zod3.z.literal("cancel") }).strict()
115
218
  ]);
116
- var expectation = import_zod2.z.object({
117
- type: import_zod2.z.enum(["answer", "interrupt"]),
219
+ var expectation = import_zod3.z.object({
220
+ type: import_zod3.z.enum(["answer", "interrupt"]),
118
221
  schemaId: id2.optional(),
119
222
  schemaVersion: id2.optional(),
120
- outputs: import_zod2.z.array(import_zod2.z.object({ schemaId: id2, schemaVersion: id2.optional() }).strict()).optional(),
121
- criteria: import_zod2.z.array(
122
- import_zod2.z.union([
123
- import_zod2.z.string().trim().min(1),
124
- import_zod2.z.object({ id: id2, text: import_zod2.z.string().trim().min(1) }).strict()
223
+ outputs: import_zod3.z.array(import_zod3.z.object({ schemaId: id2, schemaVersion: id2.optional() }).strict()).optional(),
224
+ criteria: import_zod3.z.array(
225
+ import_zod3.z.union([
226
+ import_zod3.z.string().trim().min(1),
227
+ import_zod3.z.object({ id: id2, text: import_zod3.z.string().trim().min(1) }).strict()
125
228
  ])
126
229
  ).optional(),
127
- reference: import_zod2.z.json().optional()
230
+ reference: import_zod3.z.json().optional()
128
231
  }).strict().superRefine((value, ctx) => {
129
232
  if (value.type === "answer" && (value.schemaId || value.schemaVersion))
130
233
  ctx.addIssue({
@@ -140,21 +243,21 @@ var expectation = import_zod2.z.object({
140
243
  message: "Criterion IDs must be unique within a step."
141
244
  });
142
245
  });
143
- var EvalSuiteSchema = import_zod2.z.object({
246
+ var EvalSuiteSchema = import_zod3.z.object({
144
247
  evidence: EvalEvidencePolicySchema.optional(),
145
248
  id: id2,
146
- name: import_zod2.z.string().optional(),
147
- cases: import_zod2.z.array(
148
- import_zod2.z.object({
249
+ name: import_zod3.z.string().optional(),
250
+ cases: import_zod3.z.array(
251
+ import_zod3.z.object({
149
252
  id: id2,
150
- name: import_zod2.z.string().optional(),
151
- params: import_zod2.z.json().optional(),
253
+ name: import_zod3.z.string().optional(),
254
+ params: import_zod3.z.json().optional(),
152
255
  workflowId: id2.optional(),
153
- steps: import_zod2.z.array(
154
- import_zod2.z.union([
155
- import_zod2.z.object({ message: import_zod2.z.string().min(1), expect: expectation }).strict(),
156
- import_zod2.z.object({
157
- resume: import_zod2.z.union([EvalResumeResponseSchema, handler]),
256
+ steps: import_zod3.z.array(
257
+ import_zod3.z.union([
258
+ import_zod3.z.object({ message: import_zod3.z.string().min(1), expect: expectation }).strict(),
259
+ import_zod3.z.object({
260
+ resume: import_zod3.z.union([EvalResumeResponseSchema, handler]),
158
261
  expect: expectation
159
262
  }).strict()
160
263
  ])
@@ -162,44 +265,44 @@ var EvalSuiteSchema = import_zod2.z.object({
162
265
  }).strict()
163
266
  ).min(1)
164
267
  }).strict();
165
- var EvalVerdictSchema = import_zod2.z.object({
166
- passed: import_zod2.z.boolean(),
167
- reason: import_zod2.z.string().trim().min(1),
168
- evidence: import_zod2.z.array(import_zod2.z.string().min(1))
268
+ var EvalVerdictSchema = import_zod3.z.object({
269
+ passed: import_zod3.z.boolean(),
270
+ reason: import_zod3.z.string().trim().min(1),
271
+ evidence: import_zod3.z.array(import_zod3.z.string().min(1))
169
272
  }).strict();
170
- var EvalObservationSchema = import_zod2.z.object({
273
+ var EvalObservationSchema = import_zod3.z.object({
171
274
  failure: failureDescriptor.optional(),
172
- diagnosticId: import_zod2.z.uuid().optional(),
173
- promptUsage: import_zod2.z.array(
174
- import_zod2.z.object({
175
- id: import_zod2.z.string(),
176
- version: import_zod2.z.number().int().positive(),
177
- hash: import_zod2.z.string().regex(/^[a-f0-9]{64}$/),
178
- environment: import_zod2.z.string(),
179
- snapshotRevision: import_zod2.z.string(),
180
- model: import_zod2.z.string().optional()
275
+ diagnosticId: import_zod3.z.uuid().optional(),
276
+ promptUsage: import_zod3.z.array(
277
+ import_zod3.z.object({
278
+ id: import_zod3.z.string(),
279
+ version: import_zod3.z.number().int().positive(),
280
+ hash: import_zod3.z.string().regex(/^[a-f0-9]{64}$/),
281
+ environment: import_zod3.z.string(),
282
+ snapshotRevision: import_zod3.z.string(),
283
+ model: import_zod3.z.string().optional()
181
284
  }).strict()
182
285
  ).optional(),
183
- type: import_zod2.z.enum(["answer", "interrupt", "error", "cancelled"]),
184
- text: import_zod2.z.string(),
185
- structured: import_zod2.z.array(import_zod2.z.json()),
186
- events: import_zod2.z.array(import_zod2.z.json()).optional(),
187
- runId: import_zod2.z.string().optional(),
188
- checkpointId: import_zod2.z.string().optional(),
189
- interrupt: import_zod2.z.object({
190
- requestId: import_zod2.z.string(),
191
- kind: import_zod2.z.enum(["text", "choice", "multi-choice", "custom"]),
192
- question: import_zod2.z.string().optional(),
193
- schemaId: import_zod2.z.string().optional(),
194
- schemaVersion: import_zod2.z.string().optional(),
195
- options: import_zod2.z.array(
196
- import_zod2.z.object({
197
- id: import_zod2.z.string(),
198
- label: import_zod2.z.string(),
199
- description: import_zod2.z.string().optional()
286
+ type: import_zod3.z.enum(["answer", "interrupt", "error", "cancelled"]),
287
+ text: import_zod3.z.string(),
288
+ structured: import_zod3.z.array(import_zod3.z.json()),
289
+ events: import_zod3.z.array(import_zod3.z.json()).optional(),
290
+ runId: import_zod3.z.string().optional(),
291
+ checkpointId: import_zod3.z.string().optional(),
292
+ interrupt: import_zod3.z.object({
293
+ requestId: import_zod3.z.string(),
294
+ kind: import_zod3.z.enum(["text", "choice", "multi-choice", "custom"]),
295
+ question: import_zod3.z.string().optional(),
296
+ schemaId: import_zod3.z.string().optional(),
297
+ schemaVersion: import_zod3.z.string().optional(),
298
+ options: import_zod3.z.array(
299
+ import_zod3.z.object({
300
+ id: import_zod3.z.string(),
301
+ label: import_zod3.z.string(),
302
+ description: import_zod3.z.string().optional()
200
303
  }).strict()
201
304
  ),
202
- request: import_zod2.z.json().optional()
305
+ request: import_zod3.z.json().optional()
203
306
  }).strict().optional()
204
307
  }).strict().superRefine((value, ctx) => {
205
308
  if (value.type === "interrupt" !== Boolean(value.interrupt))
@@ -208,11 +311,16 @@ var EvalObservationSchema = import_zod2.z.object({
208
311
  message: "Interrupt observations require exactly one interrupt."
209
312
  });
210
313
  });
211
- var status = import_zod2.z.enum(["passed", "failed", "error", "cancelled", "ungraded"]);
212
- var EvalIssueSchema = import_zod2.z.object({
314
+ var status = import_zod3.z.enum(["passed", "failed", "error", "cancelled", "ungraded"]);
315
+ var EvalIssueSchema = import_zod3.z.object({
316
+ exception: import_telemetry_contracts.DiagnosticContentSchema.optional(),
317
+ details: import_zod3.z.object({
318
+ timeoutMs: import_zod3.z.number().positive().optional(),
319
+ httpStatus: import_zod3.z.number().int().min(100).max(599).optional()
320
+ }).strict().optional(),
213
321
  failure: failureDescriptor.optional(),
214
- diagnosticId: import_zod2.z.uuid().optional(),
215
- phase: import_zod2.z.enum([
322
+ diagnosticId: import_zod3.z.uuid().optional(),
323
+ phase: import_zod3.z.enum([
216
324
  "params",
217
325
  "setup",
218
326
  "execute",
@@ -223,196 +331,200 @@ var EvalIssueSchema = import_zod2.z.object({
223
331
  "cleanup",
224
332
  "reporting"
225
333
  ]),
226
- code: import_zod2.z.string(),
227
- message: import_zod2.z.string()
334
+ code: import_zod3.z.string(),
335
+ message: import_zod3.z.string()
228
336
  }).strict();
229
337
  var issue = EvalIssueSchema;
230
- var EvalJudgeUsageSchema = import_zod2.z.object({
231
- provider: import_zod2.z.string().min(1),
232
- model: import_zod2.z.string().min(1),
233
- occurredAt: import_zod2.z.iso.datetime(),
234
- usage: import_zod2.z.object({
235
- input: import_zod2.z.number().finite().nonnegative().optional(),
236
- output: import_zod2.z.number().finite().nonnegative().optional(),
237
- total: import_zod2.z.number().finite().nonnegative().optional(),
238
- reasoning: import_zod2.z.number().finite().nonnegative().optional(),
239
- cacheRead: import_zod2.z.number().finite().nonnegative().optional(),
240
- cacheWrite: import_zod2.z.number().finite().nonnegative().optional(),
241
- cacheWrite1h: import_zod2.z.number().finite().nonnegative().optional(),
242
- outputIncludesReasoning: import_zod2.z.boolean().optional(),
243
- inputIncludesCacheRead: import_zod2.z.boolean().optional(),
244
- inputIncludesCacheWrite: import_zod2.z.boolean().optional()
338
+ var EvalJudgeUsageSchema = import_zod3.z.object({
339
+ provider: import_zod3.z.string().min(1),
340
+ model: import_zod3.z.string().min(1),
341
+ occurredAt: import_zod3.z.iso.datetime(),
342
+ usage: import_zod3.z.object({
343
+ input: import_zod3.z.number().finite().nonnegative().optional(),
344
+ output: import_zod3.z.number().finite().nonnegative().optional(),
345
+ total: import_zod3.z.number().finite().nonnegative().optional(),
346
+ reasoning: import_zod3.z.number().finite().nonnegative().optional(),
347
+ cacheRead: import_zod3.z.number().finite().nonnegative().optional(),
348
+ cacheWrite: import_zod3.z.number().finite().nonnegative().optional(),
349
+ cacheWrite1h: import_zod3.z.number().finite().nonnegative().optional(),
350
+ outputIncludesReasoning: import_zod3.z.boolean().optional(),
351
+ inputIncludesCacheRead: import_zod3.z.boolean().optional(),
352
+ inputIncludesCacheWrite: import_zod3.z.boolean().optional()
245
353
  }).strict().optional(),
246
- pricingContext: import_zod2.z.object({
247
- serviceTier: import_zod2.z.string().min(1).max(100).optional(),
248
- inferenceGeo: import_zod2.z.string().min(1).max(100).optional(),
249
- speed: import_zod2.z.string().min(1).max(100).optional()
354
+ pricingContext: import_zod3.z.object({
355
+ serviceTier: import_zod3.z.string().min(1).max(100).optional(),
356
+ inferenceGeo: import_zod3.z.string().min(1).max(100).optional(),
357
+ speed: import_zod3.z.string().min(1).max(100).optional()
250
358
  }).strict().optional(),
251
- pricing: import_zod2.z.object({
252
- source: import_zod2.z.literal("provider"),
253
- currency: import_zod2.z.literal("USD"),
254
- actualCostMicros: import_zod2.z.number().int().nonnegative().safe()
359
+ pricing: import_zod3.z.object({
360
+ source: import_zod3.z.literal("provider"),
361
+ currency: import_zod3.z.literal("USD"),
362
+ actualCostMicros: import_zod3.z.number().int().nonnegative().safe()
255
363
  }).strict().optional()
256
364
  }).strict();
257
- var EvalStepResultSchema = import_zod2.z.object({
258
- evidence: import_zod2.z.object({
259
- version: import_zod2.z.literal("compact-v1"),
260
- history: import_zod2.z.boolean(),
365
+ var EvalStepResultSchema = import_zod3.z.object({
366
+ evidence: import_zod3.z.object({
367
+ version: import_zod3.z.literal("compact-v1"),
368
+ history: import_zod3.z.boolean(),
261
369
  observation: EvalObservationSchema
262
370
  }).strict().optional(),
263
- index: import_zod2.z.number().int().nonnegative(),
264
- input: import_zod2.z.union([
265
- import_zod2.z.object({ message: import_zod2.z.string() }).strict(),
266
- import_zod2.z.object({ resume: EvalResumeResponseSchema }).strict()
371
+ index: import_zod3.z.number().int().nonnegative(),
372
+ input: import_zod3.z.union([
373
+ import_zod3.z.object({ message: import_zod3.z.string() }).strict(),
374
+ import_zod3.z.object({ resume: EvalResumeResponseSchema }).strict()
267
375
  ]),
268
376
  expectation,
269
377
  observation: EvalObservationSchema,
270
- reference: import_zod2.z.json().optional(),
378
+ reference: import_zod3.z.json().optional(),
271
379
  status,
272
- reason: import_zod2.z.string().optional(),
273
- judgeCalls: import_zod2.z.number().int().nonnegative().optional(),
274
- judgeUsage: import_zod2.z.array(EvalJudgeUsageSchema).optional(),
275
- criteria: import_zod2.z.array(
276
- EvalVerdictSchema.extend({ id: import_zod2.z.string(), text: import_zod2.z.string() })
380
+ reason: import_zod3.z.string().optional(),
381
+ judgeCalls: import_zod3.z.number().int().nonnegative().optional(),
382
+ judgeUsage: import_zod3.z.array(EvalJudgeUsageSchema).optional(),
383
+ criteria: import_zod3.z.array(
384
+ EvalVerdictSchema.extend({ id: import_zod3.z.string(), text: import_zod3.z.string() })
277
385
  )
278
386
  }).strict();
279
- var runtimeExecution = import_zod2.z.object({ sessionId: import_zod2.z.string().min(1), runId: import_zod2.z.string().min(1) }).strict();
280
- var EvalCaseResultSchema = import_zod2.z.object({
387
+ var runtimeExecution = import_zod3.z.object({ sessionId: import_zod3.z.string().min(1), runId: import_zod3.z.string().min(1) }).strict();
388
+ var EvalCaseResultSchema = import_zod3.z.object({
281
389
  verification: EvalVerdictSchema.optional(),
282
- phaseDurationsMs: import_zod2.z.partialRecord(issue.shape.phase, import_zod2.z.number().finite().nonnegative()).optional(),
390
+ phaseDurationsMs: import_zod3.z.partialRecord(issue.shape.phase, import_zod3.z.number().finite().nonnegative()).optional(),
283
391
  caseId: id2,
284
- repetition: import_zod2.z.number().int().positive(),
285
- attemptId: import_zod2.z.uuid().optional(),
286
- runtimeExecutions: import_zod2.z.array(runtimeExecution).optional(),
287
- sessionId: import_zod2.z.string(),
392
+ repetition: import_zod3.z.number().int().positive(),
393
+ attemptId: import_zod3.z.uuid().optional(),
394
+ runtimeExecutions: import_zod3.z.array(runtimeExecution).optional(),
395
+ sessionId: import_zod3.z.string(),
288
396
  status,
289
- durationMs: import_zod2.z.number().nonnegative(),
290
- steps: import_zod2.z.array(EvalStepResultSchema),
291
- errors: import_zod2.z.array(issue)
397
+ durationMs: import_zod3.z.number().nonnegative(),
398
+ steps: import_zod3.z.array(EvalStepResultSchema),
399
+ errors: import_zod3.z.array(issue)
292
400
  }).strict();
293
- var EvalJudgeIdentitySchema = import_zod2.z.object({
401
+ var EvalJudgeIdentitySchema = import_zod3.z.object({
294
402
  id: id2,
295
403
  version: id2,
296
- location: import_zod2.z.enum(["app", "studio"]).optional()
404
+ location: import_zod3.z.enum(["app", "studio"]).optional()
297
405
  }).strict();
298
406
  var judge = EvalJudgeIdentitySchema;
299
- var StudioEvalJudgeRequestSchema = import_zod2.z.object({
407
+ var StudioEvalJudgeRequestSchema = import_zod3.z.object({
300
408
  environment: id2,
301
409
  judge: EvalJudgeIdentitySchema,
302
- criterion: import_zod2.z.object({ id: id2, text: import_zod2.z.string().trim().min(1).max(16384) }).strict(),
410
+ criterion: import_zod3.z.object({ id: id2, text: import_zod3.z.string().trim().min(1).max(16384) }).strict(),
303
411
  input: EvalStepResultSchema.shape.input,
304
412
  observation: EvalObservationSchema,
305
- reference: import_zod2.z.json().optional(),
306
- conversation: import_zod2.z.array(EvalStepResultSchema).max(100)
413
+ reference: import_zod3.z.json().optional(),
414
+ conversation: import_zod3.z.array(EvalStepResultSchema).max(100)
307
415
  }).strict();
308
- var StudioEvalJudgeResponseSchema = import_zod2.z.object({
416
+ var StudioEvalJudgeResponseSchema = import_zod3.z.object({
309
417
  judge: EvalJudgeIdentitySchema,
310
418
  verdict: EvalVerdictSchema,
311
- usage: import_zod2.z.array(EvalJudgeUsageSchema).optional()
419
+ usage: import_zod3.z.array(EvalJudgeUsageSchema).optional()
312
420
  }).strict();
313
- var EvalRunResultSchema = import_zod2.z.object({
314
- id: import_zod2.z.uuid(),
421
+ var EvalRunResultSchema = import_zod3.z.object({
422
+ id: import_zod3.z.uuid(),
315
423
  suiteId: id2,
316
- suiteRevision: import_zod2.z.string().regex(/^[a-f0-9]{64}$/),
424
+ suiteRevision: import_zod3.z.string().regex(/^[a-f0-9]{64}$/),
317
425
  suite: EvalSuiteSchema,
318
426
  judge: judge.optional(),
319
- startedAt: import_zod2.z.iso.datetime(),
320
- durationMs: import_zod2.z.number().nonnegative(),
427
+ startedAt: import_zod3.z.iso.datetime(),
428
+ durationMs: import_zod3.z.number().nonnegative(),
321
429
  status,
322
- counts: import_zod2.z.object({
323
- passed: import_zod2.z.number().int().nonnegative(),
324
- failed: import_zod2.z.number().int().nonnegative(),
325
- error: import_zod2.z.number().int().nonnegative(),
326
- cancelled: import_zod2.z.number().int().nonnegative(),
327
- ungraded: import_zod2.z.number().int().nonnegative().optional()
430
+ counts: import_zod3.z.object({
431
+ passed: import_zod3.z.number().int().nonnegative(),
432
+ failed: import_zod3.z.number().int().nonnegative(),
433
+ error: import_zod3.z.number().int().nonnegative(),
434
+ cancelled: import_zod3.z.number().int().nonnegative(),
435
+ ungraded: import_zod3.z.number().int().nonnegative().optional()
328
436
  }).strict(),
329
- cases: import_zod2.z.array(EvalCaseResultSchema),
330
- errors: import_zod2.z.array(issue)
437
+ cases: import_zod3.z.array(EvalCaseResultSchema),
438
+ errors: import_zod3.z.array(issue)
331
439
  }).strict();
332
- var EvalManifestSchema = import_zod2.z.object({
333
- schemaVersion: import_zod2.z.literal(1),
334
- studioJudging: import_zod2.z.literal(true).optional(),
335
- promptContracts: import_zod2.z.array(
336
- import_zod2.z.object({
337
- id: import_zod2.z.string(),
338
- format: import_zod2.z.enum(["system-user", "chat"]),
339
- variablesSchema: import_zod2.z.record(import_zod2.z.string(), import_zod2.z.unknown()),
340
- configSchema: import_zod2.z.record(import_zod2.z.string(), import_zod2.z.unknown())
440
+ var EvalManifestSchema = import_zod3.z.object({
441
+ execution: EvalExecutionSettingsSchema.optional(),
442
+ schemaVersion: import_zod3.z.literal(1),
443
+ studioJudging: import_zod3.z.literal(true).optional(),
444
+ promptContracts: import_zod3.z.array(
445
+ import_zod3.z.object({
446
+ id: import_zod3.z.string(),
447
+ format: import_zod3.z.enum(["system-user", "chat"]),
448
+ variablesSchema: import_zod3.z.record(import_zod3.z.string(), import_zod3.z.unknown()),
449
+ configSchema: import_zod3.z.record(import_zod3.z.string(), import_zod3.z.unknown())
341
450
  }).strict()
342
451
  ).optional(),
343
- attemptScheduling: import_zod2.z.literal(true).optional(),
344
- suites: import_zod2.z.array(EvalSuiteSchema),
345
- responders: import_zod2.z.array(
346
- import_zod2.z.object({
452
+ attemptScheduling: import_zod3.z.literal(true).optional(),
453
+ suites: import_zod3.z.array(EvalSuiteSchema),
454
+ responders: import_zod3.z.array(
455
+ import_zod3.z.object({
347
456
  name: id2,
348
457
  schemaId: id2.optional(),
349
458
  schemaVersion: id2.optional()
350
459
  }).strict()
351
460
  ),
352
- references: import_zod2.z.array(id2),
353
- paramsSchema: import_zod2.z.record(import_zod2.z.string(), import_zod2.z.unknown()).optional(),
461
+ references: import_zod3.z.array(id2),
462
+ paramsSchema: import_zod3.z.record(import_zod3.z.string(), import_zod3.z.unknown()).optional(),
354
463
  judge: judge.optional()
355
464
  }).strict();
356
- var EvalProgressSchema = import_zod2.z.discriminatedUnion("type", [
357
- import_zod2.z.object({
358
- type: import_zod2.z.literal("case-dispatch"),
465
+ var EvalProgressSchema = import_zod3.z.discriminatedUnion("type", [
466
+ import_zod3.z.object({
467
+ type: import_zod3.z.literal("case-dispatch"),
359
468
  caseId: id2,
360
- repetition: import_zod2.z.number().int().positive(),
361
- status: import_zod2.z.enum(["queued", "retrying", "reconnecting"]),
362
- retryAt: import_zod2.z.iso.datetime().optional(),
363
- httpStatus: import_zod2.z.number().int().min(100).max(599).optional(),
364
- executionId: import_zod2.z.uuid().optional(),
365
- generation: import_zod2.z.uuid().optional()
469
+ repetition: import_zod3.z.number().int().positive(),
470
+ status: import_zod3.z.enum(["queued", "retrying", "reconnecting"]),
471
+ retryAt: import_zod3.z.iso.datetime().optional(),
472
+ httpStatus: import_zod3.z.number().int().min(100).max(599).optional(),
473
+ executionId: import_zod3.z.uuid().optional(),
474
+ generation: import_zod3.z.uuid().optional()
366
475
  }).strict(),
367
- import_zod2.z.object({
368
- type: import_zod2.z.literal("case-runtime-associated"),
476
+ import_zod3.z.object({
477
+ type: import_zod3.z.literal("case-runtime-associated"),
369
478
  caseId: id2,
370
- repetition: import_zod2.z.number().int().positive(),
371
- attemptId: import_zod2.z.uuid(),
479
+ repetition: import_zod3.z.number().int().positive(),
480
+ attemptId: import_zod3.z.uuid(),
372
481
  execution: runtimeExecution
373
482
  }).strict(),
374
- import_zod2.z.object({
375
- type: import_zod2.z.literal("run-started"),
376
- caseIds: import_zod2.z.array(id2).min(1),
377
- repetitions: import_zod2.z.number().int().positive(),
378
- concurrency: import_zod2.z.number().int().positive()
483
+ import_zod3.z.object({
484
+ type: import_zod3.z.literal("run-started"),
485
+ caseIds: import_zod3.z.array(id2).min(1),
486
+ repetitions: import_zod3.z.number().int().positive(),
487
+ concurrency: import_zod3.z.number().int().positive()
379
488
  }).strict(),
380
- import_zod2.z.object({
381
- type: import_zod2.z.literal("case-progress"),
489
+ import_zod3.z.object({
490
+ type: import_zod3.z.literal("case-progress"),
382
491
  caseId: id2,
383
- repetition: import_zod2.z.number().int().positive(),
492
+ repetition: import_zod3.z.number().int().positive(),
384
493
  phase: issue.shape.phase,
385
- stepIndex: import_zod2.z.number().int().nonnegative().optional()
494
+ stepIndex: import_zod3.z.number().int().nonnegative().optional()
386
495
  }).strict(),
387
- import_zod2.z.object({
388
- type: import_zod2.z.literal("case-started"),
389
- attemptId: import_zod2.z.uuid().optional(),
496
+ import_zod3.z.object({
497
+ type: import_zod3.z.literal("case-started"),
498
+ attemptId: import_zod3.z.uuid().optional(),
390
499
  caseId: id2,
391
- repetition: import_zod2.z.number().int().positive(),
392
- sessionId: import_zod2.z.string()
500
+ repetition: import_zod3.z.number().int().positive(),
501
+ sessionId: import_zod3.z.string()
393
502
  }).strict(),
394
- import_zod2.z.object({
395
- type: import_zod2.z.literal("step-completed"),
503
+ import_zod3.z.object({
504
+ type: import_zod3.z.literal("step-completed"),
396
505
  caseId: id2,
397
- repetition: import_zod2.z.number().int().positive(),
506
+ repetition: import_zod3.z.number().int().positive(),
398
507
  step: EvalStepResultSchema
399
508
  }).strict(),
400
- import_zod2.z.object({ type: import_zod2.z.literal("case-completed"), result: EvalCaseResultSchema }).strict()
509
+ import_zod3.z.object({ type: import_zod3.z.literal("case-completed"), result: EvalCaseResultSchema }).strict()
401
510
  ]);
402
- var EvalRemoteRunRequestSchema = import_zod2.z.object({
511
+ var EvalRemoteRunRequestSchema = import_zod3.z.object({
403
512
  promptSnapshot: import_browser.PromptSnapshotSchema.optional(),
404
- promptGroupName: import_zod2.z.string().optional(),
513
+ promptGroupName: import_zod3.z.string().optional(),
514
+ caseTimeoutMs: EvalSettingsSchema.shape.caseTimeoutMs,
515
+ runTimeoutMs: EvalSettingsSchema.shape.runTimeoutMs,
516
+ resolvedSettings: ResolvedEvalSettingsSchema.optional(),
405
517
  suiteId: id2,
406
- suiteRevision: import_zod2.z.string().regex(/^[a-f0-9]{64}$/),
407
- grading: import_zod2.z.enum(["app", "studio"]).optional(),
518
+ suiteRevision: import_zod3.z.string().regex(/^[a-f0-9]{64}$/),
519
+ grading: import_zod3.z.enum(["app", "studio"]).optional(),
408
520
  judge: EvalJudgeIdentitySchema.optional(),
409
- caseIds: import_zod2.z.array(id2).min(1).max(100).optional(),
410
- repetitions: import_zod2.z.number().int().min(1).max(20).default(1),
411
- concurrency: import_zod2.z.number().int().min(1).max(20).default(1),
412
- attempt: import_zod2.z.object({
521
+ caseIds: import_zod3.z.array(id2).min(1).max(100).optional(),
522
+ repetitions: import_zod3.z.number().int().min(1).max(20).default(1),
523
+ concurrency: import_zod3.z.number().int().min(1).max(20).default(1),
524
+ attempt: import_zod3.z.object({
413
525
  caseId: id2,
414
- repetition: import_zod2.z.number().int().min(1).max(20),
415
- evaluationId: import_zod2.z.uuid()
526
+ repetition: import_zod3.z.number().int().min(1).max(20),
527
+ evaluationId: import_zod3.z.uuid()
416
528
  }).strict().optional()
417
529
  }).strict();
418
530
  var StudioEvalStartRequestSchema = EvalRemoteRunRequestSchema.omit({
@@ -422,39 +534,42 @@ var StudioEvalStartRequestSchema = EvalRemoteRunRequestSchema.omit({
422
534
  promptGroupName: true,
423
535
  attempt: true
424
536
  }).extend({
425
- promptSelection: import_zod2.z.discriminatedUnion("type", [
426
- import_zod2.z.object({ type: import_zod2.z.literal("live") }).strict(),
427
- import_zod2.z.object({
428
- type: import_zod2.z.literal("single"),
429
- id: import_zod2.z.string(),
430
- version: import_zod2.z.number().int().positive()
537
+ promptSelection: import_zod3.z.discriminatedUnion("type", [
538
+ import_zod3.z.object({ type: import_zod3.z.literal("live") }).strict(),
539
+ import_zod3.z.object({
540
+ type: import_zod3.z.literal("single"),
541
+ id: import_zod3.z.string(),
542
+ version: import_zod3.z.number().int().positive()
431
543
  }).strict(),
432
- import_zod2.z.object({ type: import_zod2.z.literal("group"), groupId: import_zod2.z.uuid() }).strict()
544
+ import_zod3.z.object({ type: import_zod3.z.literal("group"), groupId: import_zod3.z.uuid() }).strict()
433
545
  ]).optional(),
434
- targetId: import_zod2.z.string().min(1).max(128),
435
- judge: import_zod2.z.enum(["studio", "app"]).default("studio")
546
+ targetId: import_zod3.z.string().min(1).max(128),
547
+ judge: import_zod3.z.enum(["studio", "app"]).optional(),
548
+ repetitions: EvalSettingsSchema.shape.repetitions,
549
+ concurrency: EvalSettingsSchema.shape.concurrency
436
550
  });
437
- var EvalWireEventSchema = import_zod2.z.discriminatedUnion("type", [
438
- import_zod2.z.object({
439
- type: import_zod2.z.literal("execution-status"),
440
- state: import_zod2.z.enum(["queued", "running", "completed", "cancelled", "unknown"])
551
+ var EvalWireEventSchema = import_zod3.z.discriminatedUnion("type", [
552
+ import_zod3.z.object({
553
+ type: import_zod3.z.literal("execution-status"),
554
+ state: import_zod3.z.enum(["queued", "running", "completed", "cancelled", "unknown"])
441
555
  }).strict(),
442
- import_zod2.z.object({
443
- type: import_zod2.z.literal("progress"),
556
+ import_zod3.z.object({
557
+ type: import_zod3.z.literal("progress"),
444
558
  event: EvalProgressSchema,
445
- sequence: import_zod2.z.number().int().positive().optional()
559
+ sequence: import_zod3.z.number().int().positive().optional()
446
560
  }).strict(),
447
- import_zod2.z.object({
448
- type: import_zod2.z.literal("result"),
561
+ import_zod3.z.object({
562
+ type: import_zod3.z.literal("result"),
449
563
  result: EvalRunResultSchema,
450
- sequence: import_zod2.z.number().int().positive().optional()
564
+ sequence: import_zod3.z.number().int().positive().optional()
451
565
  }).strict(),
452
- import_zod2.z.object({
453
- type: import_zod2.z.literal("error"),
454
- message: import_zod2.z.string(),
566
+ import_zod3.z.object({
567
+ type: import_zod3.z.literal("error"),
568
+ exception: import_telemetry_contracts.DiagnosticContentSchema.optional(),
569
+ message: import_zod3.z.string(),
455
570
  failure: failureDescriptor.optional(),
456
- diagnosticId: import_zod2.z.uuid().optional(),
457
- sequence: import_zod2.z.number().int().positive().optional()
571
+ diagnosticId: import_zod3.z.uuid().optional(),
572
+ sequence: import_zod3.z.number().int().positive().optional()
458
573
  }).strict()
459
574
  ]);
460
575
  var EvalConfigurationError = class extends Error {
@@ -489,7 +604,8 @@ function defineSuite(suite) {
489
604
 
490
605
  // src/evals/errors.ts
491
606
  var import_errors2 = require("@kortyx/core/errors");
492
- var import_zod3 = require("zod");
607
+ var import_telemetry_contracts2 = require("@kortyx/telemetry-contracts");
608
+ var import_zod4 = require("zod");
493
609
  var messages = {
494
610
  params: "Case parameters failed validation.",
495
611
  setup: "Case setup failed.",
@@ -505,6 +621,9 @@ function createEvalIssue(phase, error, options = {}) {
505
621
  const control = (0, import_errors2.isControlFlowError)(error);
506
622
  const declared = !control && ((0, import_errors2.isFailureDescriptor)(error) || (0, import_errors2.isFailureDescriptor)((0, import_errors2.errorProperty)(error, "failure")));
507
623
  const failure = (0, import_errors2.serializeFailure)(control ? void 0 : error);
624
+ const exception = !control && error !== void 0 ? (0, import_telemetry_contracts2.captureDiagnosticContent)(error) : null;
625
+ const rawMessage = typeof error === "string" ? error : (0, import_errors2.errorProperty)(error, "message");
626
+ const originalMessage = typeof rawMessage === "string" ? (0, import_telemetry_contracts2.redactDiagnosticText)(rawMessage) : void 0;
508
627
  let diagnosticId = options.diagnosticId ?? (0, import_errors2.errorProperty)(error, "diagnosticId");
509
628
  if (!control && !diagnosticId && options.reportError) {
510
629
  try {
@@ -512,33 +631,38 @@ function createEvalIssue(phase, error, options = {}) {
512
631
  } catch {
513
632
  }
514
633
  }
634
+ const candidate = (0, import_errors2.errorProperty)(error, "statusCode") ?? (0, import_errors2.errorProperty)(error, "status");
635
+ const httpStatus = typeof candidate === "number" && Number.isInteger(candidate) && candidate >= 100 && candidate <= 599 ? candidate : void 0;
515
636
  return {
637
+ ...exception ? { exception } : {},
638
+ ...httpStatus ? { details: { httpStatus } } : {},
516
639
  phase,
517
640
  code: declared ? failure.code : options.code ?? "EVAL_HOOK_FAILED",
518
- message: declared ? failure.message : messages[phase],
641
+ message: originalMessage ?? (declared ? failure.message : `${messages[phase]}${httpStatus ? ` HTTP ${httpStatus}.` : ""}`),
519
642
  failure,
520
- ...typeof diagnosticId === "string" && import_zod3.z.uuid().safeParse(diagnosticId).success ? { diagnosticId } : {}
643
+ ...typeof diagnosticId === "string" && import_zod4.z.uuid().safeParse(diagnosticId).success ? { diagnosticId } : {}
521
644
  };
522
645
  }
523
646
 
524
647
  // src/evals/evaluation-contracts.ts
525
- var import_zod5 = require("zod");
648
+ var import_zod6 = require("zod");
526
649
 
527
650
  // src/evals/studio-contracts.ts
528
651
  var import_browser2 = require("@kortyx/prompts/browser");
529
- var import_zod4 = require("zod");
530
- var StudioEvalTargetsResponseSchema = import_zod4.z.object({
531
- canRun: import_zod4.z.boolean(),
652
+ var import_zod5 = require("zod");
653
+ var StudioEvalTargetsResponseSchema = import_zod5.z.object({
654
+ canRun: import_zod5.z.boolean(),
655
+ settings: EvalSettingsResponseSchema.optional(),
532
656
  studioJudge: EvalJudgeIdentitySchema.nullable().optional(),
533
- targets: import_zod4.z.array(
534
- import_zod4.z.object({
535
- id: import_zod4.z.string(),
536
- name: import_zod4.z.string(),
537
- environment: import_zod4.z.string(),
538
- error: import_zod4.z.string().nullable(),
657
+ targets: import_zod5.z.array(
658
+ import_zod5.z.object({
659
+ id: import_zod5.z.string(),
660
+ name: import_zod5.z.string(),
661
+ environment: import_zod5.z.string(),
662
+ error: import_zod5.z.string().nullable(),
539
663
  // Safe discovery diagnostics; optional for compatibility with older APIs.
540
- diagnostic: import_zod4.z.object({
541
- code: import_zod4.z.enum([
664
+ diagnostic: import_zod5.z.object({
665
+ code: import_zod5.z.enum([
542
666
  "environment_forbidden",
543
667
  "environment_unavailable",
544
668
  "endpoint_not_found",
@@ -547,44 +671,47 @@ var StudioEvalTargetsResponseSchema = import_zod4.z.object({
547
671
  "endpoint_unreachable",
548
672
  "manifest_invalid"
549
673
  ]),
550
- httpStatus: import_zod4.z.number().int().min(100).max(599).optional()
674
+ httpStatus: import_zod5.z.number().int().min(100).max(599).optional()
551
675
  }).nullable().optional(),
552
676
  manifest: EvalManifestSchema.nullable(),
553
- revisions: import_zod4.z.record(import_zod4.z.string(), import_zod4.z.string())
677
+ revisions: import_zod5.z.record(import_zod5.z.string(), import_zod5.z.string())
554
678
  })
555
679
  )
556
680
  });
557
- var EvalCostAmountSchema = import_zod4.z.object({
558
- costSummary: import_zod4.z.object({
559
- amounts: import_zod4.z.array(
560
- import_zod4.z.object({
561
- amount: import_zod4.z.number().finite().nonnegative(),
562
- currency: import_zod4.z.string().nullable()
681
+ var EvalCostAmountSchema = import_zod5.z.object({
682
+ costSummary: import_zod5.z.object({
683
+ amounts: import_zod5.z.array(
684
+ import_zod5.z.object({
685
+ amount: import_zod5.z.number().finite().nonnegative(),
686
+ currency: import_zod5.z.string().nullable()
563
687
  })
564
688
  ),
565
- complete: import_zod4.z.boolean()
689
+ complete: import_zod5.z.boolean()
566
690
  }).optional(),
567
- amount: import_zod4.z.number().finite().nonnegative().nullable(),
568
- currency: import_zod4.z.string().nullable(),
569
- status: import_zod4.z.enum(["complete", "partial", "unavailable"]),
570
- calls: import_zod4.z.number().int().nonnegative(),
571
- unpricedCalls: import_zod4.z.number().int().nonnegative(),
572
- estimated: import_zod4.z.boolean()
691
+ amount: import_zod5.z.number().finite().nonnegative().nullable(),
692
+ currency: import_zod5.z.string().nullable(),
693
+ status: import_zod5.z.enum(["complete", "partial", "unavailable"]),
694
+ calls: import_zod5.z.number().int().nonnegative(),
695
+ unpricedCalls: import_zod5.z.number().int().nonnegative(),
696
+ estimated: import_zod5.z.boolean()
573
697
  });
574
- var EvalCostsSchema = import_zod4.z.object({
698
+ var EvalCostsSchema = import_zod5.z.object({
575
699
  workflow: EvalCostAmountSchema,
576
700
  judge: EvalCostAmountSchema,
577
701
  total: EvalCostAmountSchema
578
702
  });
579
- var StudioEvalRunSummarySchema = import_zod4.z.object({
580
- id: import_zod4.z.uuid(),
581
- evaluationId: import_zod4.z.uuid().nullable().optional(),
582
- targetId: import_zod4.z.string(),
583
- targetName: import_zod4.z.string(),
584
- environment: import_zod4.z.string(),
585
- suiteId: import_zod4.z.string(),
586
- suiteRevision: import_zod4.z.string(),
587
- status: import_zod4.z.enum([
703
+ var StudioEvalRunSummarySchema = import_zod5.z.object({
704
+ issue: EvalIssueSchema.nullable().optional(),
705
+ termination: EvalTerminationSchema.nullable().optional(),
706
+ resolvedSettings: ResolvedEvalSettingsSchema.optional(),
707
+ id: import_zod5.z.uuid(),
708
+ evaluationId: import_zod5.z.uuid().nullable().optional(),
709
+ targetId: import_zod5.z.string(),
710
+ targetName: import_zod5.z.string(),
711
+ environment: import_zod5.z.string(),
712
+ suiteId: import_zod5.z.string(),
713
+ suiteRevision: import_zod5.z.string(),
714
+ status: import_zod5.z.enum([
588
715
  "queued",
589
716
  "running",
590
717
  "passed",
@@ -592,49 +719,52 @@ var StudioEvalRunSummarySchema = import_zod4.z.object({
592
719
  "error",
593
720
  "cancelled"
594
721
  ]),
595
- createdAt: import_zod4.z.string(),
596
- startedAt: import_zod4.z.string().nullable(),
597
- endedAt: import_zod4.z.string().nullable(),
598
- error: import_zod4.z.string().nullable(),
599
- cancelRequestedAt: import_zod4.z.string().nullable(),
722
+ createdAt: import_zod5.z.string(),
723
+ startedAt: import_zod5.z.string().nullable(),
724
+ endedAt: import_zod5.z.string().nullable(),
725
+ error: import_zod5.z.string().nullable(),
726
+ cancelRequestedAt: import_zod5.z.string().nullable(),
600
727
  costs: EvalCostsSchema.optional(),
601
- counts: import_zod4.z.object({
602
- passed: import_zod4.z.number(),
603
- failed: import_zod4.z.number(),
604
- error: import_zod4.z.number(),
605
- cancelled: import_zod4.z.number()
728
+ counts: import_zod5.z.object({
729
+ passed: import_zod5.z.number(),
730
+ failed: import_zod5.z.number(),
731
+ error: import_zod5.z.number(),
732
+ cancelled: import_zod5.z.number()
606
733
  }).nullable().optional(),
607
- suiteName: import_zod4.z.string().nullable().optional(),
608
- totalAttempts: import_zod4.z.number().int().nonnegative().optional(),
609
- completedAttempts: import_zod4.z.number().int().nonnegative().optional(),
610
- phase: import_zod4.z.string().optional()
734
+ suiteName: import_zod5.z.string().nullable().optional(),
735
+ totalAttempts: import_zod5.z.number().int().nonnegative().optional(),
736
+ completedAttempts: import_zod5.z.number().int().nonnegative().optional(),
737
+ phase: import_zod5.z.string().optional()
611
738
  });
612
- var StudioEvalHistorySchema = import_zod4.z.object({
613
- runs: import_zod4.z.array(StudioEvalRunSummarySchema)
739
+ var StudioEvalHistorySchema = import_zod5.z.object({
740
+ runs: import_zod5.z.array(StudioEvalRunSummarySchema)
614
741
  });
615
- var StudioEvalDetailSchema = import_zod4.z.object({
742
+ var StudioEvalDetailSchema = import_zod5.z.object({
616
743
  run: StudioEvalRunSummarySchema.extend({
617
- caseCosts: import_zod4.z.record(import_zod4.z.string(), EvalCostsSchema).optional(),
618
- request: import_zod4.z.object({
619
- caseIds: import_zod4.z.array(import_zod4.z.string()).optional(),
620
- grading: import_zod4.z.enum(["app", "studio"]).optional(),
744
+ caseCosts: import_zod5.z.record(import_zod5.z.string(), EvalCostsSchema).optional(),
745
+ request: import_zod5.z.object({
746
+ caseIds: import_zod5.z.array(import_zod5.z.string()).optional(),
747
+ grading: import_zod5.z.enum(["app", "studio"]).optional(),
621
748
  judge: EvalJudgeIdentitySchema.optional(),
622
- repetitions: import_zod4.z.number().int().positive(),
623
- concurrency: import_zod4.z.number().optional(),
749
+ repetitions: import_zod5.z.number().int().positive(),
750
+ concurrency: import_zod5.z.number().optional(),
751
+ caseTimeoutMs: import_zod5.z.number().optional(),
752
+ runTimeoutMs: import_zod5.z.number().optional(),
753
+ resolvedSettings: ResolvedEvalSettingsSchema.optional(),
624
754
  promptSnapshot: import_browser2.PromptSnapshotSchema.optional(),
625
- promptGroupName: import_zod4.z.string().optional()
755
+ promptGroupName: import_zod5.z.string().optional()
626
756
  }).optional(),
627
757
  suite: EvalSuiteSchema,
628
758
  result: EvalRunResultSchema.nullable(),
629
- events: import_zod4.z.array(import_zod4.z.object({ id: import_zod4.z.number(), event: EvalProgressSchema }))
759
+ events: import_zod5.z.array(import_zod5.z.object({ id: import_zod5.z.number(), event: EvalProgressSchema }))
630
760
  })
631
761
  });
632
762
 
633
763
  // src/evals/evaluation-contracts.ts
634
- var EvaluationMetadataSchema = import_zod5.z.object({
635
- source: import_zod5.z.enum(["manual", "deployment", "schedule", "ci"]).default("manual"),
636
- commit: import_zod5.z.string().trim().min(1).max(100).optional(),
637
- deploymentUrl: import_zod5.z.url().refine((value) => {
764
+ var EvaluationMetadataSchema = import_zod6.z.object({
765
+ source: import_zod6.z.enum(["manual", "deployment", "schedule", "ci"]).default("manual"),
766
+ commit: import_zod6.z.string().trim().min(1).max(100).optional(),
767
+ deploymentUrl: import_zod6.z.url().refine((value) => {
638
768
  try {
639
769
  const url = new URL(value);
640
770
  return ["https:", "http:"].includes(url.protocol) && !url.username && !url.password;
@@ -643,62 +773,79 @@ var EvaluationMetadataSchema = import_zod5.z.object({
643
773
  }
644
774
  }, "Expected an HTTP(S) URL without credentials").optional()
645
775
  }).strict();
646
- var StudioEvaluationStartRequestSchema = import_zod5.z.object({
647
- targetId: import_zod5.z.string().trim().min(1),
648
- name: import_zod5.z.string().trim().min(1).max(200).optional(),
776
+ var StudioEvaluationStartRequestSchema = import_zod6.z.object({
777
+ targetId: import_zod6.z.string().trim().min(1),
778
+ name: import_zod6.z.string().trim().min(1).max(200).optional(),
649
779
  promptSelection: StudioEvalStartRequestSchema.shape.promptSelection,
650
- selection: import_zod5.z.enum(["all", "selected"]),
651
- suites: import_zod5.z.array(
652
- import_zod5.z.object({
653
- suiteId: import_zod5.z.string().min(1),
654
- suiteRevision: import_zod5.z.string().regex(/^[a-f0-9]{64}$/),
655
- caseIds: import_zod5.z.array(import_zod5.z.string().min(1)).min(1).max(100).optional()
780
+ selection: import_zod6.z.enum(["all", "selected"]),
781
+ suites: import_zod6.z.array(
782
+ import_zod6.z.object({
783
+ suiteId: import_zod6.z.string().min(1),
784
+ suiteRevision: import_zod6.z.string().regex(/^[a-f0-9]{64}$/),
785
+ caseIds: import_zod6.z.array(import_zod6.z.string().min(1)).min(1).max(100).optional()
656
786
  }).strict()
657
787
  ).min(1).max(100),
658
- judge: import_zod5.z.enum(["studio", "app"]).default("studio"),
659
- repetitions: import_zod5.z.number().int().min(1).max(20).default(1),
660
- concurrency: import_zod5.z.number().int().min(1).max(20).default(1),
788
+ ...EvalSettingsSchema.shape,
661
789
  metadata: EvaluationMetadataSchema.default({ source: "manual" }),
662
- idempotencyKey: import_zod5.z.string().trim().min(1).max(200).optional()
790
+ idempotencyKey: import_zod6.z.string().trim().min(1).max(200).optional()
663
791
  }).strict();
664
- var StudioEvaluationSummarySchema = import_zod5.z.object({
665
- id: import_zod5.z.uuid(),
666
- name: import_zod5.z.string(),
667
- targetId: import_zod5.z.string(),
668
- targetName: import_zod5.z.string(),
669
- environment: import_zod5.z.string(),
670
- selection: import_zod5.z.enum(["all", "selected"]),
792
+ var StudioEvaluationSummarySchema = import_zod6.z.object({
793
+ termination: EvalTerminationSchema.nullable().optional(),
794
+ resolvedSettings: ResolvedEvalSettingsSchema.optional(),
795
+ interruptedSuites: import_zod6.z.number().int().nonnegative().optional(),
796
+ failures: import_zod6.z.array(
797
+ import_zod6.z.object({
798
+ suiteRunId: import_zod6.z.uuid(),
799
+ caseId: import_zod6.z.string().optional(),
800
+ repetition: import_zod6.z.number().int().positive().optional(),
801
+ phase: import_zod6.z.string(),
802
+ code: import_zod6.z.string(),
803
+ message: import_zod6.z.string(),
804
+ diagnosticId: import_zod6.z.string().uuid().optional()
805
+ })
806
+ ).optional(),
807
+ pendingAttempts: import_zod6.z.object({
808
+ notStarted: import_zod6.z.number().int().nonnegative(),
809
+ executing: import_zod6.z.number().int().nonnegative(),
810
+ awaitingGrading: import_zod6.z.number().int().nonnegative()
811
+ }).optional(),
812
+ id: import_zod6.z.uuid(),
813
+ name: import_zod6.z.string(),
814
+ targetId: import_zod6.z.string(),
815
+ targetName: import_zod6.z.string(),
816
+ environment: import_zod6.z.string(),
817
+ selection: import_zod6.z.enum(["all", "selected"]),
671
818
  metadata: EvaluationMetadataSchema,
672
819
  judge: EvalJudgeIdentitySchema.optional(),
673
820
  status: StudioEvalRunSummarySchema.shape.status,
674
- createdAt: import_zod5.z.string(),
675
- startedAt: import_zod5.z.string().nullable(),
676
- endedAt: import_zod5.z.string().nullable(),
677
- cancelRequestedAt: import_zod5.z.string().nullable(),
678
- suiteCount: import_zod5.z.number().int().nonnegative(),
679
- completedSuites: import_zod5.z.number().int().nonnegative(),
680
- totalAttempts: import_zod5.z.number().int().nonnegative(),
681
- completedAttempts: import_zod5.z.number().int().nonnegative(),
682
- counts: import_zod5.z.object({
683
- passed: import_zod5.z.number(),
684
- failed: import_zod5.z.number(),
685
- error: import_zod5.z.number(),
686
- cancelled: import_zod5.z.number()
821
+ createdAt: import_zod6.z.string(),
822
+ startedAt: import_zod6.z.string().nullable(),
823
+ endedAt: import_zod6.z.string().nullable(),
824
+ cancelRequestedAt: import_zod6.z.string().nullable(),
825
+ suiteCount: import_zod6.z.number().int().nonnegative(),
826
+ completedSuites: import_zod6.z.number().int().nonnegative(),
827
+ totalAttempts: import_zod6.z.number().int().nonnegative(),
828
+ completedAttempts: import_zod6.z.number().int().nonnegative(),
829
+ counts: import_zod6.z.object({
830
+ passed: import_zod6.z.number(),
831
+ failed: import_zod6.z.number(),
832
+ error: import_zod6.z.number(),
833
+ cancelled: import_zod6.z.number()
687
834
  }),
688
835
  costs: EvalCostsSchema.optional(),
689
- legacy: import_zod5.z.boolean().optional()
836
+ legacy: import_zod6.z.boolean().optional()
690
837
  });
691
- var StudioEvaluationHistorySchema = import_zod5.z.object({
692
- runs: import_zod5.z.array(StudioEvaluationSummarySchema)
838
+ var StudioEvaluationHistorySchema = import_zod6.z.object({
839
+ runs: import_zod6.z.array(StudioEvaluationSummarySchema)
693
840
  });
694
- var StudioEvaluationDetailSchema = import_zod5.z.object({
841
+ var StudioEvaluationDetailSchema = import_zod6.z.object({
695
842
  run: StudioEvaluationSummarySchema.extend({
696
- suites: import_zod5.z.array(StudioEvalRunSummarySchema)
843
+ suites: import_zod6.z.array(StudioEvalRunSummarySchema)
697
844
  })
698
845
  });
699
- var StudioEvaluationResultsSchema = import_zod5.z.object({
846
+ var StudioEvaluationResultsSchema = import_zod6.z.object({
700
847
  run: StudioEvaluationSummarySchema.extend({
701
- suites: import_zod5.z.array(StudioEvalDetailSchema.shape.run)
848
+ suites: import_zod6.z.array(StudioEvalDetailSchema.shape.run)
702
849
  })
703
850
  });
704
851
 
@@ -795,11 +942,12 @@ function getEvalGradeEvidence(step, previous) {
795
942
  }
796
943
 
797
944
  // src/evals/studio-judge.ts
945
+ var import_telemetry_contracts3 = require("@kortyx/telemetry-contracts");
798
946
  async function readJson(response, signal) {
799
- if (!response.ok || !response.body) {
800
- await response.body?.cancel().catch(() => {
801
- });
802
- throw new Error("Studio judge is unavailable or rejected the request.");
947
+ if (!response.body) {
948
+ throw new Error(
949
+ `Studio judge returned HTTP ${response.status} with no response body.`
950
+ );
803
951
  }
804
952
  const reader = response.body.getReader();
805
953
  const abort = () => {
@@ -821,7 +969,18 @@ async function readJson(response, signal) {
821
969
  text += decoder.decode(part.value, { stream: true });
822
970
  }
823
971
  signal.throwIfAborted();
824
- return JSON.parse(text + decoder.decode());
972
+ text += decoder.decode();
973
+ if (!response.ok)
974
+ throw Object.assign(
975
+ new Error(
976
+ `Studio judge returned HTTP ${response.status}: ${(0, import_telemetry_contracts3.redactDiagnosticText)(text)}`
977
+ ),
978
+ {
979
+ statusCode: response.status,
980
+ responseBody: (0, import_telemetry_contracts3.redactDiagnosticText)(text)
981
+ }
982
+ );
983
+ return JSON.parse(text);
825
984
  } finally {
826
985
  signal.removeEventListener("abort", abort);
827
986
  await reader.cancel().catch(() => {
@@ -907,6 +1066,7 @@ async function createStudioEvalJudge(options) {
907
1066
  EvalCostAmountSchema,
908
1067
  EvalCostsSchema,
909
1068
  EvalEvidencePolicySchema,
1069
+ EvalExecutionSettingsSchema,
910
1070
  EvalIssueSchema,
911
1071
  EvalJudgeIdentitySchema,
912
1072
  EvalJudgeUsageSchema,
@@ -916,11 +1076,15 @@ async function createStudioEvalJudge(options) {
916
1076
  EvalRemoteRunRequestSchema,
917
1077
  EvalResumeResponseSchema,
918
1078
  EvalRunResultSchema,
1079
+ EvalSettingsResponseSchema,
1080
+ EvalSettingsSchema,
919
1081
  EvalStepResultSchema,
920
1082
  EvalSuiteSchema,
1083
+ EvalTerminationSchema,
921
1084
  EvalVerdictSchema,
922
1085
  EvalWireEventSchema,
923
1086
  EvaluationMetadataSchema,
1087
+ ResolvedEvalSettingsSchema,
924
1088
  StudioEvalDetailSchema,
925
1089
  StudioEvalHistorySchema,
926
1090
  StudioEvalJudgeRequestSchema,
@@ -937,6 +1101,7 @@ async function createStudioEvalJudge(options) {
937
1101
  createStudioEvalJudge,
938
1102
  defineSuite,
939
1103
  getEvalGradeEvidence,
940
- parseEvalSuite
1104
+ parseEvalSuite,
1105
+ resolveEvalSettings
941
1106
  });
942
1107
  //# sourceMappingURL=evals.js.map