@lesliechan721/agent-skill-eval 0.1.0-beta.7 → 0.1.0-beta.9

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 (98) hide show
  1. package/dist/bin.js +149 -39
  2. package/dist/bin.js.map +1 -1
  3. package/dist/codex-eval-app-server.d.ts +199 -0
  4. package/dist/codex-eval-app-server.js +1366 -0
  5. package/dist/codex-eval-app-server.js.map +1 -0
  6. package/dist/codex-eval-cases.d.ts +43 -0
  7. package/dist/codex-eval-cases.js +327 -0
  8. package/dist/codex-eval-cases.js.map +1 -0
  9. package/dist/codex-eval-isolation.d.ts +61 -0
  10. package/dist/codex-eval-isolation.js +318 -0
  11. package/dist/codex-eval-isolation.js.map +1 -0
  12. package/dist/codex-eval-process-tree.d.ts +38 -0
  13. package/dist/codex-eval-process-tree.js +803 -0
  14. package/dist/codex-eval-process-tree.js.map +1 -0
  15. package/dist/codex-eval-runtime-config.d.ts +43 -0
  16. package/dist/codex-eval-runtime-config.js +607 -0
  17. package/dist/codex-eval-runtime-config.js.map +1 -0
  18. package/dist/codex-trigger-eval.d.ts +82 -0
  19. package/dist/codex-trigger-eval.js +789 -0
  20. package/dist/codex-trigger-eval.js.map +1 -0
  21. package/dist/codex-workflow.d.ts +188 -0
  22. package/dist/codex-workflow.js +1790 -0
  23. package/dist/codex-workflow.js.map +1 -0
  24. package/dist/credentials.d.ts +5 -0
  25. package/dist/credentials.js +30 -0
  26. package/dist/credentials.js.map +1 -0
  27. package/dist/custom-process.d.ts +58 -0
  28. package/dist/custom-process.js +409 -0
  29. package/dist/custom-process.js.map +1 -0
  30. package/dist/eval-audit.d.ts +38 -0
  31. package/dist/eval-audit.js +71 -0
  32. package/dist/eval-audit.js.map +1 -0
  33. package/dist/eval-file.d.ts +9 -0
  34. package/dist/eval-file.js +15 -0
  35. package/dist/eval-file.js.map +1 -0
  36. package/dist/eval-result.d.ts +64 -0
  37. package/dist/eval-result.js +144 -0
  38. package/dist/eval-result.js.map +1 -0
  39. package/dist/eval-run.d.ts +23 -0
  40. package/dist/eval-run.js +539 -0
  41. package/dist/eval-run.js.map +1 -0
  42. package/dist/eval-spec.d.ts +57 -0
  43. package/dist/eval-spec.js +120 -0
  44. package/dist/eval-spec.js.map +1 -0
  45. package/dist/eval-suite-binding.d.ts +4 -0
  46. package/dist/eval-suite-binding.js +19 -0
  47. package/dist/eval-suite-binding.js.map +1 -0
  48. package/dist/index.d.ts +34 -9
  49. package/dist/index.js +18 -6
  50. package/dist/index.js.map +1 -1
  51. package/dist/json-schema.js +75 -5
  52. package/dist/json-schema.js.map +1 -1
  53. package/dist/output-path.js +2 -2
  54. package/dist/process-tree.d.ts +19 -1
  55. package/dist/process-tree.js +321 -66
  56. package/dist/process-tree.js.map +1 -1
  57. package/dist/process.d.ts +0 -2
  58. package/dist/process.js +76 -25
  59. package/dist/process.js.map +1 -1
  60. package/dist/provider-doctor.d.ts +33 -0
  61. package/dist/provider-doctor.js +86 -0
  62. package/dist/provider-doctor.js.map +1 -0
  63. package/dist/providers.d.ts +82 -0
  64. package/dist/providers.js +630 -0
  65. package/dist/providers.js.map +1 -0
  66. package/dist/run-paths.d.ts +8 -0
  67. package/dist/run-paths.js +71 -0
  68. package/dist/run-paths.js.map +1 -0
  69. package/dist/runtime-skill.d.ts +6 -0
  70. package/dist/runtime-skill.js +87 -3
  71. package/dist/runtime-skill.js.map +1 -1
  72. package/dist/schemas/digests.json +3 -3
  73. package/dist/schemas/eval-audit.schema.json +64 -0
  74. package/dist/schemas/eval-result.schema.json +202 -0
  75. package/dist/schemas/eval-spec.schema.json +109 -0
  76. package/dist/schemas.d.ts +1 -3
  77. package/dist/schemas.js +0 -17
  78. package/dist/schemas.js.map +1 -1
  79. package/dist/selected-cases.d.ts +30 -0
  80. package/dist/selected-cases.js +388 -0
  81. package/dist/selected-cases.js.map +1 -0
  82. package/dist/types.d.ts +2 -34
  83. package/package.json +6 -1
  84. package/dist/bundle.d.ts +0 -93
  85. package/dist/bundle.js +0 -216
  86. package/dist/bundle.js.map +0 -1
  87. package/dist/capabilities.d.ts +0 -2
  88. package/dist/capabilities.js +0 -38
  89. package/dist/capabilities.js.map +0 -1
  90. package/dist/plan.d.ts +0 -79
  91. package/dist/plan.js +0 -285
  92. package/dist/plan.js.map +0 -1
  93. package/dist/run.d.ts +0 -2
  94. package/dist/run.js +0 -592
  95. package/dist/run.js.map +0 -1
  96. package/dist/schemas/aw-skill-eval-execution-plan.schema.json +0 -220
  97. package/dist/schemas/eval-run-bundle.schema.json +0 -408
  98. package/dist/schemas/eval-runtime-capabilities.schema.json +0 -85
@@ -0,0 +1,409 @@
1
+ import { chmod, lstat, mkdir, readFile, readdir, realpath, rm, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import process from 'node:process';
4
+ import { applyCodexEvalProviderEnvironment, materializeCodexEvalRuntimeHome, } from './codex-eval-runtime-config.js';
5
+ import { credentialValues, redactSecrets, secretVariants } from './credentials.js';
6
+ import { ProviderProcessCleanupError, runProviderProcess } from './process.js';
7
+ import { assertProviderRunPaths } from './run-paths.js';
8
+ export const CODEX_PROVIDER_ENVIRONMENT_ALLOWLIST = [
9
+ 'ALL_PROXY',
10
+ 'AW_SKILL_EVAL_CODEX_BIN',
11
+ 'AW_SKILL_EVAL_CODEX_MODEL',
12
+ 'CODEX_HOME',
13
+ 'HOME',
14
+ 'HTTPS_PROXY',
15
+ 'HTTP_PROXY',
16
+ 'NODE_EXTRA_CA_CERTS',
17
+ 'NO_PROXY',
18
+ 'OPENAI_API_KEY',
19
+ 'SSL_CERT_DIR',
20
+ 'SSL_CERT_FILE',
21
+ ];
22
+ const CLEAN_ENVIRONMENT_ALLOWLIST = [
23
+ 'LANG',
24
+ 'LC_ALL',
25
+ 'PATH',
26
+ ...CODEX_PROVIDER_ENVIRONMENT_ALLOWLIST,
27
+ ];
28
+ function isRecord(value) {
29
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
30
+ }
31
+ function exactKeys(value, keys, label) {
32
+ const actual = Object.keys(value).sort();
33
+ const expected = [...keys].sort();
34
+ if (actual.length !== expected.length || actual.some((key, index) => key !== expected[index])) {
35
+ throw new Error(`${label} must contain only ${expected.join(', ')}.`);
36
+ }
37
+ }
38
+ function optionalExactKeys(value, required, optional, label) {
39
+ for (const key of required) {
40
+ if (!Object.prototype.hasOwnProperty.call(value, key)) {
41
+ throw new Error(`${label} is missing ${key}.`);
42
+ }
43
+ }
44
+ const allowed = new Set([...required, ...optional]);
45
+ const unknown = Object.keys(value).find((key) => !allowed.has(key));
46
+ if (unknown)
47
+ throw new Error(`${label} has unknown field ${unknown}.`);
48
+ }
49
+ function parseUsage(value) {
50
+ if (value === null)
51
+ return null;
52
+ if (!isRecord(value))
53
+ throw new Error('custom process usage must be null or an object.');
54
+ exactKeys(value, ['inputTokens', 'outputTokens'], 'custom process usage');
55
+ if (!Number.isSafeInteger(value.inputTokens) || value.inputTokens < 0 ||
56
+ !Number.isSafeInteger(value.outputTokens) || value.outputTokens < 0) {
57
+ throw new Error('custom process token counts must be non-negative safe integers.');
58
+ }
59
+ return {
60
+ inputTokens: value.inputTokens,
61
+ outputTokens: value.outputTokens,
62
+ };
63
+ }
64
+ export function parseEvalProviderGrade(value, label = 'provider grade') {
65
+ if (!isRecord(value))
66
+ throw new Error(`${label} must be an object.`);
67
+ optionalExactKeys(value, ['passed', 'score'], ['details'], label);
68
+ if (typeof value.passed !== 'boolean')
69
+ throw new Error(`${label}.passed must be boolean.`);
70
+ if (value.score !== null &&
71
+ (typeof value.score !== 'number' || !Number.isFinite(value.score)))
72
+ throw new Error(`${label}.score must be a finite number or null.`);
73
+ if (value.details !== undefined && !isRecord(value.details)) {
74
+ throw new Error(`${label}.details must be an object when present.`);
75
+ }
76
+ return {
77
+ passed: value.passed,
78
+ score: value.score,
79
+ ...(value.details === undefined
80
+ ? {}
81
+ : { details: value.details }),
82
+ };
83
+ }
84
+ export function parseCustomProcessOutput(stdout) {
85
+ let value;
86
+ try {
87
+ value = JSON.parse(stdout);
88
+ }
89
+ catch (error) {
90
+ throw new Error(`custom process stdout must be one JSON object: ${error.message}`);
91
+ }
92
+ if (!isRecord(value))
93
+ throw new Error('custom process stdout must be one JSON object.');
94
+ exactKeys(value, ['grade', 'usage', 'version'], 'custom process stdout');
95
+ if (value.version !== 1)
96
+ throw new Error('custom process stdout version must be 1.');
97
+ return {
98
+ version: 1,
99
+ usage: parseUsage(value.usage),
100
+ grade: parseEvalProviderGrade(value.grade, 'custom process grade'),
101
+ };
102
+ }
103
+ function redactBuffer(value, variants) {
104
+ let result = value;
105
+ for (const variant of variants) {
106
+ const secret = Buffer.from(variant);
107
+ if (secret.length === 0)
108
+ continue;
109
+ const chunks = [];
110
+ let offset = 0;
111
+ let match = result.indexOf(secret, offset);
112
+ if (match < 0)
113
+ continue;
114
+ while (match >= 0) {
115
+ chunks.push(result.subarray(offset, match), Buffer.from('[redacted]'));
116
+ offset = match + secret.length;
117
+ match = result.indexOf(secret, offset);
118
+ }
119
+ chunks.push(result.subarray(offset));
120
+ result = Buffer.concat(chunks);
121
+ }
122
+ return result;
123
+ }
124
+ async function removeSensitiveFile(target, parentMode) {
125
+ if ((parentMode & 0o222) === 0) {
126
+ throw new Error('credential artifact parent directory is not writable.');
127
+ }
128
+ await rm(target);
129
+ }
130
+ const REMOVED_SENSITIVE_ARTIFACT_DIAGNOSTIC = 'custom process credential cleanup removed an unredactable artifact.';
131
+ function containsSecret(value, variants) {
132
+ return variants.some((secret) => value.includes(secret));
133
+ }
134
+ async function redactOutputTree(root, variants) {
135
+ const rootInfo = await lstat(root);
136
+ if (rootInfo.isSymbolicLink() || !rootInfo.isDirectory()) {
137
+ throw new Error('custom process credential cleanup requires an ordinary owned directory.');
138
+ }
139
+ const diagnostics = [];
140
+ for (const entry of await readdir(root, { withFileTypes: true })) {
141
+ const target = path.join(root, entry.name);
142
+ const info = await lstat(target);
143
+ const sensitiveName = containsSecret(entry.name, variants);
144
+ if (info.isSymbolicLink()) {
145
+ await removeSensitiveFile(target, rootInfo.mode);
146
+ diagnostics.push(REMOVED_SENSITIVE_ARTIFACT_DIAGNOSTIC);
147
+ continue;
148
+ }
149
+ if (info.isDirectory()) {
150
+ if (sensitiveName) {
151
+ if ((rootInfo.mode & 0o222) === 0) {
152
+ throw new Error('credential artifact parent directory is not writable.');
153
+ }
154
+ await rm(target, { recursive: true });
155
+ diagnostics.push(REMOVED_SENSITIVE_ARTIFACT_DIAGNOSTIC);
156
+ continue;
157
+ }
158
+ diagnostics.push(...await redactOutputTree(target, variants));
159
+ continue;
160
+ }
161
+ if (!info.isFile()) {
162
+ if (sensitiveName) {
163
+ await removeSensitiveFile(target, rootInfo.mode);
164
+ diagnostics.push(REMOVED_SENSITIVE_ARTIFACT_DIAGNOSTIC);
165
+ }
166
+ continue;
167
+ }
168
+ if (sensitiveName) {
169
+ await removeSensitiveFile(target, rootInfo.mode);
170
+ diagnostics.push(REMOVED_SENSITIVE_ARTIFACT_DIAGNOSTIC);
171
+ continue;
172
+ }
173
+ const content = await readFile(target);
174
+ const redacted = redactBuffer(content, variants);
175
+ if (redacted.equals(content))
176
+ continue;
177
+ if (info.nlink > 1 || (info.mode & 0o222) === 0) {
178
+ await removeSensitiveFile(target, rootInfo.mode);
179
+ diagnostics.push(REMOVED_SENSITIVE_ARTIFACT_DIAGNOSTIC);
180
+ continue;
181
+ }
182
+ try {
183
+ await writeFile(target, redacted);
184
+ }
185
+ catch {
186
+ await removeSensitiveFile(target, rootInfo.mode);
187
+ diagnostics.push(REMOVED_SENSITIVE_ARTIFACT_DIAGNOSTIC);
188
+ }
189
+ }
190
+ return diagnostics;
191
+ }
192
+ async function makeOwnedTreeRemovable(root) {
193
+ const info = await lstat(root);
194
+ if (info.isSymbolicLink())
195
+ return;
196
+ if (!info.isDirectory()) {
197
+ if (info.isFile() && info.nlink === 1)
198
+ await chmod(root, 0o600);
199
+ return;
200
+ }
201
+ await chmod(root, 0o700);
202
+ for (const entry of await readdir(root)) {
203
+ await makeOwnedTreeRemovable(path.join(root, entry));
204
+ }
205
+ }
206
+ async function cleanupCustomProcessAttempt(outputDir, temporaryRoots, variants) {
207
+ const temporaryResults = await Promise.allSettled(temporaryRoots.map(async (root) => {
208
+ try {
209
+ await rm(root, { recursive: true, force: true });
210
+ }
211
+ catch {
212
+ await makeOwnedTreeRemovable(root);
213
+ await rm(root, { recursive: true, force: true });
214
+ }
215
+ }));
216
+ const redactionResult = await Promise.allSettled([redactOutputTree(outputDir, variants)]);
217
+ if (redactionResult[0].status === 'rejected') {
218
+ let removalError;
219
+ try {
220
+ await makeOwnedTreeRemovable(outputDir);
221
+ await rm(outputDir, { recursive: true, force: true });
222
+ }
223
+ catch (error) {
224
+ removalError = error;
225
+ }
226
+ if (removalError) {
227
+ throw new Error('custom process credential cleanup could not clear the output directory after an artifact cleanup failure.');
228
+ }
229
+ throw new Error('custom process credential cleanup removed the output directory after an artifact cleanup failure.');
230
+ }
231
+ if (temporaryResults.some((result) => result.status === 'rejected')) {
232
+ throw new Error('custom process credential cleanup could not remove temporary provider state.');
233
+ }
234
+ return redactionResult[0].value;
235
+ }
236
+ function cleanEnvironment(sourceEnv, evalRoot) {
237
+ const env = {};
238
+ for (const name of CLEAN_ENVIRONMENT_ALLOWLIST) {
239
+ if (sourceEnv[name] !== undefined)
240
+ env[name] = sourceEnv[name];
241
+ }
242
+ const home = path.join(evalRoot, '.custom-provider-home');
243
+ const temp = path.join(evalRoot, '.custom-provider-tmp');
244
+ return {
245
+ ...env,
246
+ HOME: home,
247
+ USERPROFILE: home,
248
+ CODEX_HOME: path.join(home, '.codex'),
249
+ XDG_CACHE_HOME: path.join(home, '.cache'),
250
+ XDG_CONFIG_HOME: path.join(home, '.config'),
251
+ XDG_STATE_HOME: path.join(home, '.state'),
252
+ TMPDIR: temp,
253
+ TEMP: temp,
254
+ TMP: temp,
255
+ NO_COLOR: '1',
256
+ };
257
+ }
258
+ export async function executeCustomProcessProvider(options) {
259
+ if (!path.isAbsolute(options.evalRoot))
260
+ throw new Error('evalRoot must be absolute.');
261
+ const evalRoot = await realpath(options.evalRoot);
262
+ if (!Number.isSafeInteger(options.input.attempt) || options.input.attempt < 1) {
263
+ throw new Error('provider attempt must be a positive safe integer.');
264
+ }
265
+ if (!Number.isSafeInteger(options.input.timeoutMs) || options.input.timeoutMs < 1) {
266
+ throw new Error('provider timeoutMs must be a positive safe integer.');
267
+ }
268
+ await assertProviderRunPaths({
269
+ evalRoot: options.evalRoot,
270
+ workspacePath: options.input.workspacePath,
271
+ fixturesPath: options.input.fixturesPath,
272
+ outputDir: options.input.outputDir,
273
+ });
274
+ const input = {
275
+ version: 1,
276
+ case: options.input.case,
277
+ variant: options.input.variant,
278
+ attempt: options.input.attempt,
279
+ workspacePath: options.input.workspacePath,
280
+ fixturesPath: options.input.fixturesPath,
281
+ outputDir: options.input.outputDir,
282
+ };
283
+ const sourceEnv = options.sourceEnv ?? process.env;
284
+ const runtimeHome = path.join(evalRoot, '.custom-provider-runtime');
285
+ const stdin = JSON.stringify(input);
286
+ let secrets = credentialValues(sourceEnv, CODEX_PROVIDER_ENVIRONMENT_ALLOWLIST);
287
+ let variants = secretVariants(secrets);
288
+ if (containsSecret(stdin, variants)) {
289
+ throw new Error('custom process input contains an allowlisted credential value.');
290
+ }
291
+ const cleanupPlatform = options.processTree?.platform ?? process.platform;
292
+ if (cleanupPlatform !== 'darwin' && cleanupPlatform !== 'linux') {
293
+ throw new Error(`custom process cleanup is unsupported on ${cleanupPlatform}.`);
294
+ }
295
+ if (options.codexRuntime) {
296
+ try {
297
+ await materializeCodexEvalRuntimeHome(options.codexRuntime, runtimeHome);
298
+ secrets = [...secrets, ...options.codexRuntime.sensitiveValues];
299
+ variants = secretVariants(secrets);
300
+ if (containsSecret(stdin, variants)) {
301
+ throw new Error('custom process input contains a runtime credential value.');
302
+ }
303
+ }
304
+ catch (error) {
305
+ await rm(runtimeHome, { recursive: true, force: true }).catch(() => undefined);
306
+ throw error;
307
+ }
308
+ }
309
+ let env = cleanEnvironment(sourceEnv, evalRoot);
310
+ if (options.codexRuntime) {
311
+ env = applyCodexEvalProviderEnvironment({
312
+ ...env,
313
+ CODEX_HOME: runtimeHome,
314
+ AW_SKILL_EVAL_CODEX_MODEL: options.codexRuntime.model ?? undefined,
315
+ AW_CODEX_EVAL_RUNTIME_HOME: runtimeHome,
316
+ AW_CODEX_EVAL_MODEL_PROVIDER: options.codexRuntime.modelProvider,
317
+ AW_CODEX_EVAL_SENSITIVE_ENV_NAMES: JSON.stringify(options.codexRuntime.sensitiveEnvironmentNames),
318
+ }, options.codexRuntime);
319
+ }
320
+ const temporaryRoots = options.codexRuntime ? [runtimeHome] : [];
321
+ let processResult;
322
+ let processCleanupError;
323
+ let providerResult;
324
+ let providerError;
325
+ try {
326
+ await mkdir(env.HOME, { mode: 0o700 });
327
+ temporaryRoots.push(env.HOME);
328
+ await mkdir(env.TMPDIR, { mode: 0o700 });
329
+ temporaryRoots.push(env.TMPDIR);
330
+ processResult = await runProviderProcess({
331
+ executable: options.command[0],
332
+ args: [...options.command.slice(1)],
333
+ cwd: evalRoot,
334
+ env,
335
+ stdin,
336
+ timeoutMs: options.input.timeoutMs,
337
+ maxBufferBytes: options.maxBufferBytes ?? 4 * 1024 * 1024,
338
+ ...(options.input.signal ? { signal: options.input.signal } : {}),
339
+ }, {}, {
340
+ containment: 'verified-observed',
341
+ processTree: options.processTree,
342
+ });
343
+ }
344
+ catch (error) {
345
+ if (error instanceof ProviderProcessCleanupError) {
346
+ processResult = error.result;
347
+ processCleanupError = error;
348
+ }
349
+ else {
350
+ providerError = error;
351
+ }
352
+ }
353
+ if (processResult) {
354
+ try {
355
+ if (processResult.timedOut) {
356
+ throw new Error(`custom process timed out after ${options.input.timeoutMs}ms.`);
357
+ }
358
+ if (processResult.cancelled)
359
+ throw new Error('custom process was aborted.');
360
+ if (processResult.maxBufferExceeded) {
361
+ throw new Error('custom process output exceeded the buffer limit.');
362
+ }
363
+ const stderr = redactSecrets(processResult.stderr.trim(), secrets);
364
+ if (processResult.signal) {
365
+ throw new Error(`custom process terminated by signal ${processResult.signal}${stderr ? `: ${stderr}` : '.'}`);
366
+ }
367
+ if (processResult.exitCode !== 0) {
368
+ throw new Error(`custom process failed with exit code ${String(processResult.exitCode)}${stderr ? `: ${stderr}` : '.'}`);
369
+ }
370
+ if (containsSecret(processResult.stdout, variants)) {
371
+ throw new Error('custom process stdout contains an allowlisted credential value.');
372
+ }
373
+ const parsed = parseCustomProcessOutput(redactSecrets(processResult.stdout, secrets));
374
+ providerResult = { usage: parsed.usage, grade: parsed.grade };
375
+ }
376
+ catch (error) {
377
+ providerError = error;
378
+ }
379
+ }
380
+ let cleanupDiagnostics = [];
381
+ let cleanupError;
382
+ try {
383
+ cleanupDiagnostics = await cleanupCustomProcessAttempt(options.input.outputDir, temporaryRoots, variants);
384
+ }
385
+ catch (error) {
386
+ cleanupError = error;
387
+ }
388
+ if (providerError || processCleanupError || cleanupError || cleanupDiagnostics.length > 0) {
389
+ const messages = [
390
+ ...(providerError ? [providerError instanceof Error ? providerError.message : String(providerError)] : []),
391
+ ...(processCleanupError
392
+ ? [`Process cleanup: ${processCleanupError instanceof Error ? processCleanupError.message : String(processCleanupError)}`]
393
+ : []),
394
+ ...cleanupDiagnostics.map((diagnostic) => `Credential cleanup: ${diagnostic}`),
395
+ ...(cleanupError
396
+ ? [`Credential cleanup: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}`]
397
+ : []),
398
+ ];
399
+ if (providerError || processCleanupError || cleanupError) {
400
+ throw new Error(redactSecrets(messages.join(' '), secrets));
401
+ }
402
+ }
403
+ if (!providerResult)
404
+ throw new Error('custom process did not return a result.');
405
+ return cleanupDiagnostics.length > 0
406
+ ? { ...providerResult, diagnostics: cleanupDiagnostics }
407
+ : providerResult;
408
+ }
409
+ //# sourceMappingURL=custom-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-process.js","sourceRoot":"","sources":["../src/custom-process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { EvalProvider, EvalSpec } from './eval-spec.js';
2
+ import type { Digest, ValidationResult } from './types.js';
3
+ export interface EvalAuditTarget {
4
+ role: 'current' | 'previous-version';
5
+ digest: Digest;
6
+ }
7
+ export interface EvalAuditBlockedCase {
8
+ caseId: string;
9
+ reason: string;
10
+ }
11
+ export interface EvalAuditIssue {
12
+ code: string;
13
+ message: string;
14
+ caseId?: string;
15
+ }
16
+ export interface EvalAudit {
17
+ version: 1;
18
+ workspaceDigest: Digest;
19
+ providerDigest: Digest;
20
+ targets: EvalAuditTarget[];
21
+ caseDigest: Digest;
22
+ status: 'pass' | 'fail' | 'unknown';
23
+ approvedCaseIds: string[];
24
+ blockedCases: EvalAuditBlockedCase[];
25
+ issues: EvalAuditIssue[];
26
+ }
27
+ export interface EvalAuditBinding {
28
+ spec: EvalSpec;
29
+ selectedCaseIds: readonly string[];
30
+ }
31
+ export interface EvalAuditFileCalculated {
32
+ audit: EvalAudit;
33
+ auditDigest: Digest;
34
+ }
35
+ export declare function computeEvalProviderDigest(provider: EvalProvider): Digest;
36
+ export declare function validateEvalAudit(value: unknown, binding?: EvalAuditBinding): Promise<ValidationResult<EvalAudit>>;
37
+ export declare function parseEvalAudit(value: unknown): Promise<EvalAudit>;
38
+ export declare function validateEvalAuditFile(auditPath: string, binding?: EvalAuditBinding): Promise<ValidationResult<EvalAuditFileCalculated>>;
@@ -0,0 +1,71 @@
1
+ import { sha256, stable } from './common.js';
2
+ import { readEvalContractFile } from './eval-file.js';
3
+ import { validateJsonSchema } from './json-schema.js';
4
+ import { getSchema } from './schemas.js';
5
+ function sorted(values) {
6
+ return [...values].sort((left, right) => left < right ? -1 : left > right ? 1 : 0);
7
+ }
8
+ function expectedTargets(spec) {
9
+ const targets = [{ role: 'current', digest: spec.target.digest }];
10
+ if (spec.baseline.type === 'previous-version')
11
+ targets.push({ role: 'previous-version', digest: spec.baseline.target.digest });
12
+ return targets;
13
+ }
14
+ export function computeEvalProviderDigest(provider) {
15
+ return sha256(stable(provider));
16
+ }
17
+ export async function validateEvalAudit(value, binding) {
18
+ const errors = validateJsonSchema(await getSchema('eval-audit'), value);
19
+ if (errors.length > 0)
20
+ return { valid: false, errors, calculated: null };
21
+ const audit = value;
22
+ if (new Set(audit.targets.map((target) => target.role)).size !== audit.targets.length)
23
+ errors.push('Audit target roles must be unique');
24
+ if (binding) {
25
+ if (new Set(binding.selectedCaseIds).size !== binding.selectedCaseIds.length)
26
+ errors.push('selected case IDs must be unique');
27
+ if (stable(audit.targets.slice().sort((left, right) => left.role.localeCompare(right.role))) !==
28
+ stable(expectedTargets(binding.spec).sort((left, right) => left.role.localeCompare(right.role))))
29
+ errors.push('Audit targets do not exactly match the bound EvalSpec');
30
+ if (audit.workspaceDigest !== binding.spec.workspace.digest)
31
+ errors.push('Audit workspaceDigest does not match the bound EvalSpec');
32
+ if (audit.providerDigest !== computeEvalProviderDigest(binding.spec.provider))
33
+ errors.push('Audit providerDigest does not match the bound EvalSpec');
34
+ if (audit.caseDigest !== binding.spec.cases.digest)
35
+ errors.push('Audit caseDigest does not match the bound EvalSpec');
36
+ if (audit.status !== 'pass')
37
+ errors.push(`Audit status is ${audit.status}; execution is blocked`);
38
+ if (stable(sorted(audit.approvedCaseIds)) !== stable(sorted(binding.selectedCaseIds)))
39
+ errors.push('Audit approvedCaseIds do not exactly match the selected case IDs');
40
+ if (audit.blockedCases.length > 0)
41
+ errors.push('Audit contains blocked cases');
42
+ }
43
+ return { valid: errors.length === 0, errors, calculated: errors.length === 0 ? audit : null };
44
+ }
45
+ export async function parseEvalAudit(value) {
46
+ const validation = await validateEvalAudit(value);
47
+ if (!validation.valid || !validation.calculated)
48
+ throw new Error(validation.errors.join('; '));
49
+ return validation.calculated;
50
+ }
51
+ export async function validateEvalAuditFile(auditPath, binding) {
52
+ try {
53
+ const file = await readEvalContractFile(auditPath, 'EvalAudit');
54
+ const validation = await validateEvalAudit(file.value, binding);
55
+ if (!validation.valid || !validation.calculated)
56
+ return { valid: false, errors: validation.errors, calculated: null };
57
+ return {
58
+ valid: true,
59
+ errors: [],
60
+ calculated: { audit: validation.calculated, auditDigest: file.digest },
61
+ };
62
+ }
63
+ catch (error) {
64
+ return {
65
+ valid: false,
66
+ errors: [`EvalAudit is unavailable or invalid: ${error.message}`],
67
+ calculated: null,
68
+ };
69
+ }
70
+ }
71
+ //# sourceMappingURL=eval-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-audit.js","sourceRoot":"","sources":["../src/eval-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Digest } from './types.js';
2
+ export interface EvalContractFile {
3
+ path: string;
4
+ raw: string;
5
+ digest: Digest;
6
+ value: unknown;
7
+ }
8
+ export declare function readEvalContractFile(filePath: string, label: string): Promise<EvalContractFile>;
9
+ export declare function computeEvalFileDigest(filePath: string): Promise<Digest>;
@@ -0,0 +1,15 @@
1
+ import { lstat, readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { sha256 } from './common.js';
4
+ export async function readEvalContractFile(filePath, label) {
5
+ const requestedPath = path.resolve(filePath);
6
+ const info = await lstat(requestedPath);
7
+ if (info.isSymbolicLink() || !info.isFile())
8
+ throw new Error(`${label} must be a regular non-symlink file`);
9
+ const raw = await readFile(requestedPath, 'utf8');
10
+ return { path: requestedPath, raw, digest: sha256(raw), value: JSON.parse(raw) };
11
+ }
12
+ export async function computeEvalFileDigest(filePath) {
13
+ return (await readEvalContractFile(filePath, 'Eval contract file')).digest;
14
+ }
15
+ //# sourceMappingURL=eval-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-file.js","sourceRoot":"","sources":["../src/eval-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAUpC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB,EAAE,KAAa;IACxE,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,CAAA;IACvC,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;QACzC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,qCAAqC,CAAC,CAAA;IAChE,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;IACjD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,EAAE,CAAA;AAC7F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IAC1D,OAAO,CAAC,MAAM,oBAAoB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAA;AAC5E,CAAC"}
@@ -0,0 +1,64 @@
1
+ import type { EvalProvider, EvalSpec, EvalSpecCalculated } from './eval-spec.js';
2
+ import type { SelectedCasesDocument } from './selected-cases.js';
3
+ import type { Digest, ValidationResult } from './types.js';
4
+ export interface EvalGrade {
5
+ passed: boolean;
6
+ score: number | null;
7
+ details?: Record<string, unknown>;
8
+ }
9
+ export interface EvalRunError {
10
+ message: string;
11
+ }
12
+ export interface EvalResultRun {
13
+ caseId: string;
14
+ variant: 'current' | 'without-skill' | 'previous-version';
15
+ attempt: number;
16
+ status: 'completed' | 'failed' | 'timeout';
17
+ durationMs: number;
18
+ outputDir: string;
19
+ usage: Record<string, unknown> | null;
20
+ grade: EvalGrade | null;
21
+ error: EvalRunError | null;
22
+ artifacts?: Array<{
23
+ path: string;
24
+ role: string;
25
+ }>;
26
+ }
27
+ export interface EvalResultSummary {
28
+ passed: number;
29
+ failed: number;
30
+ timeout: number;
31
+ error: number;
32
+ }
33
+ export interface EvalResult {
34
+ version: 1;
35
+ specDigest: Digest;
36
+ auditDigest: Digest;
37
+ targetDigest: Digest;
38
+ caseDigest: Digest;
39
+ provider: EvalProvider;
40
+ startedAt: string;
41
+ finishedAt: string;
42
+ runs: EvalResultRun[];
43
+ summary: EvalResultSummary;
44
+ }
45
+ export interface EvalResultBinding {
46
+ specDigest: Digest;
47
+ auditDigest: Digest;
48
+ targetDigest: Digest;
49
+ caseDigest: Digest;
50
+ provider: EvalProvider;
51
+ selectedCaseIds: readonly string[];
52
+ allowedVariants: readonly EvalResultRun['variant'][];
53
+ runs: number;
54
+ }
55
+ export interface EvalResultFileCalculated {
56
+ result: EvalResult;
57
+ resultDigest: Digest;
58
+ }
59
+ export declare function evalResultVariantsForSpec(spec: EvalSpec): EvalResultRun['variant'][];
60
+ export declare function createEvalResultBinding(calculated: EvalSpecCalculated, auditDigest: Digest, selectedCases: Pick<SelectedCasesDocument, 'cases' | 'suite'>): EvalResultBinding;
61
+ export declare function computeEvalResultSummary(runs: readonly EvalResultRun[]): EvalResultSummary;
62
+ export declare function validateEvalResult(value: unknown, binding?: EvalResultBinding): Promise<ValidationResult<EvalResult>>;
63
+ export declare function parseEvalResult(value: unknown): Promise<EvalResult>;
64
+ export declare function validateEvalResultFile(resultPath: string, binding?: EvalResultBinding): Promise<ValidationResult<EvalResultFileCalculated>>;