@vercel/agent-eval 2.4.1 → 2.6.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 (132) hide show
  1. package/dist/cli.js +27 -21
  2. package/dist/cli.js.map +1 -1
  3. package/dist/index.d.ts +8 -4
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +5 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/lib/agents/claude-code/agent.d.ts.map +1 -1
  8. package/dist/lib/agents/claude-code/agent.js +5 -1
  9. package/dist/lib/agents/claude-code/agent.js.map +1 -1
  10. package/dist/lib/agents/codex/agent.d.ts.map +1 -1
  11. package/dist/lib/agents/codex/agent.js +5 -1
  12. package/dist/lib/agents/codex/agent.js.map +1 -1
  13. package/dist/lib/agents/cursor/agent.d.ts.map +1 -1
  14. package/dist/lib/agents/cursor/agent.js +5 -0
  15. package/dist/lib/agents/cursor/agent.js.map +1 -1
  16. package/dist/lib/agents/fx/agent.d.ts.map +1 -1
  17. package/dist/lib/agents/fx/agent.js +3 -0
  18. package/dist/lib/agents/fx/agent.js.map +1 -1
  19. package/dist/lib/agents/fx/run.mjs +26 -0
  20. package/dist/lib/agents/gemini/agent.d.ts.map +1 -1
  21. package/dist/lib/agents/gemini/agent.js +5 -1
  22. package/dist/lib/agents/gemini/agent.js.map +1 -1
  23. package/dist/lib/agents/index.d.ts +1 -0
  24. package/dist/lib/agents/index.d.ts.map +1 -1
  25. package/dist/lib/agents/index.js +4 -0
  26. package/dist/lib/agents/index.js.map +1 -1
  27. package/dist/lib/agents/opencode/agent.d.ts.map +1 -1
  28. package/dist/lib/agents/opencode/agent.js +6 -0
  29. package/dist/lib/agents/opencode/agent.js.map +1 -1
  30. package/dist/lib/agents/pi-coding-agent/agent.d.ts +61 -0
  31. package/dist/lib/agents/pi-coding-agent/agent.d.ts.map +1 -0
  32. package/dist/lib/agents/pi-coding-agent/agent.js +127 -0
  33. package/dist/lib/agents/pi-coding-agent/agent.js.map +1 -0
  34. package/dist/lib/agents/pi-coding-agent/run.mjs +278 -0
  35. package/dist/lib/agents/plugin/contract.d.ts +40 -0
  36. package/dist/lib/agents/plugin/contract.d.ts.map +1 -1
  37. package/dist/lib/agents/plugin/contract.js.map +1 -1
  38. package/dist/lib/agents/plugin/orchestrator.d.ts +19 -0
  39. package/dist/lib/agents/plugin/orchestrator.d.ts.map +1 -1
  40. package/dist/lib/agents/plugin/orchestrator.js +269 -53
  41. package/dist/lib/agents/plugin/orchestrator.js.map +1 -1
  42. package/dist/lib/agents/redact.d.ts +34 -3
  43. package/dist/lib/agents/redact.d.ts.map +1 -1
  44. package/dist/lib/agents/redact.js +148 -35
  45. package/dist/lib/agents/redact.js.map +1 -1
  46. package/dist/lib/agents/shared.d.ts +24 -1
  47. package/dist/lib/agents/shared.d.ts.map +1 -1
  48. package/dist/lib/agents/shared.js +48 -13
  49. package/dist/lib/agents/shared.js.map +1 -1
  50. package/dist/lib/agents/types.d.ts +24 -1
  51. package/dist/lib/agents/types.d.ts.map +1 -1
  52. package/dist/lib/agents/verifier.d.ts +96 -0
  53. package/dist/lib/agents/verifier.d.ts.map +1 -0
  54. package/dist/lib/agents/verifier.js +176 -0
  55. package/dist/lib/agents/verifier.js.map +1 -0
  56. package/dist/lib/config.d.ts.map +1 -1
  57. package/dist/lib/config.js +24 -0
  58. package/dist/lib/config.js.map +1 -1
  59. package/dist/lib/dashboard.d.ts +3 -1
  60. package/dist/lib/dashboard.d.ts.map +1 -1
  61. package/dist/lib/dashboard.js +12 -1
  62. package/dist/lib/dashboard.js.map +1 -1
  63. package/dist/lib/docker-sandbox.d.ts +9 -0
  64. package/dist/lib/docker-sandbox.d.ts.map +1 -1
  65. package/dist/lib/docker-sandbox.js +15 -0
  66. package/dist/lib/docker-sandbox.js.map +1 -1
  67. package/dist/lib/fingerprint.d.ts +3 -0
  68. package/dist/lib/fingerprint.d.ts.map +1 -1
  69. package/dist/lib/fingerprint.js +34 -0
  70. package/dist/lib/fingerprint.js.map +1 -1
  71. package/dist/lib/o11y/index.d.ts +3 -2
  72. package/dist/lib/o11y/index.d.ts.map +1 -1
  73. package/dist/lib/o11y/index.js +2 -1
  74. package/dist/lib/o11y/index.js.map +1 -1
  75. package/dist/lib/o11y/parsers/claude-code.d.ts +19 -1
  76. package/dist/lib/o11y/parsers/claude-code.d.ts.map +1 -1
  77. package/dist/lib/o11y/parsers/claude-code.js +72 -1
  78. package/dist/lib/o11y/parsers/claude-code.js.map +1 -1
  79. package/dist/lib/o11y/parsers/codex.d.ts +13 -1
  80. package/dist/lib/o11y/parsers/codex.d.ts.map +1 -1
  81. package/dist/lib/o11y/parsers/codex.js +68 -1
  82. package/dist/lib/o11y/parsers/codex.js.map +1 -1
  83. package/dist/lib/o11y/parsers/fx.d.ts +2 -1
  84. package/dist/lib/o11y/parsers/fx.d.ts.map +1 -1
  85. package/dist/lib/o11y/parsers/fx.js +21 -1
  86. package/dist/lib/o11y/parsers/fx.js.map +1 -1
  87. package/dist/lib/o11y/parsers/gemini.d.ts +13 -1
  88. package/dist/lib/o11y/parsers/gemini.d.ts.map +1 -1
  89. package/dist/lib/o11y/parsers/gemini.js +35 -1
  90. package/dist/lib/o11y/parsers/gemini.js.map +1 -1
  91. package/dist/lib/o11y/parsers/index.d.ts +9 -2
  92. package/dist/lib/o11y/parsers/index.d.ts.map +1 -1
  93. package/dist/lib/o11y/parsers/index.js +15 -1
  94. package/dist/lib/o11y/parsers/index.js.map +1 -1
  95. package/dist/lib/o11y/parsers/opencode.d.ts +17 -1
  96. package/dist/lib/o11y/parsers/opencode.d.ts.map +1 -1
  97. package/dist/lib/o11y/parsers/opencode.js +47 -4
  98. package/dist/lib/o11y/parsers/opencode.js.map +1 -1
  99. package/dist/lib/o11y/parsers/pi-coding-agent.d.ts +22 -0
  100. package/dist/lib/o11y/parsers/pi-coding-agent.d.ts.map +1 -0
  101. package/dist/lib/o11y/parsers/pi-coding-agent.js +217 -0
  102. package/dist/lib/o11y/parsers/pi-coding-agent.js.map +1 -0
  103. package/dist/lib/o11y/types.d.ts +30 -0
  104. package/dist/lib/o11y/types.d.ts.map +1 -1
  105. package/dist/lib/o11y/usage.d.ts +27 -0
  106. package/dist/lib/o11y/usage.d.ts.map +1 -0
  107. package/dist/lib/o11y/usage.js +75 -0
  108. package/dist/lib/o11y/usage.js.map +1 -0
  109. package/dist/lib/reporters.d.ts +101 -0
  110. package/dist/lib/reporters.d.ts.map +1 -0
  111. package/dist/lib/reporters.js +176 -0
  112. package/dist/lib/reporters.js.map +1 -0
  113. package/dist/lib/results.d.ts +15 -2
  114. package/dist/lib/results.d.ts.map +1 -1
  115. package/dist/lib/results.js +75 -4
  116. package/dist/lib/results.js.map +1 -1
  117. package/dist/lib/runner.d.ts +16 -1
  118. package/dist/lib/runner.d.ts.map +1 -1
  119. package/dist/lib/runner.js +85 -3
  120. package/dist/lib/runner.js.map +1 -1
  121. package/dist/lib/sandbox.d.ts +9 -0
  122. package/dist/lib/sandbox.d.ts.map +1 -1
  123. package/dist/lib/sandbox.js +14 -1
  124. package/dist/lib/sandbox.js.map +1 -1
  125. package/dist/lib/types.d.ts +185 -1
  126. package/dist/lib/types.d.ts.map +1 -1
  127. package/dist/lib/types.js.map +1 -1
  128. package/dist/lib/version.d.ts +7 -0
  129. package/dist/lib/version.d.ts.map +1 -0
  130. package/dist/lib/version.js +8 -0
  131. package/dist/lib/version.js.map +1 -0
  132. package/package.json +1 -1
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Parser for the PI coding agent transcript format (`pi --mode json`).
3
+ *
4
+ * The transcript is JSONL of PI session events. Everything we need rides on
5
+ * `message_end`, whose `message` is one of:
6
+ * - role 'user' → the prompt
7
+ * - role 'assistant' → content blocks: text | thinking | toolCall
8
+ * - role 'toolResult' → the result of one toolCall (isError, content blocks)
9
+ *
10
+ * The runner already strips the streaming duplicates (`message_update`,
11
+ * `turn_end`, `agent_end`, …), but they are ignored here too, so a raw
12
+ * unfiltered stream parses to the same events without double counting.
13
+ */
14
+ /**
15
+ * Map PI tool names to canonical names.
16
+ */
17
+ function normalizeToolName(name) {
18
+ const toolMap = {
19
+ read: 'file_read',
20
+ write: 'file_write',
21
+ edit: 'file_edit',
22
+ bash: 'shell',
23
+ grep: 'grep',
24
+ find: 'glob',
25
+ ls: 'list_dir',
26
+ };
27
+ return toolMap[name.toLowerCase()] || 'unknown';
28
+ }
29
+ /**
30
+ * Convert PI's epoch-millisecond timestamps to ISO strings.
31
+ */
32
+ function toISO(ts) {
33
+ if (typeof ts === 'number')
34
+ return new Date(ts).toISOString();
35
+ if (typeof ts === 'string')
36
+ return ts;
37
+ return undefined;
38
+ }
39
+ /**
40
+ * Join the text blocks of a PI content value (a string or an array of blocks).
41
+ */
42
+ function extractText(content) {
43
+ if (typeof content === 'string')
44
+ return content;
45
+ if (!Array.isArray(content))
46
+ return '';
47
+ return content
48
+ .filter((block) => block?.type === 'text' && typeof block.text === 'string')
49
+ .map((block) => block.text)
50
+ .join('\n');
51
+ }
52
+ /**
53
+ * PI's bash tool reports a non-zero exit as a trailing "Command exited with code N"
54
+ * line in the result text, and nothing at all on success — so the suffix only
55
+ * means something on a failed result (a successful command may print that text).
56
+ */
57
+ function extractExitCode(text, success) {
58
+ if (success)
59
+ return 0;
60
+ const match = text.match(/Command exited with code (\d+)\s*$/);
61
+ return match ? Number(match[1]) : undefined;
62
+ }
63
+ /**
64
+ * Move each tool result directly after the call it answers.
65
+ *
66
+ * PI emits one assistant message carrying ALL its tool calls, then the results
67
+ * (`call A, call B, result A, result B`). The shared summary — like the other
68
+ * parsers' output — expects a result to follow its own call, so pair them by
69
+ * PI's toolCallId. Results with no matching call keep their position.
70
+ */
71
+ function pairToolResults(events) {
72
+ const ordered = [];
73
+ const openCalls = new Map();
74
+ for (const event of events) {
75
+ if (event.type === 'tool_call') {
76
+ const id = event.raw?.id;
77
+ if (typeof id === 'string')
78
+ openCalls.set(id, event);
79
+ }
80
+ else if (event.type === 'tool_result') {
81
+ const id = event.raw?.message?.toolCallId;
82
+ const call = typeof id === 'string' ? openCalls.get(id) : undefined;
83
+ if (call) {
84
+ openCalls.delete(id);
85
+ ordered.splice(ordered.indexOf(call) + 1, 0, event);
86
+ continue;
87
+ }
88
+ }
89
+ ordered.push(event);
90
+ }
91
+ return ordered;
92
+ }
93
+ /**
94
+ * Parse a single JSONL line from a PI transcript.
95
+ */
96
+ function parsePiLine(line) {
97
+ const events = [];
98
+ try {
99
+ const data = JSON.parse(line);
100
+ if (data.type === 'auto_retry_end' && data.success === false) {
101
+ events.push({
102
+ type: 'error',
103
+ content: data.finalError || 'PI exhausted its retries',
104
+ raw: data,
105
+ });
106
+ return events;
107
+ }
108
+ if (data.type !== 'message_end' || !data.message) {
109
+ // session, agent/turn lifecycle, tool_execution_*, compaction, streaming
110
+ // deltas — nothing the message_end events don't already carry.
111
+ return events;
112
+ }
113
+ const message = data.message;
114
+ const timestamp = toISO(message.timestamp);
115
+ if (message.role === 'user') {
116
+ const text = extractText(message.content);
117
+ if (text.trim()) {
118
+ events.push({ timestamp, type: 'message', role: 'user', content: text, raw: data });
119
+ }
120
+ return events;
121
+ }
122
+ if (message.role === 'assistant') {
123
+ const blocks = Array.isArray(message.content) ? message.content : [];
124
+ for (const block of blocks) {
125
+ if (block?.type === 'thinking' && typeof block.thinking === 'string' && block.thinking.trim()) {
126
+ events.push({ timestamp, type: 'thinking', content: block.thinking, raw: block });
127
+ }
128
+ else if (block?.type === 'toolCall') {
129
+ const name = block.name || 'unknown';
130
+ events.push({
131
+ timestamp,
132
+ type: 'tool_call',
133
+ tool: {
134
+ name: normalizeToolName(name),
135
+ originalName: name,
136
+ args: block.arguments || {},
137
+ },
138
+ raw: block,
139
+ });
140
+ }
141
+ }
142
+ // One message event per assistant message (= one turn), even when it only
143
+ // carries tool calls.
144
+ events.push({
145
+ timestamp,
146
+ type: 'message',
147
+ role: 'assistant',
148
+ content: extractText(blocks),
149
+ raw: data,
150
+ });
151
+ if (message.stopReason === 'error' || message.stopReason === 'aborted') {
152
+ events.push({
153
+ timestamp,
154
+ type: 'error',
155
+ content: message.errorMessage || `PI stopped with reason "${message.stopReason}"`,
156
+ raw: data,
157
+ });
158
+ }
159
+ return events;
160
+ }
161
+ if (message.role === 'toolResult') {
162
+ const name = message.toolName || 'unknown';
163
+ const toolName = normalizeToolName(name);
164
+ const text = extractText(message.content);
165
+ const success = message.isError !== true;
166
+ events.push({
167
+ timestamp,
168
+ type: 'tool_result',
169
+ tool: {
170
+ name: toolName,
171
+ originalName: name,
172
+ result: toolName === 'shell' ? { output: text, exitCode: extractExitCode(text, success) } : text,
173
+ success,
174
+ },
175
+ raw: data,
176
+ });
177
+ return events;
178
+ }
179
+ }
180
+ catch {
181
+ // Skip unparseable lines
182
+ }
183
+ return events;
184
+ }
185
+ /**
186
+ * Parse PI JSONL transcript into normalized events.
187
+ */
188
+ export function parsePiCodingAgentTranscript(raw) {
189
+ const parsed = [];
190
+ const errors = [];
191
+ const lines = raw.split('\n').filter((line) => line.trim());
192
+ for (const line of lines) {
193
+ try {
194
+ parsed.push(...parsePiLine(line));
195
+ }
196
+ catch (e) {
197
+ errors.push(`Failed to parse line: ${e instanceof Error ? e.message : String(e)}`);
198
+ }
199
+ }
200
+ const events = pairToolResults(parsed);
201
+ // Post-process: extract metadata into tool args
202
+ for (const event of events) {
203
+ if (event.type === 'tool_call' && event.tool) {
204
+ const args = event.tool.args || {};
205
+ if (['file_read', 'file_write', 'file_edit'].includes(event.tool.name)) {
206
+ if (typeof args.path === 'string') {
207
+ event.tool.args = { ...args, _extractedPath: args.path };
208
+ }
209
+ }
210
+ if (event.tool.name === 'shell' && typeof args.command === 'string') {
211
+ event.tool.args = { ...args, _extractedCommand: args.command };
212
+ }
213
+ }
214
+ }
215
+ return { events, errors };
216
+ }
217
+ //# sourceMappingURL=pi-coding-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-coding-agent.js","sourceRoot":"","sources":["../../../../src/lib/o11y/parsers/pi-coding-agent.ts"],"names":[],"mappings":"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"}
@@ -70,6 +70,33 @@ export interface ShellCommandInfo {
70
70
  /** Whether the command succeeded */
71
71
  success?: boolean;
72
72
  }
73
+ /**
74
+ * Token usage for one agent run, read from what the agent CLI itself reports.
75
+ *
76
+ * Every field is optional: a field is set only when the transcript exposes it,
77
+ * and nothing is estimated or derived from a price table. Agent CLIs count
78
+ * tokens differently, so compare `totalTokens` across agents and treat the
79
+ * per-component fields as each CLI reports them (see the README's per-agent
80
+ * table).
81
+ */
82
+ export interface TokenUsage {
83
+ /** Prompt tokens. Excludes cache reads and writes when the CLI reports those
84
+ * separately; otherwise the CLI's full prompt count. */
85
+ inputTokens?: number;
86
+ /** Generated tokens, as the CLI counts them. */
87
+ outputTokens?: number;
88
+ /** Prompt tokens served from the provider's prompt cache. */
89
+ cacheReadTokens?: number;
90
+ /** Prompt tokens written to the provider's prompt cache. */
91
+ cacheWriteTokens?: number;
92
+ /** Reasoning tokens, when the CLI reports them separately. */
93
+ reasoningTokens?: number;
94
+ /** The CLI's own total, or the sum of the input, cache, and output counts
95
+ * when the CLI reports non-overlapping counts but no total. */
96
+ totalTokens?: number;
97
+ /** Only when the agent CLI itself reports a cost. Never computed from a price table. */
98
+ costUsd?: number;
99
+ }
73
100
  /**
74
101
  * Summary statistics derived from the transcript.
75
102
  */
@@ -92,6 +119,9 @@ export interface TranscriptSummary {
92
119
  errors: string[];
93
120
  /** Thinking/reasoning blocks (if available) */
94
121
  thinkingBlocks: number;
122
+ /** Token usage of the code-generation run, when the transcript reports it.
123
+ * Judge assertions run separately and are not included. */
124
+ usage?: TokenUsage;
95
125
  }
96
126
  /**
97
127
  * A parsed transcript with events and summary.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/o11y/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/o11y/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Shared helpers for reading token usage out of agent transcripts.
3
+ *
4
+ * Each parser owns the knowledge of where its CLI reports usage; these helpers
5
+ * only keep the arithmetic consistent: counts must be finite and non-negative,
6
+ * a sum is reported only when every part of it was reported, and a usage object
7
+ * with nothing in it is undefined rather than a row of zeros.
8
+ */
9
+ import type { TokenUsage } from './types.js';
10
+ /** The usage fields that hold token counts (everything except cost). */
11
+ export declare const TOKEN_COUNT_FIELDS: readonly ["inputTokens", "outputTokens", "cacheReadTokens", "cacheWriteTokens", "reasoningTokens", "totalTokens"];
12
+ /** A reported count: a finite, non-negative number. Anything else is unreported. */
13
+ export declare function reportedNumber(value: unknown): number | undefined;
14
+ /**
15
+ * Sum values that must all be reported. One missing value makes the sum
16
+ * undefined, because a partial sum would understate the real figure.
17
+ */
18
+ export declare function sumReported(values: readonly (number | undefined)[]): number | undefined;
19
+ /** Sum each field of several usage records with {@link sumReported} semantics. */
20
+ export declare function sumUsage(records: readonly TokenUsage[]): TokenUsage | undefined;
21
+ /** Drop unreported fields. Returns undefined when no field was reported. */
22
+ export declare function compactUsage(usage: TokenUsage): TokenUsage | undefined;
23
+ /** Parse one JSONL line into an object, or undefined for anything else. */
24
+ export declare function parseJsonLine(line: string): Record<string, unknown> | undefined;
25
+ /** Narrow an unknown value to a plain object. */
26
+ export declare function asRecord(value: unknown): Record<string, unknown> | undefined;
27
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/lib/o11y/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,mHAOmB,CAAC;AAEnD,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEjE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,GAAG,SAAS,CAQvF;AAED,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,GAAG,SAAS,CAO/E;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAMtE;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAS/E;AAED,iDAAiD;AACjD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAI5E"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Shared helpers for reading token usage out of agent transcripts.
3
+ *
4
+ * Each parser owns the knowledge of where its CLI reports usage; these helpers
5
+ * only keep the arithmetic consistent: counts must be finite and non-negative,
6
+ * a sum is reported only when every part of it was reported, and a usage object
7
+ * with nothing in it is undefined rather than a row of zeros.
8
+ */
9
+ /** The usage fields that hold token counts (everything except cost). */
10
+ export const TOKEN_COUNT_FIELDS = [
11
+ 'inputTokens',
12
+ 'outputTokens',
13
+ 'cacheReadTokens',
14
+ 'cacheWriteTokens',
15
+ 'reasoningTokens',
16
+ 'totalTokens',
17
+ ];
18
+ /** A reported count: a finite, non-negative number. Anything else is unreported. */
19
+ export function reportedNumber(value) {
20
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;
21
+ }
22
+ /**
23
+ * Sum values that must all be reported. One missing value makes the sum
24
+ * undefined, because a partial sum would understate the real figure.
25
+ */
26
+ export function sumReported(values) {
27
+ if (values.length === 0)
28
+ return undefined;
29
+ let total = 0;
30
+ for (const value of values) {
31
+ if (value === undefined)
32
+ return undefined;
33
+ total += value;
34
+ }
35
+ return total;
36
+ }
37
+ /** Sum each field of several usage records with {@link sumReported} semantics. */
38
+ export function sumUsage(records) {
39
+ if (records.length === 0)
40
+ return undefined;
41
+ const summed = {};
42
+ for (const field of [...TOKEN_COUNT_FIELDS, 'costUsd']) {
43
+ summed[field] = sumReported(records.map((record) => record[field]));
44
+ }
45
+ return compactUsage(summed);
46
+ }
47
+ /** Drop unreported fields. Returns undefined when no field was reported. */
48
+ export function compactUsage(usage) {
49
+ const compacted = {};
50
+ for (const [field, value] of Object.entries(usage)) {
51
+ if (value !== undefined)
52
+ compacted[field] = value;
53
+ }
54
+ return Object.keys(compacted).length > 0 ? compacted : undefined;
55
+ }
56
+ /** Parse one JSONL line into an object, or undefined for anything else. */
57
+ export function parseJsonLine(line) {
58
+ const trimmed = line.trim();
59
+ if (!trimmed.startsWith('{'))
60
+ return undefined;
61
+ try {
62
+ const value = JSON.parse(trimmed);
63
+ return asRecord(value);
64
+ }
65
+ catch {
66
+ return undefined;
67
+ }
68
+ }
69
+ /** Narrow an unknown value to a plain object. */
70
+ export function asRecord(value) {
71
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
72
+ ? value
73
+ : undefined;
74
+ }
75
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/lib/o11y/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,wEAAwE;AACxE,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,aAAa;IACb,cAAc;IACd,iBAAiB;IACjB,kBAAkB;IAClB,iBAAiB;IACjB,aAAa;CACmC,CAAC;AAEnD,oFAAoF;AACpF,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAuC;IACjE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC1C,KAAK,IAAI,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,QAAQ,CAAC,OAA8B;IACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,kBAAkB,EAAE,SAAS,CAAU,EAAE,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAA6C,EAAE,CAAC;QAC/F,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzE,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Reporters: first-class hooks that send results somewhere besides the local
3
+ * results/ tree.
4
+ *
5
+ * The runner calls {@link notifyRunComplete} once per finished run and
6
+ * {@link notifyExperimentComplete} once per experiment. Both isolate reporter
7
+ * failures: an error is caught, redacted, handed to `onFailure`, and the next
8
+ * reporter still runs. Nothing a reporter does can change an eval result.
9
+ */
10
+ import type { ProgressEvent, Reporter, ReporterExperimentEvent, ReporterRunEvent } from './types.js';
11
+ /** One reporter call that threw or rejected. */
12
+ export interface ReporterFailure {
13
+ /** Name of the reporter that failed. */
14
+ reporter: string;
15
+ /** Which hook failed. */
16
+ hook: 'onRunComplete' | 'onExperimentComplete';
17
+ /** Set for run events. */
18
+ evalName?: string;
19
+ /** Zero-based attempt index, set for run events. */
20
+ runIndex?: number;
21
+ /** The error message, redacted. */
22
+ error: string;
23
+ }
24
+ /** How to deliver an event to a list of reporters. */
25
+ export interface ReporterDispatchOptions {
26
+ /** Credentials to scrub from the payload and from error messages. */
27
+ secrets: readonly (string | undefined)[];
28
+ /** Called for each reporter call that fails. */
29
+ onFailure?: (failure: ReporterFailure) => void;
30
+ }
31
+ /** One line describing a failed reporter call, for the CLI and logs. */
32
+ export declare function formatReporterError(event: Extract<ProgressEvent, {
33
+ type: 'reporter:error';
34
+ }>): string;
35
+ /**
36
+ * Deliver a run event to every reporter with an `onRunComplete` hook, in order.
37
+ * Returns the failures (also passed to `onFailure`).
38
+ */
39
+ export declare function notifyRunComplete(reporters: readonly Reporter[], event: ReporterRunEvent, options: ReporterDispatchOptions): Promise<ReporterFailure[]>;
40
+ /**
41
+ * Deliver an experiment event to every reporter with an
42
+ * `onExperimentComplete` hook, in order. Returns the failures (also passed to
43
+ * `onFailure`).
44
+ */
45
+ export declare function notifyExperimentComplete(reporters: readonly Reporter[], event: ReporterExperimentEvent, options: ReporterDispatchOptions): Promise<ReporterFailure[]>;
46
+ /**
47
+ * The JSON form of an experiment event used by the built-in reporters.
48
+ *
49
+ * `results` in a {@link ReporterExperimentEvent} carries everything the run
50
+ * produced: transcripts, script output, and generated files as raw bytes. A
51
+ * network payload doesn't need those (they're on disk under `outputDir`), so
52
+ * each run is reduced to its `result`. Config functions and the reporters
53
+ * themselves are left out too, since they aren't data.
54
+ */
55
+ export declare function experimentEventToJson(event: ReporterExperimentEvent): Record<string, unknown>;
56
+ /** Options for {@link jsonlReporter}. */
57
+ export interface JsonlReporterOptions {
58
+ /** File to append to. Parent directories are created. */
59
+ path: string;
60
+ }
61
+ /**
62
+ * Append one JSON line per finished run to a file. Each line is a
63
+ * {@link ReporterRunEvent}. Writes are serialized, so concurrent runs never
64
+ * interleave lines.
65
+ *
66
+ * @example
67
+ * ```ts
68
+ * reporters: [jsonlReporter({ path: 'results/runs.jsonl' })]
69
+ * ```
70
+ */
71
+ export declare function jsonlReporter(options: JsonlReporterOptions): Reporter;
72
+ /** Options for {@link httpReporter}. */
73
+ export interface HttpReporterOptions {
74
+ /** Endpoint that receives a JSON POST per event. */
75
+ url: string;
76
+ /** Extra request headers, for example an authorization header. */
77
+ headers?: Record<string, string>;
78
+ /** Retries after the first attempt for network errors, 429, and 5xx responses. @default 2 */
79
+ retries?: number;
80
+ /** Delay before the first retry, doubled for each later one. @default 500 */
81
+ retryDelayMs?: number;
82
+ }
83
+ /**
84
+ * POST each event as JSON. Run events are sent as
85
+ * `{ "type": "run", ...ReporterRunEvent }`; experiment events as
86
+ * `{ "type": "experiment", ...experimentEventToJson(event) }`. Network errors,
87
+ * 429, and 5xx responses are retried with exponential backoff; other non-2xx
88
+ * responses fail at once.
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * reporters: [
93
+ * httpReporter({
94
+ * url: 'https://example.com/ingest',
95
+ * headers: { authorization: `Bearer ${process.env.INGEST_TOKEN}` },
96
+ * }),
97
+ * ]
98
+ * ```
99
+ */
100
+ export declare function httpReporter(options: HttpReporterOptions): Reporter;
101
+ //# sourceMappingURL=reporters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporters.d.ts","sourceRoot":"","sources":["../../src/lib/reporters.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,QAAQ,EACR,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAGpB,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,IAAI,EAAE,eAAe,GAAG,sBAAsB,CAAC;IAC/C,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,sDAAsD;AACtD,MAAM,WAAW,uBAAuB;IACtC,qEAAqE;IACrE,OAAO,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IACzC,gDAAgD;IAChD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;CAChD;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC,GAAG,MAAM,CAKrG;AAMD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,SAAS,QAAQ,EAAE,EAC9B,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,eAAe,EAAE,CAAC,CAsB5B;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,SAAS,QAAQ,EAAE,EAC9B,KAAK,EAAE,uBAAuB,EAC9B,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,eAAe,EAAE,CAAC,CAoB5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAe7F;AAED,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,QAAQ,CAerE;AAED,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,6FAA6F;IAC7F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,QAAQ,CAgCnE"}