agent-eval-opencode 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +590 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agents/claude-code.d.ts +12 -0
- package/dist/lib/agents/claude-code.d.ts.map +1 -0
- package/dist/lib/agents/claude-code.js +231 -0
- package/dist/lib/agents/claude-code.js.map +1 -0
- package/dist/lib/agents/codex.d.ts +12 -0
- package/dist/lib/agents/codex.d.ts.map +1 -0
- package/dist/lib/agents/codex.js +267 -0
- package/dist/lib/agents/codex.js.map +1 -0
- package/dist/lib/agents/cursor.d.ts +10 -0
- package/dist/lib/agents/cursor.d.ts.map +1 -0
- package/dist/lib/agents/cursor.js +204 -0
- package/dist/lib/agents/cursor.js.map +1 -0
- package/dist/lib/agents/gemini.d.ts +10 -0
- package/dist/lib/agents/gemini.d.ts.map +1 -0
- package/dist/lib/agents/gemini.js +207 -0
- package/dist/lib/agents/gemini.js.map +1 -0
- package/dist/lib/agents/index.d.ts +7 -0
- package/dist/lib/agents/index.d.ts.map +1 -0
- package/dist/lib/agents/index.js +20 -0
- package/dist/lib/agents/index.js.map +1 -0
- package/dist/lib/agents/opencode.d.ts +11 -0
- package/dist/lib/agents/opencode.d.ts.map +1 -0
- package/dist/lib/agents/opencode.js +245 -0
- package/dist/lib/agents/opencode.js.map +1 -0
- package/dist/lib/agents/registry.d.ts +23 -0
- package/dist/lib/agents/registry.d.ts.map +1 -0
- package/dist/lib/agents/registry.js +35 -0
- package/dist/lib/agents/registry.js.map +1 -0
- package/dist/lib/agents/shared.d.ts +83 -0
- package/dist/lib/agents/shared.d.ts.map +1 -0
- package/dist/lib/agents/shared.js +192 -0
- package/dist/lib/agents/shared.js.map +1 -0
- package/dist/lib/agents/types.d.ts +73 -0
- package/dist/lib/agents/types.d.ts.map +1 -0
- package/dist/lib/agents/types.js +5 -0
- package/dist/lib/agents/types.js.map +1 -0
- package/dist/lib/classifier.d.ts +89 -0
- package/dist/lib/classifier.d.ts.map +1 -0
- package/dist/lib/classifier.js +285 -0
- package/dist/lib/classifier.js.map +1 -0
- package/dist/lib/config.d.ts +37 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +187 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dashboard.d.ts +65 -0
- package/dist/lib/dashboard.d.ts.map +1 -0
- package/dist/lib/dashboard.js +237 -0
- package/dist/lib/dashboard.js.map +1 -0
- package/dist/lib/docker-sandbox.d.ts +92 -0
- package/dist/lib/docker-sandbox.d.ts.map +1 -0
- package/dist/lib/docker-sandbox.js +375 -0
- package/dist/lib/docker-sandbox.js.map +1 -0
- package/dist/lib/fingerprint.d.ts +15 -0
- package/dist/lib/fingerprint.d.ts.map +1 -0
- package/dist/lib/fingerprint.js +59 -0
- package/dist/lib/fingerprint.js.map +1 -0
- package/dist/lib/fixture.d.ts +55 -0
- package/dist/lib/fixture.d.ts.map +1 -0
- package/dist/lib/fixture.js +215 -0
- package/dist/lib/fixture.js.map +1 -0
- package/dist/lib/housekeeping.d.ts +26 -0
- package/dist/lib/housekeeping.d.ts.map +1 -0
- package/dist/lib/housekeeping.js +170 -0
- package/dist/lib/housekeeping.js.map +1 -0
- package/dist/lib/init.d.ts +21 -0
- package/dist/lib/init.d.ts.map +1 -0
- package/dist/lib/init.js +275 -0
- package/dist/lib/init.js.map +1 -0
- package/dist/lib/o11y/index.d.ts +13 -0
- package/dist/lib/o11y/index.d.ts.map +1 -0
- package/dist/lib/o11y/index.js +13 -0
- package/dist/lib/o11y/index.js.map +1 -0
- package/dist/lib/o11y/parsers/claude-code.d.ts +18 -0
- package/dist/lib/o11y/parsers/claude-code.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/claude-code.js +343 -0
- package/dist/lib/o11y/parsers/claude-code.js.map +1 -0
- package/dist/lib/o11y/parsers/codex.d.ts +17 -0
- package/dist/lib/o11y/parsers/codex.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/codex.js +364 -0
- package/dist/lib/o11y/parsers/codex.js.map +1 -0
- package/dist/lib/o11y/parsers/cursor.d.ts +21 -0
- package/dist/lib/o11y/parsers/cursor.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/cursor.js +226 -0
- package/dist/lib/o11y/parsers/cursor.js.map +1 -0
- package/dist/lib/o11y/parsers/gemini.d.ts +21 -0
- package/dist/lib/o11y/parsers/gemini.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/gemini.js +241 -0
- package/dist/lib/o11y/parsers/gemini.js.map +1 -0
- package/dist/lib/o11y/parsers/index.d.ts +55 -0
- package/dist/lib/o11y/parsers/index.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/index.js +284 -0
- package/dist/lib/o11y/parsers/index.js.map +1 -0
- package/dist/lib/o11y/parsers/opencode.d.ts +17 -0
- package/dist/lib/o11y/parsers/opencode.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/opencode.js +320 -0
- package/dist/lib/o11y/parsers/opencode.js.map +1 -0
- package/dist/lib/o11y/types.d.ts +113 -0
- package/dist/lib/o11y/types.d.ts.map +1 -0
- package/dist/lib/o11y/types.js +6 -0
- package/dist/lib/o11y/types.js.map +1 -0
- package/dist/lib/results.d.ts +91 -0
- package/dist/lib/results.d.ts.map +1 -0
- package/dist/lib/results.js +361 -0
- package/dist/lib/results.js.map +1 -0
- package/dist/lib/runner.d.ts +71 -0
- package/dist/lib/runner.d.ts.map +1 -0
- package/dist/lib/runner.js +267 -0
- package/dist/lib/runner.js.map +1 -0
- package/dist/lib/sandbox.d.ts +173 -0
- package/dist/lib/sandbox.d.ts.map +1 -0
- package/dist/lib/sandbox.js +337 -0
- package/dist/lib/sandbox.js.map +1 -0
- package/dist/lib/types.d.ts +258 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +15 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/test-setup.d.ts +2 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +6 -0
- package/dist/test-setup.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor CLI agent implementation.
|
|
3
|
+
* Uses direct Cursor API access.
|
|
4
|
+
*/
|
|
5
|
+
import { createSandbox, collectLocalFiles, splitTestFiles, verifyNoTestFiles, } from '../sandbox.js';
|
|
6
|
+
import { runValidation, captureGeneratedFiles, createVitestConfig, CURSOR_DIRECT, initGitAndCommit, injectTranscriptContext, } from './shared.js';
|
|
7
|
+
/**
|
|
8
|
+
* Extract transcript from Cursor CLI stream-json output.
|
|
9
|
+
* When run with --output-format stream-json, Cursor outputs JSONL (newline-delimited JSON).
|
|
10
|
+
*/
|
|
11
|
+
function extractTranscriptFromOutput(output) {
|
|
12
|
+
if (!output || !output.trim()) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
// The --output-format stream-json output contains JSON events, one per line
|
|
16
|
+
// Filter to only include lines that look like JSON objects
|
|
17
|
+
const lines = output.split('\n').filter(line => {
|
|
18
|
+
const trimmed = line.trim();
|
|
19
|
+
return trimmed.startsWith('{') && trimmed.endsWith('}');
|
|
20
|
+
});
|
|
21
|
+
if (lines.length === 0) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
return lines.join('\n');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create Cursor CLI agent with direct API authentication.
|
|
28
|
+
*/
|
|
29
|
+
export function createCursorAgent() {
|
|
30
|
+
return {
|
|
31
|
+
name: 'cursor',
|
|
32
|
+
displayName: 'Cursor CLI',
|
|
33
|
+
getApiKeyEnvVar() {
|
|
34
|
+
return CURSOR_DIRECT.apiKeyEnvVar;
|
|
35
|
+
},
|
|
36
|
+
getDefaultModel() {
|
|
37
|
+
return 'composer-1.5';
|
|
38
|
+
},
|
|
39
|
+
async run(fixturePath, options) {
|
|
40
|
+
const startTime = Date.now();
|
|
41
|
+
let sandbox = null;
|
|
42
|
+
let agentOutput = '';
|
|
43
|
+
let transcript;
|
|
44
|
+
let aborted = false;
|
|
45
|
+
let sandboxStopped = false;
|
|
46
|
+
// Handle abort signal
|
|
47
|
+
const abortHandler = () => {
|
|
48
|
+
aborted = true;
|
|
49
|
+
if (sandbox && !sandboxStopped) {
|
|
50
|
+
sandboxStopped = true;
|
|
51
|
+
sandbox.stop().catch(() => { });
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
if (options.signal) {
|
|
55
|
+
if (options.signal.aborted) {
|
|
56
|
+
return {
|
|
57
|
+
success: false,
|
|
58
|
+
output: '',
|
|
59
|
+
error: 'Aborted before start',
|
|
60
|
+
duration: 0,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
options.signal.addEventListener('abort', abortHandler);
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
// Collect files from fixture
|
|
67
|
+
const allFiles = await collectLocalFiles(fixturePath);
|
|
68
|
+
const { workspaceFiles, testFiles } = splitTestFiles(allFiles);
|
|
69
|
+
// Check for abort before expensive operations
|
|
70
|
+
if (aborted) {
|
|
71
|
+
return {
|
|
72
|
+
success: false,
|
|
73
|
+
output: '',
|
|
74
|
+
error: 'Aborted',
|
|
75
|
+
duration: Date.now() - startTime,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Create sandbox
|
|
79
|
+
sandbox = await createSandbox({
|
|
80
|
+
timeout: options.timeout,
|
|
81
|
+
runtime: 'node24',
|
|
82
|
+
backend: options.sandbox,
|
|
83
|
+
});
|
|
84
|
+
// Check for abort after sandbox creation (abort may have fired during create)
|
|
85
|
+
if (aborted) {
|
|
86
|
+
return {
|
|
87
|
+
success: false,
|
|
88
|
+
output: '',
|
|
89
|
+
error: 'Aborted',
|
|
90
|
+
duration: Date.now() - startTime,
|
|
91
|
+
sandboxId: sandbox.sandboxId,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Upload workspace files (excluding tests)
|
|
95
|
+
await sandbox.uploadFiles(workspaceFiles);
|
|
96
|
+
await initGitAndCommit(sandbox);
|
|
97
|
+
// Run setup function if provided
|
|
98
|
+
if (options.setup) {
|
|
99
|
+
await options.setup(sandbox);
|
|
100
|
+
}
|
|
101
|
+
// Install dependencies
|
|
102
|
+
let installResult = await sandbox.runCommand('npm', ['install']);
|
|
103
|
+
if (installResult.exitCode !== 0) {
|
|
104
|
+
installResult = await sandbox.runCommand('npm', ['install']);
|
|
105
|
+
}
|
|
106
|
+
if (installResult.exitCode !== 0) {
|
|
107
|
+
const output = (installResult.stdout + installResult.stderr).trim().split('\n').slice(-10).join('\n');
|
|
108
|
+
throw new Error(`npm install failed (exit code ${installResult.exitCode}):\n${output}`);
|
|
109
|
+
}
|
|
110
|
+
// Install Cursor CLI globally using official installation script
|
|
111
|
+
const cliInstall = await sandbox.runShell('curl https://cursor.com/install -fsSL | bash');
|
|
112
|
+
if (cliInstall.exitCode !== 0) {
|
|
113
|
+
throw new Error(`Cursor CLI install failed: ${cliInstall.stderr}`);
|
|
114
|
+
}
|
|
115
|
+
// Verify no test files in sandbox
|
|
116
|
+
await verifyNoTestFiles(sandbox);
|
|
117
|
+
// Run Cursor CLI with direct API access
|
|
118
|
+
// --print: non-interactive mode (required for scripts/headless)
|
|
119
|
+
// --force: auto-approve all tool operations
|
|
120
|
+
// --output-format stream-json: structured JSONL transcript (only works with --print)
|
|
121
|
+
const cursorResult = await sandbox.runCommand('agent', [
|
|
122
|
+
options.prompt,
|
|
123
|
+
'--print',
|
|
124
|
+
'--force',
|
|
125
|
+
'--model',
|
|
126
|
+
options.model,
|
|
127
|
+
'--output-format',
|
|
128
|
+
'stream-json',
|
|
129
|
+
], {
|
|
130
|
+
env: {
|
|
131
|
+
[CURSOR_DIRECT.apiKeyEnvVar]: options.apiKey,
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
agentOutput = cursorResult.stdout + cursorResult.stderr;
|
|
135
|
+
transcript = extractTranscriptFromOutput(agentOutput);
|
|
136
|
+
if (cursorResult.exitCode !== 0) {
|
|
137
|
+
// Extract meaningful error from output (last few lines usually contain the error)
|
|
138
|
+
const errorLines = agentOutput.trim().split('\n').slice(-5).join('\n');
|
|
139
|
+
return {
|
|
140
|
+
success: false,
|
|
141
|
+
output: agentOutput,
|
|
142
|
+
transcript,
|
|
143
|
+
error: errorLines || `Cursor CLI exited with code ${cursorResult.exitCode}`,
|
|
144
|
+
duration: Date.now() - startTime,
|
|
145
|
+
sandboxId: sandbox.sandboxId,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
// Upload test files for validation
|
|
149
|
+
await sandbox.uploadFiles(testFiles);
|
|
150
|
+
// Create vitest config for EVAL.ts/tsx
|
|
151
|
+
await createVitestConfig(sandbox);
|
|
152
|
+
// Inject transcript context so EVAL.ts tests can assert on agent behavior
|
|
153
|
+
await injectTranscriptContext(sandbox, transcript, 'cursor', options.model);
|
|
154
|
+
// Run validation scripts
|
|
155
|
+
const validationResults = await runValidation(sandbox, options.scripts ?? []);
|
|
156
|
+
// Capture generated files
|
|
157
|
+
const { generatedFiles, deletedFiles } = await captureGeneratedFiles(sandbox);
|
|
158
|
+
return {
|
|
159
|
+
success: validationResults.allPassed,
|
|
160
|
+
output: agentOutput,
|
|
161
|
+
transcript,
|
|
162
|
+
duration: Date.now() - startTime,
|
|
163
|
+
testResult: validationResults.test,
|
|
164
|
+
scriptsResults: validationResults.scripts,
|
|
165
|
+
sandboxId: sandbox.sandboxId,
|
|
166
|
+
generatedFiles,
|
|
167
|
+
deletedFiles,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
// Check if this was an abort
|
|
172
|
+
if (aborted) {
|
|
173
|
+
return {
|
|
174
|
+
success: false,
|
|
175
|
+
output: agentOutput,
|
|
176
|
+
transcript,
|
|
177
|
+
error: 'Aborted',
|
|
178
|
+
duration: Date.now() - startTime,
|
|
179
|
+
sandboxId: sandbox?.sandboxId,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
success: false,
|
|
184
|
+
output: agentOutput,
|
|
185
|
+
transcript,
|
|
186
|
+
error: error instanceof Error ? error.message : String(error),
|
|
187
|
+
duration: Date.now() - startTime,
|
|
188
|
+
sandboxId: sandbox?.sandboxId,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
// Clean up abort listener
|
|
193
|
+
if (options.signal) {
|
|
194
|
+
options.signal.removeEventListener('abort', abortHandler);
|
|
195
|
+
}
|
|
196
|
+
if (sandbox && !sandboxStopped) {
|
|
197
|
+
sandboxStopped = true;
|
|
198
|
+
await sandbox.stop();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/lib/agents/cursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini CLI agent implementation.
|
|
3
|
+
* Uses direct Google Gemini API access.
|
|
4
|
+
*/
|
|
5
|
+
import type { Agent } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create Gemini CLI agent with direct API authentication.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createGeminiAgent(): Agent;
|
|
10
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/gemini.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAmC,MAAM,YAAY,CAAC;AA6CzE;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,KAAK,CA2MzC"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini CLI agent implementation.
|
|
3
|
+
* Uses direct Google Gemini API access.
|
|
4
|
+
*/
|
|
5
|
+
import { createSandbox, collectLocalFiles, splitTestFiles, verifyNoTestFiles, } from '../sandbox.js';
|
|
6
|
+
import { runValidation, captureGeneratedFiles, createVitestConfig, GEMINI_DIRECT, initGitAndCommit, injectTranscriptContext, } from './shared.js';
|
|
7
|
+
/**
|
|
8
|
+
* Extract transcript from Gemini stream-json output.
|
|
9
|
+
* When run with --output-format stream-json, Gemini outputs JSONL (newline-delimited JSON).
|
|
10
|
+
*/
|
|
11
|
+
function extractTranscriptFromOutput(output) {
|
|
12
|
+
if (!output || !output.trim()) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
// The --output-format stream-json output contains JSON events, one per line
|
|
16
|
+
// Filter to only include lines that look like JSON objects
|
|
17
|
+
const lines = output.split('\n').filter(line => {
|
|
18
|
+
const trimmed = line.trim();
|
|
19
|
+
return trimmed.startsWith('{') && trimmed.endsWith('}');
|
|
20
|
+
});
|
|
21
|
+
if (lines.length === 0) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
return lines.join('\n');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create Gemini CLI agent with direct API authentication.
|
|
28
|
+
*/
|
|
29
|
+
export function createGeminiAgent() {
|
|
30
|
+
return {
|
|
31
|
+
name: 'gemini',
|
|
32
|
+
displayName: 'Gemini CLI',
|
|
33
|
+
getApiKeyEnvVar() {
|
|
34
|
+
return GEMINI_DIRECT.apiKeyEnvVar;
|
|
35
|
+
},
|
|
36
|
+
getDefaultModel() {
|
|
37
|
+
return 'gemini-3-pro-preview';
|
|
38
|
+
},
|
|
39
|
+
async run(fixturePath, options) {
|
|
40
|
+
const startTime = Date.now();
|
|
41
|
+
let sandbox = null;
|
|
42
|
+
let agentOutput = '';
|
|
43
|
+
let transcript;
|
|
44
|
+
let aborted = false;
|
|
45
|
+
let sandboxStopped = false;
|
|
46
|
+
// Handle abort signal
|
|
47
|
+
const abortHandler = () => {
|
|
48
|
+
aborted = true;
|
|
49
|
+
if (sandbox && !sandboxStopped) {
|
|
50
|
+
sandboxStopped = true;
|
|
51
|
+
sandbox.stop().catch(() => { });
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
if (options.signal) {
|
|
55
|
+
if (options.signal.aborted) {
|
|
56
|
+
return {
|
|
57
|
+
success: false,
|
|
58
|
+
output: '',
|
|
59
|
+
error: 'Aborted before start',
|
|
60
|
+
duration: 0,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
options.signal.addEventListener('abort', abortHandler);
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
// Collect files from fixture
|
|
67
|
+
const allFiles = await collectLocalFiles(fixturePath);
|
|
68
|
+
const { workspaceFiles, testFiles } = splitTestFiles(allFiles);
|
|
69
|
+
// Check for abort before expensive operations
|
|
70
|
+
if (aborted) {
|
|
71
|
+
return {
|
|
72
|
+
success: false,
|
|
73
|
+
output: '',
|
|
74
|
+
error: 'Aborted',
|
|
75
|
+
duration: Date.now() - startTime,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Create sandbox
|
|
79
|
+
sandbox = await createSandbox({
|
|
80
|
+
timeout: options.timeout,
|
|
81
|
+
runtime: 'node24',
|
|
82
|
+
backend: options.sandbox,
|
|
83
|
+
});
|
|
84
|
+
// Check for abort after sandbox creation (abort may have fired during create)
|
|
85
|
+
if (aborted) {
|
|
86
|
+
return {
|
|
87
|
+
success: false,
|
|
88
|
+
output: '',
|
|
89
|
+
error: 'Aborted',
|
|
90
|
+
duration: Date.now() - startTime,
|
|
91
|
+
sandboxId: sandbox.sandboxId,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Upload workspace files (excluding tests)
|
|
95
|
+
await sandbox.uploadFiles(workspaceFiles);
|
|
96
|
+
await initGitAndCommit(sandbox);
|
|
97
|
+
// Run setup function if provided
|
|
98
|
+
if (options.setup) {
|
|
99
|
+
await options.setup(sandbox);
|
|
100
|
+
}
|
|
101
|
+
// Install dependencies
|
|
102
|
+
let installResult = await sandbox.runCommand('npm', ['install']);
|
|
103
|
+
if (installResult.exitCode !== 0) {
|
|
104
|
+
installResult = await sandbox.runCommand('npm', ['install']);
|
|
105
|
+
}
|
|
106
|
+
if (installResult.exitCode !== 0) {
|
|
107
|
+
const output = (installResult.stdout + installResult.stderr).trim().split('\n').slice(-10).join('\n');
|
|
108
|
+
throw new Error(`npm install failed (exit code ${installResult.exitCode}):\n${output}`);
|
|
109
|
+
}
|
|
110
|
+
// Install Gemini CLI globally
|
|
111
|
+
const cliInstall = await sandbox.runCommand('npm', [
|
|
112
|
+
'install',
|
|
113
|
+
'-g',
|
|
114
|
+
'@google/gemini-cli',
|
|
115
|
+
]);
|
|
116
|
+
if (cliInstall.exitCode !== 0) {
|
|
117
|
+
throw new Error(`Gemini CLI install failed: ${cliInstall.stderr}`);
|
|
118
|
+
}
|
|
119
|
+
// Verify no test files in sandbox
|
|
120
|
+
await verifyNoTestFiles(sandbox);
|
|
121
|
+
// Run Gemini CLI with direct API access
|
|
122
|
+
// Using stream-json format for detailed event transcript (similar to Codex's --json)
|
|
123
|
+
const geminiResult = await sandbox.runCommand('gemini', [
|
|
124
|
+
'--prompt',
|
|
125
|
+
options.prompt,
|
|
126
|
+
'--model',
|
|
127
|
+
options.model,
|
|
128
|
+
'--approval-mode',
|
|
129
|
+
'yolo',
|
|
130
|
+
'--output-format',
|
|
131
|
+
'stream-json',
|
|
132
|
+
], {
|
|
133
|
+
env: {
|
|
134
|
+
[GEMINI_DIRECT.apiKeyEnvVar]: options.apiKey,
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
agentOutput = geminiResult.stdout + geminiResult.stderr;
|
|
138
|
+
transcript = extractTranscriptFromOutput(agentOutput);
|
|
139
|
+
if (geminiResult.exitCode !== 0) {
|
|
140
|
+
// Extract meaningful error from output (last few lines usually contain the error)
|
|
141
|
+
const errorLines = agentOutput.trim().split('\n').slice(-5).join('\n');
|
|
142
|
+
return {
|
|
143
|
+
success: false,
|
|
144
|
+
output: agentOutput,
|
|
145
|
+
transcript,
|
|
146
|
+
error: errorLines || `Gemini CLI exited with code ${geminiResult.exitCode}`,
|
|
147
|
+
duration: Date.now() - startTime,
|
|
148
|
+
sandboxId: sandbox.sandboxId,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// Upload test files for validation
|
|
152
|
+
await sandbox.uploadFiles(testFiles);
|
|
153
|
+
// Create vitest config for EVAL.ts/tsx
|
|
154
|
+
await createVitestConfig(sandbox);
|
|
155
|
+
// Inject transcript context so EVAL.ts tests can assert on agent behavior
|
|
156
|
+
await injectTranscriptContext(sandbox, transcript, 'gemini', options.model);
|
|
157
|
+
// Run validation scripts
|
|
158
|
+
const validationResults = await runValidation(sandbox, options.scripts ?? []);
|
|
159
|
+
// Capture generated files
|
|
160
|
+
const { generatedFiles, deletedFiles } = await captureGeneratedFiles(sandbox);
|
|
161
|
+
return {
|
|
162
|
+
success: validationResults.allPassed,
|
|
163
|
+
output: agentOutput,
|
|
164
|
+
transcript,
|
|
165
|
+
duration: Date.now() - startTime,
|
|
166
|
+
testResult: validationResults.test,
|
|
167
|
+
scriptsResults: validationResults.scripts,
|
|
168
|
+
sandboxId: sandbox.sandboxId,
|
|
169
|
+
generatedFiles,
|
|
170
|
+
deletedFiles,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
// Check if this was an abort
|
|
175
|
+
if (aborted) {
|
|
176
|
+
return {
|
|
177
|
+
success: false,
|
|
178
|
+
output: agentOutput,
|
|
179
|
+
transcript,
|
|
180
|
+
error: 'Aborted',
|
|
181
|
+
duration: Date.now() - startTime,
|
|
182
|
+
sandboxId: sandbox?.sandboxId,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
success: false,
|
|
187
|
+
output: agentOutput,
|
|
188
|
+
transcript,
|
|
189
|
+
error: error instanceof Error ? error.message : String(error),
|
|
190
|
+
duration: Date.now() - startTime,
|
|
191
|
+
sandboxId: sandbox?.sandboxId,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
// Clean up abort listener
|
|
196
|
+
if (options.signal) {
|
|
197
|
+
options.signal.removeEventListener('abort', abortHandler);
|
|
198
|
+
}
|
|
199
|
+
if (sandbox && !sandboxStopped) {
|
|
200
|
+
sandboxStopped = true;
|
|
201
|
+
await sandbox.stop();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/lib/agents/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent registry with built-in agents.
|
|
3
|
+
*/
|
|
4
|
+
import { registerAgent, getAgent, listAgents, hasAgent } from './registry.js';
|
|
5
|
+
export { registerAgent, getAgent, listAgents, hasAgent };
|
|
6
|
+
export type { Agent, AgentRunOptions, AgentRunResult } from './types.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAiB9E,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAGzD,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent registry with built-in agents.
|
|
3
|
+
*/
|
|
4
|
+
import { registerAgent, getAgent, listAgents, hasAgent } from './registry.js';
|
|
5
|
+
import { createClaudeCodeAgent } from './claude-code.js';
|
|
6
|
+
import { createCodexAgent } from './codex.js';
|
|
7
|
+
import { createOpenCodeAgent } from './opencode.js';
|
|
8
|
+
import { createGeminiAgent } from './gemini.js';
|
|
9
|
+
import { createCursorAgent } from './cursor.js';
|
|
10
|
+
// Register all agent variants (Vercel AI Gateway + Direct API)
|
|
11
|
+
registerAgent(createClaudeCodeAgent({ useVercelAiGateway: true })); // vercel-ai-gateway/claude-code
|
|
12
|
+
registerAgent(createClaudeCodeAgent({ useVercelAiGateway: false })); // claude-code
|
|
13
|
+
registerAgent(createCodexAgent({ useVercelAiGateway: true })); // vercel-ai-gateway/codex
|
|
14
|
+
registerAgent(createCodexAgent({ useVercelAiGateway: false })); // codex
|
|
15
|
+
registerAgent(createOpenCodeAgent()); // opencode
|
|
16
|
+
registerAgent(createGeminiAgent()); // gemini
|
|
17
|
+
registerAgent(createCursorAgent()); // cursor
|
|
18
|
+
// Re-export registry functions
|
|
19
|
+
export { registerAgent, getAgent, listAgents, hasAgent };
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/agents/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,+DAA+D;AAC/D,aAAa,CAAC,qBAAqB,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAG,gCAAgC;AACtG,aAAa,CAAC,qBAAqB,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAE,cAAc;AACpF,aAAa,CAAC,gBAAgB,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAQ,0BAA0B;AAChG,aAAa,CAAC,gBAAgB,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAO,QAAQ;AAC9E,aAAa,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAiC,WAAW;AACjF,aAAa,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAmC,SAAS;AAC/E,aAAa,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAmC,SAAS;AAE/E,+BAA+B;AAC/B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode CLI agent implementation.
|
|
3
|
+
* Uses host-mounted credentials (GitHub Copilot, etc.) for model access.
|
|
4
|
+
*/
|
|
5
|
+
import type { Agent } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create OpenCode agent using host-mounted credentials.
|
|
8
|
+
* Requires Docker sandbox (bind mounts are not supported on Vercel sandbox).
|
|
9
|
+
*/
|
|
10
|
+
export declare function createOpenCodeAgent(): Agent;
|
|
11
|
+
//# sourceMappingURL=opencode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/opencode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAmC,MAAM,YAAY,CAAC;AAsGzE;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,KAAK,CAqM3C"}
|