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,267 @@
1
+ /**
2
+ * Experiment runner - orchestrates running evals against agent.
3
+ * Concurrency is controlled via an optional ConcurrencyLimiter shared across experiments.
4
+ * 429 rate-limit errors are retried with exponential backoff.
5
+ * With earlyExit, in-flight attempts are aborted when one passes.
6
+ */
7
+ import { getAgent } from './agents/index.js';
8
+ import { agentResultToEvalRunData, createEvalSummary, createExperimentResults, saveResults, } from './results.js';
9
+ /**
10
+ * Rate-limits how many operations can START within a time window.
11
+ * Once started, operations run freely with no concurrency limit.
12
+ * Create one instance and share it across experiments to control global start rate.
13
+ */
14
+ export class StartRateLimiter {
15
+ startsPerWindow;
16
+ windowMs;
17
+ queue = [];
18
+ started = 0;
19
+ timer = null;
20
+ constructor(startsPerWindow, windowMs) {
21
+ this.startsPerWindow = startsPerWindow;
22
+ this.windowMs = windowMs;
23
+ }
24
+ /**
25
+ * Wait for permission to start, then return immediately.
26
+ * The operation runs freely after this resolves.
27
+ */
28
+ async waitToStart() {
29
+ if (this.started < this.startsPerWindow) {
30
+ this.started++;
31
+ this.ensureTimer();
32
+ return;
33
+ }
34
+ return new Promise((resolve) => {
35
+ this.queue.push(resolve);
36
+ });
37
+ }
38
+ ensureTimer() {
39
+ if (this.timer)
40
+ return;
41
+ this.timer = setInterval(() => {
42
+ this.started = 0;
43
+ // Drain as many queued starters as the window allows
44
+ while (this.queue.length > 0 && this.started < this.startsPerWindow) {
45
+ this.started++;
46
+ this.queue.shift()();
47
+ }
48
+ // Stop the timer if nothing is waiting
49
+ if (this.queue.length === 0) {
50
+ clearInterval(this.timer);
51
+ this.timer = null;
52
+ }
53
+ }, this.windowMs);
54
+ }
55
+ }
56
+ /**
57
+ * Run an experiment - execute all evals with configured runs concurrently.
58
+ * With earlyExit enabled, remaining attempts for a fixture are aborted once one passes.
59
+ */
60
+ export async function runExperiment(options) {
61
+ const { config, fixtures, apiKey, resultsDir, experimentName, fingerprints, onProgress, smoke, rateLimiter } = options;
62
+ const startedAt = new Date();
63
+ // Get the agent from registry
64
+ const agent = getAgent(config.agent);
65
+ const emit = (event) => {
66
+ if (onProgress) {
67
+ onProgress(event);
68
+ }
69
+ };
70
+ // Create AbortController per fixture for earlyExit
71
+ const abortControllers = new Map();
72
+ for (const fixture of fixtures) {
73
+ abortControllers.set(fixture.name, new AbortController());
74
+ }
75
+ // Build list of all attempts to run
76
+ const attempts = [];
77
+ for (const fixture of fixtures) {
78
+ for (let i = 0; i < config.runs; i++) {
79
+ attempts.push({ fixture, runIndex: i });
80
+ }
81
+ }
82
+ emit({ type: 'experiment:start', totalAttempts: attempts.length, totalEvals: fixtures.length, totalRuns: config.runs });
83
+ // Run a single attempt
84
+ const runAttempt = async (attempt) => {
85
+ const { fixture, runIndex } = attempt;
86
+ const controller = abortControllers.get(fixture.name);
87
+ // Check if already aborted before starting
88
+ if (controller.signal.aborted) {
89
+ return {
90
+ fixtureName: fixture.name,
91
+ runIndex,
92
+ runData: {
93
+ result: { status: 'failed', error: 'Aborted', duration: 0 },
94
+ },
95
+ aborted: true,
96
+ };
97
+ }
98
+ const timeoutMs = config.timeout * 1000;
99
+ const startTime = Date.now();
100
+ // Create per-attempt controller for timeout cleanup
101
+ const attemptController = new AbortController();
102
+ // Propagate earlyExit abort to this attempt's controller
103
+ if (config.earlyExit) {
104
+ controller.signal.addEventListener('abort', () => attemptController.abort(), { once: true });
105
+ }
106
+ let timeoutId;
107
+ const agentResult = await Promise.race([
108
+ agent.run(fixture.path, {
109
+ prompt: config.editPrompt ? config.editPrompt(fixture.prompt) : fixture.prompt,
110
+ model: config.model,
111
+ timeout: timeoutMs,
112
+ apiKey,
113
+ setup: config.setup,
114
+ scripts: config.scripts,
115
+ signal: attemptController.signal,
116
+ sandbox: config.sandbox,
117
+ }),
118
+ new Promise((_, reject) => {
119
+ timeoutId = setTimeout(() => {
120
+ attemptController.abort(); // Signal agent to clean up sandbox
121
+ reject(new Error(`Eval timed out after ${config.timeout}s`));
122
+ }, timeoutMs);
123
+ }),
124
+ ]).catch((error) => {
125
+ // Convert timeout error to AgentResult format
126
+ if (error instanceof Error && error.message.includes('timed out')) {
127
+ return {
128
+ success: false,
129
+ output: '',
130
+ error: error.message,
131
+ duration: Date.now() - startTime,
132
+ };
133
+ }
134
+ throw error;
135
+ });
136
+ // Clear timeout if agent completed before timeout
137
+ if (timeoutId)
138
+ clearTimeout(timeoutId);
139
+ // Check if this was aborted
140
+ if (agentResult.error === 'Aborted' || agentResult.error === 'Aborted before start') {
141
+ return {
142
+ fixtureName: fixture.name,
143
+ runIndex,
144
+ runData: {
145
+ result: { status: 'failed', error: 'Aborted', duration: agentResult.duration / 1000 },
146
+ },
147
+ aborted: true,
148
+ };
149
+ }
150
+ const runData = agentResultToEvalRunData(agentResult);
151
+ return {
152
+ fixtureName: fixture.name,
153
+ runIndex,
154
+ runData,
155
+ };
156
+ };
157
+ // Retry wrapper: if an attempt fails suspiciously fast (< 5s), it's likely an infra issue (429, etc.)
158
+ // Real evals take minutes, so a sub-5s failure is always anomalous.
159
+ const MAX_RETRIES = 5;
160
+ const INITIAL_BACKOFF_MS = 5_000;
161
+ const ANOMALY_THRESHOLD_S = 5;
162
+ const runAttemptWithRetry = async (attempt) => {
163
+ for (let retry = 0;; retry++) {
164
+ const result = await runAttempt(attempt);
165
+ const isSuspiciouslyFast = !result.aborted &&
166
+ result.runData.result.status === 'failed' &&
167
+ result.runData.result.duration < ANOMALY_THRESHOLD_S &&
168
+ !result.runData.result.error?.includes('timed out');
169
+ if (!isSuspiciouslyFast || retry >= MAX_RETRIES) {
170
+ return result;
171
+ }
172
+ const backoff = INITIAL_BACKOFF_MS * Math.pow(2, retry);
173
+ const jitter = Math.random() * backoff * 0.5;
174
+ await new Promise((resolve) => setTimeout(resolve, backoff + jitter));
175
+ }
176
+ };
177
+ // Run all attempts with rate-limited starts, 429 retry, and progress events
178
+ const runOne = async (attempt) => {
179
+ // Wait for rate limiter before starting (if provided)
180
+ if (rateLimiter) {
181
+ await rateLimiter.waitToStart();
182
+ }
183
+ emit({ type: 'eval:start', evalName: attempt.fixture.name, runNumber: attempt.runIndex + 1, totalRuns: config.runs });
184
+ const result = await runAttemptWithRetry(attempt);
185
+ if (!result.aborted) {
186
+ emit({ type: 'eval:complete', evalName: attempt.fixture.name, runNumber: attempt.runIndex + 1, totalRuns: config.runs, result: result.runData.result });
187
+ // If this attempt passed and earlyExit is enabled, abort remaining attempts
188
+ if (config.earlyExit && result.runData.result.status === 'passed') {
189
+ emit({ type: 'experiment:earlyExit', evalName: attempt.fixture.name, runNumber: attempt.runIndex + 1 });
190
+ abortControllers.get(attempt.fixture.name).abort();
191
+ }
192
+ }
193
+ return result;
194
+ };
195
+ const results = await Promise.all(attempts.map(runOne));
196
+ // Group results by fixture, excluding aborted results
197
+ const resultsByFixture = new Map();
198
+ for (const fixture of fixtures) {
199
+ resultsByFixture.set(fixture.name, []);
200
+ }
201
+ for (const result of results) {
202
+ if (!result.aborted) {
203
+ resultsByFixture.get(result.fixtureName).push(result);
204
+ }
205
+ }
206
+ // Build eval summaries, respecting earlyExit
207
+ const evalSummaries = [];
208
+ for (const fixture of fixtures) {
209
+ const fixtureResults = resultsByFixture.get(fixture.name);
210
+ // Sort by run index to process in order
211
+ fixtureResults.sort((a, b) => a.runIndex - b.runIndex);
212
+ const runDataList = [];
213
+ for (const result of fixtureResults) {
214
+ runDataList.push(result.runData);
215
+ // With earlyExit, stop counting after first pass
216
+ if (config.earlyExit && result.runData.result.status === 'passed') {
217
+ break;
218
+ }
219
+ }
220
+ const summary = createEvalSummary(fixture.name, runDataList);
221
+ evalSummaries.push(summary);
222
+ }
223
+ const completedAt = new Date();
224
+ const experimentResults = createExperimentResults(config, evalSummaries, startedAt, completedAt);
225
+ // Save results to disk
226
+ const fixturePaths = {};
227
+ for (const fixture of fixtures) {
228
+ fixturePaths[fixture.name] = fixture.path;
229
+ }
230
+ const outputDir = saveResults(experimentResults, {
231
+ resultsDir,
232
+ experimentName,
233
+ fingerprints,
234
+ smoke,
235
+ fixturePaths,
236
+ });
237
+ emit({ type: 'experiment:saved', outputDir });
238
+ emit({ type: 'experiment:summary', results: experimentResults });
239
+ return experimentResults;
240
+ }
241
+ /**
242
+ * Run a single eval (for testing/debugging).
243
+ */
244
+ export async function runSingleEval(fixture, options) {
245
+ const agent = getAgent(options.agent ?? 'vercel-ai-gateway/claude-code');
246
+ const models = Array.isArray(options.model) ? options.model : [options.model];
247
+ const prompt = options.editPrompt ? options.editPrompt(fixture.prompt) : fixture.prompt;
248
+ const results = [];
249
+ for (const model of models) {
250
+ const agentResult = await agent.run(fixture.path, {
251
+ prompt,
252
+ model,
253
+ timeout: options.timeout * 1000,
254
+ apiKey: options.apiKey,
255
+ setup: options.setup,
256
+ scripts: options.scripts,
257
+ sandbox: options.sandbox,
258
+ });
259
+ results.push(agentResultToEvalRunData(agentResult));
260
+ }
261
+ // TODO: remove this on the next major and return an array directly...it's just here to prevent breaking changes
262
+ if (!Array.isArray(options.model)) {
263
+ return results[0];
264
+ }
265
+ return results;
266
+ }
267
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Sandbox integration for isolated eval execution.
3
+ * Supports both Vercel Sandbox and Docker backends.
4
+ */
5
+ import { Sandbox as VercelSandbox } from '@vercel/sandbox';
6
+ import type { Sandbox } from './types.js';
7
+ import { DockerSandboxManager } from './docker-sandbox.js';
8
+ /**
9
+ * Default timeout for sandbox operations (10 minutes).
10
+ */
11
+ export declare const DEFAULT_SANDBOX_TIMEOUT = 600000;
12
+ /**
13
+ * Supported sandbox backends.
14
+ */
15
+ export type SandboxBackend = 'vercel' | 'docker';
16
+ /**
17
+ * Information about the resolved sandbox backend.
18
+ */
19
+ export interface SandboxBackendInfo {
20
+ /** Which backend will be used */
21
+ backend: SandboxBackend;
22
+ /** How it was determined */
23
+ reason: 'explicit' | 'auto-detected';
24
+ /** Human-readable description */
25
+ description: string;
26
+ }
27
+ /**
28
+ * Files to ignore when copying to sandbox.
29
+ * These are build artifacts and dependencies that shouldn't be uploaded.
30
+ * Note: This is a general-purpose pattern list used by collectLocalFiles().
31
+ * For eval-specific exclusions (PROMPT.md, EVAL.ts), see TEST_FILE_PATTERNS.
32
+ */
33
+ export declare const IGNORED_PATTERNS: string[];
34
+ /**
35
+ * Test/eval file patterns to withhold from agent during task execution.
36
+ * These files are uploaded AFTER the agent completes for validation.
37
+ * - PROMPT.md: Contains the task - agent receives this via CLI argument, not as a file
38
+ * - EVAL.ts/tsx: Validation tests - must be hidden so agent can't "cheat"
39
+ */
40
+ export declare const TEST_FILE_PATTERNS: string[];
41
+ /**
42
+ * Options for creating a sandbox.
43
+ */
44
+ export interface SandboxOptions {
45
+ /** Timeout in milliseconds */
46
+ timeout?: number;
47
+ /** Runtime environment */
48
+ runtime?: 'node20' | 'node24';
49
+ /** Sandbox backend to use. 'auto' will use Vercel if token present, else Docker. @default 'auto' */
50
+ backend?: SandboxBackend | 'auto';
51
+ /** Optional explicit Vercel auth token for sandbox API auth */
52
+ token?: string;
53
+ /** Optional explicit Vercel team ID for sandbox API auth */
54
+ teamId?: string;
55
+ /** Optional explicit Vercel project ID for sandbox API auth */
56
+ projectId?: string;
57
+ }
58
+ /**
59
+ * Result of running a command in the sandbox.
60
+ */
61
+ export interface CommandResult {
62
+ stdout: string;
63
+ stderr: string;
64
+ exitCode: number;
65
+ }
66
+ /**
67
+ * File to upload to sandbox.
68
+ */
69
+ export interface SandboxFile {
70
+ path: string;
71
+ content: Buffer | string;
72
+ }
73
+ /**
74
+ * Wrapper around Vercel Sandbox providing a cleaner API.
75
+ */
76
+ export declare class SandboxManager implements Sandbox {
77
+ private sandbox;
78
+ private _workingDirectory;
79
+ constructor(sandbox: VercelSandbox);
80
+ /**
81
+ * Create a new sandbox instance.
82
+ */
83
+ static create(options?: SandboxOptions): Promise<SandboxManager>;
84
+ /**
85
+ * Get the sandbox ID.
86
+ */
87
+ get sandboxId(): string;
88
+ /**
89
+ * Run a command in the sandbox.
90
+ */
91
+ runCommand(command: string, args?: string[], options?: {
92
+ env?: Record<string, string>;
93
+ }): Promise<CommandResult>;
94
+ /**
95
+ * Run a shell command (through bash).
96
+ */
97
+ runShell(command: string, env?: Record<string, string>): Promise<CommandResult>;
98
+ /**
99
+ * Read a file from the sandbox.
100
+ */
101
+ readFile(path: string): Promise<string>;
102
+ /**
103
+ * Check if a file exists in the sandbox.
104
+ */
105
+ fileExists(path: string): Promise<boolean>;
106
+ /**
107
+ * Write files to the sandbox.
108
+ */
109
+ writeFiles(files: Record<string, string>): Promise<void>;
110
+ /**
111
+ * Upload files from local filesystem to sandbox.
112
+ */
113
+ uploadFiles(files: SandboxFile[]): Promise<void>;
114
+ /**
115
+ * Get the working directory.
116
+ */
117
+ getWorkingDirectory(): string;
118
+ /**
119
+ * Stop and clean up the sandbox.
120
+ */
121
+ stop(): Promise<void>;
122
+ }
123
+ /**
124
+ * Resolve which sandbox backend to use based on options.
125
+ *
126
+ * Priority:
127
+ * 1. Explicit backend in options (if not 'auto')
128
+ * 2. Auto-detect: Vercel if token present, else Docker
129
+ */
130
+ export declare function resolveBackend(options?: SandboxOptions): SandboxBackend;
131
+ /**
132
+ * Get information about the sandbox backend that will be used.
133
+ * Useful for displaying to users.
134
+ */
135
+ export declare function getSandboxBackendInfo(options?: SandboxOptions): SandboxBackendInfo;
136
+ /**
137
+ * Create a sandbox using the appropriate backend.
138
+ *
139
+ * By default, uses Vercel Sandbox if VERCEL_TOKEN is present,
140
+ * otherwise falls back to Docker.
141
+ *
142
+ * @example
143
+ * ```typescript
144
+ * // Auto-detect backend
145
+ * const sandbox = await createSandbox();
146
+ *
147
+ * // Explicit Docker
148
+ * const sandbox = await createSandbox({ backend: 'docker' });
149
+ *
150
+ * // Explicit Vercel
151
+ * const sandbox = await createSandbox({ backend: 'vercel' });
152
+ * ```
153
+ */
154
+ export declare function createSandbox(options?: SandboxOptions): Promise<SandboxManager | DockerSandboxManager>;
155
+ /**
156
+ * Collect files from a local directory for uploading to sandbox.
157
+ */
158
+ export declare function collectLocalFiles(dir: string, options?: {
159
+ excludePatterns?: string[];
160
+ includePatterns?: string[];
161
+ }): Promise<SandboxFile[]>;
162
+ /**
163
+ * Split files into workspace files (visible to agent) and test files (hidden until validation).
164
+ */
165
+ export declare function splitTestFiles(files: SandboxFile[]): {
166
+ workspaceFiles: SandboxFile[];
167
+ testFiles: SandboxFile[];
168
+ };
169
+ /**
170
+ * Verify that no test files exist in the sandbox.
171
+ */
172
+ export declare function verifyNoTestFiles(sandbox: SandboxManager | DockerSandboxManager): Promise<void>;
173
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/lib/sandbox.ts"],"names":[],"mappings":"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"}