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.
Files changed (129) hide show
  1. package/dist/cli.d.ts +6 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +590 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/index.d.ts +30 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +29 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/lib/agents/claude-code.d.ts +12 -0
  10. package/dist/lib/agents/claude-code.d.ts.map +1 -0
  11. package/dist/lib/agents/claude-code.js +231 -0
  12. package/dist/lib/agents/claude-code.js.map +1 -0
  13. package/dist/lib/agents/codex.d.ts +12 -0
  14. package/dist/lib/agents/codex.d.ts.map +1 -0
  15. package/dist/lib/agents/codex.js +267 -0
  16. package/dist/lib/agents/codex.js.map +1 -0
  17. package/dist/lib/agents/cursor.d.ts +10 -0
  18. package/dist/lib/agents/cursor.d.ts.map +1 -0
  19. package/dist/lib/agents/cursor.js +204 -0
  20. package/dist/lib/agents/cursor.js.map +1 -0
  21. package/dist/lib/agents/gemini.d.ts +10 -0
  22. package/dist/lib/agents/gemini.d.ts.map +1 -0
  23. package/dist/lib/agents/gemini.js +207 -0
  24. package/dist/lib/agents/gemini.js.map +1 -0
  25. package/dist/lib/agents/index.d.ts +7 -0
  26. package/dist/lib/agents/index.d.ts.map +1 -0
  27. package/dist/lib/agents/index.js +20 -0
  28. package/dist/lib/agents/index.js.map +1 -0
  29. package/dist/lib/agents/opencode.d.ts +11 -0
  30. package/dist/lib/agents/opencode.d.ts.map +1 -0
  31. package/dist/lib/agents/opencode.js +245 -0
  32. package/dist/lib/agents/opencode.js.map +1 -0
  33. package/dist/lib/agents/registry.d.ts +23 -0
  34. package/dist/lib/agents/registry.d.ts.map +1 -0
  35. package/dist/lib/agents/registry.js +35 -0
  36. package/dist/lib/agents/registry.js.map +1 -0
  37. package/dist/lib/agents/shared.d.ts +83 -0
  38. package/dist/lib/agents/shared.d.ts.map +1 -0
  39. package/dist/lib/agents/shared.js +192 -0
  40. package/dist/lib/agents/shared.js.map +1 -0
  41. package/dist/lib/agents/types.d.ts +73 -0
  42. package/dist/lib/agents/types.d.ts.map +1 -0
  43. package/dist/lib/agents/types.js +5 -0
  44. package/dist/lib/agents/types.js.map +1 -0
  45. package/dist/lib/classifier.d.ts +89 -0
  46. package/dist/lib/classifier.d.ts.map +1 -0
  47. package/dist/lib/classifier.js +285 -0
  48. package/dist/lib/classifier.js.map +1 -0
  49. package/dist/lib/config.d.ts +37 -0
  50. package/dist/lib/config.d.ts.map +1 -0
  51. package/dist/lib/config.js +187 -0
  52. package/dist/lib/config.js.map +1 -0
  53. package/dist/lib/dashboard.d.ts +65 -0
  54. package/dist/lib/dashboard.d.ts.map +1 -0
  55. package/dist/lib/dashboard.js +237 -0
  56. package/dist/lib/dashboard.js.map +1 -0
  57. package/dist/lib/docker-sandbox.d.ts +92 -0
  58. package/dist/lib/docker-sandbox.d.ts.map +1 -0
  59. package/dist/lib/docker-sandbox.js +375 -0
  60. package/dist/lib/docker-sandbox.js.map +1 -0
  61. package/dist/lib/fingerprint.d.ts +15 -0
  62. package/dist/lib/fingerprint.d.ts.map +1 -0
  63. package/dist/lib/fingerprint.js +59 -0
  64. package/dist/lib/fingerprint.js.map +1 -0
  65. package/dist/lib/fixture.d.ts +55 -0
  66. package/dist/lib/fixture.d.ts.map +1 -0
  67. package/dist/lib/fixture.js +215 -0
  68. package/dist/lib/fixture.js.map +1 -0
  69. package/dist/lib/housekeeping.d.ts +26 -0
  70. package/dist/lib/housekeeping.d.ts.map +1 -0
  71. package/dist/lib/housekeeping.js +170 -0
  72. package/dist/lib/housekeeping.js.map +1 -0
  73. package/dist/lib/init.d.ts +21 -0
  74. package/dist/lib/init.d.ts.map +1 -0
  75. package/dist/lib/init.js +275 -0
  76. package/dist/lib/init.js.map +1 -0
  77. package/dist/lib/o11y/index.d.ts +13 -0
  78. package/dist/lib/o11y/index.d.ts.map +1 -0
  79. package/dist/lib/o11y/index.js +13 -0
  80. package/dist/lib/o11y/index.js.map +1 -0
  81. package/dist/lib/o11y/parsers/claude-code.d.ts +18 -0
  82. package/dist/lib/o11y/parsers/claude-code.d.ts.map +1 -0
  83. package/dist/lib/o11y/parsers/claude-code.js +343 -0
  84. package/dist/lib/o11y/parsers/claude-code.js.map +1 -0
  85. package/dist/lib/o11y/parsers/codex.d.ts +17 -0
  86. package/dist/lib/o11y/parsers/codex.d.ts.map +1 -0
  87. package/dist/lib/o11y/parsers/codex.js +364 -0
  88. package/dist/lib/o11y/parsers/codex.js.map +1 -0
  89. package/dist/lib/o11y/parsers/cursor.d.ts +21 -0
  90. package/dist/lib/o11y/parsers/cursor.d.ts.map +1 -0
  91. package/dist/lib/o11y/parsers/cursor.js +226 -0
  92. package/dist/lib/o11y/parsers/cursor.js.map +1 -0
  93. package/dist/lib/o11y/parsers/gemini.d.ts +21 -0
  94. package/dist/lib/o11y/parsers/gemini.d.ts.map +1 -0
  95. package/dist/lib/o11y/parsers/gemini.js +241 -0
  96. package/dist/lib/o11y/parsers/gemini.js.map +1 -0
  97. package/dist/lib/o11y/parsers/index.d.ts +55 -0
  98. package/dist/lib/o11y/parsers/index.d.ts.map +1 -0
  99. package/dist/lib/o11y/parsers/index.js +284 -0
  100. package/dist/lib/o11y/parsers/index.js.map +1 -0
  101. package/dist/lib/o11y/parsers/opencode.d.ts +17 -0
  102. package/dist/lib/o11y/parsers/opencode.d.ts.map +1 -0
  103. package/dist/lib/o11y/parsers/opencode.js +320 -0
  104. package/dist/lib/o11y/parsers/opencode.js.map +1 -0
  105. package/dist/lib/o11y/types.d.ts +113 -0
  106. package/dist/lib/o11y/types.d.ts.map +1 -0
  107. package/dist/lib/o11y/types.js +6 -0
  108. package/dist/lib/o11y/types.js.map +1 -0
  109. package/dist/lib/results.d.ts +91 -0
  110. package/dist/lib/results.d.ts.map +1 -0
  111. package/dist/lib/results.js +361 -0
  112. package/dist/lib/results.js.map +1 -0
  113. package/dist/lib/runner.d.ts +71 -0
  114. package/dist/lib/runner.d.ts.map +1 -0
  115. package/dist/lib/runner.js +267 -0
  116. package/dist/lib/runner.js.map +1 -0
  117. package/dist/lib/sandbox.d.ts +173 -0
  118. package/dist/lib/sandbox.d.ts.map +1 -0
  119. package/dist/lib/sandbox.js +337 -0
  120. package/dist/lib/sandbox.js.map +1 -0
  121. package/dist/lib/types.d.ts +258 -0
  122. package/dist/lib/types.d.ts.map +1 -0
  123. package/dist/lib/types.js +15 -0
  124. package/dist/lib/types.js.map +1 -0
  125. package/dist/test-setup.d.ts +2 -0
  126. package/dist/test-setup.d.ts.map +1 -0
  127. package/dist/test-setup.js +6 -0
  128. package/dist/test-setup.js.map +1 -0
  129. package/package.json +72 -0
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Experiment configuration validation and defaults.
3
+ */
4
+ import { z } from 'zod';
5
+ import { minimatch } from 'minimatch';
6
+ import { getAgent } from './agents/index.js';
7
+ /**
8
+ * Default configuration values.
9
+ */
10
+ export const CONFIG_DEFAULTS = {
11
+ model: 'opus',
12
+ evals: '*',
13
+ runs: 1,
14
+ earlyExit: true,
15
+ scripts: [],
16
+ timeout: 600, // 10 minutes
17
+ sandbox: 'auto',
18
+ copyFiles: 'none',
19
+ };
20
+ /**
21
+ * Zod schema for validating experiment configuration.
22
+ */
23
+ const experimentConfigSchema = z.object({
24
+ agent: z.enum([
25
+ 'vercel-ai-gateway/claude-code',
26
+ 'claude-code',
27
+ 'vercel-ai-gateway/codex',
28
+ 'codex',
29
+ 'opencode',
30
+ 'gemini',
31
+ 'cursor',
32
+ ]),
33
+ model: z.union([z.string(), z.array(z.string())]).optional(),
34
+ evals: z
35
+ .union([z.string(), z.array(z.string()), z.function().args(z.string()).returns(z.boolean())])
36
+ .optional(),
37
+ runs: z.number().int().positive().optional(),
38
+ earlyExit: z.boolean().optional(),
39
+ scripts: z.array(z.string()).optional(),
40
+ timeout: z.number().positive().optional(),
41
+ setup: z.function().optional(),
42
+ sandbox: z.enum(['vercel', 'docker', 'auto']).optional(),
43
+ editPrompt: z.function().args(z.string()).returns(z.string()).optional(),
44
+ copyFiles: z.enum(['none', 'changed', 'all']).optional(),
45
+ });
46
+ /**
47
+ * Validates an experiment configuration object.
48
+ * Throws a descriptive error if validation fails.
49
+ */
50
+ export function validateConfig(config) {
51
+ const result = experimentConfigSchema.safeParse(config);
52
+ if (!result.success) {
53
+ const errors = result.error.issues
54
+ .map((issue) => ` - ${issue.path.join('.')}: ${issue.message}`)
55
+ .join('\n');
56
+ throw new Error(`Invalid experiment configuration:\n${errors}`);
57
+ }
58
+ return result.data;
59
+ }
60
+ /**
61
+ * Resolves an experiment configuration by applying defaults.
62
+ */
63
+ export function resolveConfig(config) {
64
+ // Validate agent exists
65
+ const agent = getAgent(config.agent);
66
+ // Get the default model based on the agent type
67
+ const defaultModel = config.model ?? agent.getDefaultModel();
68
+ return {
69
+ agent: config.agent,
70
+ model: defaultModel,
71
+ evals: config.evals ?? '*',
72
+ runs: config.runs ?? CONFIG_DEFAULTS.runs,
73
+ earlyExit: config.earlyExit ?? CONFIG_DEFAULTS.earlyExit,
74
+ scripts: config.scripts ?? CONFIG_DEFAULTS.scripts,
75
+ timeout: config.timeout ?? CONFIG_DEFAULTS.timeout,
76
+ setup: config.setup,
77
+ sandbox: config.sandbox ?? CONFIG_DEFAULTS.sandbox,
78
+ editPrompt: config.editPrompt,
79
+ copyFiles: config.copyFiles ?? CONFIG_DEFAULTS.copyFiles,
80
+ };
81
+ }
82
+ /**
83
+ * Loads an experiment configuration from a file path.
84
+ * Supports TypeScript and JavaScript files with default exports.
85
+ */
86
+ export async function loadConfig(configPath) {
87
+ try {
88
+ let rawConfig;
89
+ // Use jiti for TypeScript files
90
+ if (configPath.endsWith('.ts')) {
91
+ const { createJiti } = await import('jiti');
92
+ const jiti = createJiti(import.meta.url, {
93
+ interopDefault: true,
94
+ moduleCache: false,
95
+ });
96
+ rawConfig = await jiti.import(configPath);
97
+ }
98
+ else {
99
+ // Dynamic import for JavaScript files
100
+ const module = await import(configPath);
101
+ rawConfig = module.default;
102
+ }
103
+ if (!rawConfig) {
104
+ throw new Error(`Config file must have a default export`);
105
+ }
106
+ const config = validateConfig(rawConfig);
107
+ return resolveConfig(config);
108
+ }
109
+ catch (error) {
110
+ if (error instanceof Error) {
111
+ throw new Error(`Failed to load config from ${configPath}: ${error.message}`);
112
+ }
113
+ throw error;
114
+ }
115
+ }
116
+ /**
117
+ * Check if a name matches a glob-style pattern.
118
+ * Supports:
119
+ * - "*" matches everything
120
+ * - "vercel-cli/*" matches all under vercel-cli/
121
+ * - "* /deploy" matches any deploy in any folder
122
+ * - "vercel-cli/deploy" exact match
123
+ *
124
+ * Uses minimatch for robust glob matching.
125
+ */
126
+ function matchesPattern(name, pattern) {
127
+ return minimatch(name, pattern);
128
+ }
129
+ /**
130
+ * Resolves the evals filter to a list of eval names.
131
+ * Supports glob patterns like "vercel-cli/*" for nested directories.
132
+ */
133
+ export function resolveEvalNames(filter, availableEvals) {
134
+ // Single eval name or pattern
135
+ if (typeof filter === 'string') {
136
+ if (filter === '*') {
137
+ return availableEvals;
138
+ }
139
+ // Check if it's a glob pattern
140
+ if (filter.includes('*')) {
141
+ const matched = availableEvals.filter((name) => matchesPattern(name, filter));
142
+ if (matched.length === 0) {
143
+ throw new Error(`No evals matched pattern "${filter}". Available evals: ${availableEvals.join(', ')}`);
144
+ }
145
+ return matched;
146
+ }
147
+ // Exact match
148
+ if (!availableEvals.includes(filter)) {
149
+ throw new Error(`Eval "${filter}" not found. Available evals: ${availableEvals.join(', ')}`);
150
+ }
151
+ return [filter];
152
+ }
153
+ // Array of eval names or patterns
154
+ if (Array.isArray(filter)) {
155
+ const result = [];
156
+ const seen = new Set();
157
+ for (const item of filter) {
158
+ // Handle glob patterns in arrays
159
+ if (item.includes('*')) {
160
+ const matched = availableEvals.filter((name) => matchesPattern(name, item));
161
+ if (matched.length === 0) {
162
+ throw new Error(`No evals matched pattern "${item}". Available evals: ${availableEvals.join(', ')}`);
163
+ }
164
+ for (const name of matched) {
165
+ if (!seen.has(name)) {
166
+ result.push(name);
167
+ seen.add(name);
168
+ }
169
+ }
170
+ }
171
+ else {
172
+ // Exact match
173
+ if (!availableEvals.includes(item)) {
174
+ throw new Error(`Eval "${item}" not found. Available evals: ${availableEvals.join(', ')}`);
175
+ }
176
+ if (!seen.has(item)) {
177
+ result.push(item);
178
+ seen.add(item);
179
+ }
180
+ }
181
+ }
182
+ return result;
183
+ }
184
+ // Filter function
185
+ return availableEvals.filter(filter);
186
+ }
187
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Live terminal dashboard for parallel experiment runs.
3
+ * Uses log-update for in-place terminal rendering.
4
+ * Falls back to console.log for non-TTY environments.
5
+ */
6
+ import type { ProgressEvent, ExperimentResults, Classification } from './types.js';
7
+ /**
8
+ * Tracked state for a single experiment in the dashboard.
9
+ */
10
+ interface ExperimentState {
11
+ name: string;
12
+ agent: string;
13
+ model: string;
14
+ totalEvals: number;
15
+ completedEvals: number;
16
+ passed: number;
17
+ failed: number;
18
+ runStartTime: number | null;
19
+ phase: 'waiting' | 'running' | 'classifying' | 'done';
20
+ /** Currently in-flight eval names */
21
+ activeEvals: Set<string>;
22
+ /** Recently completed eval results (kept for display, max 3) */
23
+ recentResults: Array<{
24
+ name: string;
25
+ status: 'passed' | 'failed';
26
+ }>;
27
+ /** Classification progress counters */
28
+ classifyingDone: number;
29
+ classifyingTotal: number;
30
+ }
31
+ /**
32
+ * Live terminal dashboard that renders experiment progress in-place.
33
+ */
34
+ export declare class Dashboard {
35
+ private experiments;
36
+ private intervalId;
37
+ private experimentOrder;
38
+ private tick;
39
+ addExperiment(name: string, meta: {
40
+ agent: string;
41
+ model: string;
42
+ totalEvals: number;
43
+ }): void;
44
+ handleEvent(experimentName: string, event: ProgressEvent): void;
45
+ setPhase(experimentName: string, phase: 'classifying' | 'done'): void;
46
+ setClassifyingProgress(experimentName: string, done: number, total: number): void;
47
+ completeExperiment(experimentName: string, results: ExperimentResults, classifications: Map<string, Classification>): void;
48
+ start(): void;
49
+ stop(): void;
50
+ private render;
51
+ }
52
+ /**
53
+ * Render a permanent completed-experiment block that scrolls above the dashboard.
54
+ */
55
+ export declare function renderCompletedBlock(experimentName: string, _state: ExperimentState, results: ExperimentResults, classifications: Map<string, Classification>): string;
56
+ /**
57
+ * Console-based progress handler for non-TTY / single experiment mode.
58
+ */
59
+ export declare function createConsoleProgressHandler(context: {
60
+ experimentName: string;
61
+ model: string;
62
+ agent: string;
63
+ }): (event: ProgressEvent) => void;
64
+ export {};
65
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/lib/dashboard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,cAAc,EACf,MAAM,YAAY,CAAC;AASpB;;GAEG;AACH,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC;IACtD,qCAAqC;IACrC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,gEAAgE;IAChE,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAA;KAAE,CAAC,CAAC;IACpE,uCAAuC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,UAAU,CAA6C;IAC/D,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,IAAI,CAAK;IAEjB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAoBtF,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa;IA2BxD,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM;IAO9D,sBAAsB,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAQ1E,kBAAkB,CAChB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,iBAAiB,EAC1B,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IAY9C,KAAK;IAOL,IAAI;IAQJ,OAAO,CAAC,MAAM;CAiCf;AA0DD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,iBAAiB,EAC1B,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAC3C,MAAM,CA2CR;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACpD,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CA+BjC"}
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Live terminal dashboard for parallel experiment runs.
3
+ * Uses log-update for in-place terminal rendering.
4
+ * Falls back to console.log for non-TTY environments.
5
+ */
6
+ import logUpdate from 'log-update';
7
+ import chalk from 'chalk';
8
+ import { formatRunResult, createProgressDisplay, formatResultsTable, } from './results.js';
9
+ const SPINNER = ['\u280b', '\u2819', '\u2839', '\u2838', '\u283c', '\u2834', '\u2826', '\u2827', '\u2807', '\u280f'];
10
+ /**
11
+ * Live terminal dashboard that renders experiment progress in-place.
12
+ */
13
+ export class Dashboard {
14
+ experiments = new Map();
15
+ intervalId;
16
+ experimentOrder = [];
17
+ tick = 0;
18
+ addExperiment(name, meta) {
19
+ const state = {
20
+ name,
21
+ agent: meta.agent,
22
+ model: meta.model,
23
+ totalEvals: meta.totalEvals,
24
+ completedEvals: 0,
25
+ passed: 0,
26
+ failed: 0,
27
+ runStartTime: null,
28
+ phase: 'waiting',
29
+ activeEvals: new Set(),
30
+ recentResults: [],
31
+ classifyingDone: 0,
32
+ classifyingTotal: 0,
33
+ };
34
+ this.experiments.set(name, state);
35
+ this.experimentOrder.push(name);
36
+ }
37
+ handleEvent(experimentName, event) {
38
+ const state = this.experiments.get(experimentName);
39
+ if (!state)
40
+ return;
41
+ switch (event.type) {
42
+ case 'experiment:start':
43
+ state.totalEvals = event.totalAttempts;
44
+ state.phase = 'running';
45
+ state.runStartTime = Date.now();
46
+ break;
47
+ case 'eval:start':
48
+ state.activeEvals.add(event.evalName);
49
+ break;
50
+ case 'eval:complete':
51
+ state.activeEvals.delete(event.evalName);
52
+ state.completedEvals++;
53
+ if (event.result.status === 'passed') {
54
+ state.passed++;
55
+ }
56
+ else {
57
+ state.failed++;
58
+ }
59
+ state.recentResults.push({ name: event.evalName, status: event.result.status });
60
+ if (state.recentResults.length > 3)
61
+ state.recentResults.shift();
62
+ break;
63
+ }
64
+ }
65
+ setPhase(experimentName, phase) {
66
+ const state = this.experiments.get(experimentName);
67
+ if (state) {
68
+ state.phase = phase;
69
+ }
70
+ }
71
+ setClassifyingProgress(experimentName, done, total) {
72
+ const state = this.experiments.get(experimentName);
73
+ if (state) {
74
+ state.classifyingDone = done;
75
+ state.classifyingTotal = total;
76
+ }
77
+ }
78
+ completeExperiment(experimentName, results, classifications) {
79
+ const state = this.experiments.get(experimentName);
80
+ if (!state)
81
+ return;
82
+ state.phase = 'done';
83
+ logUpdate.clear();
84
+ console.log(renderCompletedBlock(experimentName, state, results, classifications));
85
+ this.render();
86
+ }
87
+ start() {
88
+ this.intervalId = setInterval(() => {
89
+ this.tick++;
90
+ this.render();
91
+ }, 100);
92
+ }
93
+ stop() {
94
+ if (this.intervalId) {
95
+ clearInterval(this.intervalId);
96
+ this.intervalId = undefined;
97
+ }
98
+ logUpdate.clear();
99
+ }
100
+ render() {
101
+ const active = this.experimentOrder.filter((name) => this.experiments.get(name).phase !== 'done');
102
+ if (active.length === 0) {
103
+ logUpdate.clear();
104
+ return;
105
+ }
106
+ const totalExperiments = this.experimentOrder.length;
107
+ const completedExperiments = totalExperiments - active.length;
108
+ const maxNameLen = Math.max(...active.map((n) => n.length));
109
+ const nameWidth = Math.max(maxNameLen + 2, 20);
110
+ const spinner = SPINNER[this.tick % SPINNER.length];
111
+ const lines = [];
112
+ lines.push('');
113
+ lines.push(chalk.bold(` ${spinner} ${completedExperiments}/${totalExperiments} experiments complete`));
114
+ lines.push('');
115
+ for (const name of active) {
116
+ const state = this.experiments.get(name);
117
+ lines.push(renderExperimentLine(state, nameWidth));
118
+ }
119
+ lines.push('');
120
+ logUpdate(lines.join('\n'));
121
+ }
122
+ }
123
+ /**
124
+ * Render a single experiment's progress bar line.
125
+ */
126
+ function renderExperimentLine(state, nameWidth) {
127
+ const nameCol = state.name.padEnd(nameWidth);
128
+ const elapsed = state.runStartTime ? Math.round((Date.now() - state.runStartTime) / 1000) : 0;
129
+ if (state.phase === 'waiting') {
130
+ const bar = renderBar(0, 1);
131
+ return ` ${chalk.gray(nameCol)} ${bar} ${chalk.gray('waiting\u2026')}`;
132
+ }
133
+ if (state.phase === 'classifying') {
134
+ const bar = renderBar(state.totalEvals, state.totalEvals);
135
+ const stats = renderStats(state);
136
+ const classifyLabel = state.classifyingTotal > 0
137
+ ? `classifying ${state.classifyingDone}/${state.classifyingTotal}\u2026`
138
+ : 'classifying\u2026';
139
+ return ` ${chalk.cyan(nameCol)} ${bar} ${stats} ${chalk.cyan('\u00b7')} ${chalk.cyan(classifyLabel)}`;
140
+ }
141
+ const bar = renderBar(state.completedEvals, state.totalEvals);
142
+ const stats = renderStats(state);
143
+ const time = chalk.gray(formatElapsed(elapsed));
144
+ return ` ${chalk.white(nameCol)} ${bar} ${stats} ${chalk.gray('\u00b7')} ${time}`;
145
+ }
146
+ function renderStats(state) {
147
+ const parts = [];
148
+ parts.push(chalk.white(`${state.completedEvals}/${state.totalEvals}`));
149
+ if (state.passed > 0)
150
+ parts.push(chalk.green(`${state.passed}\u2713`));
151
+ if (state.failed > 0)
152
+ parts.push(chalk.red(`${state.failed}\u2717`));
153
+ return parts.join(' ');
154
+ }
155
+ /**
156
+ * Format elapsed seconds as "Xm Ys" for >= 60s, otherwise "Xs".
157
+ */
158
+ function formatElapsed(seconds) {
159
+ if (seconds < 60)
160
+ return `${seconds}s`;
161
+ const m = Math.floor(seconds / 60);
162
+ const s = seconds % 60;
163
+ return `${m}m${s > 0 ? ` ${s}s` : ''}`;
164
+ }
165
+ /**
166
+ * Render a progress bar.
167
+ */
168
+ function renderBar(completed, total) {
169
+ const width = 20;
170
+ const filled = total > 0 ? Math.min(width, Math.round((completed / total) * width)) : 0;
171
+ const empty = width - filled;
172
+ return chalk.green('\u2501'.repeat(filled)) + chalk.gray('\u2500'.repeat(empty));
173
+ }
174
+ /**
175
+ * Render a permanent completed-experiment block that scrolls above the dashboard.
176
+ */
177
+ export function renderCompletedBlock(experimentName, _state, results, classifications) {
178
+ const lines = [];
179
+ const width = Math.min(process.stdout.columns || 80, 80);
180
+ const separator = '\u2500'.repeat(width);
181
+ lines.push(chalk.gray(separator));
182
+ const totalEvals = results.evals.length;
183
+ const passedEvals = results.evals.filter((e) => e.passedRuns > 0).length;
184
+ const elapsed = Math.round((new Date(results.completedAt).getTime() - new Date(results.startedAt).getTime()) / 1000);
185
+ const passRate = totalEvals > 0 ? Math.round((passedEvals / totalEvals) * 100) : 0;
186
+ const passColor = passRate === 100 ? chalk.green : passRate >= 50 ? chalk.yellow : chalk.red;
187
+ lines.push(` ${chalk.bold(experimentName)} ${passColor(`${passedEvals}/${totalEvals} passed (${passRate}%)`)} ${chalk.gray(formatElapsed(elapsed))}`);
188
+ const passed = results.evals.filter((e) => e.passedRuns > 0);
189
+ const failed = results.evals.filter((e) => e.passedRuns === 0);
190
+ if (passed.length > 0) {
191
+ lines.push(` ${passed.map((e) => chalk.green(`\u2713 ${e.name}`)).join(' ')}`);
192
+ }
193
+ if (failed.length > 0) {
194
+ lines.push(` ${failed.map((e) => chalk.red(`\u2717 ${e.name}`)).join(' ')}`);
195
+ }
196
+ if (failed.length > 0 && classifications.size > 0) {
197
+ for (const evalSummary of failed) {
198
+ const c = classifications.get(evalSummary.name);
199
+ if (c) {
200
+ const suffix = c.failureType !== 'model'
201
+ ? chalk.gray(c.acknowledged ? ' (kept)' : ' (removed)')
202
+ : '';
203
+ lines.push(chalk.gray(` ${evalSummary.name}: ${c.failureType} \u2014 ${c.failureReason}${suffix}`));
204
+ }
205
+ }
206
+ }
207
+ lines.push(chalk.gray(separator));
208
+ return lines.join('\n');
209
+ }
210
+ /**
211
+ * Console-based progress handler for non-TTY / single experiment mode.
212
+ */
213
+ export function createConsoleProgressHandler(context) {
214
+ return (event) => {
215
+ switch (event.type) {
216
+ case 'experiment:start':
217
+ console.log(`Starting ${event.totalAttempts} eval attempts concurrently (${event.totalEvals} evals \u00d7 ${event.totalRuns} runs)`);
218
+ break;
219
+ case 'eval:start':
220
+ console.log(createProgressDisplay(event.evalName, event.runNumber, event.totalRuns, context));
221
+ break;
222
+ case 'eval:complete':
223
+ console.log(formatRunResult(event.evalName, event.runNumber, event.totalRuns, event.result, context));
224
+ break;
225
+ case 'experiment:earlyExit':
226
+ console.log(`Early exit: ${event.evalName} passed on run ${event.runNumber}, aborting remaining attempts`);
227
+ break;
228
+ case 'experiment:saved':
229
+ console.log(`\nResults saved to: ${event.outputDir}`);
230
+ break;
231
+ case 'experiment:summary':
232
+ console.log(formatResultsTable(event.results));
233
+ break;
234
+ }
235
+ };
236
+ }
237
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/lib/dashboard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAwBrH;;GAEG;AACH,MAAM,OAAO,SAAS;IACZ,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IACjD,UAAU,CAA6C;IACvD,eAAe,GAAa,EAAE,CAAC;IAC/B,IAAI,GAAG,CAAC,CAAC;IAEjB,aAAa,CAAC,IAAY,EAAE,IAA0D;QACpF,MAAM,KAAK,GAAoB;YAC7B,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;YACT,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,IAAI,GAAG,EAAE;YACtB,aAAa,EAAE,EAAE;YACjB,eAAe,EAAE,CAAC;YAClB,gBAAgB,EAAE,CAAC;SACpB,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,WAAW,CAAC,cAAsB,EAAE,KAAoB;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,kBAAkB;gBACrB,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC;gBACvC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;gBACxB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM;YACR,KAAK,YAAY;gBACf,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,eAAe;gBAClB,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACzC,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACrC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,CAAC;gBACD,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBAChF,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;oBAAE,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;gBAChE,MAAM;QACV,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,cAAsB,EAAE,KAA6B;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,sBAAsB,CAAC,cAAsB,EAAE,IAAY,EAAE,KAAa;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;YAC7B,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;QACjC,CAAC;IACH,CAAC;IAED,kBAAkB,CAChB,cAAsB,EACtB,OAA0B,EAC1B,eAA4C;QAE5C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;QAErB,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9B,CAAC;QACD,SAAS,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAEO,MAAM;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CACxC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,KAAK,KAAK,MAAM,CACvD,CAAC;QAEF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;QACrD,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC;QAE9D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAEpD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,oBAAoB,IAAI,gBAAgB,uBAAuB,CAAC,CAC3F,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9B,CAAC;CACF;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,KAAsB,EAAE,SAAiB;IACrE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9F,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;IAC1E,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,aAAa,GAAG,KAAK,CAAC,gBAAgB,GAAG,CAAC;YAC9C,CAAC,CAAC,eAAe,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,gBAAgB,QAAQ;YACxE,CAAC,CAAC,mBAAmB,CAAC;QACxB,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;IACzG,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAEhD,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;AACrF,CAAC;AAED,SAAS,WAAW,CAAC,KAAsB;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACvE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC;IACvE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC;IACrE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,OAAe;IACpC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACvC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC;IACvB,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,SAAiB,EAAE,KAAa;IACjD,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC7B,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,cAAsB,EACtB,MAAuB,EACvB,OAA0B,EAC1B,eAA4C;IAE5C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEzC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAElC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;IACxC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CACxB,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CACzF,CAAC;IACF,MAAM,QAAQ,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;IAE7F,KAAK,CAAC,IAAI,CACR,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,SAAS,CAAC,GAAG,WAAW,IAAI,UAAU,YAAY,QAAQ,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,CAC5I,CAAC;IAEF,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC;IAE/D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAClD,KAAK,MAAM,WAAW,IAAI,MAAM,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,EAAE,CAAC;gBACN,MAAM,MAAM,GAAG,CAAC,CAAC,WAAW,KAAK,OAAO;oBACtC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;oBACvD,CAAC,CAAC,EAAE,CAAC;gBACP,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,WAAW,CAAC,CAAC,aAAa,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;YACxG,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,OAI5C;IACC,OAAO,CAAC,KAAoB,EAAE,EAAE;QAC9B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,kBAAkB;gBACrB,OAAO,CAAC,GAAG,CACT,YAAY,KAAK,CAAC,aAAa,gCAAgC,KAAK,CAAC,UAAU,iBAAiB,KAAK,CAAC,SAAS,QAAQ,CACxH,CAAC;gBACF,MAAM;YACR,KAAK,YAAY;gBACf,OAAO,CAAC,GAAG,CACT,qBAAqB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CACjF,CAAC;gBACF,MAAM;YACR,KAAK,eAAe;gBAClB,OAAO,CAAC,GAAG,CACT,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CACzF,CAAC;gBACF,MAAM;YACR,KAAK,sBAAsB;gBACzB,OAAO,CAAC,GAAG,CACT,eAAe,KAAK,CAAC,QAAQ,kBAAkB,KAAK,CAAC,SAAS,+BAA+B,CAC9F,CAAC;gBACF,MAAM;YACR,KAAK,kBAAkB;gBACrB,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;gBACtD,MAAM;YACR,KAAK,oBAAoB;gBACvB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC/C,MAAM;QACV,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Docker-based sandbox implementation for isolated eval execution.
3
+ * Uses dockerode to manage Docker containers as sandboxes.
4
+ */
5
+ import Docker from 'dockerode';
6
+ import type { Sandbox } from './types.js';
7
+ import type { CommandResult, SandboxFile } from './sandbox.js';
8
+ export declare function resolveDockerOptions(): Docker.DockerOptions;
9
+ export interface DockerSandboxOptions {
10
+ /** Timeout in milliseconds */
11
+ timeout?: number;
12
+ /** Runtime environment */
13
+ runtime?: 'node20' | 'node24';
14
+ }
15
+ /**
16
+ * Docker-based sandbox manager.
17
+ * Creates isolated containers for running evals.
18
+ */
19
+ export declare class DockerSandboxManager implements Sandbox {
20
+ private docker;
21
+ private container;
22
+ private _containerId;
23
+ private timeout;
24
+ private runtime;
25
+ constructor(options?: DockerSandboxOptions);
26
+ /**
27
+ * Create and start a new Docker sandbox.
28
+ */
29
+ static create(options?: DockerSandboxOptions): Promise<DockerSandboxManager>;
30
+ /**
31
+ * Initialize the sandbox by pulling image and creating container.
32
+ */
33
+ private initialize;
34
+ /**
35
+ * Ensure the Docker image is available locally, pulling if needed.
36
+ */
37
+ private ensureImage;
38
+ /**
39
+ * Pull a Docker image with progress output.
40
+ */
41
+ private pullImage;
42
+ /**
43
+ * Get the container ID.
44
+ */
45
+ get sandboxId(): string;
46
+ /**
47
+ * Run a command in the container as the sandbox (non-root) user.
48
+ */
49
+ runCommand(command: string, args?: string[], options?: {
50
+ env?: Record<string, string>;
51
+ }): Promise<CommandResult>;
52
+ /**
53
+ * Run a command in the container as root.
54
+ * Used internally for setup tasks.
55
+ */
56
+ private runCommandAsRoot;
57
+ /**
58
+ * Execute a command in the container.
59
+ */
60
+ private execCommand;
61
+ /**
62
+ * Run a shell command (through bash).
63
+ */
64
+ runShell(command: string, env?: Record<string, string>): Promise<CommandResult>;
65
+ /**
66
+ * Read a file from the container.
67
+ */
68
+ readFile(path: string): Promise<string>;
69
+ /**
70
+ * Check if a file exists in the container.
71
+ */
72
+ fileExists(path: string): Promise<boolean>;
73
+ /**
74
+ * Write files to the container.
75
+ */
76
+ writeFiles(files: Record<string, string>): Promise<void>;
77
+ /**
78
+ * Upload files to the container using tar archive.
79
+ */
80
+ uploadFiles(files: SandboxFile[]): Promise<void>;
81
+ uploadFilesToPath(containerDir: string, files: SandboxFile[]): Promise<void>;
82
+ ensureUserOwnership(containerDir: string): Promise<void>;
83
+ /**
84
+ * Get the working directory.
85
+ */
86
+ getWorkingDirectory(): string;
87
+ /**
88
+ * Stop and clean up the container.
89
+ */
90
+ stop(): Promise<void>;
91
+ }
92
+ //# sourceMappingURL=docker-sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-sandbox.d.ts","sourceRoot":"","sources":["../../src/lib/docker-sandbox.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,WAAW,CAAC;AAG/B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAmD/D,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,aAAa,CAS3D;AAED,MAAM,WAAW,oBAAoB;IACnC,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC/B;AAED;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,OAAO;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,oBAAyB;IAM9C;;OAEG;WACU,MAAM,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAMtF;;OAEG;YACW,UAAU;IAyCxB;;OAEG;YACW,WAAW;IAazB;;OAEG;YACW,SAAS;IAyBvB;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACG,UAAU,CACd,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAO,GAC7C,OAAO,CAAC,aAAa,CAAC;IAazB;;;OAGG;YACW,gBAAgB;IAW9B;;OAEG;YACW,WAAW;IAiGzB;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAIrF;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ7C;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKhD;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9D;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BhD,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB5E,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAU5B"}