labgate 0.5.31 → 0.5.33

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 (73) hide show
  1. package/README.md +50 -2
  2. package/dist/cli.js +533 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/lib/config.d.ts +11 -0
  5. package/dist/lib/config.js +45 -4
  6. package/dist/lib/config.js.map +1 -1
  7. package/dist/lib/container.d.ts +3 -3
  8. package/dist/lib/container.js +144 -12
  9. package/dist/lib/container.js.map +1 -1
  10. package/dist/lib/display-mcp.d.ts +10 -0
  11. package/dist/lib/display-mcp.js +160 -0
  12. package/dist/lib/display-mcp.js.map +1 -0
  13. package/dist/lib/display-store.d.ts +24 -0
  14. package/dist/lib/display-store.js +150 -0
  15. package/dist/lib/display-store.js.map +1 -0
  16. package/dist/lib/explorer-autopilot.d.ts +16 -0
  17. package/dist/lib/explorer-autopilot.js +573 -0
  18. package/dist/lib/explorer-autopilot.js.map +1 -0
  19. package/dist/lib/explorer-claude.d.ts +16 -0
  20. package/dist/lib/explorer-claude.js +361 -0
  21. package/dist/lib/explorer-claude.js.map +1 -0
  22. package/dist/lib/explorer-compare.d.ts +9 -0
  23. package/dist/lib/explorer-compare.js +190 -0
  24. package/dist/lib/explorer-compare.js.map +1 -0
  25. package/dist/lib/explorer-eval.d.ts +23 -0
  26. package/dist/lib/explorer-eval.js +161 -0
  27. package/dist/lib/explorer-eval.js.map +1 -0
  28. package/dist/lib/explorer-gc.d.ts +11 -0
  29. package/dist/lib/explorer-gc.js +304 -0
  30. package/dist/lib/explorer-gc.js.map +1 -0
  31. package/dist/lib/explorer-git.d.ts +14 -0
  32. package/dist/lib/explorer-git.js +136 -0
  33. package/dist/lib/explorer-git.js.map +1 -0
  34. package/dist/lib/explorer-lock.d.ts +5 -0
  35. package/dist/lib/explorer-lock.js +100 -0
  36. package/dist/lib/explorer-lock.js.map +1 -0
  37. package/dist/lib/explorer-mcp.d.ts +11 -0
  38. package/dist/lib/explorer-mcp.js +611 -0
  39. package/dist/lib/explorer-mcp.js.map +1 -0
  40. package/dist/lib/explorer-retention.d.ts +4 -0
  41. package/dist/lib/explorer-retention.js +58 -0
  42. package/dist/lib/explorer-retention.js.map +1 -0
  43. package/dist/lib/explorer-store.d.ts +77 -0
  44. package/dist/lib/explorer-store.js +950 -0
  45. package/dist/lib/explorer-store.js.map +1 -0
  46. package/dist/lib/explorer-types.d.ts +161 -0
  47. package/dist/lib/explorer-types.js +3 -0
  48. package/dist/lib/explorer-types.js.map +1 -0
  49. package/dist/lib/explorer.d.ts +31 -0
  50. package/dist/lib/explorer.js +247 -0
  51. package/dist/lib/explorer.js.map +1 -0
  52. package/dist/lib/results-store.js +37 -3
  53. package/dist/lib/results-store.js.map +1 -1
  54. package/dist/lib/test/integration-harness.js +1 -1
  55. package/dist/lib/test/integration-harness.js.map +1 -1
  56. package/dist/lib/ui.html +5115 -2052
  57. package/dist/lib/ui.js +906 -39
  58. package/dist/lib/ui.js.map +1 -1
  59. package/dist/lib/web-terminal.js +4 -3
  60. package/dist/lib/web-terminal.js.map +1 -1
  61. package/dist/mcp-bundles/dataset-mcp.bundle.mjs +0 -8
  62. package/dist/mcp-bundles/display-mcp.bundle.mjs +30209 -0
  63. package/dist/mcp-bundles/explorer-mcp.bundle.mjs +40036 -0
  64. package/dist/mcp-bundles/results-mcp.bundle.mjs +30 -4
  65. package/package.json +3 -2
  66. package/templates/tsp-lab/API_CONTRACT.md +20 -0
  67. package/templates/tsp-lab/EVAL.md +20 -0
  68. package/templates/tsp-lab/PROBLEM.md +18 -0
  69. package/templates/tsp-lab/data/generate_instances.py +51 -0
  70. package/templates/tsp-lab/data/instances.jsonl +12 -0
  71. package/templates/tsp-lab/eval.py +148 -0
  72. package/templates/tsp-lab/solver.py +88 -0
  73. package/templates/tsp-lab/stub-patches/enable_two_opt.patch +14 -0
@@ -0,0 +1,361 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildClaudeActivityLog = buildClaudeActivityLog;
4
+ exports.runClaudeHeadlessInWorktree = runClaudeHeadlessInWorktree;
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
7
+ const os_1 = require("os");
8
+ const child_process_1 = require("child_process");
9
+ const config_js_1 = require("./config.js");
10
+ const container_js_1 = require("./container.js");
11
+ const runtime_js_1 = require("./runtime.js");
12
+ const CLAUDE_PREP_TIMEOUT_SEC = 30 * 60;
13
+ const CLAUDE_PULL_TIMEOUT_SEC = 60 * 60;
14
+ const CLAUDE_RUN_TIMEOUT_SEC_FALLBACK = 30 * 60;
15
+ function compactText(value, max = 240) {
16
+ const compact = String(value || '').replace(/\s+/g, ' ').trim();
17
+ if (!compact)
18
+ return '';
19
+ if (compact.length <= max)
20
+ return compact;
21
+ return `${compact.slice(0, max - 3)}...`;
22
+ }
23
+ function parseJsonObjectLine(line) {
24
+ try {
25
+ const parsed = JSON.parse(line);
26
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
27
+ return null;
28
+ return parsed;
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ function readRecordString(record, key) {
35
+ const value = record[key];
36
+ return typeof value === 'string' ? value : '';
37
+ }
38
+ function collectClaudeTextFromContent(content) {
39
+ if (!Array.isArray(content))
40
+ return '';
41
+ let text = '';
42
+ for (const part of content) {
43
+ if (!part || typeof part !== 'object' || Array.isArray(part))
44
+ continue;
45
+ const node = part;
46
+ if (node.type === 'text' && typeof node.text === 'string') {
47
+ text += node.text;
48
+ }
49
+ }
50
+ return text;
51
+ }
52
+ function extractClaudeStreamSessionId(event) {
53
+ const direct = readRecordString(event, 'session_id').trim();
54
+ if (direct)
55
+ return direct;
56
+ const message = event.message;
57
+ if (!message || typeof message !== 'object' || Array.isArray(message))
58
+ return '';
59
+ const nested = readRecordString(message, 'session_id').trim();
60
+ return nested || '';
61
+ }
62
+ function extractClaudeAssistantSnapshot(event) {
63
+ const type = readRecordString(event, 'type').trim().toLowerCase();
64
+ if (type === 'assistant') {
65
+ const message = event.message;
66
+ if (message && typeof message === 'object' && !Array.isArray(message)) {
67
+ const content = message.content;
68
+ const contentText = collectClaudeTextFromContent(content);
69
+ if (contentText)
70
+ return contentText;
71
+ }
72
+ }
73
+ if (type === 'result') {
74
+ const resultText = readRecordString(event, 'result');
75
+ if (resultText)
76
+ return resultText;
77
+ }
78
+ return '';
79
+ }
80
+ function parseClaudeStream(stdout, resumeSessionId = '') {
81
+ const lines = String(stdout || '').split(/\r?\n/);
82
+ let latestSessionId = String(resumeSessionId || '').trim();
83
+ let assistantSnapshot = '';
84
+ for (const rawLine of lines) {
85
+ const line = rawLine.trim();
86
+ if (!line)
87
+ continue;
88
+ const event = parseJsonObjectLine(line);
89
+ if (!event)
90
+ continue;
91
+ const sessionId = extractClaudeStreamSessionId(event);
92
+ if (sessionId)
93
+ latestSessionId = sessionId;
94
+ const snapshot = extractClaudeAssistantSnapshot(event);
95
+ if (snapshot) {
96
+ assistantSnapshot = snapshot;
97
+ }
98
+ }
99
+ return {
100
+ session_id: latestSessionId,
101
+ assistant_text: assistantSnapshot,
102
+ };
103
+ }
104
+ function extractToolNames(event) {
105
+ const names = [];
106
+ const message = event.message;
107
+ if (!message || typeof message !== 'object' || Array.isArray(message))
108
+ return names;
109
+ const content = message.content;
110
+ if (!Array.isArray(content))
111
+ return names;
112
+ for (const part of content) {
113
+ if (!part || typeof part !== 'object' || Array.isArray(part))
114
+ continue;
115
+ const node = part;
116
+ if (String(node.type || '').trim() !== 'tool_use')
117
+ continue;
118
+ const name = readRecordString(node, 'name').trim();
119
+ if (name)
120
+ names.push(name);
121
+ }
122
+ return names;
123
+ }
124
+ function buildClaudeActivityLog(stdout) {
125
+ const lines = String(stdout || '').split(/\r?\n/);
126
+ const activity = [];
127
+ let latestSessionId = '';
128
+ for (const rawLine of lines) {
129
+ const line = rawLine.trim();
130
+ if (!line)
131
+ continue;
132
+ const event = parseJsonObjectLine(line);
133
+ if (!event)
134
+ continue;
135
+ const sessionId = extractClaudeStreamSessionId(event);
136
+ if (sessionId && sessionId !== latestSessionId) {
137
+ latestSessionId = sessionId;
138
+ activity.push(`[session] ${latestSessionId}`);
139
+ }
140
+ const type = readRecordString(event, 'type').trim().toLowerCase();
141
+ if (type === 'assistant') {
142
+ const snapshot = extractClaudeAssistantSnapshot(event);
143
+ const text = compactText(snapshot);
144
+ if (text)
145
+ activity.push(`[assistant] ${text}`);
146
+ }
147
+ else if (type === 'result') {
148
+ const resultText = compactText(readRecordString(event, 'result'));
149
+ if (resultText)
150
+ activity.push(`[result] ${resultText}`);
151
+ }
152
+ else if (type === 'error') {
153
+ const err = compactText(readRecordString(event, 'error') || readRecordString(event, 'message'));
154
+ if (err)
155
+ activity.push(`[error] ${err}`);
156
+ }
157
+ const tools = extractToolNames(event);
158
+ for (const tool of tools) {
159
+ activity.push(`[tool] ${tool}`);
160
+ }
161
+ }
162
+ if (activity.length === 0) {
163
+ return 'No structured Claude activity events were parsed from stream output.\n';
164
+ }
165
+ const maxLines = 600;
166
+ const truncated = activity.length > maxLines;
167
+ const body = truncated ? activity.slice(0, maxLines) : activity;
168
+ if (truncated)
169
+ body.push(`[truncated] kept first ${maxLines} lines`);
170
+ return `${body.join('\n')}\n`;
171
+ }
172
+ function runApptainer(args, cwd, timeoutSec) {
173
+ const result = (0, child_process_1.spawnSync)('apptainer', args, {
174
+ cwd,
175
+ encoding: 'utf-8',
176
+ stdio: ['ignore', 'pipe', 'pipe'],
177
+ timeout: Math.max(1, Math.floor(timeoutSec)) * 1000,
178
+ maxBuffer: 64 * 1024 * 1024,
179
+ env: process.env,
180
+ });
181
+ const errCode = result.error?.code;
182
+ return {
183
+ status: result.status,
184
+ signal: result.signal ? String(result.signal) : null,
185
+ stdout: String(result.stdout || ''),
186
+ stderr: String(result.stderr || ''),
187
+ timeout: errCode === 'ETIMEDOUT' || result.signal === 'SIGTERM',
188
+ };
189
+ }
190
+ function ensureDisplayDbFile() {
191
+ const displayDbPath = (0, config_js_1.getDisplayDbPath)();
192
+ if ((0, fs_1.existsSync)(displayDbPath))
193
+ return;
194
+ (0, config_js_1.ensurePrivateDir)((0, path_1.dirname)(displayDbPath));
195
+ (0, fs_1.writeFileSync)(displayDbPath, JSON.stringify({ version: 1, events: [] }, null, 2) + '\n', {
196
+ encoding: 'utf-8',
197
+ mode: config_js_1.PRIVATE_FILE_MODE,
198
+ });
199
+ }
200
+ function buildContainerPrefixArgs(config, worktreePath, sifPath) {
201
+ const sandboxHome = (0, config_js_1.getSandboxHome)();
202
+ const args = [
203
+ 'exec',
204
+ '--containall',
205
+ '--cleanenv',
206
+ '--home', `${sandboxHome}:/home/sandbox`,
207
+ '--bind', `${worktreePath}:/work`,
208
+ '--pwd', '/work',
209
+ ];
210
+ for (const mount of config.filesystem.extra_paths || []) {
211
+ if (!mount || typeof mount.path !== 'string')
212
+ continue;
213
+ const resolved = mount.path.replace(/^~/, (0, os_1.homedir)());
214
+ const target = `/mnt/${(0, path_1.basename)(resolved)}`;
215
+ const bindSpec = mount.mode === 'ro' ? `${resolved}:${target}:ro` : `${resolved}:${target}`;
216
+ args.push('--bind', bindSpec);
217
+ }
218
+ for (const ds of config.datasets || []) {
219
+ if (!ds || typeof ds.path !== 'string' || typeof ds.name !== 'string')
220
+ continue;
221
+ const resolved = ds.path.replace(/^~/, (0, os_1.homedir)());
222
+ const bindSpec = ds.mode === 'ro'
223
+ ? `${resolved}:/datasets/${ds.name}:ro`
224
+ : `${resolved}:/datasets/${ds.name}`;
225
+ args.push('--bind', bindSpec);
226
+ }
227
+ if ((0, fs_1.existsSync)((0, config_js_1.getConfigPath)())) {
228
+ args.push('--bind', `${(0, config_js_1.getConfigPath)()}:/labgate-config/config.json`);
229
+ }
230
+ args.push('--bind', `${(0, config_js_1.getDisplayDbPath)()}:/labgate-config/display.json`);
231
+ args.push('--env', 'HOME=/home/sandbox');
232
+ args.push('--env', 'ANTHROPIC_API_KEY=');
233
+ args.push(sifPath);
234
+ return args;
235
+ }
236
+ function ensureApptainerRuntime() {
237
+ const runtime = (0, runtime_js_1.checkRuntime)('apptainer');
238
+ if (!runtime.ok || runtime.runtime !== 'apptainer') {
239
+ return {
240
+ ok: false,
241
+ error: runtime.error || 'Apptainer runtime unavailable.',
242
+ };
243
+ }
244
+ return { ok: true };
245
+ }
246
+ function ensureSifImage(config, worktreePath) {
247
+ const imagesDir = (0, config_js_1.getImagesDir)();
248
+ (0, fs_1.mkdirSync)(imagesDir, { recursive: true, mode: 0o700 });
249
+ const sifPath = (0, path_1.join)(imagesDir, (0, container_js_1.imageToSifName)(config.image));
250
+ if ((0, fs_1.existsSync)(sifPath)) {
251
+ return { ok: true, sif_path: sifPath };
252
+ }
253
+ const pulled = runApptainer(['pull', sifPath, `docker://${config.image}`], worktreePath, CLAUDE_PULL_TIMEOUT_SEC);
254
+ if (pulled.status !== 0) {
255
+ const detail = `${pulled.stderr}\n${pulled.stdout}`.trim();
256
+ return {
257
+ ok: false,
258
+ error: detail || `Failed to pull Apptainer image: ${config.image}`,
259
+ };
260
+ }
261
+ return { ok: true, sif_path: sifPath };
262
+ }
263
+ function ensureClaudeBinaryReady(config, worktreePath, sifPath) {
264
+ const script = [
265
+ 'set -euo pipefail',
266
+ 'export HOME=/home/sandbox',
267
+ 'mkdir -p "$HOME/.npm-global"',
268
+ 'npm config set prefix "$HOME/.npm-global" 2>/dev/null || true',
269
+ 'export PATH="$HOME/.npm-global/bin:$PATH"',
270
+ 'if ! command -v claude >/dev/null 2>&1; then npm i -g @anthropic-ai/claude-code; fi',
271
+ ].join('\n');
272
+ const args = [
273
+ ...buildContainerPrefixArgs(config, worktreePath, sifPath),
274
+ 'bash',
275
+ '-lc',
276
+ script,
277
+ ];
278
+ const result = runApptainer(args, worktreePath, CLAUDE_PREP_TIMEOUT_SEC);
279
+ if (result.status !== 0) {
280
+ const detail = `${result.stderr}\n${result.stdout}`.trim();
281
+ return {
282
+ ok: false,
283
+ error: detail || 'Failed to prepare Claude CLI inside Apptainer sandbox.',
284
+ };
285
+ }
286
+ return { ok: true };
287
+ }
288
+ function normalizeTimeout(raw) {
289
+ const parsed = Number(raw);
290
+ if (!Number.isFinite(parsed))
291
+ return CLAUDE_RUN_TIMEOUT_SEC_FALLBACK;
292
+ return Math.max(30, Math.min(4 * 60 * 60, Math.floor(parsed)));
293
+ }
294
+ function runClaudeHeadlessInWorktree(input) {
295
+ const worktreePath = (0, path_1.resolve)(String(input.worktree_path || '').trim());
296
+ const prompt = String(input.prompt || '').trim();
297
+ const resumeSessionId = String(input.resume_session_id || '').trim();
298
+ const timeoutSec = normalizeTimeout(input.timeout_sec);
299
+ if (!worktreePath) {
300
+ return { ok: false, error: 'worktree_path is required' };
301
+ }
302
+ if (!prompt) {
303
+ return { ok: false, error: 'prompt is required' };
304
+ }
305
+ if (!(0, fs_1.existsSync)(worktreePath)) {
306
+ return { ok: false, error: `worktree not found: ${worktreePath}` };
307
+ }
308
+ const runtime = ensureApptainerRuntime();
309
+ if (!runtime.ok)
310
+ return runtime;
311
+ const config = (0, config_js_1.loadConfig)();
312
+ ensureDisplayDbFile();
313
+ const image = ensureSifImage(config, worktreePath);
314
+ if (!image.ok)
315
+ return image;
316
+ const ready = ensureClaudeBinaryReady(config, worktreePath, image.sif_path);
317
+ if (!ready.ok)
318
+ return ready;
319
+ const args = [
320
+ ...buildContainerPrefixArgs(config, worktreePath, image.sif_path),
321
+ '/home/sandbox/.npm-global/bin/claude',
322
+ '-p',
323
+ '--verbose',
324
+ '--output-format',
325
+ 'stream-json',
326
+ '--include-partial-messages',
327
+ ...(resumeSessionId ? ['--resume', resumeSessionId] : []),
328
+ prompt,
329
+ ];
330
+ const result = runApptainer(args, worktreePath, timeoutSec);
331
+ const parsed = parseClaudeStream(result.stdout, resumeSessionId);
332
+ if (result.timeout) {
333
+ return {
334
+ ok: false,
335
+ session_id: parsed.session_id || undefined,
336
+ assistant_text: parsed.assistant_text || undefined,
337
+ stdout: result.stdout,
338
+ stderr: result.stderr,
339
+ error: `Claude headless run timed out after ${timeoutSec}s`,
340
+ };
341
+ }
342
+ if (result.status !== 0) {
343
+ const detail = `${result.stderr}\n${result.stdout}`.trim();
344
+ return {
345
+ ok: false,
346
+ session_id: parsed.session_id || undefined,
347
+ assistant_text: parsed.assistant_text || undefined,
348
+ stdout: result.stdout,
349
+ stderr: result.stderr,
350
+ error: detail || `Claude headless run failed with status ${result.status}`,
351
+ };
352
+ }
353
+ return {
354
+ ok: true,
355
+ session_id: parsed.session_id || undefined,
356
+ assistant_text: parsed.assistant_text || undefined,
357
+ stdout: result.stdout,
358
+ stderr: result.stderr,
359
+ };
360
+ }
361
+ //# sourceMappingURL=explorer-claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explorer-claude.js","sourceRoot":"","sources":["../../src/lib/explorer-claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { ExplorerStore } from './explorer-store.js';
2
+ import type { RunCompareResult } from './explorer-types.js';
3
+ export interface RunCompareInput {
4
+ experiment_id: string;
5
+ run_id: string;
6
+ compare_to?: 'best' | 'parent' | string;
7
+ include_patch?: boolean;
8
+ }
9
+ export declare function runCompare(input: RunCompareInput, store: ExplorerStore): RunCompareResult;
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runCompare = runCompare;
4
+ const child_process_1 = require("child_process");
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
7
+ const config_js_1 = require("./config.js");
8
+ function runGit(repoPath, args) {
9
+ return String((0, child_process_1.execFileSync)('git', ['-C', repoPath, ...args], {
10
+ encoding: 'utf-8',
11
+ stdio: ['ignore', 'pipe', 'pipe'],
12
+ }));
13
+ }
14
+ function parseMetrics(metricsJson) {
15
+ if (!metricsJson)
16
+ return {};
17
+ try {
18
+ const parsed = JSON.parse(metricsJson);
19
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
20
+ return {};
21
+ return parsed;
22
+ }
23
+ catch {
24
+ return {};
25
+ }
26
+ }
27
+ function flattenNumericMetrics(value, prefix = '', out = {}) {
28
+ if (typeof value === 'number' && Number.isFinite(value)) {
29
+ if (prefix)
30
+ out[prefix] = value;
31
+ return out;
32
+ }
33
+ if (!value || typeof value !== 'object' || Array.isArray(value))
34
+ return out;
35
+ for (const [key, child] of Object.entries(value)) {
36
+ const nextPrefix = prefix ? `${prefix}.${key}` : key;
37
+ flattenNumericMetrics(child, nextPrefix, out);
38
+ }
39
+ return out;
40
+ }
41
+ function parseNameStatus(raw) {
42
+ const files = [];
43
+ for (const line of raw.split(/\r?\n/)) {
44
+ if (!line)
45
+ continue;
46
+ const fields = line.split('\t');
47
+ if (fields.length < 2)
48
+ continue;
49
+ const statusRaw = String(fields[0] || 'M').trim();
50
+ const statusLead = statusRaw[0];
51
+ const status = statusRaw.startsWith('R')
52
+ ? 'R'
53
+ : (statusLead === 'A' || statusLead === 'M' || statusLead === 'D' ? statusLead : 'M');
54
+ const path = statusRaw.startsWith('R')
55
+ ? String(fields[2] || fields[1] || '')
56
+ : String(fields[1] || '');
57
+ if (!path)
58
+ continue;
59
+ files.push({ path, status });
60
+ }
61
+ return files;
62
+ }
63
+ function parseShortStat(raw) {
64
+ const trimmed = raw.trim();
65
+ if (!trimmed)
66
+ return {};
67
+ const insMatch = trimmed.match(/(\d+)\s+insertions?\(\+\)/i);
68
+ const delMatch = trimmed.match(/(\d+)\s+deletions?\(-\)/i);
69
+ const insertions = insMatch ? Number(insMatch[1]) : undefined;
70
+ const deletions = delMatch ? Number(delMatch[1]) : undefined;
71
+ return {
72
+ insertions: Number.isFinite(insertions) ? insertions : undefined,
73
+ deletions: Number.isFinite(deletions) ? deletions : undefined,
74
+ };
75
+ }
76
+ function runCompare(input, store) {
77
+ const experimentId = String(input.experiment_id || '').trim();
78
+ const runId = String(input.run_id || '').trim();
79
+ const compareTo = String(input.compare_to || 'best').trim();
80
+ if (!experimentId)
81
+ throw new Error('experiment_id is required');
82
+ if (!runId)
83
+ throw new Error('run_id is required');
84
+ const experiment = store.getExperiment(experimentId);
85
+ if (!experiment)
86
+ throw new Error(`Experiment not found: ${experimentId}`);
87
+ const aRun = store.getRun(runId);
88
+ if (!aRun || aRun.experiment_id !== experimentId) {
89
+ throw new Error(`Run not found in experiment: ${runId}`);
90
+ }
91
+ if (!aRun.commit_sha) {
92
+ throw new Error(`Run ${runId} has no commit_sha`);
93
+ }
94
+ let bRunId = null;
95
+ let bCommitSha = '';
96
+ let bScore;
97
+ let bMetrics;
98
+ if (compareTo === 'best') {
99
+ const best = store.getBestRun(experimentId);
100
+ if (!best || !best.commit_sha) {
101
+ throw new Error(`No best run with commit found for experiment: ${experimentId}`);
102
+ }
103
+ bRunId = best.id;
104
+ bCommitSha = best.commit_sha;
105
+ if (best.score != null)
106
+ bScore = best.score;
107
+ bMetrics = parseMetrics(best.metrics_json);
108
+ }
109
+ else if (compareTo === 'parent') {
110
+ if (aRun.parent_run_id) {
111
+ const parent = store.getRun(aRun.parent_run_id);
112
+ if (!parent || !parent.commit_sha) {
113
+ throw new Error(`Parent run missing or has no commit: ${aRun.parent_run_id}`);
114
+ }
115
+ bRunId = parent.id;
116
+ bCommitSha = parent.commit_sha;
117
+ if (parent.score != null)
118
+ bScore = parent.score;
119
+ bMetrics = parseMetrics(parent.metrics_json);
120
+ }
121
+ else {
122
+ bRunId = null;
123
+ bCommitSha = aRun.parent_commit_sha;
124
+ bScore = undefined;
125
+ bMetrics = {};
126
+ }
127
+ }
128
+ else {
129
+ const other = store.getRun(compareTo);
130
+ if (!other || other.experiment_id !== experimentId || !other.commit_sha) {
131
+ throw new Error(`Comparison run missing or has no commit: ${compareTo}`);
132
+ }
133
+ bRunId = other.id;
134
+ bCommitSha = other.commit_sha;
135
+ if (other.score != null)
136
+ bScore = other.score;
137
+ bMetrics = parseMetrics(other.metrics_json);
138
+ }
139
+ if (!bCommitSha) {
140
+ throw new Error('comparison commit sha is missing');
141
+ }
142
+ const nameStatusRaw = runGit(experiment.repo_path, ['diff', '--name-status', `${bCommitSha}..${aRun.commit_sha}`]);
143
+ const shortStatRaw = runGit(experiment.repo_path, ['diff', '--shortstat', `${bCommitSha}..${aRun.commit_sha}`]);
144
+ const filesChanged = parseNameStatus(nameStatusRaw);
145
+ const short = parseShortStat(shortStatRaw);
146
+ let patchPath;
147
+ if (input.include_patch) {
148
+ const compareDir = (0, config_js_1.getExplorerCompareArtifactDir)(experimentId);
149
+ (0, fs_1.mkdirSync)(compareDir, { recursive: true, mode: 0o700 });
150
+ const safeB = (bRunId || 'base').replace(/[^a-zA-Z0-9._-]+/g, '_');
151
+ const target = (0, path_1.join)(compareDir, `${aRun.id}_vs_${safeB}.patch`);
152
+ const patchText = runGit(experiment.repo_path, ['diff', '--binary', `${bCommitSha}..${aRun.commit_sha}`]);
153
+ (0, fs_1.writeFileSync)(target, patchText, 'utf-8');
154
+ patchPath = target;
155
+ }
156
+ const aMetrics = parseMetrics(aRun.metrics_json);
157
+ const aFlat = flattenNumericMetrics(aMetrics);
158
+ const bFlat = flattenNumericMetrics(bMetrics || {});
159
+ const metricDeltas = {};
160
+ for (const [key, aValue] of Object.entries(aFlat)) {
161
+ const bValue = bFlat[key];
162
+ if (!Number.isFinite(bValue))
163
+ continue;
164
+ metricDeltas[key] = aValue - bValue;
165
+ }
166
+ const result = {
167
+ a_run_id: aRun.id,
168
+ b_run_id: bRunId,
169
+ a_commit_sha: aRun.commit_sha,
170
+ b_commit_sha: bCommitSha,
171
+ diff: {
172
+ files_changed: filesChanged,
173
+ insertions: short.insertions,
174
+ deletions: short.deletions,
175
+ patch_path: patchPath,
176
+ },
177
+ };
178
+ if (aRun.score != null)
179
+ result.a_score = aRun.score;
180
+ if (bScore != null)
181
+ result.b_score = bScore;
182
+ if (aRun.score != null && bScore != null) {
183
+ result.score_delta = aRun.score - bScore;
184
+ }
185
+ result.a_metrics = aMetrics;
186
+ result.b_metrics = bMetrics || {};
187
+ result.metric_deltas = metricDeltas;
188
+ return result;
189
+ }
190
+ //# sourceMappingURL=explorer-compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explorer-compare.js","sourceRoot":"","sources":["../../src/lib/explorer-compare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { RunStatus } from './explorer-types.js';
2
+ export interface EvalRunResult {
3
+ status: Extract<RunStatus, 'eval_ok' | 'failed_eval' | 'timeout' | 'invalid_output'>;
4
+ score?: number;
5
+ metrics?: Record<string, unknown>;
6
+ stdout_path: string;
7
+ stderr_path: string;
8
+ eval_command: string;
9
+ exit_code: number | null;
10
+ signal: string | null;
11
+ started_at: string;
12
+ finished_at: string;
13
+ runtime_ms: number;
14
+ error?: string;
15
+ }
16
+ export interface EvalRunOptions {
17
+ worktree_path: string;
18
+ eval_command: string;
19
+ timeout_sec: number;
20
+ artifact_dir: string;
21
+ env?: NodeJS.ProcessEnv;
22
+ }
23
+ export declare function runEvaluation(opts: EvalRunOptions): EvalRunResult;