@lesliechan721/agent-skill-eval 0.1.0-beta.3 → 0.1.0-beta.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +167 -39
- package/dist/bin.js.map +1 -1
- package/dist/codex-eval-app-server.d.ts +205 -0
- package/dist/codex-eval-app-server.js +1372 -0
- package/dist/codex-eval-app-server.js.map +1 -0
- package/dist/codex-eval-cases.d.ts +43 -0
- package/dist/codex-eval-cases.js +327 -0
- package/dist/codex-eval-cases.js.map +1 -0
- package/dist/codex-eval-isolation.d.ts +79 -0
- package/dist/codex-eval-isolation.js +420 -0
- package/dist/codex-eval-isolation.js.map +1 -0
- package/dist/codex-eval-process-tree.d.ts +41 -0
- package/dist/codex-eval-process-tree.js +858 -0
- package/dist/codex-eval-process-tree.js.map +1 -0
- package/dist/codex-eval-runtime-config.d.ts +43 -0
- package/dist/codex-eval-runtime-config.js +607 -0
- package/dist/codex-eval-runtime-config.js.map +1 -0
- package/dist/codex-trigger-eval.d.ts +82 -0
- package/dist/codex-trigger-eval.js +790 -0
- package/dist/codex-trigger-eval.js.map +1 -0
- package/dist/codex-workflow-evaluation.d.ts +76 -0
- package/dist/codex-workflow-evaluation.js +263 -0
- package/dist/codex-workflow-evaluation.js.map +1 -0
- package/dist/codex-workflow.d.ts +196 -0
- package/dist/codex-workflow.js +1936 -0
- package/dist/codex-workflow.js.map +1 -0
- package/dist/credentials.d.ts +5 -0
- package/dist/credentials.js +30 -0
- package/dist/credentials.js.map +1 -0
- package/dist/custom-process.d.ts +60 -0
- package/dist/custom-process.js +424 -0
- package/dist/custom-process.js.map +1 -0
- package/dist/eval-audit.d.ts +38 -0
- package/dist/eval-audit.js +71 -0
- package/dist/eval-audit.js.map +1 -0
- package/dist/eval-file.d.ts +9 -0
- package/dist/eval-file.js +15 -0
- package/dist/eval-file.js.map +1 -0
- package/dist/eval-process-management.d.ts +22 -0
- package/dist/eval-process-management.js +90 -0
- package/dist/eval-process-management.js.map +1 -0
- package/dist/eval-result.d.ts +79 -0
- package/dist/eval-result.js +144 -0
- package/dist/eval-result.js.map +1 -0
- package/dist/eval-run.d.ts +27 -0
- package/dist/eval-run.js +565 -0
- package/dist/eval-run.js.map +1 -0
- package/dist/eval-spec.d.ts +57 -0
- package/dist/eval-spec.js +120 -0
- package/dist/eval-spec.js.map +1 -0
- package/dist/eval-suite-binding.d.ts +4 -0
- package/dist/eval-suite-binding.js +19 -0
- package/dist/eval-suite-binding.js.map +1 -0
- package/dist/index.d.ts +38 -9
- package/dist/index.js +20 -6
- package/dist/index.js.map +1 -1
- package/dist/json-schema.js +75 -5
- package/dist/json-schema.js.map +1 -1
- package/dist/output-path.js +2 -2
- package/dist/process-tree.d.ts +21 -1
- package/dist/process-tree.js +797 -158
- package/dist/process-tree.js.map +1 -1
- package/dist/process.d.ts +2 -2
- package/dist/process.js +99 -34
- package/dist/process.js.map +1 -1
- package/dist/provider-doctor.d.ts +46 -0
- package/dist/provider-doctor.js +120 -0
- package/dist/provider-doctor.js.map +1 -0
- package/dist/providers.d.ts +85 -0
- package/dist/providers.js +636 -0
- package/dist/providers.js.map +1 -0
- package/dist/run-paths.d.ts +8 -0
- package/dist/run-paths.js +71 -0
- package/dist/run-paths.js.map +1 -0
- package/dist/runtime-skill.d.ts +6 -0
- package/dist/runtime-skill.js +87 -3
- package/dist/runtime-skill.js.map +1 -1
- package/dist/schemas/digests.json +3 -3
- package/dist/schemas/eval-audit.schema.json +64 -0
- package/dist/schemas/eval-result.schema.json +232 -0
- package/dist/schemas/eval-spec.schema.json +109 -0
- package/dist/schemas.d.ts +1 -3
- package/dist/schemas.js +22 -20
- package/dist/schemas.js.map +1 -1
- package/dist/selected-cases.d.ts +30 -0
- package/dist/selected-cases.js +388 -0
- package/dist/selected-cases.js.map +1 -0
- package/dist/types.d.ts +2 -34
- package/dist/windows-job.d.ts +26 -0
- package/dist/windows-job.js +97 -0
- package/dist/windows-job.js.map +1 -0
- package/package.json +17 -3
- package/dist/bundle.d.ts +0 -93
- package/dist/bundle.js +0 -216
- package/dist/bundle.js.map +0 -1
- package/dist/capabilities.d.ts +0 -2
- package/dist/capabilities.js +0 -38
- package/dist/capabilities.js.map +0 -1
- package/dist/plan.d.ts +0 -79
- package/dist/plan.js +0 -285
- package/dist/plan.js.map +0 -1
- package/dist/run.d.ts +0 -2
- package/dist/run.js +0 -592
- package/dist/run.js.map +0 -1
- package/dist/schemas/aw-skill-eval-execution-plan.schema.json +0 -220
- package/dist/schemas/eval-run-bundle.schema.json +0 -408
- package/dist/schemas/eval-runtime-capabilities.schema.json +0 -85
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import process from 'node:process';
|
|
2
|
+
import { assertCodexEvalKeychainWrapperAbsent } from './codex-eval-isolation.js';
|
|
3
|
+
import { assertProcessTreeInspectionAvailable, } from './process-tree.js';
|
|
4
|
+
import { resolveWindowsJobHelperPath } from './windows-job.js';
|
|
5
|
+
const FULL_ACCESS_PERMISSION_PROFILE = 'danger-full-access';
|
|
6
|
+
const UNMANAGED_LIMITATION = 'Only the direct provider child is targeted; descendant discovery and cleanup are not available.';
|
|
7
|
+
const MANAGED_LIMITATION = 'Process-tree inspection verifies cooperative descendants, but it is not OS-enforced containment and does not guarantee descendant cleanup.';
|
|
8
|
+
const WINDOWS_MANAGED_LIMITATION = 'Windows uses OS-enforced Job containment; the current EvalResult contract does not claim portable descendant cleanup.';
|
|
9
|
+
const UNMANAGED_RISK = 'Unmanaged mode skips process-tree inspection, targets only the direct provider child, and can leave descendant processes running. It does not bypass the macOS keychain or cmux checks.';
|
|
10
|
+
export function normalizedCodexPermissionProfile(sourceEnv) {
|
|
11
|
+
const value = sourceEnv.CODEX_PERMISSION_PROFILE?.trim();
|
|
12
|
+
if (!value)
|
|
13
|
+
return null;
|
|
14
|
+
return value.replace(/^:/u, '');
|
|
15
|
+
}
|
|
16
|
+
export function codexPermissionProfileStatus(sourceEnv) {
|
|
17
|
+
const profile = normalizedCodexPermissionProfile(sourceEnv);
|
|
18
|
+
if (profile === null)
|
|
19
|
+
return 'unknown';
|
|
20
|
+
return profile === FULL_ACCESS_PERMISSION_PROFILE ? 'full-access' : 'restricted';
|
|
21
|
+
}
|
|
22
|
+
function restrictedSessionError(profile) {
|
|
23
|
+
return new Error(`Model eval is blocked because CODEX_PERMISSION_PROFILE=${profile} does not identify ` +
|
|
24
|
+
'a Full Access Codex session. A one-off sandbox_permissions=require_escalated request ' +
|
|
25
|
+
'does not change the original permission profile. Do not retry with one-off elevation. ' +
|
|
26
|
+
'Switch the entire session to Full Access or explicitly authorize ' +
|
|
27
|
+
`--allow-unmanaged-processes. ${UNMANAGED_RISK} No keychain check, process-tree inspection, output ` +
|
|
28
|
+
'directory, or model process was started.');
|
|
29
|
+
}
|
|
30
|
+
export async function resolveEvalProcessManagement(options) {
|
|
31
|
+
const sourceEnv = options.sourceEnv ?? process.env;
|
|
32
|
+
const dependencies = options.dependencies ?? {};
|
|
33
|
+
const platform = dependencies.platform ?? dependencies.processTree?.platform ?? process.platform;
|
|
34
|
+
const profile = normalizedCodexPermissionProfile(sourceEnv);
|
|
35
|
+
const permissionStatus = codexPermissionProfileStatus(sourceEnv);
|
|
36
|
+
if (permissionStatus === 'restricted' && !options.allowUnmanaged) {
|
|
37
|
+
throw restrictedSessionError(profile);
|
|
38
|
+
}
|
|
39
|
+
await assertCodexEvalKeychainWrapperAbsent({
|
|
40
|
+
platform,
|
|
41
|
+
sourceEnv,
|
|
42
|
+
...(options.codexBin ? { codexBin: options.codexBin } : {}),
|
|
43
|
+
...(dependencies.resolveCodexExecutable
|
|
44
|
+
? { resolveCodexExecutable: dependencies.resolveCodexExecutable }
|
|
45
|
+
: {}),
|
|
46
|
+
...(dependencies.readUserKeychainSearchList
|
|
47
|
+
? { readUserKeychainSearchList: dependencies.readUserKeychainSearchList }
|
|
48
|
+
: {}),
|
|
49
|
+
});
|
|
50
|
+
if (options.allowUnmanaged) {
|
|
51
|
+
return {
|
|
52
|
+
mode: 'unmanaged-confirmed',
|
|
53
|
+
inspectionAvailable: false,
|
|
54
|
+
userAcknowledged: true,
|
|
55
|
+
descendantCleanupGuaranteed: false,
|
|
56
|
+
limitation: UNMANAGED_LIMITATION,
|
|
57
|
+
diagnostic: permissionStatus === 'restricted'
|
|
58
|
+
? `Restricted Codex permission profile ${profile} was explicitly accepted; process-tree inspection was skipped.`
|
|
59
|
+
: 'Unmanaged process execution was explicitly accepted; process-tree inspection was skipped.',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
if (platform === 'win32') {
|
|
64
|
+
(dependencies.resolveWindowsJobHelper ?? resolveWindowsJobHelperPath)();
|
|
65
|
+
}
|
|
66
|
+
else if (dependencies.inspectProcessTree)
|
|
67
|
+
await dependencies.inspectProcessTree();
|
|
68
|
+
else {
|
|
69
|
+
await assertProcessTreeInspectionAvailable({
|
|
70
|
+
...dependencies.processTree,
|
|
71
|
+
platform,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
mode: 'managed',
|
|
76
|
+
inspectionAvailable: true,
|
|
77
|
+
userAcknowledged: false,
|
|
78
|
+
descendantCleanupGuaranteed: false,
|
|
79
|
+
limitation: platform === 'win32' ? WINDOWS_MANAGED_LIMITATION : MANAGED_LIMITATION,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
const diagnostic = error instanceof Error ? error.message : String(error);
|
|
84
|
+
throw new Error(`Full Access process management is unavailable. ${diagnostic} No output directory ` +
|
|
85
|
+
'or model process was started. A one-off sandbox_permissions=require_escalated ' +
|
|
86
|
+
'request is not Full Access. Switch the entire session to Full Access or explicitly ' +
|
|
87
|
+
`authorize --allow-unmanaged-processes. ${UNMANAGED_RISK}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=eval-process-management.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-process-management.js","sourceRoot":"","sources":["../src/eval-process-management.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
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 type EvalResultProcessManagement = {
|
|
34
|
+
mode: 'managed';
|
|
35
|
+
inspectionAvailable: true;
|
|
36
|
+
userAcknowledged: false;
|
|
37
|
+
descendantCleanupGuaranteed: false;
|
|
38
|
+
limitation: string;
|
|
39
|
+
} | {
|
|
40
|
+
mode: 'unmanaged-confirmed';
|
|
41
|
+
inspectionAvailable: false;
|
|
42
|
+
userAcknowledged: true;
|
|
43
|
+
descendantCleanupGuaranteed: false;
|
|
44
|
+
limitation: string;
|
|
45
|
+
diagnostic?: string;
|
|
46
|
+
};
|
|
47
|
+
export interface EvalResult {
|
|
48
|
+
version: 2;
|
|
49
|
+
specDigest: Digest;
|
|
50
|
+
auditDigest: Digest;
|
|
51
|
+
targetDigest: Digest;
|
|
52
|
+
caseDigest: Digest;
|
|
53
|
+
provider: EvalProvider;
|
|
54
|
+
processManagement: EvalResultProcessManagement;
|
|
55
|
+
startedAt: string;
|
|
56
|
+
finishedAt: string;
|
|
57
|
+
runs: EvalResultRun[];
|
|
58
|
+
summary: EvalResultSummary;
|
|
59
|
+
}
|
|
60
|
+
export interface EvalResultBinding {
|
|
61
|
+
specDigest: Digest;
|
|
62
|
+
auditDigest: Digest;
|
|
63
|
+
targetDigest: Digest;
|
|
64
|
+
caseDigest: Digest;
|
|
65
|
+
provider: EvalProvider;
|
|
66
|
+
selectedCaseIds: readonly string[];
|
|
67
|
+
allowedVariants: readonly EvalResultRun['variant'][];
|
|
68
|
+
runs: number;
|
|
69
|
+
}
|
|
70
|
+
export interface EvalResultFileCalculated {
|
|
71
|
+
result: EvalResult;
|
|
72
|
+
resultDigest: Digest;
|
|
73
|
+
}
|
|
74
|
+
export declare function evalResultVariantsForSpec(spec: EvalSpec): EvalResultRun['variant'][];
|
|
75
|
+
export declare function createEvalResultBinding(calculated: EvalSpecCalculated, auditDigest: Digest, selectedCases: Pick<SelectedCasesDocument, 'cases' | 'suite'>): EvalResultBinding;
|
|
76
|
+
export declare function computeEvalResultSummary(runs: readonly EvalResultRun[]): EvalResultSummary;
|
|
77
|
+
export declare function validateEvalResult(value: unknown, binding?: EvalResultBinding): Promise<ValidationResult<EvalResult>>;
|
|
78
|
+
export declare function parseEvalResult(value: unknown): Promise<EvalResult>;
|
|
79
|
+
export declare function validateEvalResultFile(resultPath: string, binding?: EvalResultBinding): Promise<ValidationResult<EvalResultFileCalculated>>;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { 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
|
+
import { assertEvalProviderSuiteKind } from './eval-suite-binding.js';
|
|
6
|
+
export function evalResultVariantsForSpec(spec) {
|
|
7
|
+
if (spec.baseline.type === 'without-skill')
|
|
8
|
+
return ['current', 'without-skill'];
|
|
9
|
+
if (spec.baseline.type === 'previous-version')
|
|
10
|
+
return ['current', 'previous-version'];
|
|
11
|
+
return ['current'];
|
|
12
|
+
}
|
|
13
|
+
export function createEvalResultBinding(calculated, auditDigest, selectedCases) {
|
|
14
|
+
assertEvalProviderSuiteKind(calculated.spec.provider, selectedCases.suite.kind);
|
|
15
|
+
return {
|
|
16
|
+
specDigest: calculated.specDigest,
|
|
17
|
+
auditDigest,
|
|
18
|
+
targetDigest: calculated.targetDigest,
|
|
19
|
+
caseDigest: calculated.caseDigest,
|
|
20
|
+
provider: calculated.spec.provider,
|
|
21
|
+
selectedCaseIds: selectedCases.cases.map((entry) => entry.id),
|
|
22
|
+
allowedVariants: evalResultVariantsForSpec(calculated.spec),
|
|
23
|
+
runs: calculated.spec.runs,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function computeEvalResultSummary(runs) {
|
|
27
|
+
const summary = { passed: 0, failed: 0, timeout: 0, error: 0 };
|
|
28
|
+
for (const run of runs) {
|
|
29
|
+
if (run.status === 'timeout')
|
|
30
|
+
summary.timeout += 1;
|
|
31
|
+
else if (run.status === 'failed')
|
|
32
|
+
summary.error += 1;
|
|
33
|
+
else if (run.grade?.passed)
|
|
34
|
+
summary.passed += 1;
|
|
35
|
+
else
|
|
36
|
+
summary.failed += 1;
|
|
37
|
+
}
|
|
38
|
+
return summary;
|
|
39
|
+
}
|
|
40
|
+
export async function validateEvalResult(value, binding) {
|
|
41
|
+
const errors = validateJsonSchema(await getSchema('eval-result'), value);
|
|
42
|
+
if (errors.length > 0)
|
|
43
|
+
return { valid: false, errors, calculated: null };
|
|
44
|
+
const result = value;
|
|
45
|
+
const leapSecond = /:60(?=(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$)/iu;
|
|
46
|
+
const timestamp = (value) => {
|
|
47
|
+
const leap = leapSecond.test(value);
|
|
48
|
+
const parsed = Date.parse(leap ? value.replace(leapSecond, ':59') : value);
|
|
49
|
+
return leap ? parsed + 1_000 : parsed;
|
|
50
|
+
};
|
|
51
|
+
if (timestamp(result.finishedAt) < timestamp(result.startedAt))
|
|
52
|
+
errors.push('Result finishedAt must not be earlier than startedAt');
|
|
53
|
+
for (const [index, run] of result.runs.entries()) {
|
|
54
|
+
if (run.status === 'completed') {
|
|
55
|
+
if (run.grade === null)
|
|
56
|
+
errors.push(`run ${index} is completed but has no grade`);
|
|
57
|
+
if (run.error !== null)
|
|
58
|
+
errors.push(`run ${index} is completed but includes an error`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
if (run.grade !== null)
|
|
62
|
+
errors.push(`run ${index} has status ${run.status} but includes a grade`);
|
|
63
|
+
if (run.error === null)
|
|
64
|
+
errors.push(`run ${index} has status ${run.status} but has no error`);
|
|
65
|
+
}
|
|
66
|
+
if (typeof result.provider === 'object'
|
|
67
|
+
&& result.provider.type === 'codex-workflow'
|
|
68
|
+
&& run.status === 'completed') {
|
|
69
|
+
if (run.usage === null)
|
|
70
|
+
errors.push(`run ${index} codex-workflow has no usage evidence`);
|
|
71
|
+
const expected = [
|
|
72
|
+
{ path: 'workflow-evidence.json', role: 'evidence' },
|
|
73
|
+
{ path: 'workflow-trace.json', role: 'trace' },
|
|
74
|
+
{ path: 'model-output.txt', role: 'output' },
|
|
75
|
+
{ path: 'provider-result.json', role: 'result' },
|
|
76
|
+
];
|
|
77
|
+
if (!run.artifacts
|
|
78
|
+
|| stable([...run.artifacts].sort((left, right) => left.path.localeCompare(right.path)))
|
|
79
|
+
!== stable(expected.sort((left, right) => left.path.localeCompare(right.path))))
|
|
80
|
+
errors.push(`run ${index} codex-workflow artifacts are incomplete`);
|
|
81
|
+
}
|
|
82
|
+
else if (run.artifacts !== undefined) {
|
|
83
|
+
errors.push(`run ${index} must not include codex-workflow artifacts`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const summary = computeEvalResultSummary(result.runs);
|
|
87
|
+
if (stable(summary) !== stable(result.summary))
|
|
88
|
+
errors.push('Result summary does not match runs');
|
|
89
|
+
if (binding) {
|
|
90
|
+
for (const key of ['specDigest', 'auditDigest', 'targetDigest', 'caseDigest']) {
|
|
91
|
+
if (result[key] !== binding[key])
|
|
92
|
+
errors.push(`Result ${key} does not match its binding`);
|
|
93
|
+
}
|
|
94
|
+
if (stable(result.provider) !== stable(binding.provider))
|
|
95
|
+
errors.push('Result provider does not match its binding');
|
|
96
|
+
const selectedCaseIds = new Set(binding.selectedCaseIds);
|
|
97
|
+
const allowedVariants = new Set(binding.allowedVariants);
|
|
98
|
+
const observedRuns = new Set();
|
|
99
|
+
for (const [index, run] of result.runs.entries()) {
|
|
100
|
+
if (!selectedCaseIds.has(run.caseId)) {
|
|
101
|
+
errors.push(`run ${index} caseId is not selected by its binding`);
|
|
102
|
+
}
|
|
103
|
+
if (!allowedVariants.has(run.variant)) {
|
|
104
|
+
errors.push(`run ${index} variant is not enabled by its binding`);
|
|
105
|
+
}
|
|
106
|
+
if (run.attempt > binding.runs) {
|
|
107
|
+
errors.push(`run ${index} attempt exceeds its binding`);
|
|
108
|
+
}
|
|
109
|
+
const identity = JSON.stringify([run.caseId, run.variant, run.attempt]);
|
|
110
|
+
if (observedRuns.has(identity)) {
|
|
111
|
+
errors.push(`run ${index} duplicates a case, variant, and attempt tuple`);
|
|
112
|
+
}
|
|
113
|
+
observedRuns.add(identity);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return { valid: errors.length === 0, errors, calculated: errors.length === 0 ? result : null };
|
|
117
|
+
}
|
|
118
|
+
export async function parseEvalResult(value) {
|
|
119
|
+
const validation = await validateEvalResult(value);
|
|
120
|
+
if (!validation.valid || !validation.calculated)
|
|
121
|
+
throw new Error(validation.errors.join('; '));
|
|
122
|
+
return validation.calculated;
|
|
123
|
+
}
|
|
124
|
+
export async function validateEvalResultFile(resultPath, binding) {
|
|
125
|
+
try {
|
|
126
|
+
const file = await readEvalContractFile(resultPath, 'EvalResult');
|
|
127
|
+
const validation = await validateEvalResult(file.value, binding);
|
|
128
|
+
if (!validation.valid || !validation.calculated)
|
|
129
|
+
return { valid: false, errors: validation.errors, calculated: null };
|
|
130
|
+
return {
|
|
131
|
+
valid: true,
|
|
132
|
+
errors: [],
|
|
133
|
+
calculated: { result: validation.calculated, resultDigest: file.digest },
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
return {
|
|
138
|
+
valid: false,
|
|
139
|
+
errors: [`EvalResult is unavailable or invalid: ${error.message}`],
|
|
140
|
+
calculated: null,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=eval-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-result.js","sourceRoot":"","sources":["../src/eval-result.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type CustomProcessExecutorOptions, type EvalProviderRunResult } from './custom-process.js';
|
|
2
|
+
import { type EvalResult, type EvalResultProcessManagement } from './eval-result.js';
|
|
3
|
+
import { type EvalProcessManagementDependencies } from './eval-process-management.js';
|
|
4
|
+
import { type BuiltinEvalProviderDependencies, type BuiltinEvalProviderRunInput } from './providers.js';
|
|
5
|
+
import { type CodexWorkflowExecutorOptions } from './codex-workflow.js';
|
|
6
|
+
import { type SelectedCasesDocument, type SelectedEvalCase } from './selected-cases.js';
|
|
7
|
+
import type { Digest } from './types.js';
|
|
8
|
+
export interface RunEvalSpecOptions {
|
|
9
|
+
auditPath: string;
|
|
10
|
+
allowUnmanagedProcesses?: boolean;
|
|
11
|
+
processManagementDependencies?: EvalProcessManagementDependencies;
|
|
12
|
+
onProcessManagementResolved?: (evidence: EvalResultProcessManagement) => void;
|
|
13
|
+
signal?: AbortSignal;
|
|
14
|
+
sourceEnv?: NodeJS.ProcessEnv;
|
|
15
|
+
builtinProviderDependencies?: BuiltinEvalProviderDependencies;
|
|
16
|
+
runBuiltinProvider?: (id: string, input: BuiltinEvalProviderRunInput, dependencies?: BuiltinEvalProviderDependencies) => Promise<EvalProviderRunResult>;
|
|
17
|
+
executeCustomProvider?: (options: CustomProcessExecutorOptions) => Promise<EvalProviderRunResult>;
|
|
18
|
+
executeCodexWorkflowProvider?: (options: CodexWorkflowExecutorOptions) => Promise<EvalProviderRunResult>;
|
|
19
|
+
}
|
|
20
|
+
export interface RunEvalSpecResult {
|
|
21
|
+
valid: true;
|
|
22
|
+
resultPath: string;
|
|
23
|
+
resultDigest: Digest;
|
|
24
|
+
result: EvalResult;
|
|
25
|
+
}
|
|
26
|
+
export declare function adaptConversationProviderCase(document: SelectedCasesDocument, evalCase: SelectedEvalCase): Record<string, unknown>;
|
|
27
|
+
export declare function runEvalSpec(specPath: string, options: RunEvalSpecOptions): Promise<RunEvalSpecResult>;
|