elasticdash-test 0.1.16 → 0.1.17-alpha-2

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 (86) hide show
  1. package/dist/cloud-client.d.ts +34 -0
  2. package/dist/cloud-client.d.ts.map +1 -0
  3. package/dist/cloud-client.js +103 -0
  4. package/dist/cloud-client.js.map +1 -0
  5. package/dist/dashboard-server.d.ts.map +1 -1
  6. package/dist/dashboard-server.js +425 -90
  7. package/dist/dashboard-server.js.map +1 -1
  8. package/dist/evaluators/determinism.d.ts +3 -0
  9. package/dist/evaluators/determinism.d.ts.map +1 -0
  10. package/dist/evaluators/determinism.js +116 -0
  11. package/dist/evaluators/determinism.js.map +1 -0
  12. package/dist/evaluators/index.d.ts +4 -0
  13. package/dist/evaluators/index.d.ts.map +1 -0
  14. package/dist/evaluators/index.js +61 -0
  15. package/dist/evaluators/index.js.map +1 -0
  16. package/dist/evaluators/latency-budget.d.ts +3 -0
  17. package/dist/evaluators/latency-budget.d.ts.map +1 -0
  18. package/dist/evaluators/latency-budget.js +45 -0
  19. package/dist/evaluators/latency-budget.js.map +1 -0
  20. package/dist/evaluators/llm-judge.d.ts +3 -0
  21. package/dist/evaluators/llm-judge.d.ts.map +1 -0
  22. package/dist/evaluators/llm-judge.js +122 -0
  23. package/dist/evaluators/llm-judge.js.map +1 -0
  24. package/dist/evaluators/output-contains.d.ts +3 -0
  25. package/dist/evaluators/output-contains.d.ts.map +1 -0
  26. package/dist/evaluators/output-contains.js +52 -0
  27. package/dist/evaluators/output-contains.js.map +1 -0
  28. package/dist/evaluators/output-schema.d.ts +3 -0
  29. package/dist/evaluators/output-schema.d.ts.map +1 -0
  30. package/dist/evaluators/output-schema.js +58 -0
  31. package/dist/evaluators/output-schema.js.map +1 -0
  32. package/dist/evaluators/token-budget.d.ts +3 -0
  33. package/dist/evaluators/token-budget.d.ts.map +1 -0
  34. package/dist/evaluators/token-budget.js +45 -0
  35. package/dist/evaluators/token-budget.js.map +1 -0
  36. package/dist/evaluators/types.d.ts +103 -0
  37. package/dist/evaluators/types.d.ts.map +1 -0
  38. package/dist/evaluators/types.js +6 -0
  39. package/dist/evaluators/types.js.map +1 -0
  40. package/dist/html/dashboard.html +359 -73
  41. package/dist/index.cjs +253 -14
  42. package/dist/index.d.ts +2 -2
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +1 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/interceptors/telemetry-push.d.ts +40 -0
  47. package/dist/interceptors/telemetry-push.d.ts.map +1 -1
  48. package/dist/interceptors/telemetry-push.js +129 -6
  49. package/dist/interceptors/telemetry-push.js.map +1 -1
  50. package/dist/interceptors/tool.d.ts.map +1 -1
  51. package/dist/interceptors/tool.js +8 -1
  52. package/dist/interceptors/tool.js.map +1 -1
  53. package/dist/interceptors/workflow-ai.d.ts.map +1 -1
  54. package/dist/interceptors/workflow-ai.js +21 -6
  55. package/dist/interceptors/workflow-ai.js.map +1 -1
  56. package/dist/internals/mock-resolver.d.ts +70 -2
  57. package/dist/internals/mock-resolver.d.ts.map +1 -1
  58. package/dist/internals/mock-resolver.js +157 -6
  59. package/dist/internals/mock-resolver.js.map +1 -1
  60. package/dist/test-group/cli.d.ts +8 -0
  61. package/dist/test-group/cli.d.ts.map +1 -0
  62. package/dist/test-group/cli.js +162 -0
  63. package/dist/test-group/cli.js.map +1 -0
  64. package/dist/test-group/git-context.d.ts +3 -0
  65. package/dist/test-group/git-context.d.ts.map +1 -0
  66. package/dist/test-group/git-context.js +59 -0
  67. package/dist/test-group/git-context.js.map +1 -0
  68. package/dist/test-group/reporter.d.ts +4 -0
  69. package/dist/test-group/reporter.d.ts.map +1 -0
  70. package/dist/test-group/reporter.js +54 -0
  71. package/dist/test-group/reporter.js.map +1 -0
  72. package/dist/test-group/runner.d.ts +18 -0
  73. package/dist/test-group/runner.d.ts.map +1 -0
  74. package/dist/test-group/runner.js +234 -0
  75. package/dist/test-group/runner.js.map +1 -0
  76. package/dist/workflow-runner-worker.js +7 -1
  77. package/dist/workflow-runner-worker.js.map +1 -1
  78. package/package.json +1 -1
  79. package/src/dashboard-server.ts +101 -28
  80. package/src/html/dashboard.html +359 -73
  81. package/src/index.ts +2 -2
  82. package/src/interceptors/telemetry-push.ts +159 -7
  83. package/src/interceptors/tool.ts +9 -1
  84. package/src/interceptors/workflow-ai.ts +22 -6
  85. package/src/internals/mock-resolver.ts +190 -7
  86. package/src/workflow-runner-worker.ts +11 -3
@@ -0,0 +1,3 @@
1
+ import type { Expectation, SingleRunData, ExpectationResult } from './types.js';
2
+ export declare function evaluateLLMJudge(expectation: Expectation, runs: SingleRunData[]): Promise<ExpectationResult>;
3
+ //# sourceMappingURL=llm-judge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-judge.d.ts","sourceRoot":"","sources":["../../src/evaluators/llm-judge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAgB,MAAM,YAAY,CAAA;AAqG7F,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,aAAa,EAAE,GACpB,OAAO,CAAC,iBAAiB,CAAC,CA+C5B"}
@@ -0,0 +1,122 @@
1
+ async function callJudgeLLM(prompt, output, model, provider) {
2
+ const outputStr = typeof output === 'string' ? output : JSON.stringify(output, null, 2);
3
+ const systemPrompt = `You are an evaluation judge. You will be given an output from an AI workflow and a criteria to evaluate it against. Respond with exactly YES or NO on the first line, followed by a brief reasoning on the next line.`;
4
+ const userMessage = `## Criteria\n${prompt}\n\n## Output to evaluate\n${outputStr}\n\nDoes the output meet the criteria? Answer YES or NO, then explain briefly.`;
5
+ if (provider === 'openai' || provider === 'default') {
6
+ const apiKey = process.env.OPENAI_API_KEY;
7
+ if (!apiKey)
8
+ throw new Error('OPENAI_API_KEY not set (needed for LLM judge)');
9
+ const res = await fetch('https://api.openai.com/v1/chat/completions', {
10
+ method: 'POST',
11
+ headers: {
12
+ 'Authorization': `Bearer ${apiKey}`,
13
+ 'Content-Type': 'application/json',
14
+ },
15
+ body: JSON.stringify({
16
+ model,
17
+ messages: [
18
+ { role: 'system', content: systemPrompt },
19
+ { role: 'user', content: userMessage },
20
+ ],
21
+ max_tokens: 200,
22
+ temperature: 0,
23
+ }),
24
+ signal: AbortSignal.timeout(30_000),
25
+ });
26
+ if (!res.ok) {
27
+ throw new Error(`OpenAI API error: ${res.status} ${res.statusText}`);
28
+ }
29
+ const json = await res.json();
30
+ const content = json.choices?.[0]?.message?.content ?? '';
31
+ return parseVerdict(content);
32
+ }
33
+ if (provider === 'anthropic') {
34
+ const apiKey = process.env.ANTHROPIC_API_KEY;
35
+ if (!apiKey)
36
+ throw new Error('ANTHROPIC_API_KEY not set (needed for LLM judge)');
37
+ const res = await fetch('https://api.anthropic.com/v1/messages', {
38
+ method: 'POST',
39
+ headers: {
40
+ 'x-api-key': apiKey,
41
+ 'content-type': 'application/json',
42
+ 'anthropic-version': '2023-06-01',
43
+ },
44
+ body: JSON.stringify({
45
+ model,
46
+ system: systemPrompt,
47
+ messages: [{ role: 'user', content: userMessage }],
48
+ max_tokens: 200,
49
+ temperature: 0,
50
+ }),
51
+ signal: AbortSignal.timeout(30_000),
52
+ });
53
+ if (!res.ok) {
54
+ throw new Error(`Anthropic API error: ${res.status} ${res.statusText}`);
55
+ }
56
+ const json = await res.json();
57
+ const content = json.content?.[0]?.text ?? '';
58
+ return parseVerdict(content);
59
+ }
60
+ throw new Error(`Unsupported judge provider: ${provider}. Use 'openai' or 'anthropic'.`);
61
+ }
62
+ function parseVerdict(content) {
63
+ const lines = content.trim().split('\n');
64
+ const firstLine = lines[0]?.trim().toUpperCase() ?? '';
65
+ const passed = firstLine.startsWith('YES');
66
+ const reasoning = lines.slice(1).join('\n').trim() || (passed ? 'Criteria met' : 'Criteria not met');
67
+ return { passed, reasoning };
68
+ }
69
+ function resolveModel(expectation) {
70
+ const provider = expectation.judgeProvider || detectProvider(expectation.judgeModel);
71
+ const model = expectation.judgeModel || 'gpt-4o-mini';
72
+ return { model, provider };
73
+ }
74
+ function detectProvider(model) {
75
+ if (!model)
76
+ return 'default';
77
+ if (model.startsWith('claude'))
78
+ return 'anthropic';
79
+ return 'default';
80
+ }
81
+ export async function evaluateLLMJudge(expectation, runs) {
82
+ if (!expectation.judgePrompt) {
83
+ return {
84
+ expectationId: expectation.id,
85
+ type: 'llm-judge',
86
+ passed: false,
87
+ detail: 'No judge prompt provided',
88
+ };
89
+ }
90
+ const { model, provider } = resolveModel(expectation);
91
+ const perRun = [];
92
+ let allPassed = true;
93
+ for (const run of runs) {
94
+ try {
95
+ const verdict = await callJudgeLLM(expectation.judgePrompt, run.output, model, provider === 'default' ? 'openai' : provider);
96
+ if (!verdict.passed)
97
+ allPassed = false;
98
+ perRun.push({
99
+ runIndex: run.runIndex,
100
+ passed: verdict.passed,
101
+ value: verdict.reasoning,
102
+ });
103
+ }
104
+ catch (err) {
105
+ allPassed = false;
106
+ perRun.push({
107
+ runIndex: run.runIndex,
108
+ passed: false,
109
+ value: `error: ${err.message}`,
110
+ });
111
+ }
112
+ }
113
+ const passedCount = perRun.filter((r) => r.passed).length;
114
+ return {
115
+ expectationId: expectation.id,
116
+ type: 'llm-judge',
117
+ passed: allPassed,
118
+ detail: `${passedCount}/${runs.length} passed judge evaluation (${model})`,
119
+ perRun,
120
+ };
121
+ }
122
+ //# sourceMappingURL=llm-judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-judge.js","sourceRoot":"","sources":["../../src/evaluators/llm-judge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Expectation, SingleRunData, ExpectationResult } from './types.js';
2
+ export declare function evaluateOutputContains(expectation: Expectation, runs: SingleRunData[]): ExpectationResult;
3
+ //# sourceMappingURL=output-contains.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-contains.d.ts","sourceRoot":"","sources":["../../src/evaluators/output-contains.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAgB,MAAM,YAAY,CAAA;AAQ7F,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,aAAa,EAAE,GACpB,iBAAiB,CAgDnB"}
@@ -0,0 +1,52 @@
1
+ function stringify(value) {
2
+ if (typeof value === 'string')
3
+ return value;
4
+ if (value == null)
5
+ return '';
6
+ return JSON.stringify(value);
7
+ }
8
+ export function evaluateOutputContains(expectation, runs) {
9
+ const perRun = [];
10
+ let allPassed = true;
11
+ for (const run of runs) {
12
+ let output = stringify(run.output);
13
+ let contains = expectation.containsText ?? '';
14
+ let notContains = expectation.notContainsText ?? '';
15
+ if (expectation.caseInsensitive) {
16
+ output = output.toLowerCase();
17
+ contains = contains.toLowerCase();
18
+ notContains = notContains.toLowerCase();
19
+ }
20
+ let passed = true;
21
+ const reasons = [];
22
+ if (expectation.containsText && !output.includes(contains)) {
23
+ passed = false;
24
+ reasons.push(`missing "${expectation.containsText}"`);
25
+ }
26
+ if (expectation.notContainsText && output.includes(notContains)) {
27
+ passed = false;
28
+ reasons.push(`contains forbidden "${expectation.notContainsText}"`);
29
+ }
30
+ if (!passed)
31
+ allPassed = false;
32
+ perRun.push({
33
+ runIndex: run.runIndex,
34
+ passed,
35
+ value: passed ? 'ok' : reasons.join('; '),
36
+ });
37
+ }
38
+ const passedCount = perRun.filter((r) => r.passed).length;
39
+ const parts = [`${passedCount}/${runs.length} passed`];
40
+ if (expectation.containsText)
41
+ parts.push(`contains: "${expectation.containsText}"`);
42
+ if (expectation.notContainsText)
43
+ parts.push(`excludes: "${expectation.notContainsText}"`);
44
+ return {
45
+ expectationId: expectation.id,
46
+ type: 'output-contains',
47
+ passed: allPassed,
48
+ detail: parts.join(', '),
49
+ perRun,
50
+ };
51
+ }
52
+ //# sourceMappingURL=output-contains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-contains.js","sourceRoot":"","sources":["../../src/evaluators/output-contains.ts"],"names":[],"mappings":"AAEA,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAA;IAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,WAAwB,EACxB,IAAqB;IAErB,MAAM,MAAM,GAAmB,EAAE,CAAA;IACjC,IAAI,SAAS,GAAG,IAAI,CAAA;IAEpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAClC,IAAI,QAAQ,GAAG,WAAW,CAAC,YAAY,IAAI,EAAE,CAAA;QAC7C,IAAI,WAAW,GAAG,WAAW,CAAC,eAAe,IAAI,EAAE,CAAA;QAEnD,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC;YAChC,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;YAC7B,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;YACjC,WAAW,GAAG,WAAW,CAAC,WAAW,EAAE,CAAA;QACzC,CAAC;QAED,IAAI,MAAM,GAAG,IAAI,CAAA;QACjB,MAAM,OAAO,GAAa,EAAE,CAAA;QAE5B,IAAI,WAAW,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,MAAM,GAAG,KAAK,CAAA;YACd,OAAO,CAAC,IAAI,CAAC,YAAY,WAAW,CAAC,YAAY,GAAG,CAAC,CAAA;QACvD,CAAC;QAED,IAAI,WAAW,CAAC,eAAe,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAChE,MAAM,GAAG,KAAK,CAAA;YACd,OAAO,CAAC,IAAI,CAAC,uBAAuB,WAAW,CAAC,eAAe,GAAG,CAAC,CAAA;QACrE,CAAC;QAED,IAAI,CAAC,MAAM;YAAE,SAAS,GAAG,KAAK,CAAA;QAC9B,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,MAAM;YACN,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;SAC1C,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAA;IACzD,MAAM,KAAK,GAAa,CAAC,GAAG,WAAW,IAAI,IAAI,CAAC,MAAM,SAAS,CAAC,CAAA;IAChE,IAAI,WAAW,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,WAAW,CAAC,YAAY,GAAG,CAAC,CAAA;IACnF,IAAI,WAAW,CAAC,eAAe;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,WAAW,CAAC,eAAe,GAAG,CAAC,CAAA;IAEzF,OAAO;QACL,aAAa,EAAE,WAAW,CAAC,EAAE;QAC7B,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACxB,MAAM;KACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Expectation, SingleRunData, ExpectationResult } from './types.js';
2
+ export declare function evaluateOutputSchema(expectation: Expectation, runs: SingleRunData[]): Promise<ExpectationResult>;
3
+ //# sourceMappingURL=output-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-schema.d.ts","sourceRoot":"","sources":["../../src/evaluators/output-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAgB,MAAM,YAAY,CAAA;AAE7F,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,aAAa,EAAE,GACpB,OAAO,CAAC,iBAAiB,CAAC,CA4D5B"}
@@ -0,0 +1,58 @@
1
+ export async function evaluateOutputSchema(expectation, runs) {
2
+ if (!expectation.jsonSchema) {
3
+ return {
4
+ expectationId: expectation.id,
5
+ type: 'output-schema',
6
+ passed: true,
7
+ detail: 'No JSON schema provided, skipped',
8
+ };
9
+ }
10
+ // Dynamic import ajv — it's an optional dependency
11
+ let Ajv;
12
+ try {
13
+ // @ts-ignore — ajv is an optional peer dependency
14
+ Ajv = (await import('ajv')).default;
15
+ }
16
+ catch {
17
+ return {
18
+ expectationId: expectation.id,
19
+ type: 'output-schema',
20
+ passed: false,
21
+ detail: 'ajv package not installed. Run: npm install ajv',
22
+ };
23
+ }
24
+ const ajv = new Ajv({ allErrors: true });
25
+ const validate = ajv.compile(expectation.jsonSchema);
26
+ const perRun = [];
27
+ let allPassed = true;
28
+ for (const run of runs) {
29
+ let data = run.output;
30
+ // If output is a string, try to parse it as JSON
31
+ if (typeof data === 'string') {
32
+ try {
33
+ data = JSON.parse(data);
34
+ }
35
+ catch {
36
+ // leave as string — will likely fail validation
37
+ }
38
+ }
39
+ const valid = validate(data);
40
+ if (!valid) {
41
+ allPassed = false;
42
+ const errors = validate.errors?.map((e) => `${e.instancePath || '/'} ${e.message}`).join('; ') ?? 'unknown error';
43
+ perRun.push({ runIndex: run.runIndex, passed: false, value: errors });
44
+ }
45
+ else {
46
+ perRun.push({ runIndex: run.runIndex, passed: true, value: 'valid' });
47
+ }
48
+ }
49
+ const passedCount = perRun.filter((r) => r.passed).length;
50
+ return {
51
+ expectationId: expectation.id,
52
+ type: 'output-schema',
53
+ passed: allPassed,
54
+ detail: `${passedCount}/${runs.length} outputs match schema`,
55
+ perRun,
56
+ };
57
+ }
58
+ //# sourceMappingURL=output-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-schema.js","sourceRoot":"","sources":["../../src/evaluators/output-schema.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAAwB,EACxB,IAAqB;IAErB,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QAC5B,OAAO;YACL,aAAa,EAAE,WAAW,CAAC,EAAE;YAC7B,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,kCAAkC;SAC3C,CAAA;IACH,CAAC;IAED,mDAAmD;IACnD,IAAI,GAAQ,CAAA;IACZ,IAAI,CAAC;QACH,kDAAkD;QAClD,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAA;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,aAAa,EAAE,WAAW,CAAC,EAAE;YAC7B,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,iDAAiD;SAC1D,CAAA;IACH,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;IAEpD,MAAM,MAAM,GAAmB,EAAE,CAAA;IACjC,IAAI,SAAS,GAAG,IAAI,CAAA;IAEpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAA;QACrB,iDAAiD;QACjD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,gDAAgD;YAClD,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS,GAAG,KAAK,CAAA;YACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,YAAY,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,eAAe,CAAA;YACtH,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACvE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAA;IAEzD,OAAO;QACL,aAAa,EAAE,WAAW,CAAC,EAAE;QAC7B,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,GAAG,WAAW,IAAI,IAAI,CAAC,MAAM,uBAAuB;QAC5D,MAAM;KACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Expectation, SingleRunData, ExpectationResult } from './types.js';
2
+ export declare function evaluateTokenBudget(expectation: Expectation, runs: SingleRunData[]): ExpectationResult;
3
+ //# sourceMappingURL=token-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-budget.d.ts","sourceRoot":"","sources":["../../src/evaluators/token-budget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAgB,MAAM,YAAY,CAAA;AAE7F,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,aAAa,EAAE,GACpB,iBAAiB,CAgDnB"}
@@ -0,0 +1,45 @@
1
+ export function evaluateTokenBudget(expectation, runs) {
2
+ const perRun = [];
3
+ let allPassed = true;
4
+ // Per-run check
5
+ if (expectation.maxTokensPerRun != null) {
6
+ for (const run of runs) {
7
+ const tokens = run.tokenUsage.totalTokens;
8
+ const passed = tokens <= expectation.maxTokensPerRun;
9
+ if (!passed)
10
+ allPassed = false;
11
+ perRun.push({ runIndex: run.runIndex, passed, value: tokens });
12
+ }
13
+ }
14
+ // Total check
15
+ const totalTokens = runs.reduce((sum, r) => sum + r.tokenUsage.totalTokens, 0);
16
+ if (expectation.maxTotalTokens != null && totalTokens > expectation.maxTotalTokens) {
17
+ allPassed = false;
18
+ }
19
+ // If neither constraint is set, pass by default but populate per-run
20
+ if (expectation.maxTokensPerRun == null && expectation.maxTotalTokens == null) {
21
+ for (const run of runs) {
22
+ perRun.push({ runIndex: run.runIndex, passed: true, value: run.tokenUsage.totalTokens });
23
+ }
24
+ }
25
+ // Build detail string
26
+ const avg = runs.length > 0 ? Math.round(totalTokens / runs.length) : 0;
27
+ const parts = [];
28
+ if (expectation.maxTokensPerRun != null) {
29
+ const passedCount = perRun.filter((r) => r.passed).length;
30
+ parts.push(`${passedCount}/${runs.length} runs under ${expectation.maxTokensPerRun} tokens/run`);
31
+ }
32
+ if (expectation.maxTotalTokens != null) {
33
+ const totalPassed = totalTokens <= expectation.maxTotalTokens;
34
+ parts.push(`total ${totalTokens} tokens ${totalPassed ? 'within' : 'exceeds'} ${expectation.maxTotalTokens} budget`);
35
+ }
36
+ parts.push(`avg ${avg} tokens/run`);
37
+ return {
38
+ expectationId: expectation.id,
39
+ type: 'token-budget',
40
+ passed: allPassed,
41
+ detail: parts.join(', '),
42
+ perRun: perRun.length > 0 ? perRun : undefined,
43
+ };
44
+ }
45
+ //# sourceMappingURL=token-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-budget.js","sourceRoot":"","sources":["../../src/evaluators/token-budget.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CACjC,WAAwB,EACxB,IAAqB;IAErB,MAAM,MAAM,GAAmB,EAAE,CAAA;IACjC,IAAI,SAAS,GAAG,IAAI,CAAA;IAEpB,gBAAgB;IAChB,IAAI,WAAW,CAAC,eAAe,IAAI,IAAI,EAAE,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,WAAW,CAAA;YACzC,MAAM,MAAM,GAAG,MAAM,IAAI,WAAW,CAAC,eAAe,CAAA;YACpD,IAAI,CAAC,MAAM;gBAAE,SAAS,GAAG,KAAK,CAAA;YAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IAED,cAAc;IACd,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAC9E,IAAI,WAAW,CAAC,cAAc,IAAI,IAAI,IAAI,WAAW,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC;QACnF,SAAS,GAAG,KAAK,CAAA;IACnB,CAAC;IAED,qEAAqE;IACrE,IAAI,WAAW,CAAC,eAAe,IAAI,IAAI,IAAI,WAAW,CAAC,cAAc,IAAI,IAAI,EAAE,CAAC;QAC9E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAA;QAC1F,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvE,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,IAAI,WAAW,CAAC,eAAe,IAAI,IAAI,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAA;QACzD,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,IAAI,IAAI,CAAC,MAAM,eAAe,WAAW,CAAC,eAAe,aAAa,CAAC,CAAA;IAClG,CAAC;IACD,IAAI,WAAW,CAAC,cAAc,IAAI,IAAI,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,WAAW,IAAI,WAAW,CAAC,cAAc,CAAA;QAC7D,KAAK,CAAC,IAAI,CAAC,SAAS,WAAW,WAAW,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,IAAI,WAAW,CAAC,cAAc,SAAS,CAAC,CAAA;IACtH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,CAAA;IAEnC,OAAO;QACL,aAAa,EAAE,WAAW,CAAC,EAAE;QAC7B,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAC/C,CAAA;AACH,CAAC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Evaluator types — shared interfaces for the test group evaluation system.
3
+ * Field names match the backend DB schema (camelCase versions of snake_case columns).
4
+ */
5
+ export type ExpectationType = 'llm-judge' | 'token-budget' | 'latency-budget' | 'output-contains' | 'output-schema' | 'determinism';
6
+ export interface Expectation {
7
+ id: number;
8
+ testGroupId: number;
9
+ type: ExpectationType;
10
+ judgePrompt?: string;
11
+ judgeModel?: string;
12
+ judgeProvider?: string;
13
+ maxTotalTokens?: number;
14
+ maxTokensPerRun?: number;
15
+ maxDurationMs?: number;
16
+ maxTotalDurationMs?: number;
17
+ containsText?: string;
18
+ notContainsText?: string;
19
+ caseInsensitive?: boolean;
20
+ jsonSchema?: Record<string, unknown>;
21
+ similarityThreshold?: number;
22
+ }
23
+ export interface TokenUsage {
24
+ inputTokens: number;
25
+ outputTokens: number;
26
+ totalTokens: number;
27
+ }
28
+ export interface SingleRunData {
29
+ runIndex: number;
30
+ passed: boolean;
31
+ durationMs: number;
32
+ tokenUsage: TokenUsage;
33
+ output: unknown;
34
+ trace?: unknown;
35
+ error?: string;
36
+ startedAt?: string;
37
+ completedAt?: string;
38
+ }
39
+ export interface PerRunResult {
40
+ runIndex: number;
41
+ passed: boolean;
42
+ value: unknown;
43
+ }
44
+ export interface ExpectationResult {
45
+ expectationId: number;
46
+ type: ExpectationType;
47
+ passed: boolean;
48
+ detail: string;
49
+ perRun?: PerRunResult[];
50
+ }
51
+ export interface EvaluationResult {
52
+ passed: boolean;
53
+ summary: string;
54
+ results: ExpectationResult[];
55
+ }
56
+ export interface TestGroup {
57
+ id: number;
58
+ name: string;
59
+ description?: string;
60
+ projectId: number;
61
+ workflowName: string;
62
+ frozenEvents: unknown[];
63
+ targetStepId: number;
64
+ targetStepType: 'ai' | 'tool';
65
+ mockInput?: unknown;
66
+ promptMocks?: Record<string, string>;
67
+ toolMocks?: Record<string, unknown>;
68
+ expectations: Expectation[];
69
+ runCount: number;
70
+ passThreshold: 'all' | number;
71
+ timeoutMs: number;
72
+ tags?: string[];
73
+ createdAt?: string;
74
+ updatedAt?: string;
75
+ }
76
+ export interface GitContext {
77
+ branch: string;
78
+ commit: string;
79
+ commitMessage?: string;
80
+ prNumber?: number;
81
+ prUrl?: string;
82
+ }
83
+ export interface TestGroupRunResult {
84
+ testGroupId: number;
85
+ triggeredBy: 'dashboard' | 'ci' | 'api' | 'schedule' | 'local';
86
+ passed: boolean;
87
+ summary: string;
88
+ singleRuns: SingleRunData[];
89
+ expectationResults: ExpectationResult[];
90
+ gitContext?: GitContext;
91
+ startedAt: string;
92
+ completedAt: string;
93
+ }
94
+ export interface BatchResult {
95
+ passed: boolean;
96
+ summary: string;
97
+ testGroupRunIds: number[];
98
+ results: TestGroupRunResult[];
99
+ gitContext?: GitContext;
100
+ startedAt: string;
101
+ completedAt: string;
102
+ }
103
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/evaluators/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Evaluator types — shared interfaces for the test group evaluation system.
3
+ * Field names match the backend DB schema (camelCase versions of snake_case columns).
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/evaluators/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}