stepproof 0.3.0 → 0.5.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.
Files changed (74) hide show
  1. package/dist/adapters/anthropic.d.ts +7 -2
  2. package/dist/adapters/anthropic.d.ts.map +1 -1
  3. package/dist/adapters/anthropic.js +35 -4
  4. package/dist/adapters/anthropic.js.map +1 -1
  5. package/dist/adapters/azure-openai.d.ts +13 -0
  6. package/dist/adapters/azure-openai.d.ts.map +1 -0
  7. package/dist/adapters/azure-openai.js +90 -0
  8. package/dist/adapters/azure-openai.js.map +1 -0
  9. package/dist/adapters/base.d.ts +20 -1
  10. package/dist/adapters/base.d.ts.map +1 -1
  11. package/dist/adapters/bedrock.d.ts +11 -0
  12. package/dist/adapters/bedrock.d.ts.map +1 -0
  13. package/dist/adapters/bedrock.js +145 -0
  14. package/dist/adapters/bedrock.js.map +1 -0
  15. package/dist/adapters/gemini.d.ts +3 -2
  16. package/dist/adapters/gemini.d.ts.map +1 -1
  17. package/dist/adapters/gemini.js +38 -4
  18. package/dist/adapters/gemini.js.map +1 -1
  19. package/dist/adapters/index.d.ts +7 -0
  20. package/dist/adapters/index.d.ts.map +1 -1
  21. package/dist/adapters/index.js +36 -1
  22. package/dist/adapters/index.js.map +1 -1
  23. package/dist/adapters/ollama.d.ts +3 -2
  24. package/dist/adapters/ollama.d.ts.map +1 -1
  25. package/dist/adapters/ollama.js +22 -6
  26. package/dist/adapters/ollama.js.map +1 -1
  27. package/dist/adapters/openai.d.ts +7 -2
  28. package/dist/adapters/openai.d.ts.map +1 -1
  29. package/dist/adapters/openai.js +37 -6
  30. package/dist/adapters/openai.js.map +1 -1
  31. package/dist/assertions/engine.d.ts +12 -1
  32. package/dist/assertions/engine.d.ts.map +1 -1
  33. package/dist/assertions/engine.js +343 -1
  34. package/dist/assertions/engine.js.map +1 -1
  35. package/dist/baseline.d.ts +2 -1
  36. package/dist/baseline.d.ts.map +1 -1
  37. package/dist/baseline.js +18 -1
  38. package/dist/baseline.js.map +1 -1
  39. package/dist/cli.js +163 -6
  40. package/dist/cli.js.map +1 -1
  41. package/dist/commands/diff.d.ts +2 -0
  42. package/dist/commands/diff.d.ts.map +1 -0
  43. package/dist/commands/diff.js +252 -0
  44. package/dist/commands/diff.js.map +1 -0
  45. package/dist/commands/generate.d.ts +12 -0
  46. package/dist/commands/generate.d.ts.map +1 -0
  47. package/dist/commands/generate.js +112 -0
  48. package/dist/commands/generate.js.map +1 -0
  49. package/dist/commands/watch.d.ts +7 -0
  50. package/dist/commands/watch.d.ts.map +1 -0
  51. package/dist/commands/watch.js +84 -0
  52. package/dist/commands/watch.js.map +1 -0
  53. package/dist/core/scenario-parser.d.ts +1 -1
  54. package/dist/core/scenario-parser.d.ts.map +1 -1
  55. package/dist/core/scenario-parser.js +191 -9
  56. package/dist/core/scenario-parser.js.map +1 -1
  57. package/dist/core/scenario-runner.d.ts +4 -0
  58. package/dist/core/scenario-runner.d.ts.map +1 -1
  59. package/dist/core/scenario-runner.js +402 -61
  60. package/dist/core/scenario-runner.js.map +1 -1
  61. package/dist/core/types.d.ts +80 -4
  62. package/dist/core/types.d.ts.map +1 -1
  63. package/dist/dataset.d.ts +6 -0
  64. package/dist/dataset.d.ts.map +1 -0
  65. package/dist/dataset.js +108 -0
  66. package/dist/dataset.js.map +1 -0
  67. package/dist/reporters/github-comment.d.ts +8 -0
  68. package/dist/reporters/github-comment.d.ts.map +1 -0
  69. package/dist/reporters/github-comment.js +114 -0
  70. package/dist/reporters/github-comment.js.map +1 -0
  71. package/dist/reporters/terminal-reporter.d.ts.map +1 -1
  72. package/dist/reporters/terminal-reporter.js +39 -5
  73. package/dist/reporters/terminal-reporter.js.map +1 -1
  74. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import * as path from 'node:path';
2
- import { getAdapter } from '../adapters/index.js';
2
+ import { getAdapter, getCustomAdapter } from '../adapters/index.js';
3
3
  import { runAssertions } from '../assertions/engine.js';
4
4
  import { substituteVariables } from './scenario-parser.js';
5
5
  import { getCached, setCache } from '../cache.js';
@@ -16,90 +16,398 @@ function calculateCost(model, inputTokens, outputTokens) {
16
16
  return 0;
17
17
  return (inputTokens / 1000) * pricing.input + (outputTokens / 1000) * pricing.output;
18
18
  }
19
- export async function runScenario(scenario, scenarioFilePath, options = {}) {
20
- const iterations = options.iterations ?? scenario.iterations ?? 10;
21
- const scenarioDir = path.dirname(path.resolve(scenarioFilePath));
22
- const variables = scenario.variables ?? {};
23
- const startedAt = new Date().toISOString();
19
+ function delayMs(ms) {
20
+ return new Promise((resolve) => setTimeout(resolve, ms));
21
+ }
22
+ /** Build CallOptions from step-level config fields */
23
+ function buildCallOptions(step) {
24
+ if (step.temperature === undefined && step.top_p === undefined && step.max_tokens === undefined) {
25
+ return undefined;
26
+ }
27
+ return {
28
+ temperature: step.temperature,
29
+ topP: step.top_p,
30
+ maxTokens: step.max_tokens,
31
+ };
32
+ }
33
+ /** Wrap a promise with a timeout using Promise.race */
34
+ function withTimeout(promise, timeoutMs) {
35
+ return new Promise((resolve, reject) => {
36
+ const timer = setTimeout(() => reject(new Error(`Step timed out after ${timeoutMs}ms`)), timeoutMs);
37
+ promise.then((val) => { clearTimeout(timer); resolve(val); }, (err) => { clearTimeout(timer); reject(err); });
38
+ });
39
+ }
40
+ // ── Streaming execution ─────────────────────────────────────────────
41
+ /**
42
+ * Execute a step using streaming and collect TTFT/TPS/ITL metrics.
43
+ * Falls back to non-streaming if the adapter doesn't support it.
44
+ */
45
+ async function executeStreaming(step, resolvedPrompt, resolvedSystem, callOptions, scenarioDir) {
46
+ const adapter = step.provider === 'custom' && step.plugin
47
+ ? await getCustomAdapter(path.resolve(scenarioDir, step.plugin))
48
+ : getAdapter(step.provider, step.model);
49
+ if (!adapter.stream) {
50
+ // Fallback: adapter doesn't support streaming
51
+ return adapter.call(resolvedPrompt, resolvedSystem, callOptions);
52
+ }
24
53
  const startMs = Date.now();
25
- const allResults = [];
26
- const useCache = !options.noCache;
27
- const cacheStats = { hits: 0, misses: 0 };
28
- for (let i = 1; i <= iterations; i++) {
29
- const stepOutputs = {};
30
- for (const step of scenario.steps) {
31
- const resolvedPrompt = substituteVariables(step.prompt, variables, stepOutputs);
32
- const resolvedSystem = step.system
33
- ? substituteVariables(step.system, variables, stepOutputs)
34
- : undefined;
35
- let output = '';
36
- let error;
37
- let durationMs = 0;
38
- let inputTokens;
39
- let outputTokens;
40
- let costUsd;
41
- try {
42
- // Check cache before calling adapter
43
- let response = useCache
54
+ const tokens = [];
55
+ const timestamps = [];
56
+ const gen = adapter.stream(resolvedPrompt, resolvedSystem, callOptions);
57
+ for await (const chunk of gen) {
58
+ tokens.push(chunk.token);
59
+ timestamps.push(chunk.timestampMs);
60
+ }
61
+ const endMs = Date.now();
62
+ const text = tokens.join('');
63
+ const durationMs = endMs - startMs;
64
+ // Compute stream metrics — O(n) single pass over timestamps
65
+ let ttftMs = 0;
66
+ let tokensPerSecond = 0;
67
+ let interTokenLatencyMs = 0;
68
+ if (timestamps.length > 0) {
69
+ ttftMs = timestamps[0] - startMs;
70
+ tokensPerSecond = durationMs > 0 ? (tokens.length / durationMs) * 1000 : 0;
71
+ if (timestamps.length > 1) {
72
+ let totalITL = 0;
73
+ for (let i = 1; i < timestamps.length; i++) {
74
+ totalITL += timestamps[i] - timestamps[i - 1];
75
+ }
76
+ interTokenLatencyMs = totalITL / (timestamps.length - 1);
77
+ }
78
+ }
79
+ return {
80
+ text,
81
+ durationMs,
82
+ streamMetrics: { ttftMs, tokensPerSecond, interTokenLatencyMs },
83
+ };
84
+ }
85
+ // ── Dependency graph helpers ──────────────────────────────────────────
86
+ /** Extract all {{step_id.output}} references from a string. O(n) in string length. */
87
+ function extractOutputRefs(text) {
88
+ const refs = [];
89
+ const regex = /\{\{(\w+)\.output\}\}/g;
90
+ let match;
91
+ while ((match = regex.exec(text)) !== null) {
92
+ refs.push(match[1]);
93
+ }
94
+ return refs;
95
+ }
96
+ /** Collect all step IDs referenced by a step (from prompt, conversation, system, if condition). */
97
+ function getImplicitDependencies(step) {
98
+ const refs = new Set();
99
+ if (step.prompt)
100
+ for (const r of extractOutputRefs(step.prompt))
101
+ refs.add(r);
102
+ if (step.system)
103
+ for (const r of extractOutputRefs(step.system))
104
+ refs.add(r);
105
+ if (step.conversation) {
106
+ for (const turn of step.conversation) {
107
+ if (turn.content)
108
+ for (const r of extractOutputRefs(turn.content))
109
+ refs.add(r);
110
+ }
111
+ }
112
+ if (step.if)
113
+ for (const r of extractOutputRefs(step.if))
114
+ refs.add(r);
115
+ return Array.from(refs);
116
+ }
117
+ /**
118
+ * Build full dependency set per step (explicit depends_on + implicit template refs).
119
+ * O(S * T) where S = steps, T = max template refs per step.
120
+ */
121
+ function buildDependencyMap(steps) {
122
+ const stepIds = new Set(steps.map(s => s.id));
123
+ const deps = new Map();
124
+ for (const step of steps) {
125
+ const stepDeps = new Set();
126
+ if (step.depends_on) {
127
+ for (const dep of step.depends_on) {
128
+ if (!stepIds.has(dep)) {
129
+ throw new Error(`Step "${step.id}" depends_on unknown step "${dep}"`);
130
+ }
131
+ stepDeps.add(dep);
132
+ }
133
+ }
134
+ for (const ref of getImplicitDependencies(step)) {
135
+ if (stepIds.has(ref))
136
+ stepDeps.add(ref);
137
+ }
138
+ deps.set(step.id, stepDeps);
139
+ }
140
+ return deps;
141
+ }
142
+ /** Check whether any parallelism exists in the dependency graph. */
143
+ function hasAnyParallelism(steps, depMap) {
144
+ if (steps.some(s => s.if || s.conversation))
145
+ return true;
146
+ let zeroDeps = 0;
147
+ for (const deps of depMap.values()) {
148
+ if (deps.size === 0)
149
+ zeroDeps++;
150
+ if (zeroDeps > 1)
151
+ return true;
152
+ }
153
+ return false;
154
+ }
155
+ // ── Conditional step evaluation ──────────────────────────────────────
156
+ function evaluateCondition(condition, variables, stepOutputs) {
157
+ const resolved = substituteVariables(condition, variables, stepOutputs);
158
+ const opMatch = resolved.match(/^(.+?)\s+(contains|not_contains|matches)\s+"(.*)"$/s);
159
+ if (!opMatch) {
160
+ throw new Error(`Invalid if condition: ${condition}. Expected: '<expr> contains|not_contains|matches "<value>"'`);
161
+ }
162
+ let subject = opMatch[1].trim();
163
+ const operator = opMatch[2];
164
+ const value = opMatch[3];
165
+ if ((subject.startsWith('"') && subject.endsWith('"')) ||
166
+ (subject.startsWith("'") && subject.endsWith("'"))) {
167
+ subject = subject.slice(1, -1);
168
+ }
169
+ switch (operator) {
170
+ case 'contains': return subject.includes(value);
171
+ case 'not_contains': return !subject.includes(value);
172
+ case 'matches': return new RegExp(value).test(subject);
173
+ default: return false;
174
+ }
175
+ }
176
+ // ── Multi-turn conversation execution ────────────────────────────────
177
+ async function executeConversation(step, variables, stepOutputs, resolvedSystem, useCache, cacheStats, scenarioDir) {
178
+ const turns = step.conversation;
179
+ const messages = [];
180
+ for (const turn of turns) {
181
+ if (turn.content !== undefined) {
182
+ const resolvedContent = substituteVariables(turn.content, variables, stepOutputs);
183
+ messages.push({ role: turn.role, content: resolvedContent });
184
+ }
185
+ else if (turn.role === 'assistant') {
186
+ break;
187
+ }
188
+ }
189
+ const cacheKeyStr = messages.map(m => `${m.role}:${m.content}`).join('|');
190
+ const cached = useCache
191
+ ? getCached(step.provider, step.model, cacheKeyStr, resolvedSystem)
192
+ : null;
193
+ if (cached !== null) {
194
+ cacheStats.hits++;
195
+ return cached;
196
+ }
197
+ const adapter = step.provider === 'custom' && step.plugin
198
+ ? await getCustomAdapter(path.resolve(scenarioDir, step.plugin))
199
+ : getAdapter(step.provider, step.model);
200
+ const callOptions = buildCallOptions(step);
201
+ const response = await adapter.chat(messages, resolvedSystem, callOptions);
202
+ cacheStats.misses++;
203
+ if (useCache) {
204
+ setCache(step.provider, step.model, cacheKeyStr, resolvedSystem, response);
205
+ }
206
+ return response;
207
+ }
208
+ // ── Single step execution (with retry) ───────────────────────────────
209
+ async function runStepIteration(step, iteration, variables, stepOutputs, scenarioDir, useCache, cacheStats, datasetRow) {
210
+ // Conditional: evaluate `if` and skip when false
211
+ if (step.if) {
212
+ const conditionMet = evaluateCondition(step.if, variables, stepOutputs);
213
+ if (!conditionMet) {
214
+ stepOutputs[step.id] = '';
215
+ return {
216
+ stepId: step.id,
217
+ iteration,
218
+ output: '',
219
+ passed: true,
220
+ skipped: true,
221
+ assertionResults: [],
222
+ durationMs: 0,
223
+ datasetRow,
224
+ };
225
+ }
226
+ }
227
+ const maxRetries = step.retry ?? 0;
228
+ const retryDelayVal = step.retry_delay ?? 1000;
229
+ let retriesUsed = 0;
230
+ const callOptions = buildCallOptions(step);
231
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
232
+ const resolvedSystem = step.system
233
+ ? substituteVariables(step.system, variables, stepOutputs)
234
+ : undefined;
235
+ let output = '';
236
+ let error;
237
+ let durationMs = 0;
238
+ let inputTokens;
239
+ let outputTokens;
240
+ let costUsd;
241
+ let streamMetrics;
242
+ try {
243
+ let response;
244
+ let callPromise;
245
+ if (step.conversation) {
246
+ callPromise = executeConversation(step, variables, stepOutputs, resolvedSystem, useCache, cacheStats, scenarioDir);
247
+ }
248
+ else if (step.stream) {
249
+ // Streaming mode — bypass cache, collect stream metrics
250
+ const resolvedPrompt = substituteVariables(step.prompt ?? '', variables, stepOutputs);
251
+ callPromise = executeStreaming(step, resolvedPrompt, resolvedSystem, callOptions, scenarioDir);
252
+ cacheStats.misses++;
253
+ }
254
+ else {
255
+ // Standard single-prompt mode
256
+ const resolvedPrompt = substituteVariables(step.prompt ?? '', variables, stepOutputs);
257
+ const cached = useCache
44
258
  ? getCached(step.provider, step.model, resolvedPrompt, resolvedSystem)
45
259
  : null;
46
- if (response !== null) {
260
+ if (cached !== null) {
47
261
  cacheStats.hits++;
262
+ callPromise = Promise.resolve(cached);
48
263
  }
49
264
  else {
50
- const adapter = getAdapter(step.provider, step.model);
51
- response = await adapter.call(resolvedPrompt, resolvedSystem);
52
- cacheStats.misses++;
53
- if (useCache) {
54
- setCache(step.provider, step.model, resolvedPrompt, resolvedSystem, response);
55
- }
265
+ const adapter = step.provider === 'custom' && step.plugin
266
+ ? await getCustomAdapter(path.resolve(scenarioDir, step.plugin))
267
+ : getAdapter(step.provider, step.model);
268
+ callPromise = adapter.call(resolvedPrompt, resolvedSystem, callOptions).then(resp => {
269
+ cacheStats.misses++;
270
+ if (useCache && attempt === 0) {
271
+ setCache(step.provider, step.model, resolvedPrompt, resolvedSystem, resp);
272
+ }
273
+ return resp;
274
+ });
56
275
  }
57
- output = response.text;
58
- durationMs = response.durationMs;
59
- if (response.usage) {
60
- inputTokens = response.usage.inputTokens;
61
- outputTokens = response.usage.outputTokens;
62
- costUsd = calculateCost(step.model, inputTokens, outputTokens);
63
- }
64
- stepOutputs[step.id] = output;
65
276
  }
66
- catch (e) {
67
- error = e.message;
68
- cacheStats.misses++;
69
- stepOutputs[step.id] = '';
277
+ // Apply timeout if configured
278
+ if (step.timeout) {
279
+ response = await withTimeout(callPromise, step.timeout);
280
+ }
281
+ else {
282
+ response = await callPromise;
70
283
  }
71
- let assertionResults = [];
72
- let assertionsPassed = false;
73
- if (!error) {
74
- const { results, allPassed } = await runAssertions(output, step.assertions, scenarioDir, { durationMs, costUsd });
75
- assertionResults = results;
76
- assertionsPassed = allPassed;
284
+ output = response.text;
285
+ durationMs = response.durationMs;
286
+ streamMetrics = response.streamMetrics;
287
+ if (response.usage) {
288
+ inputTokens = response.usage.inputTokens;
289
+ outputTokens = response.usage.outputTokens;
290
+ costUsd = calculateCost(step.model, inputTokens, outputTokens);
77
291
  }
78
- const stepPassed = !error && assertionsPassed;
79
- const result = {
292
+ stepOutputs[step.id] = output;
293
+ }
294
+ catch (e) {
295
+ error = e.message;
296
+ cacheStats.misses++;
297
+ stepOutputs[step.id] = '';
298
+ }
299
+ let assertionResults = [];
300
+ let assertionsPassed = false;
301
+ if (!error) {
302
+ const { results, allPassed } = await runAssertions(output, step.assertions, scenarioDir, { durationMs, costUsd, streamMetrics, scenarioName: '', stepId: step.id });
303
+ assertionResults = results;
304
+ assertionsPassed = allPassed;
305
+ }
306
+ const stepPassed = !error && assertionsPassed;
307
+ if (stepPassed || attempt === maxRetries) {
308
+ return {
80
309
  stepId: step.id,
81
- iteration: i,
310
+ iteration,
82
311
  output,
83
312
  passed: stepPassed,
313
+ retriesUsed,
314
+ datasetRow,
84
315
  assertionResults,
85
316
  error,
86
317
  durationMs,
87
318
  inputTokens,
88
319
  outputTokens,
89
320
  costUsd,
321
+ streamMetrics,
90
322
  };
91
- allResults.push(result);
92
- options.onStepComplete?.(step.id, stepPassed);
93
323
  }
94
- options.onIterationComplete?.(i, iterations);
324
+ retriesUsed++;
325
+ if (retryDelayVal > 0)
326
+ await delayMs(retryDelayVal);
95
327
  }
96
- // Aggregate per-step summaries
328
+ // Unreachable
329
+ throw new Error('Unreachable');
330
+ }
331
+ // ── Parallel step execution (topological) ────────────────────────────
332
+ async function executeStepsParallel(steps, depMap, variables, scenarioDir, iteration, useCache, cacheStats, onStepComplete, datasetRow) {
333
+ const results = [];
334
+ const stepOutputs = {};
335
+ const completed = new Set();
336
+ const remaining = new Set(steps.map(s => s.id));
337
+ const stepById = new Map(steps.map(s => [s.id, s]));
338
+ while (remaining.size > 0) {
339
+ const ready = [];
340
+ for (const id of remaining) {
341
+ const deps = depMap.get(id);
342
+ let allMet = true;
343
+ for (const dep of deps) {
344
+ if (!completed.has(dep)) {
345
+ allMet = false;
346
+ break;
347
+ }
348
+ }
349
+ if (allMet)
350
+ ready.push(stepById.get(id));
351
+ }
352
+ if (ready.length === 0) {
353
+ throw new Error(`Circular dependency detected among steps: ${Array.from(remaining).join(', ')}`);
354
+ }
355
+ const batchResults = await Promise.all(ready.map(step => runStepIteration(step, iteration, variables, stepOutputs, scenarioDir, useCache, cacheStats, datasetRow)));
356
+ for (const result of batchResults) {
357
+ results.push(result);
358
+ completed.add(result.stepId);
359
+ remaining.delete(result.stepId);
360
+ onStepComplete?.(result.stepId, result.passed);
361
+ }
362
+ }
363
+ return results;
364
+ }
365
+ // ── Main entry point ─────────────────────────────────────────────────
366
+ export async function runScenario(scenario, scenarioFilePath, options = {}) {
367
+ const iterations = options.iterations ?? scenario.iterations ?? 10;
368
+ const scenarioDir = path.dirname(path.resolve(scenarioFilePath));
369
+ const baseVariables = scenario.variables ?? {};
370
+ const dataset = options.dataset;
371
+ const startedAt = new Date().toISOString();
372
+ const startMs = Date.now();
373
+ const allResults = [];
374
+ const useCache = !options.noCache;
375
+ const cacheStats = { hits: 0, misses: 0 };
376
+ // Build dependency graph once
377
+ const depMap = buildDependencyMap(scenario.steps);
378
+ const useParallel = hasAnyParallelism(scenario.steps, depMap);
379
+ // Variable sets: one per dataset row, or just base variables
380
+ const variableSets = dataset
381
+ ? dataset.map((row, i) => ({ vars: { ...baseVariables, ...row }, rowIndex: i }))
382
+ : [{ vars: baseVariables }];
383
+ for (const { vars, rowIndex } of variableSets) {
384
+ for (let i = 1; i <= iterations; i++) {
385
+ let iterResults;
386
+ if (useParallel) {
387
+ iterResults = await executeStepsParallel(scenario.steps, depMap, vars, scenarioDir, i, useCache, cacheStats, options.onStepComplete, rowIndex);
388
+ }
389
+ else {
390
+ const stepOutputs = {};
391
+ iterResults = [];
392
+ for (const step of scenario.steps) {
393
+ const result = await runStepIteration(step, i, vars, stepOutputs, scenarioDir, useCache, cacheStats, rowIndex);
394
+ iterResults.push(result);
395
+ options.onStepComplete?.(step.id, result.passed);
396
+ }
397
+ }
398
+ allResults.push(...iterResults);
399
+ options.onIterationComplete?.(dataset ? (rowIndex * iterations) + i : i, dataset ? dataset.length * iterations : iterations);
400
+ }
401
+ }
402
+ // Aggregate per-step summaries (exclude skipped from pass/fail counts)
97
403
  const steps = scenario.steps.map((step) => {
98
404
  const stepResults = allResults.filter((r) => r.stepId === step.id);
99
- const passes = stepResults.filter((r) => r.passed).length;
100
- const failures = stepResults.length - passes;
101
- const passRate = stepResults.length > 0 ? passes / stepResults.length : 0;
405
+ const nonSkipped = stepResults.filter(r => !r.skipped);
406
+ const passes = nonSkipped.filter((r) => r.passed).length;
407
+ const failures = nonSkipped.length - passes;
408
+ const passRate = nonSkipped.length > 0 ? passes / nonSkipped.length : 1;
102
409
  const minPassRate = step.min_pass_rate ?? 0.8;
410
+ const retriedCount = stepResults.filter((r) => (r.retriesUsed ?? 0) > 0).length;
103
411
  const totalDurationMs = stepResults.reduce((s, r) => s + r.durationMs, 0);
104
412
  const avgDurationMs = stepResults.length > 0 ? totalDurationMs / stepResults.length : 0;
105
413
  const totalCostUsd = stepResults.reduce((s, r) => s + (r.costUsd ?? 0), 0);
@@ -115,12 +423,44 @@ export async function runScenario(scenario, scenarioFilePath, options = {}) {
115
423
  avgDurationMs,
116
424
  totalCostUsd,
117
425
  avgCostUsd,
426
+ retriedCount: retriedCount > 0 ? retriedCount : undefined,
118
427
  };
119
428
  });
120
429
  const allPassed = steps.every((s) => !s.belowThreshold);
121
430
  const completedAt = new Date().toISOString();
122
431
  const durationMs = Date.now() - startMs;
123
- // Expose cache stats to caller
432
+ // Build dataset summary if applicable
433
+ let datasetInfo;
434
+ if (dataset && options.datasetPath) {
435
+ const rowSummaries = dataset.map((row, rowIdx) => {
436
+ const rowResults = allResults.filter((r) => r.datasetRow === rowIdx);
437
+ const stepSummaries = scenario.steps.map((step) => {
438
+ const sr = rowResults.filter((r) => r.stepId === step.id);
439
+ const passed = sr.filter((r) => r.passed).length;
440
+ return {
441
+ stepId: step.id,
442
+ passed: passed === sr.length,
443
+ passRate: sr.length > 0 ? passed / sr.length : 0,
444
+ };
445
+ });
446
+ const keys = Object.keys(row).slice(0, 3);
447
+ const preview = {};
448
+ for (const k of keys)
449
+ preview[k] = row[k];
450
+ return {
451
+ rowIndex: rowIdx,
452
+ rowPreview: preview,
453
+ allStepsPassed: stepSummaries.every((s) => s.passed),
454
+ stepResults: stepSummaries,
455
+ };
456
+ });
457
+ datasetInfo = {
458
+ path: options.datasetPath,
459
+ totalRows: dataset.length,
460
+ rowsPassed: rowSummaries.filter((r) => r.allStepsPassed).length,
461
+ rowSummaries,
462
+ };
463
+ }
124
464
  options.cacheStats = cacheStats;
125
465
  return {
126
466
  scenarioName: scenario.name,
@@ -131,6 +471,7 @@ export async function runScenario(scenario, scenarioFilePath, options = {}) {
131
471
  steps,
132
472
  allPassed,
133
473
  results: allResults,
474
+ dataset: datasetInfo,
134
475
  };
135
476
  }
136
477
  //# sourceMappingURL=scenario-runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scenario-runner.js","sourceRoot":"","sources":["../../src/core/scenario-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scenario-runner.js","sourceRoot":"","sources":["../../src/core/scenario-runner.ts"],"names":[],"mappings":"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"}