@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.
Files changed (53) hide show
  1. package/dist/cli.js +69 -13
  2. package/dist/cli.js.map +1 -1
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/lib/agents/index.d.ts.map +1 -1
  8. package/dist/lib/agents/index.js +0 -2
  9. package/dist/lib/agents/index.js.map +1 -1
  10. package/dist/lib/config.d.ts.map +1 -1
  11. package/dist/lib/config.js +3 -1
  12. package/dist/lib/config.js.map +1 -1
  13. package/dist/lib/o11y/index.d.ts +11 -0
  14. package/dist/lib/o11y/index.d.ts.map +1 -0
  15. package/dist/lib/o11y/index.js +11 -0
  16. package/dist/lib/o11y/index.js.map +1 -0
  17. package/dist/lib/o11y/parsers/claude-code.d.ts +18 -0
  18. package/dist/lib/o11y/parsers/claude-code.d.ts.map +1 -0
  19. package/dist/lib/o11y/parsers/claude-code.js +343 -0
  20. package/dist/lib/o11y/parsers/claude-code.js.map +1 -0
  21. package/dist/lib/o11y/parsers/codex.d.ts +17 -0
  22. package/dist/lib/o11y/parsers/codex.d.ts.map +1 -0
  23. package/dist/lib/o11y/parsers/codex.js +296 -0
  24. package/dist/lib/o11y/parsers/codex.js.map +1 -0
  25. package/dist/lib/o11y/parsers/index.d.ts +51 -0
  26. package/dist/lib/o11y/parsers/index.d.ts.map +1 -0
  27. package/dist/lib/o11y/parsers/index.js +280 -0
  28. package/dist/lib/o11y/parsers/index.js.map +1 -0
  29. package/dist/lib/o11y/parsers/opencode.d.ts +17 -0
  30. package/dist/lib/o11y/parsers/opencode.d.ts.map +1 -0
  31. package/dist/lib/o11y/parsers/opencode.js +313 -0
  32. package/dist/lib/o11y/parsers/opencode.js.map +1 -0
  33. package/dist/lib/o11y/types.d.ts +113 -0
  34. package/dist/lib/o11y/types.d.ts.map +1 -0
  35. package/dist/lib/o11y/types.js +6 -0
  36. package/dist/lib/o11y/types.js.map +1 -0
  37. package/dist/lib/results.d.ts +2 -1
  38. package/dist/lib/results.d.ts.map +1 -1
  39. package/dist/lib/results.js +23 -7
  40. package/dist/lib/results.js.map +1 -1
  41. package/dist/lib/runner.d.ts +6 -5
  42. package/dist/lib/runner.d.ts.map +1 -1
  43. package/dist/lib/runner.js +21 -11
  44. package/dist/lib/runner.js.map +1 -1
  45. package/dist/lib/types.d.ts +25 -3
  46. package/dist/lib/types.d.ts.map +1 -1
  47. package/dist/lib/types.js.map +1 -1
  48. package/package.json +5 -3
  49. package/README.md +0 -474
  50. package/dist/lib/agents/ai-sdk-agent.d.ts +0 -10
  51. package/dist/lib/agents/ai-sdk-agent.d.ts.map +0 -1
  52. package/dist/lib/agents/ai-sdk-agent.js +0 -427
  53. 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