agent-eval-opencode 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +590 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agents/claude-code.d.ts +12 -0
- package/dist/lib/agents/claude-code.d.ts.map +1 -0
- package/dist/lib/agents/claude-code.js +231 -0
- package/dist/lib/agents/claude-code.js.map +1 -0
- package/dist/lib/agents/codex.d.ts +12 -0
- package/dist/lib/agents/codex.d.ts.map +1 -0
- package/dist/lib/agents/codex.js +267 -0
- package/dist/lib/agents/codex.js.map +1 -0
- package/dist/lib/agents/cursor.d.ts +10 -0
- package/dist/lib/agents/cursor.d.ts.map +1 -0
- package/dist/lib/agents/cursor.js +204 -0
- package/dist/lib/agents/cursor.js.map +1 -0
- package/dist/lib/agents/gemini.d.ts +10 -0
- package/dist/lib/agents/gemini.d.ts.map +1 -0
- package/dist/lib/agents/gemini.js +207 -0
- package/dist/lib/agents/gemini.js.map +1 -0
- package/dist/lib/agents/index.d.ts +7 -0
- package/dist/lib/agents/index.d.ts.map +1 -0
- package/dist/lib/agents/index.js +20 -0
- package/dist/lib/agents/index.js.map +1 -0
- package/dist/lib/agents/opencode.d.ts +11 -0
- package/dist/lib/agents/opencode.d.ts.map +1 -0
- package/dist/lib/agents/opencode.js +245 -0
- package/dist/lib/agents/opencode.js.map +1 -0
- package/dist/lib/agents/registry.d.ts +23 -0
- package/dist/lib/agents/registry.d.ts.map +1 -0
- package/dist/lib/agents/registry.js +35 -0
- package/dist/lib/agents/registry.js.map +1 -0
- package/dist/lib/agents/shared.d.ts +83 -0
- package/dist/lib/agents/shared.d.ts.map +1 -0
- package/dist/lib/agents/shared.js +192 -0
- package/dist/lib/agents/shared.js.map +1 -0
- package/dist/lib/agents/types.d.ts +73 -0
- package/dist/lib/agents/types.d.ts.map +1 -0
- package/dist/lib/agents/types.js +5 -0
- package/dist/lib/agents/types.js.map +1 -0
- package/dist/lib/classifier.d.ts +89 -0
- package/dist/lib/classifier.d.ts.map +1 -0
- package/dist/lib/classifier.js +285 -0
- package/dist/lib/classifier.js.map +1 -0
- package/dist/lib/config.d.ts +37 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +187 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dashboard.d.ts +65 -0
- package/dist/lib/dashboard.d.ts.map +1 -0
- package/dist/lib/dashboard.js +237 -0
- package/dist/lib/dashboard.js.map +1 -0
- package/dist/lib/docker-sandbox.d.ts +92 -0
- package/dist/lib/docker-sandbox.d.ts.map +1 -0
- package/dist/lib/docker-sandbox.js +375 -0
- package/dist/lib/docker-sandbox.js.map +1 -0
- package/dist/lib/fingerprint.d.ts +15 -0
- package/dist/lib/fingerprint.d.ts.map +1 -0
- package/dist/lib/fingerprint.js +59 -0
- package/dist/lib/fingerprint.js.map +1 -0
- package/dist/lib/fixture.d.ts +55 -0
- package/dist/lib/fixture.d.ts.map +1 -0
- package/dist/lib/fixture.js +215 -0
- package/dist/lib/fixture.js.map +1 -0
- package/dist/lib/housekeeping.d.ts +26 -0
- package/dist/lib/housekeeping.d.ts.map +1 -0
- package/dist/lib/housekeeping.js +170 -0
- package/dist/lib/housekeeping.js.map +1 -0
- package/dist/lib/init.d.ts +21 -0
- package/dist/lib/init.d.ts.map +1 -0
- package/dist/lib/init.js +275 -0
- package/dist/lib/init.js.map +1 -0
- package/dist/lib/o11y/index.d.ts +13 -0
- package/dist/lib/o11y/index.d.ts.map +1 -0
- package/dist/lib/o11y/index.js +13 -0
- package/dist/lib/o11y/index.js.map +1 -0
- package/dist/lib/o11y/parsers/claude-code.d.ts +18 -0
- package/dist/lib/o11y/parsers/claude-code.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/claude-code.js +343 -0
- package/dist/lib/o11y/parsers/claude-code.js.map +1 -0
- package/dist/lib/o11y/parsers/codex.d.ts +17 -0
- package/dist/lib/o11y/parsers/codex.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/codex.js +364 -0
- package/dist/lib/o11y/parsers/codex.js.map +1 -0
- package/dist/lib/o11y/parsers/cursor.d.ts +21 -0
- package/dist/lib/o11y/parsers/cursor.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/cursor.js +226 -0
- package/dist/lib/o11y/parsers/cursor.js.map +1 -0
- package/dist/lib/o11y/parsers/gemini.d.ts +21 -0
- package/dist/lib/o11y/parsers/gemini.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/gemini.js +241 -0
- package/dist/lib/o11y/parsers/gemini.js.map +1 -0
- package/dist/lib/o11y/parsers/index.d.ts +55 -0
- package/dist/lib/o11y/parsers/index.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/index.js +284 -0
- package/dist/lib/o11y/parsers/index.js.map +1 -0
- package/dist/lib/o11y/parsers/opencode.d.ts +17 -0
- package/dist/lib/o11y/parsers/opencode.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/opencode.js +320 -0
- package/dist/lib/o11y/parsers/opencode.js.map +1 -0
- package/dist/lib/o11y/types.d.ts +113 -0
- package/dist/lib/o11y/types.d.ts.map +1 -0
- package/dist/lib/o11y/types.js +6 -0
- package/dist/lib/o11y/types.js.map +1 -0
- package/dist/lib/results.d.ts +91 -0
- package/dist/lib/results.d.ts.map +1 -0
- package/dist/lib/results.js +361 -0
- package/dist/lib/results.js.map +1 -0
- package/dist/lib/runner.d.ts +71 -0
- package/dist/lib/runner.d.ts.map +1 -0
- package/dist/lib/runner.js +267 -0
- package/dist/lib/runner.js.map +1 -0
- package/dist/lib/sandbox.d.ts +173 -0
- package/dist/lib/sandbox.d.ts.map +1 -0
- package/dist/lib/sandbox.js +337 -0
- package/dist/lib/sandbox.js.map +1 -0
- package/dist/lib/types.d.ts +258 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +15 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/test-setup.d.ts +2 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +6 -0
- package/dist/test-setup.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eval fixture discovery and validation.
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, readdirSync, statSync, existsSync } from 'fs';
|
|
5
|
+
import { join, resolve } from 'path';
|
|
6
|
+
import { REQUIRED_EVAL_FILES, EXCLUDED_FILES } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Error thrown when an eval fixture is invalid.
|
|
9
|
+
*/
|
|
10
|
+
export class FixtureValidationError extends Error {
|
|
11
|
+
fixtureName;
|
|
12
|
+
constructor(fixtureName, message) {
|
|
13
|
+
super(`Eval "${fixtureName}": ${message}`);
|
|
14
|
+
this.fixtureName = fixtureName;
|
|
15
|
+
this.name = 'FixtureValidationError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if a file exists with exact case match (case-sensitive even on Mac/Windows).
|
|
20
|
+
* Returns true only if the file exists AND the case matches exactly.
|
|
21
|
+
*/
|
|
22
|
+
function existsWithExactCase(dirPath, fileName) {
|
|
23
|
+
try {
|
|
24
|
+
const files = readdirSync(dirPath);
|
|
25
|
+
return files.includes(fileName);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Discovers all eval fixtures in a directory.
|
|
33
|
+
* Recursively searches for directories containing PROMPT.md.
|
|
34
|
+
* Supports nested organization like "vercel-cli/deploy" or "flags/create-flag".
|
|
35
|
+
*/
|
|
36
|
+
export function discoverFixtures(evalsDir) {
|
|
37
|
+
const absolutePath = resolve(evalsDir);
|
|
38
|
+
if (!existsSync(absolutePath)) {
|
|
39
|
+
throw new Error(`Evals directory not found: ${absolutePath}`);
|
|
40
|
+
}
|
|
41
|
+
const fixtures = [];
|
|
42
|
+
function walk(dir, basePath = '') {
|
|
43
|
+
const entries = readdirSync(dir);
|
|
44
|
+
for (const entry of entries) {
|
|
45
|
+
// Skip hidden directories and files
|
|
46
|
+
if (entry.startsWith('.')) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const entryPath = join(dir, entry);
|
|
50
|
+
// Only consider directories
|
|
51
|
+
if (!statSync(entryPath).isDirectory()) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const relativePath = basePath ? `${basePath}/${entry}` : entry;
|
|
55
|
+
// Check if this directory contains PROMPT.md (potential fixture)
|
|
56
|
+
if (existsWithExactCase(entryPath, 'PROMPT.md')) {
|
|
57
|
+
fixtures.push(relativePath);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
// Not a fixture directory, recurse into it
|
|
61
|
+
walk(entryPath, relativePath);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
walk(absolutePath);
|
|
66
|
+
return fixtures.sort();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Validates that a fixture has all required files with correct case.
|
|
70
|
+
* Returns an array of missing file names, or empty array if valid.
|
|
71
|
+
* Note: Accepts either EVAL.ts or EVAL.tsx for the eval file.
|
|
72
|
+
* Case-sensitive: 'prompt.md' will fail even on Mac/Windows.
|
|
73
|
+
*/
|
|
74
|
+
export function validateFixtureFiles(fixturePath) {
|
|
75
|
+
const missing = [];
|
|
76
|
+
for (const file of REQUIRED_EVAL_FILES) {
|
|
77
|
+
// Special case: Accept either EVAL.ts or EVAL.tsx (both case-sensitive)
|
|
78
|
+
if (file === 'EVAL.ts') {
|
|
79
|
+
const hasEvalTs = existsWithExactCase(fixturePath, 'EVAL.ts');
|
|
80
|
+
const hasEvalTsx = existsWithExactCase(fixturePath, 'EVAL.tsx');
|
|
81
|
+
if (!hasEvalTs && !hasEvalTsx) {
|
|
82
|
+
missing.push('EVAL.ts or EVAL.tsx');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
if (!existsWithExactCase(fixturePath, file)) {
|
|
87
|
+
missing.push(file);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return missing;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Validates the package.json of a fixture.
|
|
95
|
+
* Ensures it has "type": "module".
|
|
96
|
+
*/
|
|
97
|
+
export function validatePackageJson(fixturePath) {
|
|
98
|
+
const packageJsonPath = join(fixturePath, 'package.json');
|
|
99
|
+
try {
|
|
100
|
+
const content = readFileSync(packageJsonPath, 'utf-8');
|
|
101
|
+
const pkg = JSON.parse(content);
|
|
102
|
+
if (pkg.type !== 'module') {
|
|
103
|
+
return {
|
|
104
|
+
isModule: false,
|
|
105
|
+
error: 'package.json must have "type": "module"',
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return { isModule: true };
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (error instanceof SyntaxError) {
|
|
112
|
+
return {
|
|
113
|
+
isModule: false,
|
|
114
|
+
error: 'package.json is not valid JSON',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Loads a single eval fixture with full validation.
|
|
122
|
+
*/
|
|
123
|
+
export function loadFixture(evalsDir, name) {
|
|
124
|
+
const fixturePath = resolve(evalsDir, name);
|
|
125
|
+
if (!existsSync(fixturePath)) {
|
|
126
|
+
throw new FixtureValidationError(name, `Directory not found: ${fixturePath}`);
|
|
127
|
+
}
|
|
128
|
+
// Validate required files
|
|
129
|
+
const missingFiles = validateFixtureFiles(fixturePath);
|
|
130
|
+
if (missingFiles.length > 0) {
|
|
131
|
+
throw new FixtureValidationError(name, `Missing required files: ${missingFiles.join(', ')}`);
|
|
132
|
+
}
|
|
133
|
+
// Validate package.json
|
|
134
|
+
const pkgValidation = validatePackageJson(fixturePath);
|
|
135
|
+
if (pkgValidation.error) {
|
|
136
|
+
throw new FixtureValidationError(name, pkgValidation.error);
|
|
137
|
+
}
|
|
138
|
+
// Read prompt (case-sensitive check)
|
|
139
|
+
if (!existsWithExactCase(fixturePath, 'PROMPT.md')) {
|
|
140
|
+
throw new FixtureValidationError(name, 'PROMPT.md not found (case-sensitive: must be uppercase)');
|
|
141
|
+
}
|
|
142
|
+
const promptPath = join(fixturePath, 'PROMPT.md');
|
|
143
|
+
const prompt = readFileSync(promptPath, 'utf-8');
|
|
144
|
+
return {
|
|
145
|
+
name,
|
|
146
|
+
path: fixturePath,
|
|
147
|
+
prompt,
|
|
148
|
+
isModule: pkgValidation.isModule,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Discovers and loads all valid eval fixtures from a directory.
|
|
153
|
+
* Returns both valid fixtures and any validation errors encountered.
|
|
154
|
+
*/
|
|
155
|
+
export function loadAllFixtures(evalsDir) {
|
|
156
|
+
const fixtureNames = discoverFixtures(evalsDir);
|
|
157
|
+
const fixtures = [];
|
|
158
|
+
const errors = [];
|
|
159
|
+
for (const name of fixtureNames) {
|
|
160
|
+
try {
|
|
161
|
+
const fixture = loadFixture(evalsDir, name);
|
|
162
|
+
fixtures.push(fixture);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
if (error instanceof FixtureValidationError) {
|
|
166
|
+
errors.push(error);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return { fixtures, errors };
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Gets a list of all files in a fixture directory.
|
|
177
|
+
* Excludes PROMPT.md, EVAL.ts, node_modules, and .git.
|
|
178
|
+
*/
|
|
179
|
+
export function getFixtureFiles(fixturePath, excludePatterns = EXCLUDED_FILES) {
|
|
180
|
+
const files = [];
|
|
181
|
+
function walk(dir, basePath = '') {
|
|
182
|
+
const entries = readdirSync(dir);
|
|
183
|
+
for (const entry of entries) {
|
|
184
|
+
const relativePath = basePath ? `${basePath}/${entry}` : entry;
|
|
185
|
+
// Check if should be excluded
|
|
186
|
+
if (excludePatterns.some((pattern) => relativePath === pattern || entry === pattern)) {
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
const fullPath = join(dir, entry);
|
|
190
|
+
const stat = statSync(fullPath);
|
|
191
|
+
if (stat.isDirectory()) {
|
|
192
|
+
walk(fullPath, relativePath);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
files.push(relativePath);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
walk(fixturePath);
|
|
200
|
+
return files.sort();
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Reads all fixture files into a map.
|
|
204
|
+
* Keys are relative paths, values are file contents.
|
|
205
|
+
*/
|
|
206
|
+
export function readFixtureFiles(fixturePath, excludePatterns) {
|
|
207
|
+
const files = getFixtureFiles(fixturePath, excludePatterns);
|
|
208
|
+
const contents = new Map();
|
|
209
|
+
for (const file of files) {
|
|
210
|
+
const fullPath = join(fixturePath, file);
|
|
211
|
+
contents.set(file, readFileSync(fullPath, 'utf-8'));
|
|
212
|
+
}
|
|
213
|
+
return contents;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixture.js","sourceRoot":"","sources":["../../src/lib/fixture.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAEtC;IADT,YACS,WAAmB,EAC1B,OAAe;QAEf,KAAK,CAAC,SAAS,WAAW,MAAM,OAAO,EAAE,CAAC,CAAC;QAHpC,gBAAW,GAAX,WAAW,CAAQ;QAI1B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,OAAe,EAAE,QAAgB;IAC5D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,SAAS,IAAI,CAAC,GAAW,EAAE,WAAmB,EAAE;QAC9C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAEjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,oCAAoC;YACpC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAEnC,4BAA4B;YAC5B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvC,SAAS;YACX,CAAC;YAED,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YAE/D,iEAAiE;YACjE,IAAI,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;gBAChD,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,2CAA2C;gBAC3C,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,CAAC;IACnB,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;QACvC,wEAAwE;QACxE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,mBAAmB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YAChE,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC5C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAE1D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEhC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO;gBACL,QAAQ,EAAE,KAAK;gBACf,KAAK,EAAE,yCAAyC;aACjD,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,OAAO;gBACL,QAAQ,EAAE,KAAK;gBACf,KAAK,EAAE,gCAAgC;aACxC,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,IAAY;IACxD,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAE5C,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,WAAW,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,0BAA0B;IAC1B,MAAM,YAAY,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACvD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,sBAAsB,CAC9B,IAAI,EACJ,2BAA2B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrD,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,MAAM,aAAa,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACvD,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,sBAAsB,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,sBAAsB,CAAC,IAAI,EAAE,yDAAyD,CAAC,CAAC;IACpG,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAEjD,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,WAAW;QACjB,MAAM;QACN,QAAQ,EAAE,aAAa,CAAC,QAAQ;KACjC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAI9C,MAAM,YAAY,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,MAAM,GAA6B,EAAE,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,WAAmB,EACnB,kBAAqC,cAAc;IAEnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS,IAAI,CAAC,GAAW,EAAE,WAAmB,EAAE;QAC9C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAEjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YAE/D,8BAA8B;YAC9B,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,CAAC,EAAE,CAAC;gBACrF,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEhC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,CAAC;IAClB,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAmB,EACnB,eAAmC;IAEnC,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACzC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Housekeeping for eval results.
|
|
3
|
+
*
|
|
4
|
+
* After experiments complete, consolidate results:
|
|
5
|
+
* - For each (experiment, eval) pair: keep only the latest valid result
|
|
6
|
+
* - Remove older duplicates and dangling/incomplete results
|
|
7
|
+
* - Remove empty timestamp directories
|
|
8
|
+
*/
|
|
9
|
+
interface HousekeepingStats {
|
|
10
|
+
removedDuplicates: number;
|
|
11
|
+
removedIncomplete: number;
|
|
12
|
+
removedNonModelFailures: number;
|
|
13
|
+
removedEmptyDirs: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Run housekeeping on a single experiment's results directory.
|
|
17
|
+
*
|
|
18
|
+
* For each eval: keeps the newest complete result (has summary.json and
|
|
19
|
+
* at least one transcript), removes older duplicates and incomplete results.
|
|
20
|
+
* Removes empty timestamp directories afterward.
|
|
21
|
+
*/
|
|
22
|
+
export declare function housekeep(resultsDir: string, experimentName: string, options?: {
|
|
23
|
+
dry?: boolean;
|
|
24
|
+
}): HousekeepingStats;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=housekeeping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"housekeeping.d.ts","sourceRoot":"","sources":["../../src/lib/housekeeping.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,UAAU,iBAAiB;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1B,iBAAiB,CAgGnB"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Housekeeping for eval results.
|
|
3
|
+
*
|
|
4
|
+
* After experiments complete, consolidate results:
|
|
5
|
+
* - For each (experiment, eval) pair: keep only the latest valid result
|
|
6
|
+
* - Remove older duplicates and dangling/incomplete results
|
|
7
|
+
* - Remove empty timestamp directories
|
|
8
|
+
*/
|
|
9
|
+
import { readdirSync, rmSync, existsSync, readFileSync, statSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { isClassifierEnabled, isNonModelFailure } from './classifier.js';
|
|
12
|
+
/**
|
|
13
|
+
* Run housekeeping on a single experiment's results directory.
|
|
14
|
+
*
|
|
15
|
+
* For each eval: keeps the newest complete result (has summary.json and
|
|
16
|
+
* at least one transcript), removes older duplicates and incomplete results.
|
|
17
|
+
* Removes empty timestamp directories afterward.
|
|
18
|
+
*/
|
|
19
|
+
export function housekeep(resultsDir, experimentName, options) {
|
|
20
|
+
const stats = {
|
|
21
|
+
removedDuplicates: 0,
|
|
22
|
+
removedIncomplete: 0,
|
|
23
|
+
removedNonModelFailures: 0,
|
|
24
|
+
removedEmptyDirs: 0,
|
|
25
|
+
};
|
|
26
|
+
const experimentDir = join(resultsDir, experimentName);
|
|
27
|
+
if (!existsSync(experimentDir))
|
|
28
|
+
return stats;
|
|
29
|
+
// Get all timestamps sorted newest first
|
|
30
|
+
let timestamps;
|
|
31
|
+
try {
|
|
32
|
+
timestamps = readdirSync(experimentDir)
|
|
33
|
+
.filter((t) => !t.startsWith('.'))
|
|
34
|
+
.filter((t) => {
|
|
35
|
+
try {
|
|
36
|
+
return statSync(join(experimentDir, t)).isDirectory();
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
.sort()
|
|
43
|
+
.reverse();
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return stats;
|
|
47
|
+
}
|
|
48
|
+
// Track which (eval, fingerprint) pairs we've already seen (newest wins).
|
|
49
|
+
// Results with different fingerprints (e.g. smoke vs full run) are not
|
|
50
|
+
// duplicates of each other and should coexist.
|
|
51
|
+
const seenEvals = new Set();
|
|
52
|
+
for (const timestamp of timestamps) {
|
|
53
|
+
const tsDir = join(experimentDir, timestamp);
|
|
54
|
+
let evalDirs;
|
|
55
|
+
try {
|
|
56
|
+
evalDirs = readdirSync(tsDir).filter((d) => !d.startsWith('.'));
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
for (const evalDir of evalDirs) {
|
|
62
|
+
const evalResultDir = join(tsDir, evalDir);
|
|
63
|
+
if (!statSync(evalResultDir).isDirectory())
|
|
64
|
+
continue;
|
|
65
|
+
// Read fingerprint to distinguish different configs (e.g. smoke vs full)
|
|
66
|
+
const fingerprint = readFingerprint(evalResultDir);
|
|
67
|
+
const dedupeKey = fingerprint ? `${evalDir}:${fingerprint}` : evalDir;
|
|
68
|
+
if (seenEvals.has(dedupeKey)) {
|
|
69
|
+
// Older duplicate with same fingerprint — remove
|
|
70
|
+
if (!options?.dry) {
|
|
71
|
+
rmSync(evalResultDir, { recursive: true });
|
|
72
|
+
}
|
|
73
|
+
stats.removedDuplicates++;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
// Check if this result is complete
|
|
77
|
+
// Note: non-model failures are only cleaned up if the classifier is enabled
|
|
78
|
+
const isNonModel = isClassifierEnabled() && isNonModelFailure(evalResultDir);
|
|
79
|
+
if (isComplete(evalResultDir) && !isSmoke(evalResultDir) && !isNonModel) {
|
|
80
|
+
seenEvals.add(dedupeKey);
|
|
81
|
+
}
|
|
82
|
+
else if (isNonModel) {
|
|
83
|
+
if (!options?.dry) {
|
|
84
|
+
rmSync(evalResultDir, { recursive: true });
|
|
85
|
+
}
|
|
86
|
+
stats.removedNonModelFailures++;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Incomplete or smoke — remove
|
|
90
|
+
if (!options?.dry) {
|
|
91
|
+
rmSync(evalResultDir, { recursive: true });
|
|
92
|
+
}
|
|
93
|
+
stats.removedIncomplete++;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Check if timestamp dir is now empty
|
|
97
|
+
try {
|
|
98
|
+
const remaining = readdirSync(tsDir).filter((d) => !d.startsWith('.'));
|
|
99
|
+
if (remaining.length === 0) {
|
|
100
|
+
if (!options?.dry) {
|
|
101
|
+
rmSync(tsDir, { recursive: true });
|
|
102
|
+
}
|
|
103
|
+
stats.removedEmptyDirs++;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Directory already removed or inaccessible
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return stats;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if an eval result is from a smoke test.
|
|
114
|
+
*/
|
|
115
|
+
function isSmoke(evalResultDir) {
|
|
116
|
+
try {
|
|
117
|
+
const summary = JSON.parse(readFileSync(join(evalResultDir, 'summary.json'), 'utf-8'));
|
|
118
|
+
return summary.smoke === true;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Read the fingerprint from an eval result's summary.json, if present.
|
|
126
|
+
*/
|
|
127
|
+
function readFingerprint(evalResultDir) {
|
|
128
|
+
try {
|
|
129
|
+
const summary = JSON.parse(readFileSync(join(evalResultDir, 'summary.json'), 'utf-8'));
|
|
130
|
+
return summary.fingerprint;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Check if an eval result directory is complete.
|
|
138
|
+
* Complete means: has summary.json and at least one run with a transcript.
|
|
139
|
+
*/
|
|
140
|
+
function isComplete(evalResultDir) {
|
|
141
|
+
const summaryPath = join(evalResultDir, 'summary.json');
|
|
142
|
+
if (!existsSync(summaryPath))
|
|
143
|
+
return false;
|
|
144
|
+
// Check for at least one transcript
|
|
145
|
+
try {
|
|
146
|
+
const entries = readdirSync(evalResultDir);
|
|
147
|
+
for (const entry of entries) {
|
|
148
|
+
if (!entry.startsWith('run-'))
|
|
149
|
+
continue;
|
|
150
|
+
const runDir = join(evalResultDir, entry);
|
|
151
|
+
if (existsSync(join(runDir, 'transcript-raw.jsonl')) ||
|
|
152
|
+
existsSync(join(runDir, 'transcript.json'))) {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
// No transcript found — but summary.json exists.
|
|
161
|
+
// Still consider complete if summary shows 0% (model produced nothing, which is valid).
|
|
162
|
+
try {
|
|
163
|
+
const summary = JSON.parse(readFileSync(summaryPath, 'utf-8'));
|
|
164
|
+
return summary.totalRuns > 0;
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=housekeeping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"housekeeping.js","sourceRoot":"","sources":["../../src/lib/housekeeping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project initialization - create new eval projects.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Options for initializing a new project.
|
|
6
|
+
*/
|
|
7
|
+
export interface InitOptions {
|
|
8
|
+
/** Project name */
|
|
9
|
+
name: string;
|
|
10
|
+
/** Target directory (defaults to current working directory) */
|
|
11
|
+
targetDir?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Initialize a new eval project.
|
|
15
|
+
*/
|
|
16
|
+
export declare function initProject(options: InitOptions): string;
|
|
17
|
+
/**
|
|
18
|
+
* Get instructions for after project creation.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getPostInitInstructions(projectDir: string, projectName: string): string;
|
|
21
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/lib/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAyQD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CA0BxD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAavF"}
|