@vercel/agent-eval 0.0.9 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +69 -13
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/agents/index.d.ts.map +1 -1
- package/dist/lib/agents/index.js +0 -2
- package/dist/lib/agents/index.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +3 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/o11y/index.d.ts +11 -0
- package/dist/lib/o11y/index.d.ts.map +1 -0
- package/dist/lib/o11y/index.js +11 -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 +296 -0
- package/dist/lib/o11y/parsers/codex.js.map +1 -0
- package/dist/lib/o11y/parsers/index.d.ts +51 -0
- package/dist/lib/o11y/parsers/index.d.ts.map +1 -0
- package/dist/lib/o11y/parsers/index.js +280 -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 +313 -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 +2 -1
- package/dist/lib/results.d.ts.map +1 -1
- package/dist/lib/results.js +23 -7
- package/dist/lib/results.js.map +1 -1
- package/dist/lib/runner.d.ts +6 -5
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/runner.js +21 -11
- package/dist/lib/runner.js.map +1 -1
- package/dist/lib/types.d.ts +25 -3
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js.map +1 -1
- package/package.json +5 -3
- package/README.md +0 -474
- package/dist/lib/agents/ai-sdk-agent.d.ts +0 -10
- package/dist/lib/agents/ai-sdk-agent.d.ts.map +0 -1
- package/dist/lib/agents/ai-sdk-agent.js +0 -427
- package/dist/lib/agents/ai-sdk-agent.js.map +0 -1
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for Claude Code transcript format.
|
|
3
|
+
* Claude Code stores transcripts as JSONL at ~/.claude/projects/{path}/{session}.jsonl
|
|
4
|
+
*
|
|
5
|
+
* Format reference (based on Claude Code CLI output):
|
|
6
|
+
* - Messages have type: "user" | "assistant"
|
|
7
|
+
* - Tool use appears in assistant messages with tool_use blocks
|
|
8
|
+
* - Tool results appear as separate messages with type: "tool_result"
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Map Claude Code tool names to canonical names.
|
|
12
|
+
*/
|
|
13
|
+
function normalizeToolName(name) {
|
|
14
|
+
const toolMap = {
|
|
15
|
+
// File operations
|
|
16
|
+
Read: 'file_read',
|
|
17
|
+
read_file: 'file_read',
|
|
18
|
+
ReadFile: 'file_read',
|
|
19
|
+
Write: 'file_write',
|
|
20
|
+
write_file: 'file_write',
|
|
21
|
+
WriteFile: 'file_write',
|
|
22
|
+
write_to_file: 'file_write',
|
|
23
|
+
Edit: 'file_edit',
|
|
24
|
+
edit_file: 'file_edit',
|
|
25
|
+
EditFile: 'file_edit',
|
|
26
|
+
str_replace_editor: 'file_edit',
|
|
27
|
+
StrReplace: 'file_edit',
|
|
28
|
+
// Shell
|
|
29
|
+
Bash: 'shell',
|
|
30
|
+
bash: 'shell',
|
|
31
|
+
Shell: 'shell',
|
|
32
|
+
shell: 'shell',
|
|
33
|
+
execute_command: 'shell',
|
|
34
|
+
run_command: 'shell',
|
|
35
|
+
// Web
|
|
36
|
+
WebFetch: 'web_fetch',
|
|
37
|
+
web_fetch: 'web_fetch',
|
|
38
|
+
fetch_url: 'web_fetch',
|
|
39
|
+
mcp__fetch__fetch: 'web_fetch',
|
|
40
|
+
WebSearch: 'web_search',
|
|
41
|
+
web_search: 'web_search',
|
|
42
|
+
// Search/navigation
|
|
43
|
+
Glob: 'glob',
|
|
44
|
+
glob: 'glob',
|
|
45
|
+
list_files: 'glob',
|
|
46
|
+
Grep: 'grep',
|
|
47
|
+
grep: 'grep',
|
|
48
|
+
search_files: 'grep',
|
|
49
|
+
LS: 'list_dir',
|
|
50
|
+
list_dir: 'list_dir',
|
|
51
|
+
ListDir: 'list_dir',
|
|
52
|
+
// Agent/subagent tools
|
|
53
|
+
Task: 'agent_task',
|
|
54
|
+
task: 'agent_task',
|
|
55
|
+
};
|
|
56
|
+
return toolMap[name] || 'unknown';
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Extract file path from tool arguments.
|
|
60
|
+
*/
|
|
61
|
+
function extractFilePath(args) {
|
|
62
|
+
return (args.path || args.file_path || args.filename || args.file);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Extract URL from tool arguments.
|
|
66
|
+
*/
|
|
67
|
+
function extractUrl(args) {
|
|
68
|
+
return (args.url || args.uri || args.href);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extract command from tool arguments.
|
|
72
|
+
*/
|
|
73
|
+
function extractCommand(args) {
|
|
74
|
+
if (typeof args.command === 'string')
|
|
75
|
+
return args.command;
|
|
76
|
+
if (Array.isArray(args.command))
|
|
77
|
+
return args.command.join(' ');
|
|
78
|
+
if (typeof args.cmd === 'string')
|
|
79
|
+
return args.cmd;
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Parse a single JSONL line from Claude Code transcript.
|
|
84
|
+
*/
|
|
85
|
+
function parseClaudeCodeLine(line) {
|
|
86
|
+
const events = [];
|
|
87
|
+
try {
|
|
88
|
+
const data = JSON.parse(line);
|
|
89
|
+
// Handle different Claude Code message formats
|
|
90
|
+
if (data.type === 'user' || data.role === 'user') {
|
|
91
|
+
// Check if this is a tool_result message (user message containing tool results)
|
|
92
|
+
const contentArray = getContentArray(data);
|
|
93
|
+
const toolResults = contentArray?.filter((block) => block.type === 'tool_result');
|
|
94
|
+
if (toolResults && toolResults.length > 0) {
|
|
95
|
+
// Extract tool results from user message
|
|
96
|
+
for (const result of toolResults) {
|
|
97
|
+
const r = result;
|
|
98
|
+
events.push({
|
|
99
|
+
timestamp: data.timestamp,
|
|
100
|
+
type: 'tool_result',
|
|
101
|
+
tool: {
|
|
102
|
+
name: 'unknown',
|
|
103
|
+
originalName: (r.tool_use_id || 'unknown'),
|
|
104
|
+
result: r.content,
|
|
105
|
+
success: !r.is_error && !r.error,
|
|
106
|
+
},
|
|
107
|
+
raw: r,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
// Regular user message
|
|
113
|
+
events.push({
|
|
114
|
+
timestamp: data.timestamp,
|
|
115
|
+
type: 'message',
|
|
116
|
+
role: 'user',
|
|
117
|
+
content: extractContent(data),
|
|
118
|
+
raw: data,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else if (data.type === 'assistant' || data.role === 'assistant') {
|
|
123
|
+
// Assistant message - may contain text and/or tool_use blocks
|
|
124
|
+
const content = extractContent(data);
|
|
125
|
+
if (content) {
|
|
126
|
+
events.push({
|
|
127
|
+
timestamp: data.timestamp,
|
|
128
|
+
type: 'message',
|
|
129
|
+
role: 'assistant',
|
|
130
|
+
content,
|
|
131
|
+
raw: data,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// Extract tool_use blocks
|
|
135
|
+
const toolUses = extractToolUses(data);
|
|
136
|
+
for (const toolUse of toolUses) {
|
|
137
|
+
events.push({
|
|
138
|
+
timestamp: data.timestamp,
|
|
139
|
+
type: 'tool_call',
|
|
140
|
+
tool: {
|
|
141
|
+
name: normalizeToolName(toolUse.name),
|
|
142
|
+
originalName: toolUse.name,
|
|
143
|
+
args: toolUse.input || toolUse.args || {},
|
|
144
|
+
},
|
|
145
|
+
raw: toolUse,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
// Extract thinking blocks
|
|
149
|
+
const thinking = extractThinking(data);
|
|
150
|
+
if (thinking) {
|
|
151
|
+
events.push({
|
|
152
|
+
timestamp: data.timestamp,
|
|
153
|
+
type: 'thinking',
|
|
154
|
+
content: thinking,
|
|
155
|
+
raw: data,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else if (data.type === 'tool_result' || data.type === 'tool_response') {
|
|
160
|
+
events.push({
|
|
161
|
+
timestamp: data.timestamp,
|
|
162
|
+
type: 'tool_result',
|
|
163
|
+
tool: {
|
|
164
|
+
name: 'unknown',
|
|
165
|
+
originalName: data.tool_use_id || 'unknown',
|
|
166
|
+
result: data.content || data.output || data.result,
|
|
167
|
+
success: !data.is_error && !data.error,
|
|
168
|
+
},
|
|
169
|
+
raw: data,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
else if (data.type === 'system' || data.role === 'system') {
|
|
173
|
+
events.push({
|
|
174
|
+
timestamp: data.timestamp,
|
|
175
|
+
type: 'message',
|
|
176
|
+
role: 'system',
|
|
177
|
+
content: extractContent(data),
|
|
178
|
+
raw: data,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
else if (data.type === 'error' || data.error) {
|
|
182
|
+
events.push({
|
|
183
|
+
timestamp: data.timestamp,
|
|
184
|
+
type: 'error',
|
|
185
|
+
content: data.error?.message || data.message || JSON.stringify(data.error),
|
|
186
|
+
raw: data,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// Skip unparseable lines
|
|
192
|
+
}
|
|
193
|
+
return events;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get the content array from data, handling nested message format.
|
|
197
|
+
* Claude Code wraps messages: { type: "assistant", message: { content: [...] } }
|
|
198
|
+
*/
|
|
199
|
+
function getContentArray(data) {
|
|
200
|
+
// Direct content array
|
|
201
|
+
if (Array.isArray(data.content)) {
|
|
202
|
+
return data.content;
|
|
203
|
+
}
|
|
204
|
+
// Nested message format (real Claude Code format)
|
|
205
|
+
const message = data.message;
|
|
206
|
+
if (message && Array.isArray(message.content)) {
|
|
207
|
+
return message.content;
|
|
208
|
+
}
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get string content from data, handling nested message format.
|
|
213
|
+
*/
|
|
214
|
+
function getStringContent(data) {
|
|
215
|
+
if (typeof data.content === 'string') {
|
|
216
|
+
return data.content;
|
|
217
|
+
}
|
|
218
|
+
const message = data.message;
|
|
219
|
+
if (message && typeof message.content === 'string') {
|
|
220
|
+
return message.content;
|
|
221
|
+
}
|
|
222
|
+
return undefined;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Extract text content from various message formats.
|
|
226
|
+
*/
|
|
227
|
+
function extractContent(data) {
|
|
228
|
+
// Check for direct string content
|
|
229
|
+
const stringContent = getStringContent(data);
|
|
230
|
+
if (stringContent) {
|
|
231
|
+
return stringContent;
|
|
232
|
+
}
|
|
233
|
+
// Check for content blocks array
|
|
234
|
+
const contentArray = getContentArray(data);
|
|
235
|
+
if (contentArray) {
|
|
236
|
+
const textBlocks = contentArray.filter((block) => block.type === 'text');
|
|
237
|
+
if (textBlocks.length > 0) {
|
|
238
|
+
return textBlocks.map((b) => b.text).join('\n');
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (typeof data.text === 'string') {
|
|
242
|
+
return data.text;
|
|
243
|
+
}
|
|
244
|
+
// Note: don't check data.message as string since message is an object in Claude Code format
|
|
245
|
+
return undefined;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Extract tool_use blocks from assistant messages.
|
|
249
|
+
*/
|
|
250
|
+
function extractToolUses(data) {
|
|
251
|
+
const toolUses = [];
|
|
252
|
+
// Check content array (handles both direct and nested message format)
|
|
253
|
+
const contentArray = getContentArray(data);
|
|
254
|
+
if (contentArray) {
|
|
255
|
+
for (const block of contentArray) {
|
|
256
|
+
const b = block;
|
|
257
|
+
if (b.type === 'tool_use') {
|
|
258
|
+
toolUses.push({
|
|
259
|
+
name: b.name,
|
|
260
|
+
input: b.input,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Also check for tool_calls array format (OpenAI-style)
|
|
266
|
+
const toolCalls = data.tool_calls || data.message?.tool_calls;
|
|
267
|
+
if (Array.isArray(toolCalls)) {
|
|
268
|
+
for (const call of toolCalls) {
|
|
269
|
+
const c = call;
|
|
270
|
+
const func = c.function;
|
|
271
|
+
toolUses.push({
|
|
272
|
+
name: (func?.name || c.name),
|
|
273
|
+
args: func?.arguments
|
|
274
|
+
? JSON.parse(func.arguments)
|
|
275
|
+
: (c.arguments || c.input),
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return toolUses;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Extract thinking/reasoning content.
|
|
283
|
+
*/
|
|
284
|
+
function extractThinking(data) {
|
|
285
|
+
const contentArray = getContentArray(data);
|
|
286
|
+
if (contentArray) {
|
|
287
|
+
const thinkingBlocks = contentArray.filter((block) => block.type === 'thinking');
|
|
288
|
+
if (thinkingBlocks.length > 0) {
|
|
289
|
+
return thinkingBlocks.map((b) => {
|
|
290
|
+
const block = b;
|
|
291
|
+
return block.thinking || block.text;
|
|
292
|
+
}).join('\n');
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return undefined;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Parse Claude Code JSONL transcript into events.
|
|
299
|
+
*/
|
|
300
|
+
export function parseClaudeCodeTranscript(raw) {
|
|
301
|
+
const events = [];
|
|
302
|
+
const errors = [];
|
|
303
|
+
const lines = raw.split('\n').filter((line) => line.trim());
|
|
304
|
+
for (const line of lines) {
|
|
305
|
+
try {
|
|
306
|
+
const lineEvents = parseClaudeCodeLine(line);
|
|
307
|
+
events.push(...lineEvents);
|
|
308
|
+
}
|
|
309
|
+
catch (e) {
|
|
310
|
+
errors.push(`Failed to parse line: ${e instanceof Error ? e.message : String(e)}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Post-process to link tool_results to their tool_calls
|
|
314
|
+
// and extract additional metadata
|
|
315
|
+
for (const event of events) {
|
|
316
|
+
if (event.type === 'tool_call' && event.tool) {
|
|
317
|
+
const args = event.tool.args || {};
|
|
318
|
+
// Extract file paths for file operations
|
|
319
|
+
if (['file_read', 'file_write', 'file_edit'].includes(event.tool.name)) {
|
|
320
|
+
const path = extractFilePath(args);
|
|
321
|
+
if (path) {
|
|
322
|
+
event.tool.args = { ...args, _extractedPath: path };
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
// Extract URLs for web fetches
|
|
326
|
+
if (event.tool.name === 'web_fetch') {
|
|
327
|
+
const url = extractUrl(args);
|
|
328
|
+
if (url) {
|
|
329
|
+
event.tool.args = { ...args, _extractedUrl: url };
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
// Extract commands for shell operations
|
|
333
|
+
if (event.tool.name === 'shell') {
|
|
334
|
+
const command = extractCommand(args);
|
|
335
|
+
if (command) {
|
|
336
|
+
event.tool.args = { ...args, _extractedCommand: command };
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return { events, errors };
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../src/lib/o11y/parsers/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for OpenAI Codex CLI transcript format.
|
|
3
|
+
* Codex outputs JSONL to stdout when run with --json flag.
|
|
4
|
+
*
|
|
5
|
+
* Format reference (based on Codex CLI output):
|
|
6
|
+
* - Events have a "type" field indicating the event type
|
|
7
|
+
* - Messages, function calls, and results are separate events
|
|
8
|
+
*/
|
|
9
|
+
import type { TranscriptEvent } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Parse Codex JSONL transcript into events.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseCodexTranscript(raw: string): {
|
|
14
|
+
events: TranscriptEvent[];
|
|
15
|
+
errors: string[];
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../../src/lib/o11y/parsers/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAY,MAAM,aAAa,CAAC;AAoQ7D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG;IACjD,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CA+CA"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for OpenAI Codex CLI transcript format.
|
|
3
|
+
* Codex outputs JSONL to stdout when run with --json flag.
|
|
4
|
+
*
|
|
5
|
+
* Format reference (based on Codex CLI output):
|
|
6
|
+
* - Events have a "type" field indicating the event type
|
|
7
|
+
* - Messages, function calls, and results are separate events
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Map Codex tool names to canonical names.
|
|
11
|
+
*/
|
|
12
|
+
function normalizeToolName(name) {
|
|
13
|
+
const toolMap = {
|
|
14
|
+
// File operations
|
|
15
|
+
read_file: 'file_read',
|
|
16
|
+
write_file: 'file_write',
|
|
17
|
+
edit_file: 'file_edit',
|
|
18
|
+
patch_file: 'file_edit',
|
|
19
|
+
create_file: 'file_write',
|
|
20
|
+
delete_file: 'file_write',
|
|
21
|
+
// Shell
|
|
22
|
+
shell: 'shell',
|
|
23
|
+
bash: 'shell',
|
|
24
|
+
execute: 'shell',
|
|
25
|
+
run: 'shell',
|
|
26
|
+
exec: 'shell',
|
|
27
|
+
terminal: 'shell',
|
|
28
|
+
// Web
|
|
29
|
+
fetch: 'web_fetch',
|
|
30
|
+
http_request: 'web_fetch',
|
|
31
|
+
curl: 'web_fetch',
|
|
32
|
+
web_search: 'web_search',
|
|
33
|
+
search: 'web_search',
|
|
34
|
+
// Search/navigation
|
|
35
|
+
glob: 'glob',
|
|
36
|
+
find_files: 'glob',
|
|
37
|
+
list_files: 'glob',
|
|
38
|
+
grep: 'grep',
|
|
39
|
+
search_files: 'grep',
|
|
40
|
+
ripgrep: 'grep',
|
|
41
|
+
ls: 'list_dir',
|
|
42
|
+
list_directory: 'list_dir',
|
|
43
|
+
dir: 'list_dir',
|
|
44
|
+
};
|
|
45
|
+
return toolMap[name.toLowerCase()] || 'unknown';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Extract file path from tool arguments.
|
|
49
|
+
*/
|
|
50
|
+
function extractFilePath(args) {
|
|
51
|
+
return (args.path || args.file || args.filename || args.file_path);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Extract URL from tool arguments.
|
|
55
|
+
*/
|
|
56
|
+
function extractUrl(args) {
|
|
57
|
+
return (args.url || args.uri || args.endpoint);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Extract command from tool arguments.
|
|
61
|
+
*/
|
|
62
|
+
function extractCommand(args) {
|
|
63
|
+
if (typeof args.command === 'string')
|
|
64
|
+
return args.command;
|
|
65
|
+
if (Array.isArray(args.command))
|
|
66
|
+
return args.command.join(' ');
|
|
67
|
+
if (typeof args.cmd === 'string')
|
|
68
|
+
return args.cmd;
|
|
69
|
+
if (Array.isArray(args.args) && typeof args.program === 'string') {
|
|
70
|
+
return `${args.program} ${args.args.join(' ')}`;
|
|
71
|
+
}
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Parse a single JSONL line from Codex transcript.
|
|
76
|
+
*/
|
|
77
|
+
function parseCodexLine(line) {
|
|
78
|
+
const events = [];
|
|
79
|
+
try {
|
|
80
|
+
const data = JSON.parse(line);
|
|
81
|
+
// Codex uses various event type formats
|
|
82
|
+
const eventType = data.type || data.event || data.kind;
|
|
83
|
+
switch (eventType) {
|
|
84
|
+
case 'message':
|
|
85
|
+
case 'chat':
|
|
86
|
+
case 'response': {
|
|
87
|
+
const role = data.role || (data.from === 'assistant' ? 'assistant' : 'user');
|
|
88
|
+
events.push({
|
|
89
|
+
timestamp: data.timestamp || data.ts,
|
|
90
|
+
type: 'message',
|
|
91
|
+
role: role,
|
|
92
|
+
content: data.content || data.text || data.message,
|
|
93
|
+
raw: data,
|
|
94
|
+
});
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
case 'function_call':
|
|
98
|
+
case 'tool_call':
|
|
99
|
+
case 'tool_use':
|
|
100
|
+
case 'action': {
|
|
101
|
+
const name = data.function?.name || data.name || data.tool || data.action;
|
|
102
|
+
const args = data.function?.arguments
|
|
103
|
+
? typeof data.function.arguments === 'string'
|
|
104
|
+
? JSON.parse(data.function.arguments)
|
|
105
|
+
: data.function.arguments
|
|
106
|
+
: data.arguments || data.input || data.params || {};
|
|
107
|
+
events.push({
|
|
108
|
+
timestamp: data.timestamp || data.ts,
|
|
109
|
+
type: 'tool_call',
|
|
110
|
+
tool: {
|
|
111
|
+
name: normalizeToolName(name),
|
|
112
|
+
originalName: name,
|
|
113
|
+
args,
|
|
114
|
+
},
|
|
115
|
+
raw: data,
|
|
116
|
+
});
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case 'function_result':
|
|
120
|
+
case 'tool_result':
|
|
121
|
+
case 'tool_response':
|
|
122
|
+
case 'action_result': {
|
|
123
|
+
events.push({
|
|
124
|
+
timestamp: data.timestamp || data.ts,
|
|
125
|
+
type: 'tool_result',
|
|
126
|
+
tool: {
|
|
127
|
+
name: 'unknown',
|
|
128
|
+
originalName: data.tool || data.function || 'unknown',
|
|
129
|
+
result: data.result || data.output || data.content,
|
|
130
|
+
success: data.success !== false && !data.error,
|
|
131
|
+
},
|
|
132
|
+
raw: data,
|
|
133
|
+
});
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
case 'thinking':
|
|
137
|
+
case 'reasoning':
|
|
138
|
+
case 'thought': {
|
|
139
|
+
events.push({
|
|
140
|
+
timestamp: data.timestamp || data.ts,
|
|
141
|
+
type: 'thinking',
|
|
142
|
+
content: data.content || data.text || data.thought,
|
|
143
|
+
raw: data,
|
|
144
|
+
});
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
case 'error': {
|
|
148
|
+
events.push({
|
|
149
|
+
timestamp: data.timestamp || data.ts,
|
|
150
|
+
type: 'error',
|
|
151
|
+
content: data.error?.message || data.message || data.content,
|
|
152
|
+
raw: data,
|
|
153
|
+
});
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
// Codex Responses API events
|
|
157
|
+
case 'thread.started':
|
|
158
|
+
case 'thread.completed':
|
|
159
|
+
case 'turn.started':
|
|
160
|
+
case 'turn.completed':
|
|
161
|
+
case 'turn.failed': {
|
|
162
|
+
// These are control flow events, capture as metadata
|
|
163
|
+
events.push({
|
|
164
|
+
timestamp: data.timestamp || data.ts,
|
|
165
|
+
type: eventType === 'turn.failed' ? 'error' : 'message',
|
|
166
|
+
role: 'system',
|
|
167
|
+
content: eventType === 'turn.failed'
|
|
168
|
+
? (data.error?.message || `Turn failed`)
|
|
169
|
+
: eventType,
|
|
170
|
+
raw: data,
|
|
171
|
+
});
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
case 'response.created':
|
|
175
|
+
case 'response.completed':
|
|
176
|
+
case 'response.cancelled':
|
|
177
|
+
case 'response.failed': {
|
|
178
|
+
// Response lifecycle events
|
|
179
|
+
if (eventType === 'response.failed') {
|
|
180
|
+
events.push({
|
|
181
|
+
timestamp: data.timestamp || data.ts,
|
|
182
|
+
type: 'error',
|
|
183
|
+
content: data.error?.message || 'Response failed',
|
|
184
|
+
raw: data,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
case 'output_text.delta':
|
|
190
|
+
case 'output_text.done': {
|
|
191
|
+
// Text streaming events
|
|
192
|
+
if (data.text || data.delta) {
|
|
193
|
+
events.push({
|
|
194
|
+
timestamp: data.timestamp || data.ts,
|
|
195
|
+
type: 'message',
|
|
196
|
+
role: 'assistant',
|
|
197
|
+
content: data.text || data.delta,
|
|
198
|
+
raw: data,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
default: {
|
|
204
|
+
// Try to infer from structure
|
|
205
|
+
if (data.role === 'assistant' || data.role === 'user') {
|
|
206
|
+
events.push({
|
|
207
|
+
timestamp: data.timestamp || data.ts,
|
|
208
|
+
type: 'message',
|
|
209
|
+
role: data.role,
|
|
210
|
+
content: data.content || data.text,
|
|
211
|
+
raw: data,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
else if (data.function || data.tool) {
|
|
215
|
+
// Looks like a tool call or result
|
|
216
|
+
if (data.result !== undefined || data.output !== undefined) {
|
|
217
|
+
events.push({
|
|
218
|
+
timestamp: data.timestamp || data.ts,
|
|
219
|
+
type: 'tool_result',
|
|
220
|
+
tool: {
|
|
221
|
+
name: 'unknown',
|
|
222
|
+
originalName: data.function || data.tool || 'unknown',
|
|
223
|
+
result: data.result || data.output,
|
|
224
|
+
success: !data.error,
|
|
225
|
+
},
|
|
226
|
+
raw: data,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
const name = data.function?.name || data.function || data.tool;
|
|
231
|
+
events.push({
|
|
232
|
+
timestamp: data.timestamp || data.ts,
|
|
233
|
+
type: 'tool_call',
|
|
234
|
+
tool: {
|
|
235
|
+
name: normalizeToolName(name),
|
|
236
|
+
originalName: name,
|
|
237
|
+
args: data.arguments || data.input || {},
|
|
238
|
+
},
|
|
239
|
+
raw: data,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
// Skip unparseable lines
|
|
248
|
+
}
|
|
249
|
+
return events;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Parse Codex JSONL transcript into events.
|
|
253
|
+
*/
|
|
254
|
+
export function parseCodexTranscript(raw) {
|
|
255
|
+
const events = [];
|
|
256
|
+
const errors = [];
|
|
257
|
+
const lines = raw.split('\n').filter((line) => line.trim());
|
|
258
|
+
for (const line of lines) {
|
|
259
|
+
try {
|
|
260
|
+
const lineEvents = parseCodexLine(line);
|
|
261
|
+
events.push(...lineEvents);
|
|
262
|
+
}
|
|
263
|
+
catch (e) {
|
|
264
|
+
errors.push(`Failed to parse line: ${e instanceof Error ? e.message : String(e)}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Post-process to extract additional metadata
|
|
268
|
+
for (const event of events) {
|
|
269
|
+
if (event.type === 'tool_call' && event.tool) {
|
|
270
|
+
const args = event.tool.args || {};
|
|
271
|
+
// Extract file paths for file operations
|
|
272
|
+
if (['file_read', 'file_write', 'file_edit'].includes(event.tool.name)) {
|
|
273
|
+
const path = extractFilePath(args);
|
|
274
|
+
if (path) {
|
|
275
|
+
event.tool.args = { ...args, _extractedPath: path };
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// Extract URLs for web fetches
|
|
279
|
+
if (event.tool.name === 'web_fetch') {
|
|
280
|
+
const url = extractUrl(args);
|
|
281
|
+
if (url) {
|
|
282
|
+
event.tool.args = { ...args, _extractedUrl: url };
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Extract commands for shell operations
|
|
286
|
+
if (event.tool.name === 'shell') {
|
|
287
|
+
const command = extractCommand(args);
|
|
288
|
+
if (command) {
|
|
289
|
+
event.tool.args = { ...args, _extractedCommand: command };
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return { events, errors };
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=codex.js.map
|