@bradtaylorsf/alpha-loop 1.3.0 → 1.4.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.js +80 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/eval.d.ts +53 -0
- package/dist/commands/eval.js +538 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/evolve.d.ts +25 -0
- package/dist/commands/evolve.js +270 -0
- package/dist/commands/evolve.js.map +1 -0
- package/dist/commands/history.d.ts +1 -1
- package/dist/commands/history.js +4 -4
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/run.js +139 -0
- package/dist/commands/run.js.map +1 -1
- package/dist/lib/agent.d.ts +8 -0
- package/dist/lib/agent.js +28 -3
- package/dist/lib/agent.js.map +1 -1
- package/dist/lib/config.d.ts +22 -0
- package/dist/lib/config.js +63 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/eval-checks.d.ts +91 -0
- package/dist/lib/eval-checks.js +254 -0
- package/dist/lib/eval-checks.js.map +1 -0
- package/dist/lib/eval-runner.d.ts +29 -0
- package/dist/lib/eval-runner.js +439 -0
- package/dist/lib/eval-runner.js.map +1 -0
- package/dist/lib/eval.d.ts +170 -0
- package/dist/lib/eval.js +507 -0
- package/dist/lib/eval.js.map +1 -0
- package/dist/lib/pipeline.d.ts +9 -0
- package/dist/lib/pipeline.js +186 -10
- package/dist/lib/pipeline.js.map +1 -1
- package/dist/lib/prompts.d.ts +18 -0
- package/dist/lib/prompts.js +48 -0
- package/dist/lib/prompts.js.map +1 -1
- package/dist/lib/score.d.ts +80 -0
- package/dist/lib/score.js +172 -0
- package/dist/lib/score.js.map +1 -0
- package/dist/lib/session.d.ts +2 -1
- package/dist/lib/session.js +16 -0
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/traces.d.ts +173 -0
- package/dist/lib/traces.js +272 -0
- package/dist/lib/traces.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eval Command — run eval suite, capture failures, list cases, view scores.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* alpha-loop eval — Run the eval suite, compute composite score
|
|
6
|
+
* alpha-loop eval capture — Interactive: walk through recent failures
|
|
7
|
+
* alpha-loop eval capture <N> — Capture a specific issue as an eval case
|
|
8
|
+
* alpha-loop eval list — Show eval cases and recent scores
|
|
9
|
+
* alpha-loop eval scores — Score history over time
|
|
10
|
+
* alpha-loop eval search — Greedy config search (model/agent variants)
|
|
11
|
+
* alpha-loop eval pareto — Show score/cost Pareto frontier
|
|
12
|
+
* alpha-loop eval import-swebench — Import from SWE-bench
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import * as readline from 'node:readline';
|
|
17
|
+
import { log } from '../lib/logger.js';
|
|
18
|
+
import { loadConfig } from '../lib/config.js';
|
|
19
|
+
import { loadEvalCases, saveCapturedCase, loadUnannotatedCases, annotateCapturedCase, formatEvalCase, evalsDir, } from '../lib/eval.js';
|
|
20
|
+
import { readScores, latestScore, scoresByConfig, paretoFrontier, formatScoreEntry, compareRuns, } from '../lib/score.js';
|
|
21
|
+
import { listTraceSessions, listTraceIssues, readTraceMetadata, readTrace, } from '../lib/traces.js';
|
|
22
|
+
import { runEvalSuite } from '../lib/eval-runner.js';
|
|
23
|
+
/** Helper to ask a question via readline. */
|
|
24
|
+
function ask(rl, question) {
|
|
25
|
+
return new Promise((resolve) => {
|
|
26
|
+
rl.question(question, (answer) => resolve(answer.trim()));
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Run the eval suite.
|
|
31
|
+
*/
|
|
32
|
+
export async function evalRunCommand(options) {
|
|
33
|
+
const config = loadConfig();
|
|
34
|
+
// Map --suite to type filter
|
|
35
|
+
let type = options.type;
|
|
36
|
+
if (options.suite === 'step')
|
|
37
|
+
type = 'step';
|
|
38
|
+
if (options.suite === 'e2e')
|
|
39
|
+
type = 'full';
|
|
40
|
+
const cases = loadEvalCases({
|
|
41
|
+
tags: options.tags?.split(','),
|
|
42
|
+
type,
|
|
43
|
+
step: options.step,
|
|
44
|
+
caseId: options.case,
|
|
45
|
+
});
|
|
46
|
+
if (cases.length === 0) {
|
|
47
|
+
log.warn('No eval cases found. Use `alpha-loop eval capture` to create some.');
|
|
48
|
+
log.info(`Eval cases directory: ${evalsDir(undefined, config.evalDir)}`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
log.step(`Running ${cases.length} eval case(s)...`);
|
|
52
|
+
console.log('');
|
|
53
|
+
for (const evalCase of cases) {
|
|
54
|
+
console.log(` ${formatEvalCase(evalCase)}`);
|
|
55
|
+
}
|
|
56
|
+
console.log('');
|
|
57
|
+
// Show previous score for comparison
|
|
58
|
+
const previousScore = latestScore(evalsDir(undefined, config.evalDir));
|
|
59
|
+
// Execute the eval suite
|
|
60
|
+
const result = await runEvalSuite(cases, config, {
|
|
61
|
+
caseId: options.case,
|
|
62
|
+
verbose: options.verbose,
|
|
63
|
+
});
|
|
64
|
+
// Print results
|
|
65
|
+
console.log('');
|
|
66
|
+
log.step('Results:');
|
|
67
|
+
console.log('');
|
|
68
|
+
for (const caseResult of result.cases) {
|
|
69
|
+
const icon = caseResult.passed ? 'PASS' : 'FAIL';
|
|
70
|
+
const credit = caseResult.partialCredit < 1 ? ` (credit=${caseResult.partialCredit.toFixed(2)})` : '';
|
|
71
|
+
const error = caseResult.error ? ` — ${caseResult.error}` : '';
|
|
72
|
+
console.log(` ${icon} ${caseResult.caseId} ${caseResult.duration}s${credit}${error}`);
|
|
73
|
+
}
|
|
74
|
+
console.log('');
|
|
75
|
+
console.log(` Score: ${result.composite}`);
|
|
76
|
+
console.log(` Pass: ${result.passCount}/${result.cases.length}`);
|
|
77
|
+
console.log(` Time: ${result.totalDuration}s`);
|
|
78
|
+
// Compare to previous run
|
|
79
|
+
if (previousScore) {
|
|
80
|
+
const delta = result.composite - previousScore.composite;
|
|
81
|
+
const arrow = delta > 0 ? '+' : '';
|
|
82
|
+
console.log(` Delta: ${arrow}${delta.toFixed(2)} (prev: ${previousScore.composite})`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Compare two eval runs.
|
|
87
|
+
*/
|
|
88
|
+
export function evalCompareCommand(run1, run2) {
|
|
89
|
+
const comparison = compareRuns(evalsDir(undefined, loadConfig().evalDir), run1, run2);
|
|
90
|
+
if (!comparison) {
|
|
91
|
+
log.warn('Could not find one or both runs. Use run index (1-based) or timestamp prefix.');
|
|
92
|
+
log.info('Run `alpha-loop eval scores` to see available runs.');
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
log.step('Run Comparison:');
|
|
96
|
+
console.log('');
|
|
97
|
+
console.log(` Run 1: ${comparison.run1.timestamp.split('T')[0]} score=${comparison.run1.composite} cost=$${comparison.run1.totalCost.toFixed(2)}`);
|
|
98
|
+
console.log(` Run 2: ${comparison.run2.timestamp.split('T')[0]} score=${comparison.run2.composite} cost=$${comparison.run2.totalCost.toFixed(2)}`);
|
|
99
|
+
console.log('');
|
|
100
|
+
const scoreDelta = comparison.scoreDelta;
|
|
101
|
+
const scoreArrow = scoreDelta > 0 ? '+' : '';
|
|
102
|
+
console.log(` Score delta: ${scoreArrow}${scoreDelta.toFixed(2)}`);
|
|
103
|
+
console.log(` Cost delta: ${comparison.costDelta >= 0 ? '+' : ''}$${comparison.costDelta.toFixed(2)}`);
|
|
104
|
+
console.log('');
|
|
105
|
+
// Per-case breakdown
|
|
106
|
+
console.log(' Case Run 1 Run 2 Delta');
|
|
107
|
+
console.log(' ---- ----- ----- -----');
|
|
108
|
+
for (const c of comparison.cases) {
|
|
109
|
+
const name = c.caseId.padEnd(32);
|
|
110
|
+
const s1 = c.run1Passed === null ? ' - ' : (c.run1Passed ? ' PASS' : ' FAIL');
|
|
111
|
+
const s2 = c.run2Passed === null ? ' - ' : (c.run2Passed ? ' PASS' : ' FAIL');
|
|
112
|
+
const delta = c.delta === 0 ? ' =' : (c.delta > 0 ? ` +${c.delta.toFixed(1)}` : ` ${c.delta.toFixed(1)}`);
|
|
113
|
+
console.log(` ${name} ${s1} ${s2} ${delta}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Capture a failure as an eval case — interactive walkthrough.
|
|
118
|
+
*
|
|
119
|
+
* Flow:
|
|
120
|
+
* 1. Show unannotated (auto-captured) skeleton cases first, prompt to annotate
|
|
121
|
+
* 2. Show recent session failures grouped by session
|
|
122
|
+
* 3. For each failure: show step, test/verify status, prompt for diagnosis
|
|
123
|
+
*/
|
|
124
|
+
export async function evalCaptureCommand(options) {
|
|
125
|
+
const config = loadConfig();
|
|
126
|
+
if (options.issue) {
|
|
127
|
+
// Capture a specific issue
|
|
128
|
+
await captureSpecificIssue(parseInt(options.issue, 10), config);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
132
|
+
let capturedCount = 0;
|
|
133
|
+
try {
|
|
134
|
+
// Phase 1: Show unannotated skeleton cases first
|
|
135
|
+
const unannotated = loadUnannotatedCases();
|
|
136
|
+
if (unannotated.length > 0) {
|
|
137
|
+
log.step(`Unannotated eval cases (auto-captured):`);
|
|
138
|
+
console.log('');
|
|
139
|
+
for (let i = 0; i < unannotated.length; i++) {
|
|
140
|
+
const u = unannotated[i];
|
|
141
|
+
const meta = u.evalCase;
|
|
142
|
+
console.log(` ${i + 1}. ${meta.id} (issue #${extractIssueNum(meta.id)}, ${meta.source})`);
|
|
143
|
+
}
|
|
144
|
+
console.log('');
|
|
145
|
+
for (const entry of unannotated) {
|
|
146
|
+
const answer = await ask(rl, `Annotate ${entry.evalCase.id}? (y/n): `);
|
|
147
|
+
if (answer.toLowerCase() !== 'y')
|
|
148
|
+
continue;
|
|
149
|
+
const annotation = await promptAnnotation(rl);
|
|
150
|
+
annotateCapturedCase(entry.path, annotation);
|
|
151
|
+
capturedCount++;
|
|
152
|
+
log.success(`Annotated: ${entry.evalCase.id}`);
|
|
153
|
+
}
|
|
154
|
+
if (capturedCount > 0)
|
|
155
|
+
console.log('');
|
|
156
|
+
}
|
|
157
|
+
// Phase 2: Show recent session failures
|
|
158
|
+
const sessionFailures = collectSessionFailures();
|
|
159
|
+
if (sessionFailures.length === 0 && unannotated.length === 0) {
|
|
160
|
+
log.info('No failures found in recent sessions. Nothing to capture.');
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (sessionFailures.length > 0) {
|
|
164
|
+
// Group by session
|
|
165
|
+
const grouped = groupBySession(sessionFailures);
|
|
166
|
+
log.step('Recent sessions with failures:');
|
|
167
|
+
console.log('');
|
|
168
|
+
for (const [session, failures] of grouped) {
|
|
169
|
+
console.log(` ${session} — ${failures.length} failure(s)`);
|
|
170
|
+
for (const f of failures) {
|
|
171
|
+
const step = detectFailureStepFromResult(f.result);
|
|
172
|
+
const tests = f.result.testsPassing ? 'PASS' : 'FAIL';
|
|
173
|
+
const verify = f.result.verifySkipped ? 'SKIP' : (f.result.verifyPassing ? 'PASS' : 'FAIL');
|
|
174
|
+
console.log(` #${f.issueNum} — ${f.title}`);
|
|
175
|
+
console.log(` Failed at: ${step} | Tests: ${tests} | Verify: ${verify}`);
|
|
176
|
+
}
|
|
177
|
+
console.log('');
|
|
178
|
+
}
|
|
179
|
+
// Prompt to capture each failure
|
|
180
|
+
for (const [_session, failures] of grouped) {
|
|
181
|
+
for (const failure of failures) {
|
|
182
|
+
const answer = await ask(rl, `Capture #${failure.issueNum}? (y/n/skip all): `);
|
|
183
|
+
if (answer === 'skip all')
|
|
184
|
+
break;
|
|
185
|
+
if (answer.toLowerCase() !== 'y')
|
|
186
|
+
continue;
|
|
187
|
+
const annotation = await promptAnnotation(rl);
|
|
188
|
+
const step = detectFailureStepFromResult(failure.result);
|
|
189
|
+
const casePath = saveCapturedCase({
|
|
190
|
+
issueNum: failure.issueNum,
|
|
191
|
+
title: failure.title,
|
|
192
|
+
issueBody: typeof failure.result.issueBody === 'string' ? failure.result.issueBody : undefined,
|
|
193
|
+
step,
|
|
194
|
+
session: failure.session,
|
|
195
|
+
tags: annotation.tags,
|
|
196
|
+
});
|
|
197
|
+
// Immediately annotate since we have the diagnosis
|
|
198
|
+
annotateCapturedCase(casePath, annotation);
|
|
199
|
+
capturedCount++;
|
|
200
|
+
log.success(`Created: ${casePath}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (capturedCount > 0) {
|
|
205
|
+
console.log('');
|
|
206
|
+
log.info(`Done. ${capturedCount} eval case(s) created/annotated. Run 'alpha-loop eval --suite step' to test.`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
rl.close();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/** Prompt user for failure annotation. */
|
|
214
|
+
async function promptAnnotation(rl) {
|
|
215
|
+
console.log('');
|
|
216
|
+
const whatWentWrong = await ask(rl, ' What went wrong? (one line): ');
|
|
217
|
+
const whatShouldHaveHappened = await ask(rl, ' What should have happened? (one line): ');
|
|
218
|
+
const tagsInput = await ask(rl, ' Tags (comma-separated, optional): ');
|
|
219
|
+
return {
|
|
220
|
+
whatWentWrong,
|
|
221
|
+
whatShouldHaveHappened,
|
|
222
|
+
tags: tagsInput.split(',').map((t) => t.trim()).filter(Boolean),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/** Extract issue number from a captured case ID like "captured-047-module-format". */
|
|
226
|
+
function extractIssueNum(caseId) {
|
|
227
|
+
const match = caseId.match(/captured-(\d+)/);
|
|
228
|
+
return match ? String(parseInt(match[1], 10)) : '?';
|
|
229
|
+
}
|
|
230
|
+
/** Collect failures from recent sessions. */
|
|
231
|
+
function collectSessionFailures() {
|
|
232
|
+
const sessionsDir = join(process.cwd(), '.alpha-loop', 'sessions');
|
|
233
|
+
if (!existsSync(sessionsDir))
|
|
234
|
+
return [];
|
|
235
|
+
const sessionDirs = readdirSync(sessionsDir, { withFileTypes: true })
|
|
236
|
+
.filter((d) => d.isDirectory())
|
|
237
|
+
.map((d) => d.name)
|
|
238
|
+
.sort()
|
|
239
|
+
.reverse();
|
|
240
|
+
const failures = [];
|
|
241
|
+
for (const sessionDir of sessionDirs.slice(0, 5)) {
|
|
242
|
+
const sessionPath = join(sessionsDir, sessionDir);
|
|
243
|
+
const resultFiles = readdirSync(sessionPath)
|
|
244
|
+
.filter((f) => f.startsWith('result-') && f.endsWith('.json'));
|
|
245
|
+
for (const file of resultFiles) {
|
|
246
|
+
try {
|
|
247
|
+
const result = JSON.parse(readFileSync(join(sessionPath, file), 'utf-8'));
|
|
248
|
+
if (result.status === 'failure') {
|
|
249
|
+
failures.push({
|
|
250
|
+
session: sessionDir,
|
|
251
|
+
issueNum: result.issueNum,
|
|
252
|
+
title: result.title ?? `Issue #${result.issueNum}`,
|
|
253
|
+
file: join(sessionPath, file),
|
|
254
|
+
result,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// Skip malformed result files
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return failures;
|
|
264
|
+
}
|
|
265
|
+
/** Group failures by session name. */
|
|
266
|
+
function groupBySession(failures) {
|
|
267
|
+
const grouped = new Map();
|
|
268
|
+
for (const f of failures) {
|
|
269
|
+
const existing = grouped.get(f.session) ?? [];
|
|
270
|
+
existing.push(f);
|
|
271
|
+
grouped.set(f.session, existing);
|
|
272
|
+
}
|
|
273
|
+
return grouped;
|
|
274
|
+
}
|
|
275
|
+
/** Detect failure step from a raw session result object. */
|
|
276
|
+
function detectFailureStepFromResult(result) {
|
|
277
|
+
if (!result.testsPassing) {
|
|
278
|
+
return (typeof result.filesChanged === 'number' && result.filesChanged > 1) ? 'test-fix' : 'implement';
|
|
279
|
+
}
|
|
280
|
+
if (!result.verifyPassing && !result.verifySkipped)
|
|
281
|
+
return 'verify';
|
|
282
|
+
return 'review';
|
|
283
|
+
}
|
|
284
|
+
/** Capture a specific issue number as an eval case. */
|
|
285
|
+
async function captureSpecificIssue(issueNum, config) {
|
|
286
|
+
// Look for this issue in traces
|
|
287
|
+
const sessions = listTraceSessions();
|
|
288
|
+
let found = false;
|
|
289
|
+
for (const session of sessions.reverse()) {
|
|
290
|
+
const issues = listTraceIssues(session);
|
|
291
|
+
if (issues.includes(issueNum)) {
|
|
292
|
+
const metadata = readTraceMetadata(session, issueNum);
|
|
293
|
+
if (metadata) {
|
|
294
|
+
found = true;
|
|
295
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
296
|
+
try {
|
|
297
|
+
await captureFromTrace(rl, session, issueNum, metadata, config);
|
|
298
|
+
}
|
|
299
|
+
finally {
|
|
300
|
+
rl.close();
|
|
301
|
+
}
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// Fallback: check session result files
|
|
307
|
+
if (!found) {
|
|
308
|
+
const sessionsDir = join(process.cwd(), '.alpha-loop', 'sessions');
|
|
309
|
+
if (existsSync(sessionsDir)) {
|
|
310
|
+
const sessionDirs = readdirSync(sessionsDir, { withFileTypes: true })
|
|
311
|
+
.filter((d) => d.isDirectory())
|
|
312
|
+
.map((d) => d.name)
|
|
313
|
+
.sort()
|
|
314
|
+
.reverse();
|
|
315
|
+
for (const sessionDir of sessionDirs) {
|
|
316
|
+
const resultFile = join(sessionsDir, sessionDir, `result-${issueNum}.json`);
|
|
317
|
+
if (existsSync(resultFile)) {
|
|
318
|
+
found = true;
|
|
319
|
+
const result = JSON.parse(readFileSync(resultFile, 'utf-8'));
|
|
320
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
321
|
+
try {
|
|
322
|
+
await captureFailure(rl, {
|
|
323
|
+
session: sessionDir,
|
|
324
|
+
issueNum,
|
|
325
|
+
title: result.title ?? `Issue #${issueNum}`,
|
|
326
|
+
file: resultFile,
|
|
327
|
+
}, config);
|
|
328
|
+
}
|
|
329
|
+
finally {
|
|
330
|
+
rl.close();
|
|
331
|
+
}
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
if (!found) {
|
|
338
|
+
log.warn(`No data found for issue #${issueNum}. Run the pipeline first, or create an eval case manually.`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/** Capture an eval case from trace data. */
|
|
342
|
+
async function captureFromTrace(rl, session, issueNum, metadata, config) {
|
|
343
|
+
log.step(`Capturing eval case from trace: session=${session}, issue=#${issueNum}`);
|
|
344
|
+
// Read available trace data
|
|
345
|
+
const plan = readTrace(session, issueNum, 'plan.json');
|
|
346
|
+
const diff = readTrace(session, issueNum, 'diff.patch');
|
|
347
|
+
const step = metadata.testsPassing
|
|
348
|
+
? (metadata.verifyPassing ? 'review' : 'verify')
|
|
349
|
+
: 'implement';
|
|
350
|
+
console.log(`\n Issue: #${issueNum} — ${metadata.title}`);
|
|
351
|
+
console.log(` Status: ${metadata.status}`);
|
|
352
|
+
console.log(` Failed at: ${step}`);
|
|
353
|
+
console.log(` Tests: ${metadata.testsPassing ? 'PASS' : 'FAIL'} | Verify: ${metadata.verifySkipped ? 'SKIP' : (metadata.verifyPassing ? 'PASS' : 'FAIL')}`);
|
|
354
|
+
console.log(` Duration: ${metadata.duration}s, Retries: ${metadata.retries}`);
|
|
355
|
+
if (plan)
|
|
356
|
+
console.log(` Plan: available`);
|
|
357
|
+
if (diff)
|
|
358
|
+
console.log(` Diff: ${diff.length} chars`);
|
|
359
|
+
console.log('');
|
|
360
|
+
const annotation = await promptAnnotation(rl);
|
|
361
|
+
const casePath = saveCapturedCase({
|
|
362
|
+
issueNum,
|
|
363
|
+
title: metadata.title,
|
|
364
|
+
step,
|
|
365
|
+
session,
|
|
366
|
+
tags: annotation.tags,
|
|
367
|
+
});
|
|
368
|
+
annotateCapturedCase(casePath, annotation);
|
|
369
|
+
log.success(`Eval case saved: ${casePath}`);
|
|
370
|
+
}
|
|
371
|
+
/** Capture a failure from session result as an eval case. */
|
|
372
|
+
async function captureFailure(rl, failure, config) {
|
|
373
|
+
log.step(`\nCapturing: #${failure.issueNum} — ${failure.title}`);
|
|
374
|
+
const result = JSON.parse(readFileSync(failure.file, 'utf-8'));
|
|
375
|
+
const step = detectFailureStepFromResult(result);
|
|
376
|
+
console.log(` Failed at: ${step}`);
|
|
377
|
+
console.log(` Tests: ${result.testsPassing ? 'PASS' : 'FAIL'} | Verify: ${result.verifySkipped ? 'SKIP' : (result.verifyPassing ? 'PASS' : 'FAIL')}`);
|
|
378
|
+
console.log(` Duration: ${result.duration}s`);
|
|
379
|
+
console.log(` Files changed: ${result.filesChanged}`);
|
|
380
|
+
console.log('');
|
|
381
|
+
const annotation = await promptAnnotation(rl);
|
|
382
|
+
const casePath = saveCapturedCase({
|
|
383
|
+
issueNum: failure.issueNum,
|
|
384
|
+
title: failure.title,
|
|
385
|
+
step,
|
|
386
|
+
session: failure.session,
|
|
387
|
+
tags: annotation.tags,
|
|
388
|
+
});
|
|
389
|
+
annotateCapturedCase(casePath, annotation);
|
|
390
|
+
log.success(`Eval case saved: ${casePath}`);
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* List eval cases and recent scores.
|
|
394
|
+
*/
|
|
395
|
+
export function evalListCommand() {
|
|
396
|
+
const cases = loadEvalCases();
|
|
397
|
+
const dir = evalsDir(undefined, loadConfig().evalDir);
|
|
398
|
+
if (cases.length === 0) {
|
|
399
|
+
log.info('No eval cases found.');
|
|
400
|
+
log.info(`Create eval cases in: ${dir}`);
|
|
401
|
+
log.info('Or use `alpha-loop eval capture` to capture from failures.');
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
log.step(`Eval Cases (${cases.length}):`);
|
|
405
|
+
console.log('');
|
|
406
|
+
const fullCases = cases.filter((c) => c.type === 'full');
|
|
407
|
+
const stepCases = cases.filter((c) => c.type === 'step');
|
|
408
|
+
if (fullCases.length > 0) {
|
|
409
|
+
console.log(' Full Pipeline:');
|
|
410
|
+
for (const c of fullCases) {
|
|
411
|
+
console.log(` ${formatEvalCase(c)}`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
if (stepCases.length > 0) {
|
|
415
|
+
console.log(' Step-Level:');
|
|
416
|
+
for (const c of stepCases) {
|
|
417
|
+
console.log(` ${formatEvalCase(c)}`);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
console.log('');
|
|
421
|
+
// Show latest score
|
|
422
|
+
const latest = latestScore(dir);
|
|
423
|
+
if (latest) {
|
|
424
|
+
console.log(` Latest score: ${formatScoreEntry(latest)}`);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Show score history.
|
|
429
|
+
*/
|
|
430
|
+
export function evalScoresCommand() {
|
|
431
|
+
const scores = readScores(evalsDir(undefined, loadConfig().evalDir));
|
|
432
|
+
if (scores.length === 0) {
|
|
433
|
+
log.info('No scores recorded yet. Run `alpha-loop eval` to generate scores.');
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
log.step(`Score History (${scores.length} entries):`);
|
|
437
|
+
console.log('');
|
|
438
|
+
// Show last 20 entries
|
|
439
|
+
const recent = scores.slice(-20);
|
|
440
|
+
for (const entry of recent) {
|
|
441
|
+
console.log(` ${formatScoreEntry(entry)}`);
|
|
442
|
+
}
|
|
443
|
+
console.log('');
|
|
444
|
+
// Show trend
|
|
445
|
+
if (scores.length >= 2) {
|
|
446
|
+
const first = scores[0].composite;
|
|
447
|
+
const last = scores[scores.length - 1].composite;
|
|
448
|
+
const delta = last - first;
|
|
449
|
+
const arrow = delta > 0 ? '+' : '';
|
|
450
|
+
console.log(` Trend: ${first} -> ${last} (${arrow}${delta.toFixed(2)})`);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Show score/cost Pareto frontier.
|
|
455
|
+
*/
|
|
456
|
+
export function evalParetoCommand() {
|
|
457
|
+
const frontier = paretoFrontier(evalsDir(undefined, loadConfig().evalDir));
|
|
458
|
+
if (frontier.length === 0) {
|
|
459
|
+
log.info('No scores recorded yet.');
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
log.step(`Pareto Frontier (${frontier.length} entries):`);
|
|
463
|
+
console.log('');
|
|
464
|
+
console.log(' Score Cost Config');
|
|
465
|
+
console.log(' ----- ---- ------');
|
|
466
|
+
for (const entry of frontier) {
|
|
467
|
+
const score = entry.composite.toFixed(2).padStart(6);
|
|
468
|
+
const cost = `$${entry.totalCost.toFixed(2)}`.padStart(8);
|
|
469
|
+
console.log(` ${score} ${cost} ${entry.configHash}`);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Greedy search over model/agent configs.
|
|
474
|
+
*/
|
|
475
|
+
export async function evalSearchCommand(options) {
|
|
476
|
+
const config = loadConfig();
|
|
477
|
+
const cases = loadEvalCases();
|
|
478
|
+
if (cases.length === 0) {
|
|
479
|
+
log.warn('No eval cases found. Create some first with `alpha-loop eval capture`.');
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
const models = options.models?.split(',') ?? [config.model || 'default'];
|
|
483
|
+
const agents = options.agents?.split(',') ?? [config.agent];
|
|
484
|
+
const maxRuns = parseInt(options.maxRuns ?? '10', 10);
|
|
485
|
+
log.step('Config Search');
|
|
486
|
+
console.log(` Models: ${models.join(', ')}`);
|
|
487
|
+
console.log(` Agents: ${agents.join(', ')}`);
|
|
488
|
+
console.log(` Eval cases: ${cases.length}`);
|
|
489
|
+
console.log(` Max runs: ${maxRuns}`);
|
|
490
|
+
console.log('');
|
|
491
|
+
// Generate config variants
|
|
492
|
+
const variants = [];
|
|
493
|
+
for (const agent of agents) {
|
|
494
|
+
for (const model of models) {
|
|
495
|
+
variants.push({ agent, model });
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
log.info(`Generated ${variants.length} config variant(s).`);
|
|
499
|
+
log.info('To execute: run `alpha-loop eval` with each config variant.');
|
|
500
|
+
log.info('Results will be tracked in scores.jsonl for comparison.');
|
|
501
|
+
console.log('');
|
|
502
|
+
for (let i = 0; i < Math.min(variants.length, maxRuns); i++) {
|
|
503
|
+
const v = variants[i];
|
|
504
|
+
console.log(` ${i + 1}. agent=${v.agent} model=${v.model}`);
|
|
505
|
+
}
|
|
506
|
+
// Show current best
|
|
507
|
+
const configs = scoresByConfig(evalsDir(undefined, config.evalDir));
|
|
508
|
+
if (configs.length > 0) {
|
|
509
|
+
console.log('');
|
|
510
|
+
log.step('Current Rankings:');
|
|
511
|
+
for (const c of configs.slice(0, 5)) {
|
|
512
|
+
const best = Math.max(...c.scores.map((s) => s.composite));
|
|
513
|
+
console.log(` ${c.configHash}: best=${best.toFixed(2)} (${c.scores.length} runs)`);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* Import SWE-bench cases (placeholder — requires HuggingFace download).
|
|
519
|
+
*/
|
|
520
|
+
export async function evalImportSwebenchCommand() {
|
|
521
|
+
log.step('SWE-bench Import');
|
|
522
|
+
log.info('');
|
|
523
|
+
log.info('SWE-bench integration imports real GitHub issues with validated patches.');
|
|
524
|
+
log.info('');
|
|
525
|
+
log.info('Setup:');
|
|
526
|
+
log.info(' 1. Clone the alpha-loop-evals fixture monorepo');
|
|
527
|
+
log.info(' 2. Download SWE-bench dataset from HuggingFace:');
|
|
528
|
+
log.info(' princeton-nlp/SWE-bench');
|
|
529
|
+
log.info(' 3. Run: alpha-loop eval import-swebench --dataset <path>');
|
|
530
|
+
log.info('');
|
|
531
|
+
log.info('Each SWE-bench instance becomes an eval case with:');
|
|
532
|
+
log.info(' - fixture_repo: the target repo at the specific commit');
|
|
533
|
+
log.info(' - issue_body: the original GitHub issue description');
|
|
534
|
+
log.info(' - expected: validated patch as ground truth');
|
|
535
|
+
log.info('');
|
|
536
|
+
log.info('This is planned for M2 (Eval Content). See issue #95.');
|
|
537
|
+
}
|
|
538
|
+
//# sourceMappingURL=eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/commands/eval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type EvolveOptions = {
|
|
2
|
+
maxIterations?: string;
|
|
3
|
+
dryRun?: boolean;
|
|
4
|
+
verbose?: boolean;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Run the evolve loop: propose → eval → keep/discard.
|
|
8
|
+
*/
|
|
9
|
+
export declare function evolveCommand(options: EvolveOptions): Promise<void>;
|
|
10
|
+
/** Parsed proposed change from agent output. */
|
|
11
|
+
type ProposedChange = {
|
|
12
|
+
path: string;
|
|
13
|
+
content: string;
|
|
14
|
+
reason: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Parse proposed changes from agent output.
|
|
18
|
+
* Expects a JSON array in the output.
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseProposedChanges(output: string): ProposedChange[];
|
|
21
|
+
/**
|
|
22
|
+
* Check if a proposed path is safe to modify.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isSafePath(filePath: string): boolean;
|
|
25
|
+
export {};
|