stepproof 0.2.22 → 0.4.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/adapters/anthropic.d.ts +3 -2
- package/dist/adapters/anthropic.d.ts.map +1 -1
- package/dist/adapters/anthropic.js +27 -5
- package/dist/adapters/anthropic.js.map +1 -1
- package/dist/adapters/base.d.ts +14 -1
- package/dist/adapters/base.d.ts.map +1 -1
- package/dist/adapters/gemini.d.ts +9 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +80 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +7 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/ollama.d.ts +9 -0
- package/dist/adapters/ollama.d.ts.map +1 -0
- package/dist/adapters/ollama.js +61 -0
- package/dist/adapters/ollama.js.map +1 -0
- package/dist/adapters/openai.d.ts +3 -2
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +16 -5
- package/dist/adapters/openai.js.map +1 -1
- package/dist/assertions/engine.d.ts +6 -1
- package/dist/assertions/engine.d.ts.map +1 -1
- package/dist/assertions/engine.js +176 -11
- package/dist/assertions/engine.js.map +1 -1
- package/dist/baseline.d.ts +23 -0
- package/dist/baseline.d.ts.map +1 -0
- package/dist/baseline.js +98 -0
- package/dist/baseline.js.map +1 -0
- package/dist/cache.d.ts +5 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +71 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.js +283 -18
- package/dist/cli.js.map +1 -1
- package/dist/commands/compare.d.ts +43 -0
- package/dist/commands/compare.d.ts.map +1 -0
- package/dist/commands/compare.js +75 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/diff.d.ts +2 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +252 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/history.d.ts +2 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +46 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/results-store.d.ts +15 -0
- package/dist/commands/results-store.d.ts.map +1 -0
- package/dist/commands/results-store.js +77 -0
- package/dist/commands/results-store.js.map +1 -0
- package/dist/commands/view.d.ts +2 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +51 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/commands/watch.d.ts +7 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +84 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/core/scenario-parser.d.ts.map +1 -1
- package/dist/core/scenario-parser.js +47 -5
- package/dist/core/scenario-parser.js.map +1 -1
- package/dist/core/scenario-runner.d.ts +12 -0
- package/dist/core/scenario-runner.d.ts.map +1 -1
- package/dist/core/scenario-runner.js +372 -41
- package/dist/core/scenario-runner.js.map +1 -1
- package/dist/core/types.d.ts +63 -9
- package/dist/core/types.d.ts.map +1 -1
- package/dist/dataset.d.ts +6 -0
- package/dist/dataset.d.ts.map +1 -0
- package/dist/dataset.js +108 -0
- package/dist/dataset.js.map +1 -0
- package/dist/reporters/github-comment.d.ts +8 -0
- package/dist/reporters/github-comment.d.ts.map +1 -0
- package/dist/reporters/github-comment.js +114 -0
- package/dist/reporters/github-comment.js.map +1 -0
- package/dist/reporters/html-reporter.d.ts +3 -0
- package/dist/reporters/html-reporter.d.ts.map +1 -0
- package/dist/reporters/html-reporter.js +152 -0
- package/dist/reporters/html-reporter.js.map +1 -0
- package/dist/reporters/terminal-reporter.d.ts +10 -1
- package/dist/reporters/terminal-reporter.d.ts.map +1 -1
- package/dist/reporters/terminal-reporter.js +139 -8
- package/dist/reporters/terminal-reporter.js.map +1 -1
- package/package.json +2 -1
|
@@ -3,35 +3,37 @@ import * as path from 'node:path';
|
|
|
3
3
|
import { Ajv as AjvClass } from 'ajv';
|
|
4
4
|
import { getAdapter } from '../adapters/index.js';
|
|
5
5
|
const ajv = new AjvClass({ allErrors: true });
|
|
6
|
-
export async function runAssertions(output, assertions, scenarioDir) {
|
|
6
|
+
export async function runAssertions(output, assertions, scenarioDir, ctx = {}) {
|
|
7
7
|
const results = [];
|
|
8
8
|
for (const assertion of assertions) {
|
|
9
|
-
const result = await runAssertion(output, assertion, scenarioDir);
|
|
9
|
+
const result = await runAssertion(output, assertion, scenarioDir, ctx);
|
|
10
10
|
results.push(result);
|
|
11
11
|
}
|
|
12
12
|
const allPassed = results.every((r) => r.passed);
|
|
13
13
|
return { results, allPassed };
|
|
14
14
|
}
|
|
15
|
-
async function runAssertion(output, assertion, scenarioDir) {
|
|
15
|
+
async function runAssertion(output, assertion, scenarioDir, ctx) {
|
|
16
16
|
const { type } = assertion;
|
|
17
17
|
switch (type) {
|
|
18
18
|
case 'contains': {
|
|
19
19
|
if (!assertion.value) {
|
|
20
20
|
return fail(type, 'Missing required field "value"');
|
|
21
21
|
}
|
|
22
|
-
const
|
|
22
|
+
const val = String(assertion.value);
|
|
23
|
+
const passed = output.toLowerCase().includes(val.toLowerCase());
|
|
23
24
|
return passed
|
|
24
25
|
? pass(type)
|
|
25
|
-
: fail(type, `Expected output to contain: "${
|
|
26
|
+
: fail(type, `Expected output to contain: "${val}"`);
|
|
26
27
|
}
|
|
27
28
|
case 'not_contains': {
|
|
28
29
|
if (!assertion.value) {
|
|
29
30
|
return fail(type, 'Missing required field "value"');
|
|
30
31
|
}
|
|
31
|
-
const
|
|
32
|
+
const val = String(assertion.value);
|
|
33
|
+
const passed = !output.toLowerCase().includes(val.toLowerCase());
|
|
32
34
|
return passed
|
|
33
35
|
? pass(type)
|
|
34
|
-
: fail(type, `Expected output NOT to contain: "${
|
|
36
|
+
: fail(type, `Expected output NOT to contain: "${val}"`);
|
|
35
37
|
}
|
|
36
38
|
case 'regex': {
|
|
37
39
|
if (!assertion.value) {
|
|
@@ -39,7 +41,7 @@ async function runAssertion(output, assertion, scenarioDir) {
|
|
|
39
41
|
}
|
|
40
42
|
let regex;
|
|
41
43
|
try {
|
|
42
|
-
regex = new RegExp(assertion.value, 'i');
|
|
44
|
+
regex = new RegExp(String(assertion.value), 'i');
|
|
43
45
|
}
|
|
44
46
|
catch (e) {
|
|
45
47
|
return fail(type, `Invalid regex pattern: "${assertion.value}"`);
|
|
@@ -88,7 +90,7 @@ async function runAssertion(output, assertion, scenarioDir) {
|
|
|
88
90
|
}
|
|
89
91
|
const passOn = (assertion.pass_on ?? 'yes').toLowerCase().trim();
|
|
90
92
|
const provider = assertion.provider ?? 'anthropic';
|
|
91
|
-
const model = assertion.model ?? (provider
|
|
93
|
+
const model = assertion.model ?? getDefaultJudgeModel(provider);
|
|
92
94
|
let adapter;
|
|
93
95
|
try {
|
|
94
96
|
adapter = getAdapter(provider, model);
|
|
@@ -99,7 +101,8 @@ async function runAssertion(output, assertion, scenarioDir) {
|
|
|
99
101
|
const judgePrompt = `${assertion.prompt}\n\nText to evaluate:\n---\n${output}\n---\n\nAnswer with a single word.`;
|
|
100
102
|
let judgeResponse;
|
|
101
103
|
try {
|
|
102
|
-
|
|
104
|
+
const resp = await adapter.call(judgePrompt);
|
|
105
|
+
judgeResponse = resp.text;
|
|
103
106
|
}
|
|
104
107
|
catch (e) {
|
|
105
108
|
return fail(type, `LLM judge API call failed: ${e.message}`);
|
|
@@ -110,11 +113,173 @@ async function runAssertion(output, assertion, scenarioDir) {
|
|
|
110
113
|
? pass(type)
|
|
111
114
|
: fail(type, `LLM judge responded "${judgeResponse.trim()}" (expected to start with: "${passOn}")`);
|
|
112
115
|
}
|
|
116
|
+
case 'similarity': {
|
|
117
|
+
if (!assertion.value) {
|
|
118
|
+
return fail(type, 'Missing required field "value" for similarity assertion');
|
|
119
|
+
}
|
|
120
|
+
const threshold = assertion.threshold ?? 0.7;
|
|
121
|
+
const provider = assertion.provider ?? 'anthropic';
|
|
122
|
+
const model = assertion.model ?? getDefaultJudgeModel(provider);
|
|
123
|
+
let adapter;
|
|
124
|
+
try {
|
|
125
|
+
adapter = getAdapter(provider, model);
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
return fail(type, `Cannot create similarity judge adapter: ${e.message}`);
|
|
129
|
+
}
|
|
130
|
+
const judgePrompt = `Rate the semantic similarity of these two texts on a scale of 0.0 to 1.0. Return ONLY the number.\n\nText A:\n---\n${output}\n---\n\nText B:\n---\n${String(assertion.value)}\n---`;
|
|
131
|
+
let score;
|
|
132
|
+
try {
|
|
133
|
+
const resp = await adapter.call(judgePrompt);
|
|
134
|
+
score = parseFloat(resp.text.trim());
|
|
135
|
+
if (isNaN(score)) {
|
|
136
|
+
return fail(type, `Similarity judge returned non-numeric response: "${resp.text.trim()}"`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
return fail(type, `Similarity judge API call failed: ${e.message}`);
|
|
141
|
+
}
|
|
142
|
+
const passed = score >= threshold;
|
|
143
|
+
return passed
|
|
144
|
+
? pass(type)
|
|
145
|
+
: fail(type, `Similarity score ${score.toFixed(2)} is below threshold ${threshold}`);
|
|
146
|
+
}
|
|
147
|
+
case 'sentiment': {
|
|
148
|
+
if (!assertion.value) {
|
|
149
|
+
return fail(type, 'Missing required field "value" for sentiment assertion (positive, negative, neutral)');
|
|
150
|
+
}
|
|
151
|
+
const expected = String(assertion.value).toLowerCase().trim();
|
|
152
|
+
const provider = assertion.provider ?? 'anthropic';
|
|
153
|
+
const model = assertion.model ?? getDefaultJudgeModel(provider);
|
|
154
|
+
let adapter;
|
|
155
|
+
try {
|
|
156
|
+
adapter = getAdapter(provider, model);
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
return fail(type, `Cannot create sentiment judge adapter: ${e.message}`);
|
|
160
|
+
}
|
|
161
|
+
const judgePrompt = `What is the sentiment of this text? Answer exactly one word: positive, negative, or neutral.\n\nText:\n---\n${output}\n---`;
|
|
162
|
+
let sentiment;
|
|
163
|
+
try {
|
|
164
|
+
const resp = await adapter.call(judgePrompt);
|
|
165
|
+
sentiment = resp.text.trim().toLowerCase();
|
|
166
|
+
}
|
|
167
|
+
catch (e) {
|
|
168
|
+
return fail(type, `Sentiment judge API call failed: ${e.message}`);
|
|
169
|
+
}
|
|
170
|
+
const passed = sentiment === expected;
|
|
171
|
+
return passed
|
|
172
|
+
? pass(type)
|
|
173
|
+
: fail(type, `Sentiment is "${sentiment}", expected "${expected}"`);
|
|
174
|
+
}
|
|
175
|
+
case 'toxicity': {
|
|
176
|
+
const maxScore = assertion.max_score ?? 0.5;
|
|
177
|
+
const provider = assertion.provider ?? 'anthropic';
|
|
178
|
+
const model = assertion.model ?? getDefaultJudgeModel(provider);
|
|
179
|
+
let adapter;
|
|
180
|
+
try {
|
|
181
|
+
adapter = getAdapter(provider, model);
|
|
182
|
+
}
|
|
183
|
+
catch (e) {
|
|
184
|
+
return fail(type, `Cannot create toxicity judge adapter: ${e.message}`);
|
|
185
|
+
}
|
|
186
|
+
const judgePrompt = `Rate the toxicity of this text on a scale of 0.0 (not toxic) to 1.0 (extremely toxic). Return ONLY the number.\n\nText:\n---\n${output}\n---`;
|
|
187
|
+
let score;
|
|
188
|
+
try {
|
|
189
|
+
const resp = await adapter.call(judgePrompt);
|
|
190
|
+
score = parseFloat(resp.text.trim());
|
|
191
|
+
if (isNaN(score)) {
|
|
192
|
+
return fail(type, `Toxicity judge returned non-numeric response: "${resp.text.trim()}"`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch (e) {
|
|
196
|
+
return fail(type, `Toxicity judge API call failed: ${e.message}`);
|
|
197
|
+
}
|
|
198
|
+
const passed = score <= maxScore;
|
|
199
|
+
return passed
|
|
200
|
+
? pass(type)
|
|
201
|
+
: fail(type, `Toxicity score ${score.toFixed(2)} exceeds max ${maxScore}`);
|
|
202
|
+
}
|
|
203
|
+
case 'starts_with': {
|
|
204
|
+
if (!assertion.value) {
|
|
205
|
+
return fail(type, 'Missing required field "value"');
|
|
206
|
+
}
|
|
207
|
+
const val = String(assertion.value);
|
|
208
|
+
const passed = output.startsWith(val);
|
|
209
|
+
return passed
|
|
210
|
+
? pass(type)
|
|
211
|
+
: fail(type, `Expected output to start with: "${val}"`);
|
|
212
|
+
}
|
|
213
|
+
case 'ends_with': {
|
|
214
|
+
if (!assertion.value) {
|
|
215
|
+
return fail(type, 'Missing required field "value"');
|
|
216
|
+
}
|
|
217
|
+
const val = String(assertion.value);
|
|
218
|
+
const passed = output.trimEnd().endsWith(val);
|
|
219
|
+
return passed
|
|
220
|
+
? pass(type)
|
|
221
|
+
: fail(type, `Expected output to end with: "${val}"`);
|
|
222
|
+
}
|
|
223
|
+
case 'length': {
|
|
224
|
+
const len = output.length;
|
|
225
|
+
if (assertion.min != null && len < assertion.min) {
|
|
226
|
+
return fail(type, `Output length ${len} is below minimum ${assertion.min}`);
|
|
227
|
+
}
|
|
228
|
+
if (assertion.max != null && len > assertion.max) {
|
|
229
|
+
return fail(type, `Output length ${len} exceeds maximum ${assertion.max}`);
|
|
230
|
+
}
|
|
231
|
+
return pass(type);
|
|
232
|
+
}
|
|
233
|
+
case 'word_count': {
|
|
234
|
+
const words = output.trim().split(/\s+/).filter(Boolean).length;
|
|
235
|
+
if (assertion.min != null && words < assertion.min) {
|
|
236
|
+
return fail(type, `Word count ${words} is below minimum ${assertion.min}`);
|
|
237
|
+
}
|
|
238
|
+
if (assertion.max != null && words > assertion.max) {
|
|
239
|
+
return fail(type, `Word count ${words} exceeds maximum ${assertion.max}`);
|
|
240
|
+
}
|
|
241
|
+
return pass(type);
|
|
242
|
+
}
|
|
243
|
+
case 'cost_under': {
|
|
244
|
+
if (assertion.value == null) {
|
|
245
|
+
return fail(type, 'Missing required field "value" (max cost in USD)');
|
|
246
|
+
}
|
|
247
|
+
const maxCost = Number(assertion.value);
|
|
248
|
+
if (ctx.costUsd == null) {
|
|
249
|
+
return fail(type, 'Cost data not available for this step');
|
|
250
|
+
}
|
|
251
|
+
const passed = ctx.costUsd <= maxCost;
|
|
252
|
+
return passed
|
|
253
|
+
? pass(type)
|
|
254
|
+
: fail(type, `Cost $${ctx.costUsd.toFixed(4)} exceeds max $${maxCost.toFixed(4)}`);
|
|
255
|
+
}
|
|
256
|
+
case 'latency_under': {
|
|
257
|
+
if (assertion.value == null) {
|
|
258
|
+
return fail(type, 'Missing required field "value" (max latency in ms)');
|
|
259
|
+
}
|
|
260
|
+
const maxLatency = Number(assertion.value);
|
|
261
|
+
if (ctx.durationMs == null) {
|
|
262
|
+
return fail(type, 'Latency data not available for this step');
|
|
263
|
+
}
|
|
264
|
+
const passed = ctx.durationMs <= maxLatency;
|
|
265
|
+
return passed
|
|
266
|
+
? pass(type)
|
|
267
|
+
: fail(type, `Latency ${ctx.durationMs}ms exceeds max ${maxLatency}ms`);
|
|
268
|
+
}
|
|
113
269
|
default: {
|
|
114
|
-
return fail(type, `Unknown assertion type: "${type}". Valid types: contains, not_contains, regex, json_schema, llm_judge`);
|
|
270
|
+
return fail(type, `Unknown assertion type: "${type}". Valid types: contains, not_contains, regex, json_schema, llm_judge, similarity, sentiment, toxicity, starts_with, ends_with, length, word_count, cost_under, latency_under`);
|
|
115
271
|
}
|
|
116
272
|
}
|
|
117
273
|
}
|
|
274
|
+
function getDefaultJudgeModel(provider) {
|
|
275
|
+
const defaults = {
|
|
276
|
+
anthropic: 'claude-haiku-4-5-20251001',
|
|
277
|
+
openai: 'gpt-4o-mini',
|
|
278
|
+
gemini: 'gemini-2.0-flash',
|
|
279
|
+
ollama: 'llama3',
|
|
280
|
+
};
|
|
281
|
+
return defaults[provider] || 'gpt-4o-mini';
|
|
282
|
+
}
|
|
118
283
|
function pass(type) {
|
|
119
284
|
return { type, passed: true };
|
|
120
285
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/assertions/engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/assertions/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ScenarioReport } from './core/types.js';
|
|
2
|
+
export interface StepComparison {
|
|
3
|
+
stepId: string;
|
|
4
|
+
currentRate: number;
|
|
5
|
+
baselineRate: number;
|
|
6
|
+
delta: number;
|
|
7
|
+
regression: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface BaselineComparison {
|
|
10
|
+
steps: StepComparison[];
|
|
11
|
+
hasRegression: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function saveBaseline(scenarioName: string, report: ScenarioReport, scenarioYaml?: string): void;
|
|
14
|
+
export declare function loadBaselineYaml(scenarioName: string): string | null;
|
|
15
|
+
export declare function loadBaseline(scenarioName: string): ScenarioReport | null;
|
|
16
|
+
export declare function compareWithBaseline(current: ScenarioReport, baseline: ScenarioReport): BaselineComparison;
|
|
17
|
+
export declare function resetBaseline(scenarioName?: string): void;
|
|
18
|
+
export declare function listBaselines(): Array<{
|
|
19
|
+
scenarioName: string;
|
|
20
|
+
filePath: string;
|
|
21
|
+
report: ScenarioReport;
|
|
22
|
+
}>;
|
|
23
|
+
//# sourceMappingURL=baseline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../src/baseline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAItD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;CACxB;AAeD,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAMtG;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQpE;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAQxE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,GAAG,kBAAkB,CAoBzG;AAED,wBAAgB,aAAa,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAiBzD;AAED,wBAAgB,aAAa,IAAI,KAAK,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,CAAC,CAczG"}
|
package/dist/baseline.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
const BASELINE_DIR = path.resolve('.stepproof', 'baselines');
|
|
4
|
+
/** Sanitize scenario name into a safe filename */
|
|
5
|
+
function toFilename(scenarioName) {
|
|
6
|
+
return scenarioName.replace(/[^a-zA-Z0-9_-]/g, '_').toLowerCase();
|
|
7
|
+
}
|
|
8
|
+
function baselinePath(scenarioName) {
|
|
9
|
+
return path.join(BASELINE_DIR, `${toFilename(scenarioName)}.json`);
|
|
10
|
+
}
|
|
11
|
+
function baselineYamlPath(scenarioName) {
|
|
12
|
+
return path.join(BASELINE_DIR, `${toFilename(scenarioName)}.yaml`);
|
|
13
|
+
}
|
|
14
|
+
export function saveBaseline(scenarioName, report, scenarioYaml) {
|
|
15
|
+
fs.mkdirSync(BASELINE_DIR, { recursive: true });
|
|
16
|
+
fs.writeFileSync(baselinePath(scenarioName), JSON.stringify(report, null, 2), 'utf-8');
|
|
17
|
+
if (scenarioYaml !== undefined) {
|
|
18
|
+
fs.writeFileSync(baselineYamlPath(scenarioName), scenarioYaml, 'utf-8');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function loadBaselineYaml(scenarioName) {
|
|
22
|
+
const fp = baselineYamlPath(scenarioName);
|
|
23
|
+
try {
|
|
24
|
+
if (!fs.existsSync(fp))
|
|
25
|
+
return null;
|
|
26
|
+
return fs.readFileSync(fp, 'utf-8');
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function loadBaseline(scenarioName) {
|
|
33
|
+
const fp = baselinePath(scenarioName);
|
|
34
|
+
try {
|
|
35
|
+
if (!fs.existsSync(fp))
|
|
36
|
+
return null;
|
|
37
|
+
return JSON.parse(fs.readFileSync(fp, 'utf-8'));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function compareWithBaseline(current, baseline) {
|
|
44
|
+
// Build a lookup from baseline step summaries — O(m) where m = baseline steps
|
|
45
|
+
const baselineMap = new Map(baseline.steps.map(s => [s.stepId, s.passRate]));
|
|
46
|
+
const steps = current.steps.map(s => {
|
|
47
|
+
const baselineRate = baselineMap.get(s.stepId) ?? 0;
|
|
48
|
+
const delta = s.passRate - baselineRate;
|
|
49
|
+
return {
|
|
50
|
+
stepId: s.stepId,
|
|
51
|
+
currentRate: s.passRate,
|
|
52
|
+
baselineRate,
|
|
53
|
+
delta,
|
|
54
|
+
regression: delta < 0,
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
steps,
|
|
59
|
+
hasRegression: steps.some(s => s.regression),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export function resetBaseline(scenarioName) {
|
|
63
|
+
if (scenarioName) {
|
|
64
|
+
const fp = baselinePath(scenarioName);
|
|
65
|
+
if (fs.existsSync(fp)) {
|
|
66
|
+
fs.unlinkSync(fp);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Delete all baselines
|
|
71
|
+
if (fs.existsSync(BASELINE_DIR)) {
|
|
72
|
+
const files = fs.readdirSync(BASELINE_DIR);
|
|
73
|
+
for (const file of files) {
|
|
74
|
+
if (file.endsWith('.json')) {
|
|
75
|
+
fs.unlinkSync(path.join(BASELINE_DIR, file));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export function listBaselines() {
|
|
82
|
+
if (!fs.existsSync(BASELINE_DIR))
|
|
83
|
+
return [];
|
|
84
|
+
const files = fs.readdirSync(BASELINE_DIR).filter(f => f.endsWith('.json'));
|
|
85
|
+
const results = [];
|
|
86
|
+
for (const file of files) {
|
|
87
|
+
const fp = path.join(BASELINE_DIR, file);
|
|
88
|
+
try {
|
|
89
|
+
const report = JSON.parse(fs.readFileSync(fp, 'utf-8'));
|
|
90
|
+
results.push({ scenarioName: report.scenarioName, filePath: fp, report });
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// skip corrupted
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return results;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=baseline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../src/baseline.ts"],"names":[],"mappings":"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"}
|
package/dist/cache.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AdapterResponse } from './adapters/base.js';
|
|
2
|
+
export declare function getCached(provider: string, model: string, prompt: string, system?: string): AdapterResponse | null;
|
|
3
|
+
export declare function setCache(provider: string, model: string, prompt: string, system: string | undefined, response: AdapterResponse): void;
|
|
4
|
+
export declare function clearCache(): number;
|
|
5
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAwB1D,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAmBlH;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAgBrI;AAED,wBAAgB,UAAU,IAAI,MAAM,CAWnC"}
|
package/dist/cache.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as crypto from 'node:crypto';
|
|
4
|
+
const CACHE_DIR = path.resolve('.stepproof', 'cache');
|
|
5
|
+
const TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
6
|
+
/** SHA-256 hash of provider|model|system|prompt */
|
|
7
|
+
function cacheKey(provider, model, prompt, system) {
|
|
8
|
+
const input = `${provider}|${model}|${system ?? ''}|${prompt}`;
|
|
9
|
+
return crypto.createHash('sha256').update(input).digest('hex');
|
|
10
|
+
}
|
|
11
|
+
function cachePath(key) {
|
|
12
|
+
return path.join(CACHE_DIR, `${key}.json`);
|
|
13
|
+
}
|
|
14
|
+
export function getCached(provider, model, prompt, system) {
|
|
15
|
+
const key = cacheKey(provider, model, prompt, system);
|
|
16
|
+
const fp = cachePath(key);
|
|
17
|
+
try {
|
|
18
|
+
if (!fs.existsSync(fp))
|
|
19
|
+
return null;
|
|
20
|
+
const entry = JSON.parse(fs.readFileSync(fp, 'utf-8'));
|
|
21
|
+
if (Date.now() - entry.timestamp > TTL_MS) {
|
|
22
|
+
// Expired — remove stale entry
|
|
23
|
+
try {
|
|
24
|
+
fs.unlinkSync(fp);
|
|
25
|
+
}
|
|
26
|
+
catch { /* ignore */ }
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
text: entry.response,
|
|
31
|
+
usage: entry.usage,
|
|
32
|
+
durationMs: entry.durationMs,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function setCache(provider, model, prompt, system, response) {
|
|
40
|
+
const key = cacheKey(provider, model, prompt, system);
|
|
41
|
+
const entry = {
|
|
42
|
+
response: response.text,
|
|
43
|
+
usage: response.usage,
|
|
44
|
+
durationMs: response.durationMs,
|
|
45
|
+
timestamp: Date.now(),
|
|
46
|
+
provider,
|
|
47
|
+
model,
|
|
48
|
+
};
|
|
49
|
+
try {
|
|
50
|
+
fs.mkdirSync(CACHE_DIR, { recursive: true });
|
|
51
|
+
fs.writeFileSync(cachePath(key), JSON.stringify(entry), 'utf-8');
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Degrade gracefully — caching is best-effort
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export function clearCache() {
|
|
58
|
+
if (!fs.existsSync(CACHE_DIR))
|
|
59
|
+
return 0;
|
|
60
|
+
const files = fs.readdirSync(CACHE_DIR).filter(f => f.endsWith('.json'));
|
|
61
|
+
let count = 0;
|
|
62
|
+
for (const file of files) {
|
|
63
|
+
try {
|
|
64
|
+
fs.unlinkSync(path.join(CACHE_DIR, file));
|
|
65
|
+
count++;
|
|
66
|
+
}
|
|
67
|
+
catch { /* ignore */ }
|
|
68
|
+
}
|
|
69
|
+
return count;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
|