@cogitator-ai/evals 0.13.2 → 0.14.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 (66) hide show
  1. package/README.md +94 -14
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/plugin-evals/execute.d.ts +45 -0
  7. package/dist/plugin-evals/execute.d.ts.map +1 -0
  8. package/dist/plugin-evals/execute.js +508 -0
  9. package/dist/plugin-evals/execute.js.map +1 -0
  10. package/dist/plugin-evals/files.d.ts +17 -0
  11. package/dist/plugin-evals/files.d.ts.map +1 -0
  12. package/dist/plugin-evals/files.js +46 -0
  13. package/dist/plugin-evals/files.js.map +1 -0
  14. package/dist/plugin-evals/glob.d.ts +8 -0
  15. package/dist/plugin-evals/glob.d.ts.map +1 -0
  16. package/dist/plugin-evals/glob.js +63 -0
  17. package/dist/plugin-evals/glob.js.map +1 -0
  18. package/dist/plugin-evals/graders.d.ts +21 -0
  19. package/dist/plugin-evals/graders.d.ts.map +1 -0
  20. package/dist/plugin-evals/graders.js +198 -0
  21. package/dist/plugin-evals/graders.js.map +1 -0
  22. package/dist/plugin-evals/index.d.ts +4 -0
  23. package/dist/plugin-evals/index.d.ts.map +1 -0
  24. package/dist/plugin-evals/index.js +3 -0
  25. package/dist/plugin-evals/index.js.map +1 -0
  26. package/dist/plugin-evals/judge.d.ts +33 -0
  27. package/dist/plugin-evals/judge.d.ts.map +1 -0
  28. package/dist/plugin-evals/judge.js +73 -0
  29. package/dist/plugin-evals/judge.js.map +1 -0
  30. package/dist/plugin-evals/mocks.d.ts +34 -0
  31. package/dist/plugin-evals/mocks.d.ts.map +1 -0
  32. package/dist/plugin-evals/mocks.js +373 -0
  33. package/dist/plugin-evals/mocks.js.map +1 -0
  34. package/dist/plugin-evals/report.d.ts +4 -0
  35. package/dist/plugin-evals/report.d.ts.map +1 -0
  36. package/dist/plugin-evals/report.js +177 -0
  37. package/dist/plugin-evals/report.js.map +1 -0
  38. package/dist/plugin-evals/runner.d.ts +23 -0
  39. package/dist/plugin-evals/runner.d.ts.map +1 -0
  40. package/dist/plugin-evals/runner.js +582 -0
  41. package/dist/plugin-evals/runner.js.map +1 -0
  42. package/dist/plugin-evals/schema.d.ts +179 -0
  43. package/dist/plugin-evals/schema.d.ts.map +1 -0
  44. package/dist/plugin-evals/schema.js +194 -0
  45. package/dist/plugin-evals/schema.js.map +1 -0
  46. package/dist/plugin-evals/suite.d.ts +40 -0
  47. package/dist/plugin-evals/suite.d.ts.map +1 -0
  48. package/dist/plugin-evals/suite.js +476 -0
  49. package/dist/plugin-evals/suite.js.map +1 -0
  50. package/dist/plugin-evals/tools.d.ts +42 -0
  51. package/dist/plugin-evals/tools.d.ts.map +1 -0
  52. package/dist/plugin-evals/tools.js +136 -0
  53. package/dist/plugin-evals/tools.js.map +1 -0
  54. package/dist/plugin-evals/transcript.d.ts +35 -0
  55. package/dist/plugin-evals/transcript.d.ts.map +1 -0
  56. package/dist/plugin-evals/transcript.js +149 -0
  57. package/dist/plugin-evals/transcript.js.map +1 -0
  58. package/dist/plugin-evals/types.d.ts +378 -0
  59. package/dist/plugin-evals/types.d.ts.map +1 -0
  60. package/dist/plugin-evals/types.js +2 -0
  61. package/dist/plugin-evals/types.js.map +1 -0
  62. package/dist/reporters/html-format.d.ts +5 -2
  63. package/dist/reporters/html-format.d.ts.map +1 -1
  64. package/dist/reporters/html-format.js +6 -3
  65. package/dist/reporters/html-format.js.map +1 -1
  66. package/package.json +5 -3
@@ -0,0 +1,373 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { errorText, isDirectory, isInside } from './files.js';
4
+ import { isRecord, issuesText, MockFrontmatterSchema, readMarkdown, ToolsListSchema, } from './schema.js';
5
+ /** Longest string value an `expect:` pattern checks: a longer one counts as a violation */
6
+ export const EXPECT_MAX_LENGTH = 4096;
7
+ const EXPECT_TYPES = new Set([
8
+ 'string',
9
+ 'number',
10
+ 'boolean',
11
+ 'array',
12
+ 'object',
13
+ 'null',
14
+ ]);
15
+ /**
16
+ * The mocked tools of a case: the suite's mocks with the case's own over them, file by file.
17
+ * A file of the case's own `mocks/` that cannot be used throws with the file and the reason, since
18
+ * the case asked for it. A suite file that cannot be used is reported in `problems` under its
19
+ * server, so it fails only the cases that use that server
20
+ */
21
+ export function loadMocks(suiteDir, caseDir) {
22
+ const merged = new Map();
23
+ const own = join(caseDir, 'mocks');
24
+ for (const dir of [suiteDir, own]) {
25
+ if (dir === undefined || !isDirectory(dir))
26
+ continue;
27
+ for (const [server, found] of readMockDir(dir)) {
28
+ if (dir === own) {
29
+ const [problem] = found.problems.values();
30
+ if (problem !== undefined)
31
+ throw new Error(problem);
32
+ }
33
+ const into = merged.get(server) ?? { tools: new Map(), problems: new Map() };
34
+ for (const [name, tool] of found.tools) {
35
+ into.tools.set(name, tool);
36
+ into.problems.delete(`${name}.md`);
37
+ }
38
+ for (const [file, problem] of found.problems)
39
+ into.problems.set(file, problem);
40
+ merged.set(server, into);
41
+ }
42
+ }
43
+ const mocks = {};
44
+ const problems = {};
45
+ for (const [server, found] of merged) {
46
+ if (found.problems.size > 0) {
47
+ problems[server] = [...found.problems.values()].join(', ');
48
+ continue;
49
+ }
50
+ mocks[server] = [...found.tools.values()].sort((a, b) => a.tool.localeCompare(b.tool));
51
+ }
52
+ return { mocks, problems };
53
+ }
54
+ function readMockDir(dir) {
55
+ const servers = new Map();
56
+ for (const server of readdirSync(dir).sort()) {
57
+ const serverDir = join(dir, server);
58
+ if (server.startsWith('.') || !isDirectory(serverDir))
59
+ continue;
60
+ const found = { tools: new Map(), problems: new Map() };
61
+ servers.set(server, found);
62
+ let schemas = new Map();
63
+ try {
64
+ schemas = readToolsList(serverDir);
65
+ }
66
+ catch (error) {
67
+ found.problems.set('_tools.json', errorText(error));
68
+ }
69
+ for (const file of readdirSync(serverDir).sort()) {
70
+ const path = join(serverDir, file);
71
+ if (file === '_server.md') {
72
+ found.problems.set(file, `${path}: _server.md agent mocks are not supported by Cogitator's plugin evals, give each tool a fixed mock file`);
73
+ continue;
74
+ }
75
+ if (!file.endsWith('.md') || file.startsWith('_') || file.startsWith('.'))
76
+ continue;
77
+ if (!statSync(path).isFile())
78
+ continue;
79
+ const tool = file.slice(0, -'.md'.length);
80
+ try {
81
+ found.tools.set(tool, readMockFile(path, server, tool, serverDir, schemas.get(tool)));
82
+ }
83
+ catch (error) {
84
+ found.problems.set(file, errorText(error));
85
+ }
86
+ }
87
+ }
88
+ return servers;
89
+ }
90
+ function readToolsList(serverDir) {
91
+ const path = join(serverDir, '_tools.json');
92
+ const found = new Map();
93
+ if (!existsSync(path))
94
+ return found;
95
+ let json;
96
+ try {
97
+ json = JSON.parse(readFileSync(path, 'utf8'));
98
+ }
99
+ catch (error) {
100
+ throw new Error(`${path}: not valid JSON (${errorText(error)})`, { cause: error });
101
+ }
102
+ const parsed = ToolsListSchema.safeParse(json);
103
+ if (!parsed.success)
104
+ throw new Error(`${path}: ${issuesText(parsed.error)}`);
105
+ const tools = Array.isArray(parsed.data) ? parsed.data : parsed.data.tools;
106
+ for (const tool of tools) {
107
+ const description = typeof tool.description === 'string' ? tool.description : undefined;
108
+ const inputSchema = isRecord(tool.inputSchema) ? tool.inputSchema : undefined;
109
+ found.set(tool.name, {
110
+ ...(description !== undefined && { description }),
111
+ ...(inputSchema && { inputSchema }),
112
+ });
113
+ }
114
+ return found;
115
+ }
116
+ function readMockFile(path, server, tool, dir, schema) {
117
+ const parts = readMarkdown(readFileSync(path, 'utf8'));
118
+ if ('error' in parts)
119
+ throw new Error(`${path}: ${parts.error}`);
120
+ const parsed = MockFrontmatterSchema.safeParse(parts.fields);
121
+ if (!parsed.success)
122
+ throw new Error(`${path}: ${issuesText(parsed.error)}`);
123
+ if (parsed.data.type === 'agent' || parsed.data.abort_when !== undefined) {
124
+ throw new Error(`${path}: type: agent mocks are not supported by Cogitator's plugin evals, use a fixed mock`);
125
+ }
126
+ const expect = {};
127
+ for (const [field, spec] of Object.entries(parsed.data.expect ?? {})) {
128
+ const expectation = expectationOf(spec);
129
+ if ('error' in expectation)
130
+ throw new Error(`${path}: expect.${field} ${expectation.error}`);
131
+ expect[field] = expectation;
132
+ }
133
+ return {
134
+ server,
135
+ tool,
136
+ body: parts.body.replace(/^\n+/, '').replace(/\s+$/, ''),
137
+ error: parsed.data.error,
138
+ expect,
139
+ dir,
140
+ ...(schema?.description !== undefined && { description: schema.description }),
141
+ ...(schema?.inputSchema && { inputSchema: schema.inputSchema }),
142
+ };
143
+ }
144
+ function isLiteral(value) {
145
+ return (value === null ||
146
+ typeof value === 'string' ||
147
+ typeof value === 'boolean' ||
148
+ (typeof value === 'number' && Number.isFinite(value)));
149
+ }
150
+ function expectationOf(spec) {
151
+ if (Array.isArray(spec)) {
152
+ if (spec.length === 0 || !spec.every(isLiteral)) {
153
+ return { error: 'must list literal values (strings, numbers, booleans, null)' };
154
+ }
155
+ return { kind: 'oneOf', values: spec };
156
+ }
157
+ if (typeof spec === 'string') {
158
+ if (EXPECT_TYPES.has(spec))
159
+ return { kind: 'type', type: spec };
160
+ const pattern = /^\/(.*)\/([a-z]*)$/s.exec(spec);
161
+ if (pattern) {
162
+ const [, source = '', flags = ''] = pattern;
163
+ const problem = dialectProblem(source) ?? flagsProblem(flags);
164
+ if (problem)
165
+ return { error: `has the pattern ${spec}, which ${problem}` };
166
+ return { kind: 'pattern', source, flags };
167
+ }
168
+ return { kind: 'literal', value: spec };
169
+ }
170
+ if (isLiteral(spec))
171
+ return { kind: 'literal', value: spec };
172
+ return { error: 'must be a type name, a /regex/, a literal or a list of literals' };
173
+ }
174
+ function flagsProblem(flags) {
175
+ return /^[is]*$/.test(flags) ? undefined : 'uses a flag other than i and s';
176
+ }
177
+ /**
178
+ * Why `source` is outside the pattern dialect of `expect:` (literals, `.`, escapes, classes, the
179
+ * quantifiers `* + ? {m,n}` on one of those, an optional `^` and `$`), undefined when it is in it
180
+ */
181
+ export function dialectProblem(source) {
182
+ let at = source.startsWith('^') ? 1 : 0;
183
+ let end = source.length;
184
+ if (end > at && source.endsWith('$') && !escapedAt(source, end - 1))
185
+ end--;
186
+ while (at < end) {
187
+ const char = source[at];
188
+ if (char === '(' || char === ')')
189
+ return 'has a group, which the dialect does not allow';
190
+ if (char === '|')
191
+ return 'has an alternation, write a list of literals instead';
192
+ if (char === '^' || char === '$')
193
+ return 'has an anchor that is not at its start or end';
194
+ if (char === '*' || char === '+' || char === '?' || char === '{') {
195
+ return 'has a quantifier with nothing to repeat';
196
+ }
197
+ if (char === '\\') {
198
+ const next = source[at + 1];
199
+ if (next === undefined || at + 1 >= end)
200
+ return 'ends with a lone backslash';
201
+ if (/[1-9k]/.test(next))
202
+ return 'has a backreference, which the dialect does not allow';
203
+ at += 2;
204
+ }
205
+ else if (char === '[') {
206
+ const close = classEnd(source, at, end);
207
+ if (close === -1)
208
+ return 'has an unclosed character class';
209
+ at = close + 1;
210
+ }
211
+ else
212
+ at++;
213
+ const quantified = quantifierEnd(source, at, end);
214
+ if (quantified === -1)
215
+ return 'has a malformed {m,n} quantifier';
216
+ if (quantified !== at && quantified < end && source[quantified] === '?') {
217
+ return 'has a lazy quantifier, which the dialect does not allow';
218
+ }
219
+ at = quantified;
220
+ }
221
+ try {
222
+ new RegExp(source);
223
+ }
224
+ catch (error) {
225
+ return `is not a valid regular expression: ${errorText(error)}`;
226
+ }
227
+ return undefined;
228
+ }
229
+ function escapedAt(source, index) {
230
+ let slashes = 0;
231
+ for (let at = index - 1; at >= 0 && source[at] === '\\'; at--)
232
+ slashes++;
233
+ return slashes % 2 === 1;
234
+ }
235
+ function classEnd(source, open, end) {
236
+ let at = open + 1;
237
+ if (source[at] === '^')
238
+ at++;
239
+ if (source[at] === ']')
240
+ at++;
241
+ while (at < end) {
242
+ if (source[at] === '\\')
243
+ at += 2;
244
+ else if (source[at] === ']')
245
+ return at;
246
+ else
247
+ at++;
248
+ }
249
+ return -1;
250
+ }
251
+ /** Where a quantifier after an atom ends (`at` itself without one), -1 for a broken `{m,n}` */
252
+ function quantifierEnd(source, at, end) {
253
+ const char = source[at];
254
+ if (at >= end)
255
+ return at;
256
+ if (char === '*' || char === '+' || char === '?')
257
+ return at + 1;
258
+ if (char !== '{')
259
+ return at;
260
+ const match = /^\{\d+(?:,\d*)?\}/.exec(source.slice(at, end));
261
+ return match ? at + match[0].length : -1;
262
+ }
263
+ /** Why `input` violates the mock's `expect:` checks, undefined when it passes them */
264
+ export function expectViolation(mock, input) {
265
+ for (const [field, expectation] of Object.entries(mock.expect)) {
266
+ const found = valueAt(input, field);
267
+ if (!found.present)
268
+ return `${field} is missing`;
269
+ const problem = violation(expectation, found.value);
270
+ if (problem)
271
+ return `${field} ${problem}`;
272
+ }
273
+ return undefined;
274
+ }
275
+ function violation(expectation, value) {
276
+ switch (expectation.kind) {
277
+ case 'type':
278
+ return typeOf(value) === expectation.type ? undefined : `is not a ${expectation.type}`;
279
+ case 'pattern': {
280
+ if (typeof value !== 'string')
281
+ return 'is not a string';
282
+ if (value.length > EXPECT_MAX_LENGTH) {
283
+ return `is longer than ${EXPECT_MAX_LENGTH} characters`;
284
+ }
285
+ return new RegExp(expectation.source, expectation.flags).test(value)
286
+ ? undefined
287
+ : `does not match /${expectation.source}/${expectation.flags}`;
288
+ }
289
+ case 'literal':
290
+ return value === expectation.value
291
+ ? undefined
292
+ : `is not ${JSON.stringify(expectation.value)}`;
293
+ case 'oneOf':
294
+ return isLiteral(value) && expectation.values.includes(value)
295
+ ? undefined
296
+ : `is not one of ${expectation.values.map((v) => JSON.stringify(v)).join(', ')}`;
297
+ }
298
+ }
299
+ function typeOf(value) {
300
+ if (value === null)
301
+ return 'null';
302
+ if (Array.isArray(value))
303
+ return 'array';
304
+ if (typeof value === 'number')
305
+ return Number.isFinite(value) ? 'number' : undefined;
306
+ if (typeof value === 'string' || typeof value === 'boolean' || typeof value === 'object') {
307
+ return typeof value;
308
+ }
309
+ return undefined;
310
+ }
311
+ function valueAt(input, path) {
312
+ let current = input;
313
+ for (const key of path.split('.')) {
314
+ if (Array.isArray(current) && /^\d+$/.test(key)) {
315
+ const index = Number(key);
316
+ if (index >= current.length)
317
+ return { present: false };
318
+ current = current[index];
319
+ }
320
+ else if (isRecord(current) && Object.hasOwn(current, key)) {
321
+ current = current[key];
322
+ }
323
+ else
324
+ return { present: false };
325
+ }
326
+ return { present: true, value: current };
327
+ }
328
+ function textOf(value) {
329
+ if (value === undefined)
330
+ return '';
331
+ return typeof value === 'string' ? value : JSON.stringify(value);
332
+ }
333
+ /**
334
+ * The mock's answer to `input`: its body with `{{input.<field>}}` replaced by the field and
335
+ * `{{file:<path>}}` by the contents of a file of the server's mock directory, where `<path>` may
336
+ * hold `{input.<field>}`
337
+ */
338
+ export function renderMock(mock, input) {
339
+ return mock.body.replace(/\{\{\s*([^{}]*(?:\{[^{}]*\}[^{}]*)*)\s*\}\}/g, (whole, inner) => {
340
+ const expression = inner.trim();
341
+ if (expression.startsWith('input.')) {
342
+ const found = valueAt(input, expression.slice('input.'.length));
343
+ return found.present ? textOf(found.value) : '';
344
+ }
345
+ if (expression.startsWith('file:')) {
346
+ const name = expression
347
+ .slice('file:'.length)
348
+ .replace(/\{\s*input\.([^{}\s]+)\s*\}/g, (_match, field) => {
349
+ const found = valueAt(input, field);
350
+ return found.present ? textOf(found.value) : '';
351
+ });
352
+ const path = resolve(mock.dir, name);
353
+ if (path === mock.dir || !isInside(mock.dir, path)) {
354
+ throw new Error(`The mock fixture ${name} is outside the mock directory`);
355
+ }
356
+ if (!existsSync(path) || !statSync(path).isFile()) {
357
+ throw new Error(`The mock fixture ${name} does not exist`);
358
+ }
359
+ return readFileSync(path, 'utf8');
360
+ }
361
+ return whole;
362
+ });
363
+ }
364
+ /** A mock stopping its run: the run scores 0 and reports `aborted` */
365
+ export class MockAbortError extends Error {
366
+ abort;
367
+ constructor(abort) {
368
+ super(`${abort.server}/${abort.tool}: ${abort.reason}`);
369
+ this.abort = abort;
370
+ this.name = 'MockAbortError';
371
+ }
372
+ }
373
+ //# sourceMappingURL=mocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mocks.js","sourceRoot":"","sources":["../../src/plugin-evals/mocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PluginEvalResult } from './types.js';
2
+ /** The result document as a self-contained HTML page: no scripts, no external requests */
3
+ export declare function pluginEvalHtml(result: PluginEvalResult): string;
4
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/plugin-evals/report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,gBAAgB,EAEjB,MAAM,SAAS,CAAC;AAoKjB,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CA8B/D"}
@@ -0,0 +1,177 @@
1
+ import { escapeHtml, foldable, htmlDocument, htmlTiles } from '../reporters/html-format.js';
2
+ const STYLE = `
3
+ .verdict { font-size: 15px; margin: 12px 0; }
4
+ .banner { border: 1px solid var(--warn); color: var(--warn); border-radius: 8px; padding: 8px 12px; margin: 12px 0; }
5
+ .case { border: 1px solid var(--border); border-left: 4px solid var(--border); border-radius: 8px; padding: 12px 16px; margin: 16px 0; }
6
+ .case.regressed { border-left-color: var(--fail); }
7
+ .case.failed-load { border-left-color: var(--fail); }
8
+ .case h2 { margin: 0 0 6px; display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline; }
9
+ .case h3 { font-size: 13px; color: var(--muted); margin: 14px 0 6px; }
10
+ .bar { position: relative; height: 8px; background: var(--surface); border-radius: 4px; margin: 6px 0 10px; }
11
+ .bar span { position: absolute; left: 0; top: 0; bottom: 0; background: var(--pass); border-radius: 4px; }
12
+ .bar span.low { background: var(--fail); }
13
+ .bar i { position: absolute; top: -3px; bottom: -3px; width: 2px; background: var(--text); }
14
+ .run { border-top: 1px solid var(--border); padding: 6px 0; }
15
+ .run-head { display: flex; flex-wrap: wrap; gap: 10px; font-variant-numeric: tabular-nums; }
16
+ .graders { list-style: none; padding: 0; margin: 4px 0 0; }
17
+ .graders li { margin: 2px 0; }
18
+ .chip { display: inline-block; border-radius: 10px; padding: 0 8px; font-size: 12px; font-weight: 600; color: #fff; }
19
+ .chip.pass { background: var(--pass); }
20
+ .chip.fail { background: var(--fail); }
21
+ .chip.skip { background: var(--muted); }
22
+ .badge { display: inline-block; border: 1px solid var(--border); border-radius: 10px; padding: 0 8px; font-size: 11px; color: var(--muted); }
23
+ .notice { color: var(--warn); margin: 2px 0; }
24
+ `;
25
+ function fixed(value, digits = 2) {
26
+ return value.toFixed(digits);
27
+ }
28
+ function signed(value, digits = 2) {
29
+ if (value === undefined)
30
+ return '-';
31
+ const text = value.toFixed(digits);
32
+ return value > 0 ? `+${text}` : text;
33
+ }
34
+ function usd(value) {
35
+ return `$${value.toFixed(value < 1 ? 4 : 2)}`;
36
+ }
37
+ function scoreText(value) {
38
+ return value === null || value === undefined ? '-' : fixed(value);
39
+ }
40
+ function definitionText(grader) {
41
+ switch (grader.type) {
42
+ case 'regex':
43
+ return `/${grader.pattern}/${grader.flags} ${grader.match} in ${typeof grader.target === 'string' ? grader.target : `file ${grader.target.path}`}`;
44
+ case 'tool_used':
45
+ return `${grader.tool}${grader.inputMatch === undefined ? '' : ` /${grader.inputMatch}/`}, ${grader.min} to ${grader.max ?? 'any'} calls`;
46
+ case 'tool_order':
47
+ return `${grader.before.tool} before ${grader.after.tool}`;
48
+ case 'file_exists':
49
+ return `${grader.exists ? 'a created file matches' : 'no created file matches'} ${grader.path}`;
50
+ case 'llm':
51
+ return `${grader.criteria}\n\nfocus: ${typeof grader.focus === 'string' ? grader.focus : `file ${grader.focus.path}`}`;
52
+ case 'baseline':
53
+ return `${grader.criteria}\n\nreference: ${grader.baselineFile}`;
54
+ }
55
+ }
56
+ function graderItem(result) {
57
+ const chip = result.skipped
58
+ ? '<span class="chip skip">skipped</span>'
59
+ : `<span class="chip ${result.passed ? 'pass' : 'fail'}">${result.passed ? 'pass' : 'fail'}</span>`;
60
+ const badge = result.scored ? '' : ' <span class="badge">plugin-fired indicator</span>';
61
+ const votes = result.votes
62
+ ? `<ul>${result.votes
63
+ .map((vote) => `<li><b>${escapeHtml(vote.verdict)}</b>${vote.reasoning ? ` ${escapeHtml(vote.reasoning)}` : ''}</li>`)
64
+ .join('')}</ul>`
65
+ : '';
66
+ const evidence = result.evidence !== undefined
67
+ ? `<details><summary>What the judge saw</summary><pre>${escapeHtml(result.evidence)}</pre></details>`
68
+ : '';
69
+ const body = `<pre>${escapeHtml(result.explanation)}</pre>${votes}${evidence}`;
70
+ const open = !result.passed && !result.skipped ? ' open' : '';
71
+ return `<li>${chip} <code>${escapeHtml(result.name)}</code> <span class="muted">${escapeHtml(result.type)}, weight ${result.weight}</span>${badge}<details${open}><summary>explanation</summary>${body}</details></li>`;
72
+ }
73
+ function runBlock(run) {
74
+ const head = [
75
+ `<b>Run ${run.index}</b>`,
76
+ `score ${fixed(run.score)}`,
77
+ usd(run.costUsd),
78
+ `${run.durationSeconds.toFixed(1)}s`,
79
+ ...(run.error !== null ? [`<span class="fail">${escapeHtml(run.error)}</span>`] : []),
80
+ ...(run.aborted
81
+ ? [
82
+ `<span class="fail">aborted by ${escapeHtml(`${run.aborted.server}/${run.aborted.tool}`)}: ${escapeHtml(run.aborted.reason)}</span>`,
83
+ ]
84
+ : []),
85
+ ...(run.skippedPaidGraders ? ['<span class="warn">judge graders skipped</span>'] : []),
86
+ ...(run.tempDir ? [`<code>${escapeHtml(run.tempDir)}</code>`] : []),
87
+ ].join(' ');
88
+ const graders = run.graders.length > 0
89
+ ? `<ul class="graders">${run.graders.map(graderItem).join('')}</ul>`
90
+ : '<p class="muted">not graded</p>';
91
+ const reply = run.lastMessage !== ''
92
+ ? `<details><summary>Final reply</summary>${foldable(run.lastMessage, 200)}</details>`
93
+ : '';
94
+ return `<div class="run"><div class="run-head">${head}</div>${graders}${reply}</div>`;
95
+ }
96
+ function caseBlock(result, threshold) {
97
+ const { aggregates } = result;
98
+ const regressed = aggregates.delta !== undefined && aggregates.delta < 0;
99
+ const classes = ['case', regressed ? 'regressed' : '', result.error ? 'failed-load' : '']
100
+ .filter((name) => name !== '')
101
+ .join(' ');
102
+ const score = aggregates.score ?? 0;
103
+ const status = aggregates.passed
104
+ ? '<span class="pass">pass</span>'
105
+ : '<span class="fail">fail</span>';
106
+ const delta = aggregates.delta === undefined ? '' : `<span>delta ${signed(aggregates.delta)}</span>`;
107
+ const without = aggregates.withoutScore === undefined
108
+ ? ''
109
+ : `<span class="muted">without ${scoreText(aggregates.withoutScore)}</span>`;
110
+ const bar = `<div class="bar"><span class="${score < threshold ? 'low' : ''}" style="width:${(score * 100).toFixed(1)}%"></span><i style="left:${(threshold * 100).toFixed(1)}%"></i></div>`;
111
+ const notices = result.notices
112
+ .map((notice) => `<p class="notice">${escapeHtml(notice)}</p>`)
113
+ .join('');
114
+ const error = result.error ? `<p class="fail">${escapeHtml(result.error)}</p>` : '';
115
+ const withRuns = result.arms.with.map(runBlock).join('');
116
+ const withoutRuns = result.arms.without.map(runBlock).join('');
117
+ const graders = result.graders
118
+ .map((grader) => `<li><code>${escapeHtml(grader.name)}</code> <span class="muted">${escapeHtml(grader.type)}</span><pre>${escapeHtml(definitionText(grader))}</pre></li>`)
119
+ .join('');
120
+ return [
121
+ `<section class="${classes}">`,
122
+ `<h2>${escapeHtml(result.name)} ${status} <span>score ${scoreText(aggregates.score)}</span>${without}${delta}<span class="muted">${usd(aggregates.costUsd)}</span></h2>`,
123
+ bar,
124
+ notices,
125
+ error,
126
+ withRuns === '' ? '' : `<h3>${result.singleArm ? 'Runs' : 'With plugin'}</h3>${withRuns}`,
127
+ withoutRuns === '' ? '' : `<h3>Baseline, without the plugin</h3>${withoutRuns}`,
128
+ result.prompt === ''
129
+ ? ''
130
+ : `<details><summary>Prompt</summary><pre>${escapeHtml(result.prompt)}</pre></details>`,
131
+ graders === '' ? '' : `<details><summary>Graders</summary><ul>${graders}</ul></details>`,
132
+ '</section>',
133
+ ].join('\n');
134
+ }
135
+ function verdictLine(result) {
136
+ const compared = result.cases.filter((c) => c.aggregates.delta !== undefined);
137
+ if (compared.length === 0 || result.aggregates.meanDelta === undefined)
138
+ return '';
139
+ const improved = compared.filter((c) => (c.aggregates.delta ?? 0) > 0).length;
140
+ const regressed = compared.filter((c) => (c.aggregates.delta ?? 0) < 0).length;
141
+ const flat = compared.length - improved - regressed;
142
+ const points = signed(result.aggregates.meanDelta * 100, 1);
143
+ return `<p class="verdict">Plugin effect: <b>${points} pts</b> vs baseline, improved ${improved}, flat ${flat}, regressed ${regressed} of ${compared.length} case${compared.length === 1 ? '' : 's'}</p>`;
144
+ }
145
+ /** The result document as a self-contained HTML page: no scripts, no external requests */
146
+ export function pluginEvalHtml(result) {
147
+ const { aggregates } = result;
148
+ const tiles = htmlTiles([
149
+ ['Suite score', fixed(aggregates.overallScore)],
150
+ ['Ablation delta', signed(aggregates.meanDelta)],
151
+ ['Baseline score', scoreText(aggregates.baselineScore)],
152
+ [
153
+ `Cases at ${fixed(result.config.threshold)} or more`,
154
+ `${aggregates.casesPassed} / ${aggregates.casesTotal}`,
155
+ ],
156
+ ['Perfect runs', `${Math.round(aggregates.perfectRuns * 100)}%`],
157
+ ['Cost', usd(result.costUsd)],
158
+ ['Duration', `${Math.round(result.durationSeconds)}s`],
159
+ ]);
160
+ const banner = result.partial
161
+ ? `<p class="banner">Partial run (${escapeHtml(result.partialReason ?? 'unknown')}): leave it out of trend charts</p>`
162
+ : '';
163
+ const warnings = result.warnings
164
+ .map((warning) => `<p class="notice">${escapeHtml(warning)}</p>`)
165
+ .join('');
166
+ const body = [
167
+ `<h1>Plugin evals: ${escapeHtml(result.plugin.name)}</h1>`,
168
+ `<p class="sub">${escapeHtml(result.evalDir)} &middot; ${escapeHtml(result.startedAt)} &middot; Cogitator ${escapeHtml(result.cogitatorVersion)}${result.config.model ? ` &middot; model ${escapeHtml(result.config.model)}` : ''}</p>`,
169
+ verdictLine(result),
170
+ banner,
171
+ warnings,
172
+ tiles,
173
+ ...result.cases.map((c) => caseBlock(c, result.config.threshold)),
174
+ ].join('\n');
175
+ return htmlDocument(`Plugin evals: ${result.plugin.name}`, body, STYLE);
176
+ }
177
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/plugin-evals/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AASzF,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBb,CAAC;AAEF,SAAS,KAAK,CAAC,KAAa,EAAE,MAAM,GAAG,CAAC;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,MAAM,CAAC,KAAyB,EAAE,MAAM,GAAG,CAAC;IACnD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IACpC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACvC,CAAC;AAED,SAAS,GAAG,CAAC,KAAa;IACxB,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,SAAS,CAAC,KAAgC;IACjD,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,cAAc,CAAC,MAAwB;IAC9C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACrJ,KAAK,WAAW;YACd,OAAO,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,UAAU,GAAG,KAAK,MAAM,CAAC,GAAG,OAAO,MAAM,CAAC,GAAG,IAAI,KAAK,QAAQ,CAAC;QAC5I,KAAK,YAAY;YACf,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7D,KAAK,aAAa;YAChB,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,yBAAyB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAClG,KAAK,KAAK;YACR,OAAO,GAAG,MAAM,CAAC,QAAQ,cAAc,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACzH,KAAK,UAAU;YACb,OAAO,GAAG,MAAM,CAAC,QAAQ,kBAAkB,MAAM,CAAC,YAAY,EAAE,CAAC;IACrE,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,MAA8B;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO;QACzB,CAAC,CAAC,wCAAwC;QAC1C,CAAC,CAAC,qBAAqB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC;IACtG,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oDAAoD,CAAC;IACxF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK;QACxB,CAAC,CAAC,OAAO,MAAM,CAAC,KAAK;aAChB,GAAG,CACF,CAAC,IAAI,EAAE,EAAE,CACP,UAAU,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CACzG;aACA,IAAI,CAAC,EAAE,CAAC,OAAO;QACpB,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,QAAQ,GACZ,MAAM,CAAC,QAAQ,KAAK,SAAS;QAC3B,CAAC,CAAC,sDAAsD,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB;QACrG,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,IAAI,GAAG,QAAQ,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,KAAK,GAAG,QAAQ,EAAE,CAAC;IAC/E,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,OAAO,OAAO,IAAI,UAAU,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,MAAM,UAAU,KAAK,WAAW,IAAI,kCAAkC,IAAI,iBAAiB,CAAC;AAC1N,CAAC;AAED,SAAS,QAAQ,CAAC,GAAwB;IACxC,MAAM,IAAI,GAAG;QACX,UAAU,GAAG,CAAC,KAAK,MAAM;QACzB,SAAS,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAC3B,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;QAChB,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QACpC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,sBAAsB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,GAAG,CAAC,GAAG,CAAC,OAAO;YACb,CAAC,CAAC;gBACE,iCAAiC,UAAU,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS;aACrI;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,iDAAiD,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,MAAM,OAAO,GACX,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QACpB,CAAC,CAAC,uBAAuB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO;QACpE,CAAC,CAAC,iCAAiC,CAAC;IACxC,MAAM,KAAK,GACT,GAAG,CAAC,WAAW,KAAK,EAAE;QACpB,CAAC,CAAC,0CAA0C,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,YAAY;QACtF,CAAC,CAAC,EAAE,CAAC;IACT,OAAO,0CAA0C,IAAI,SAAS,OAAO,GAAG,KAAK,QAAQ,CAAC;AACxF,CAAC;AAED,SAAS,SAAS,CAAC,MAA4B,EAAE,SAAiB;IAChE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAC9B,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,KAAK,SAAS,IAAI,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;SACtF,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;SAC7B,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM;QAC9B,CAAC,CAAC,gCAAgC;QAClC,CAAC,CAAC,gCAAgC,CAAC;IACrC,MAAM,KAAK,GACT,UAAU,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;IACzF,MAAM,OAAO,GACX,UAAU,CAAC,YAAY,KAAK,SAAS;QACnC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,+BAA+B,SAAS,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC;IACjF,MAAM,GAAG,GAAG,iCAAiC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;IAC7L,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;SAC3B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,qBAAqB,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;SAC9D,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;SAC3B,GAAG,CACF,CAAC,MAAM,EAAE,EAAE,CACT,aAAa,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,aAAa,CAC3J;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO;QACL,mBAAmB,OAAO,IAAI;QAC9B,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,gBAAgB,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,OAAO,GAAG,KAAK,uBAAuB,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc;QACxK,GAAG;QACH,OAAO;QACP,KAAK;QACL,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,QAAQ,QAAQ,EAAE;QACzF,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,wCAAwC,WAAW,EAAE;QAC/E,MAAM,CAAC,MAAM,KAAK,EAAE;YAClB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,0CAA0C,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB;QACzF,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,0CAA0C,OAAO,iBAAiB;QACxF,YAAY;KACb,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,MAAwB;IAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAC9E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAClF,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9E,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/E,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IAC5D,OAAO,wCAAwC,MAAM,kCAAkC,QAAQ,UAAU,IAAI,eAAe,SAAS,OAAO,QAAQ,CAAC,MAAM,QAAQ,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AAC5M,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,cAAc,CAAC,MAAwB;IACrD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAC9B,MAAM,KAAK,GAAG,SAAS,CAAC;QACtB,CAAC,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAC/C,CAAC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC,gBAAgB,EAAE,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACvD;YACE,YAAY,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU;YACpD,GAAG,UAAU,CAAC,WAAW,MAAM,UAAU,CAAC,UAAU,EAAE;SACvD;QACD,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC;QAChE,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC;KACvD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO;QAC3B,CAAC,CAAC,kCAAkC,UAAU,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS,CAAC,qCAAqC;QACtH,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ;SAC7B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;SAChE,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,IAAI,GAAG;QACX,qBAAqB,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO;QAC1D,kBAAkB,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,uBAAuB,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM;QACvO,WAAW,CAAC,MAAM,CAAC;QACnB,MAAM;QACN,QAAQ;QACR,KAAK;QACL,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;KAClE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO,YAAY,CAAC,iBAAiB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { PluginEvalOptions, PluginEvalReport } from './types.js';
2
+ /**
3
+ * Experimental. Runs a plugin's eval suite in the format of Claude Code's `claude plugin eval`:
4
+ * each case's prompt several times in a fresh workspace with the plugin loaded and, for the
5
+ * no-plugin baseline, without it, scores every run with the case's graders (`regex`,
6
+ * `tool_used`, `tool_order`, `file_exists`, and `llm` and `baseline` judged by a majority of three
7
+ * votes) and writes `aggregate-result.json` and a self-contained `report.html`.
8
+ *
9
+ * Needs `@cogitator-ai/core`. Throws `PluginEvalError` when the suite cannot start: no plugin, no
10
+ * case, an invalid option. A case that fails to load is reported in the result instead.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const { result, reportFile } = await experimental_runPluginEvals({
15
+ * target: './my-plugin',
16
+ * llm: { defaultModel: 'anthropic/claude-sonnet-5-5' },
17
+ * threshold: 0.8,
18
+ * });
19
+ * console.log(result.aggregates.overallScore, reportFile);
20
+ * ```
21
+ */
22
+ export declare function experimental_runPluginEvals(input: PluginEvalOptions): Promise<PluginEvalReport>;
23
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/plugin-evals/runner.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAMV,iBAAiB,EAGjB,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAsLjB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAwZ3B"}