@agentv/eval 4.35.1-next.1 → 4.36.0-next.1
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/index.cjs +74 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5336 -394
- package/dist/index.d.ts +5336 -394
- package/dist/index.js +56 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -45,11 +45,29 @@ __export(index_exports, {
|
|
|
45
45
|
NormalizedTraceToolSchema: () => NormalizedTraceToolSchema,
|
|
46
46
|
NormalizedTrajectorySchema: () => NormalizedTrajectorySchema,
|
|
47
47
|
PromptTemplateInputSchema: () => PromptTemplateInputSchema,
|
|
48
|
+
TRACE_EVENT_TYPES: () => TRACE_EVENT_TYPES,
|
|
49
|
+
TRACE_REDACTION_LEVELS: () => TRACE_REDACTION_LEVELS,
|
|
50
|
+
TRACE_SCHEMA_VERSION: () => TRACE_SCHEMA_VERSION,
|
|
51
|
+
TRACE_SOURCE_KINDS: () => TRACE_SOURCE_KINDS,
|
|
52
|
+
TRACE_TOOL_STATUSES: () => TRACE_TOOL_STATUSES,
|
|
48
53
|
TargetInvocationError: () => TargetInvocationError,
|
|
49
54
|
TargetNotAvailableError: () => TargetNotAvailableError,
|
|
50
55
|
TokenUsageSchema: () => TokenUsageSchema,
|
|
51
56
|
ToolCallSchema: () => ToolCallSchema,
|
|
57
|
+
TraceArtifactSchema: () => TraceArtifactSchema,
|
|
58
|
+
TraceBranchSchema: () => TraceBranchSchema,
|
|
59
|
+
TraceErrorSchema: () => TraceErrorSchema,
|
|
60
|
+
TraceEventSchema: () => TraceEventSchema,
|
|
61
|
+
TraceMessageSchema: () => TraceMessageSchema,
|
|
62
|
+
TraceModelSchema: () => TraceModelSchema,
|
|
63
|
+
TraceRawEvidenceSchema: () => TraceRawEvidenceSchema,
|
|
64
|
+
TraceRedactionStateSchema: () => TraceRedactionStateSchema,
|
|
65
|
+
TraceSchema: () => TraceSchema,
|
|
66
|
+
TraceSessionSchema: () => TraceSessionSchema,
|
|
67
|
+
TraceSourceRefSchema: () => TraceSourceRefSchema,
|
|
68
|
+
TraceSourceSchema: () => TraceSourceSchema,
|
|
52
69
|
TraceSummarySchema: () => TraceSummarySchema,
|
|
70
|
+
TraceToolSchema: () => TraceToolSchema,
|
|
53
71
|
createTargetClient: () => createTargetClient,
|
|
54
72
|
defineAssertion: () => defineAssertion,
|
|
55
73
|
defineCodeGrader: () => defineCodeGrader,
|
|
@@ -87,10 +105,17 @@ var NORMALIZED_TRACE_EVENT_TYPES = [
|
|
|
87
105
|
"message",
|
|
88
106
|
"model_turn",
|
|
89
107
|
"tool_call",
|
|
90
|
-
"tool_result"
|
|
108
|
+
"tool_result",
|
|
109
|
+
"final_response",
|
|
110
|
+
"error"
|
|
91
111
|
];
|
|
92
112
|
var NORMALIZED_TOOL_STATUSES = ["ok", "error", "timeout", "cancelled", "unknown"];
|
|
93
113
|
var NORMALIZED_REDACTION_LEVELS = ["none", "partial", "full"];
|
|
114
|
+
var TRACE_SCHEMA_VERSION = NORMALIZED_TRAJECTORY_SCHEMA_VERSION;
|
|
115
|
+
var TRACE_SOURCE_KINDS = NORMALIZED_TRACE_SOURCE_KINDS;
|
|
116
|
+
var TRACE_EVENT_TYPES = NORMALIZED_TRACE_EVENT_TYPES;
|
|
117
|
+
var TRACE_TOOL_STATUSES = NORMALIZED_TOOL_STATUSES;
|
|
118
|
+
var TRACE_REDACTION_LEVELS = NORMALIZED_REDACTION_LEVELS;
|
|
94
119
|
var MetadataSchema = import_zod.z.record(import_zod.z.string(), import_zod.z.unknown());
|
|
95
120
|
var NormalizedRedactionStateSchema = import_zod.z.object({
|
|
96
121
|
level: import_zod.z.enum(NORMALIZED_REDACTION_LEVELS),
|
|
@@ -183,6 +208,7 @@ var NormalizedTraceEventSchema = import_zod.z.object({
|
|
|
183
208
|
message: NormalizedTraceMessageSchema.optional(),
|
|
184
209
|
model: NormalizedTraceModelSchema.optional(),
|
|
185
210
|
tool: NormalizedTraceToolSchema.optional(),
|
|
211
|
+
error: NormalizedTraceErrorSchema.optional(),
|
|
186
212
|
sourceRef: NormalizedTraceSourceRefSchema.optional(),
|
|
187
213
|
rawEvidence: import_zod.z.array(NormalizedRawEvidenceSchema).optional(),
|
|
188
214
|
redaction: NormalizedRedactionStateSchema.optional(),
|
|
@@ -201,6 +227,18 @@ var NormalizedTrajectorySchema = import_zod.z.object({
|
|
|
201
227
|
endedAt: import_zod.z.string().optional(),
|
|
202
228
|
metadata: MetadataSchema.optional()
|
|
203
229
|
});
|
|
230
|
+
var TraceRedactionStateSchema = NormalizedRedactionStateSchema;
|
|
231
|
+
var TraceErrorSchema = NormalizedTraceErrorSchema;
|
|
232
|
+
var TraceSourceSchema = NormalizedTraceSourceSchema;
|
|
233
|
+
var TraceSessionSchema = NormalizedTraceSessionSchema;
|
|
234
|
+
var TraceBranchSchema = NormalizedTraceBranchSchema;
|
|
235
|
+
var TraceSourceRefSchema = NormalizedTraceSourceRefSchema;
|
|
236
|
+
var TraceRawEvidenceSchema = NormalizedRawEvidenceSchema;
|
|
237
|
+
var TraceMessageSchema = NormalizedTraceMessageSchema;
|
|
238
|
+
var TraceModelSchema = NormalizedTraceModelSchema;
|
|
239
|
+
var TraceToolSchema = NormalizedTraceToolSchema;
|
|
240
|
+
var TraceEventSchema = NormalizedTraceEventSchema;
|
|
241
|
+
var TraceArtifactSchema = NormalizedTrajectorySchema;
|
|
204
242
|
var ToolCallSchema = import_zod.z.object({
|
|
205
243
|
tool: import_zod.z.string(),
|
|
206
244
|
input: import_zod.z.unknown().optional(),
|
|
@@ -240,16 +278,31 @@ var MessageSchema = import_zod.z.object({
|
|
|
240
278
|
durationMs: import_zod.z.number().optional(),
|
|
241
279
|
metadata: import_zod.z.record(import_zod.z.unknown()).optional()
|
|
242
280
|
});
|
|
281
|
+
var TraceSchema = TraceSummarySchema.extend({
|
|
282
|
+
schemaVersion: import_zod.z.literal(TRACE_SCHEMA_VERSION),
|
|
283
|
+
messages: import_zod.z.array(MessageSchema),
|
|
284
|
+
events: import_zod.z.array(TraceEventSchema),
|
|
285
|
+
tokenUsage: TokenUsageSchema.optional(),
|
|
286
|
+
costUsd: import_zod.z.number().optional(),
|
|
287
|
+
durationMs: import_zod.z.number().optional(),
|
|
288
|
+
startTime: import_zod.z.string().optional(),
|
|
289
|
+
endTime: import_zod.z.string().optional(),
|
|
290
|
+
metadata: MetadataSchema.optional()
|
|
291
|
+
});
|
|
243
292
|
var CodeGraderInputSchema = import_zod.z.object({
|
|
244
293
|
criteria: import_zod.z.string(),
|
|
245
294
|
expectedOutput: import_zod.z.array(MessageSchema),
|
|
246
|
-
output: import_zod.z.
|
|
295
|
+
output: import_zod.z.string().nullable().optional(),
|
|
296
|
+
/** Deprecated migration alias; same value as output for text agents. */
|
|
297
|
+
answer: import_zod.z.string().optional(),
|
|
298
|
+
messages: import_zod.z.array(MessageSchema).optional().default([]),
|
|
247
299
|
/** Path to a temp file containing the output JSON (used for large payloads). */
|
|
248
300
|
outputPath: import_zod.z.string().optional(),
|
|
249
301
|
inputFiles: import_zod.z.array(import_zod.z.string()),
|
|
250
302
|
input: import_zod.z.array(MessageSchema),
|
|
251
303
|
metadata: import_zod.z.record(import_zod.z.unknown()).nullable().optional(),
|
|
252
|
-
trace:
|
|
304
|
+
trace: TraceSchema.nullable().optional(),
|
|
305
|
+
traceSummary: TraceSummarySchema.nullable().optional(),
|
|
253
306
|
tokenUsage: TokenUsageSchema.nullable().optional(),
|
|
254
307
|
costUsd: import_zod.z.number().nullable().optional(),
|
|
255
308
|
durationMs: import_zod.z.number().nullable().optional(),
|
|
@@ -596,11 +649,29 @@ function defineAssertion(handler) {
|
|
|
596
649
|
NormalizedTraceToolSchema,
|
|
597
650
|
NormalizedTrajectorySchema,
|
|
598
651
|
PromptTemplateInputSchema,
|
|
652
|
+
TRACE_EVENT_TYPES,
|
|
653
|
+
TRACE_REDACTION_LEVELS,
|
|
654
|
+
TRACE_SCHEMA_VERSION,
|
|
655
|
+
TRACE_SOURCE_KINDS,
|
|
656
|
+
TRACE_TOOL_STATUSES,
|
|
599
657
|
TargetInvocationError,
|
|
600
658
|
TargetNotAvailableError,
|
|
601
659
|
TokenUsageSchema,
|
|
602
660
|
ToolCallSchema,
|
|
661
|
+
TraceArtifactSchema,
|
|
662
|
+
TraceBranchSchema,
|
|
663
|
+
TraceErrorSchema,
|
|
664
|
+
TraceEventSchema,
|
|
665
|
+
TraceMessageSchema,
|
|
666
|
+
TraceModelSchema,
|
|
667
|
+
TraceRawEvidenceSchema,
|
|
668
|
+
TraceRedactionStateSchema,
|
|
669
|
+
TraceSchema,
|
|
670
|
+
TraceSessionSchema,
|
|
671
|
+
TraceSourceRefSchema,
|
|
672
|
+
TraceSourceSchema,
|
|
603
673
|
TraceSummarySchema,
|
|
674
|
+
TraceToolSchema,
|
|
604
675
|
createTargetClient,
|
|
605
676
|
defineAssertion,
|
|
606
677
|
defineCodeGrader,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/schemas.ts","../src/target-client.ts","../src/assertion.ts","../src/case-conversion.ts","../src/deprecation.ts","../src/prompt-template.ts","../src/runtime.ts"],"sourcesContent":["/**\n * AgentV Evaluation SDK\n *\n * Build custom graders for AI agent outputs.\n *\n * @example Custom assertion (simplest way to add evaluation logic)\n * ```typescript\n * #!/usr/bin/env bun\n * import { defineAssertion } from '@agentv/eval';\n *\n * export default defineAssertion(({ output, criteria }) => {\n * const text = output?.map(m => String(m.content ?? '')).join(' ') ?? '';\n * return {\n * pass: text.includes('hello'),\n * assertions: [{ text: 'Checks greeting', passed: text.includes('hello') }],\n * };\n * }));\n * ```\n *\n * @example Code grader (full control)\n * ```typescript\n * #!/usr/bin/env bun\n * import { defineCodeGrader } from '@agentv/eval';\n *\n * export default defineCodeGrader(({ trace, output }) => {\n * const text = output?.map(m => String(m.content ?? '')).join(' ') ?? '';\n * return {\n * score: trace?.eventCount <= 5 ? 1.0 : 0.5,\n * assertions: [{ text: 'Efficient tool usage', passed: trace?.eventCount <= 5 }],\n * };\n * }));\n * ```\n *\n * @packageDocumentation\n */\n\n// Re-export schemas and types\nexport {\n CodeGraderInputSchema,\n CodeGraderResultSchema,\n NORMALIZED_REDACTION_LEVELS,\n NORMALIZED_TOOL_STATUSES,\n NORMALIZED_TRACE_EVENT_TYPES,\n NORMALIZED_TRACE_SOURCE_KINDS,\n NORMALIZED_TRAJECTORY_SCHEMA_VERSION,\n TraceSummarySchema,\n NormalizedRawEvidenceSchema,\n NormalizedRedactionStateSchema,\n NormalizedTraceBranchSchema,\n NormalizedTraceErrorSchema,\n NormalizedTraceEventSchema,\n NormalizedTraceMessageSchema,\n NormalizedTraceModelSchema,\n NormalizedTraceSessionSchema,\n NormalizedTraceSourceRefSchema,\n NormalizedTraceSourceSchema,\n NormalizedTraceToolSchema,\n NormalizedTrajectorySchema,\n MessageSchema,\n ToolCallSchema,\n TokenUsageSchema,\n PromptTemplateInputSchema,\n ContentTextSchema,\n ContentImageSchema,\n ContentFileSchema,\n ContentSchema,\n type CodeGraderInput,\n type CodeGraderResult,\n type NormalizedRawEvidence,\n type NormalizedRedactionState,\n type NormalizedTraceBranch,\n type NormalizedTraceError,\n type NormalizedTraceEvent,\n type NormalizedTraceMessage,\n type NormalizedTraceModel,\n type NormalizedTraceSession,\n type NormalizedTraceSource,\n type NormalizedTraceSourceRef,\n type NormalizedTraceTool,\n type NormalizedTrajectory,\n type TraceSummary,\n type Message,\n type ToolCall,\n type TokenUsage,\n type PromptTemplateInput,\n type ContentText,\n type ContentImage,\n type ContentFile,\n type Content,\n} from './schemas.js';\n\n// Re-export target client\nexport {\n createTargetClient,\n TargetNotAvailableError,\n TargetInvocationError,\n type TargetClient,\n type TargetInfo,\n type TargetInvokeRequest,\n type TargetInvokeResponse,\n} from './target-client.js';\n\n// Re-export Zod for typed config support\nexport { z } from 'zod';\n\n// Re-export assertion types\nexport type {\n AssertionContext,\n AssertionHandler,\n AssertionScore,\n AssertionType,\n} from './assertion.js';\n\nimport { type AssertionHandler, runAssertion } from './assertion.js';\nimport { type PromptTemplateHandler, runPromptTemplate } from './prompt-template.js';\nimport { type CodeGraderHandler, runCodeGrader } from './runtime.js';\n\nexport type { CodeGraderHandler };\nexport type { PromptTemplateHandler };\n\n/**\n * Define a code grader with automatic stdin/stdout handling.\n *\n * This function:\n * 1. Reads JSON from stdin (snake_case format)\n * 2. Converts to camelCase and validates with Zod\n * 3. Calls your handler with typed input\n * 4. Validates the result and outputs JSON to stdout\n * 5. Handles errors gracefully with proper exit codes\n *\n * @param handler - Function that evaluates the input and returns a result\n *\n * @example\n * ```typescript\n * import { defineCodeGrader } from '@agentv/eval';\n *\n * export default defineCodeGrader(({ trace }) => {\n * if (!trace) {\n * return { score: 0.5, assertions: [{ text: 'No trace available', passed: false }] };\n * }\n *\n * const efficient = trace.eventCount <= 10;\n * return {\n * score: efficient ? 1.0 : 0.5,\n * assertions: [{ text: efficient ? 'Efficient execution' : 'Too many tool calls', passed: efficient }],\n * };\n * });\n * ```\n *\n * @example With typed config\n * ```typescript\n * import { defineCodeGrader, z } from '@agentv/eval';\n *\n * const ConfigSchema = z.object({\n * maxToolCalls: z.number().default(10),\n * });\n *\n * export default defineCodeGrader(({ trace, config }) => {\n * const { maxToolCalls } = ConfigSchema.parse(config ?? {});\n * // Use maxToolCalls...\n * });\n * ```\n */\nexport function defineCodeGrader(handler: CodeGraderHandler): void {\n // Run immediately when module is loaded\n runCodeGrader(handler);\n}\n\n/**\n * Define a prompt template with automatic stdin/stdout handling.\n *\n * This function:\n * 1. Reads JSON from stdin (snake_case format)\n * 2. Converts to camelCase and validates with Zod\n * 3. Calls your handler with typed input\n * 4. Outputs the generated prompt string to stdout\n * 5. Handles errors gracefully with proper exit codes\n *\n * @param handler - Function that generates the prompt string from input\n *\n * @example\n * ```typescript\n * import { definePromptTemplate } from '@agentv/eval';\n *\n * export default definePromptTemplate((ctx) => {\n * const question = ctx.input.map(m => String(m.content ?? '')).join('\\n');\n * const answer = ctx.output?.map(m => String(m.content ?? '')).join('\\n') ?? '';\n * return `Question: ${question}\\nAnswer: ${answer}`;\n * });\n * ```\n */\nexport function definePromptTemplate(handler: PromptTemplateHandler): void {\n // Run immediately when module is loaded\n runPromptTemplate(handler);\n}\n\n/**\n * Define a custom assertion grader with automatic stdin/stdout handling.\n *\n * Assertions are the simplest way to add custom evaluation logic. They receive\n * the full evaluation context and return a pass/fail result with optional\n * granular scoring.\n *\n * This function:\n * 1. Reads JSON from stdin (snake_case format)\n * 2. Converts to camelCase and validates with Zod\n * 3. Calls your handler with typed context\n * 4. Normalizes the result (pass→score, clamp, etc.)\n * 5. Outputs JSON to stdout\n * 6. Handles errors gracefully with proper exit codes\n *\n * @param handler - Function that evaluates the context and returns a result\n *\n * @example Simple pass/fail\n * ```typescript\n * import { defineAssertion } from '@agentv/eval';\n *\n * export default defineAssertion(({ output }) => {\n * const text = output?.map(m => String(m.content ?? '')).join(' ') ?? '';\n * return {\n * pass: text.toLowerCase().includes('hello'),\n * assertions: [{ text: 'Checks for greeting', passed: text.toLowerCase().includes('hello') }],\n * };\n * }));\n * ```\n *\n * @example Granular scoring\n * ```typescript\n * import { defineAssertion } from '@agentv/eval';\n *\n * export default defineAssertion(({ output, trace }) => {\n * const text = output?.map(m => String(m.content ?? '')).join(' ') ?? '';\n * const hasContent = text.length > 0 ? 0.5 : 0;\n * const isEfficient = (trace?.eventCount ?? 0) <= 5 ? 0.5 : 0;\n * return {\n * score: hasContent + isEfficient,\n * assertions: [\n * { text: 'Has content', passed: !!hasContent },\n * { text: 'Efficient', passed: !!isEfficient },\n * ],\n * };\n * }));\n * ```\n */\nexport function defineAssertion(handler: AssertionHandler): void {\n runAssertion(handler);\n}\n","/**\n * Zod schemas for code grader input/output validation.\n * Provides both compile-time types and runtime validation.\n *\n * ## Content model\n *\n * `Message.content` accepts `string | object[] | object`:\n * - `string` — backward-compatible plain text (most common case)\n * - `object[]` — typed content blocks for multimodal messages, plus AgentV\n * eval input blocks such as `{ type: \"file\", value, path, text }`\n * - `object` — structured YAML/JSON content such as expected outputs\n *\n * Content variants:\n * - `ContentText` — `{ type: 'text', text: string }`\n * - `ContentImage` — `{ type: 'image', media_type: string, path: string }` (file path, not base64)\n * - `ContentFile` — `{ type: 'file', media_type: string, path: string }`\n *\n * To add a new content variant:\n * 1. Define a new Zod schema with a unique `type` literal\n * 2. Add it to `ContentSchema` discriminated union\n * 3. Re-export from `index.ts`\n */\nimport { z } from 'zod';\n\n/**\n * Token usage metrics schema.\n */\nexport const TokenUsageSchema = z.object({\n input: z.number(),\n output: z.number(),\n cached: z.number().optional(),\n reasoning: z.number().optional(),\n});\n\n/**\n * Derived trace summary schema (camelCase for TypeScript ergonomics).\n *\n * This is a compatibility/read model for existing code graders and result\n * artifacts. Full trace state should use NormalizedTrajectory and project into\n * this shape only at result or grader-compatibility boundaries.\n */\nexport const TraceSummarySchema = z.object({\n eventCount: z.number(),\n toolCalls: z.record(z.string(), z.number()),\n errorCount: z.number(),\n toolDurations: z.record(z.string(), z.array(z.number())).optional(),\n llmCallCount: z.number().optional(),\n});\n\nexport const NORMALIZED_TRAJECTORY_SCHEMA_VERSION = 'agentv.trace.v1' as const;\n\nexport const NORMALIZED_TRACE_SOURCE_KINDS = [\n 'agentv_run',\n 'otlp',\n 'phoenix',\n 'langfuse',\n 'pi_session',\n 'imported_transcript',\n 'compact_transcript',\n] as const;\n\nexport const NORMALIZED_TRACE_EVENT_TYPES = [\n 'message',\n 'model_turn',\n 'tool_call',\n 'tool_result',\n] as const;\n\nexport const NORMALIZED_TOOL_STATUSES = ['ok', 'error', 'timeout', 'cancelled', 'unknown'] as const;\n\nexport const NORMALIZED_REDACTION_LEVELS = ['none', 'partial', 'full'] as const;\n\nconst MetadataSchema = z.record(z.string(), z.unknown());\n\nexport const NormalizedRedactionStateSchema = z.object({\n level: z.enum(NORMALIZED_REDACTION_LEVELS),\n fields: z.array(z.string()).optional(),\n reason: z.string().optional(),\n});\n\nexport const NormalizedTraceErrorSchema = z.object({\n message: z.string(),\n name: z.string().optional(),\n code: z.string().optional(),\n stack: z.string().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedTraceSourceSchema = z.object({\n kind: z.enum(NORMALIZED_TRACE_SOURCE_KINDS),\n path: z.string().optional(),\n url: z.string().optional(),\n provider: z.string().optional(),\n format: z.string().optional(),\n version: z.string().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedTraceSessionSchema = z.object({\n sessionId: z.string().optional(),\n conversationId: z.string().optional(),\n cwd: z.string().optional(),\n startedAt: z.string().optional(),\n endedAt: z.string().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedTraceBranchSchema = z.object({\n selectedLeafId: z.string().optional(),\n selectedPathIds: z.array(z.string()).optional(),\n includedEventIds: z.array(z.string()).optional(),\n omittedEventIds: z.array(z.string()).optional(),\n selectionReason: z.string().optional(),\n});\n\nexport const NormalizedTraceSourceRefSchema = z.object({\n eventId: z.string().optional(),\n messageId: z.string().optional(),\n spanId: z.string().optional(),\n traceId: z.string().optional(),\n rawKind: z.string().optional(),\n path: z.string().optional(),\n line: z.number().int().nonnegative().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedRawEvidenceSchema = z.object({\n kind: z.string(),\n ref: z.string().optional(),\n mediaType: z.string().optional(),\n content: z.unknown().optional(),\n redacted: z.boolean().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedTraceMessageSchema = z.object({\n role: z.string(),\n name: z.string().optional(),\n content: z.unknown().optional(),\n redaction: NormalizedRedactionStateSchema.optional(),\n tokenUsage: TokenUsageSchema.optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedTraceModelSchema = z.object({\n provider: z.string().optional(),\n name: z.string().optional(),\n invocationId: z.string().optional(),\n tokenUsage: TokenUsageSchema.optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedTraceToolSchema = z.object({\n name: z.string(),\n callId: z.string().optional(),\n input: z.unknown().optional(),\n output: z.unknown().optional(),\n status: z.enum(NORMALIZED_TOOL_STATUSES).optional(),\n error: NormalizedTraceErrorSchema.optional(),\n redaction: NormalizedRedactionStateSchema.optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedTraceEventSchema = z.object({\n eventId: z.string(),\n parentEventId: z.string().optional(),\n ordinal: z.number().int().nonnegative(),\n type: z.enum(NORMALIZED_TRACE_EVENT_TYPES),\n timestamp: z.string().optional(),\n durationMs: z.number().nonnegative().optional(),\n durationInferred: z.boolean().optional(),\n turnIndex: z.number().int().nonnegative().optional(),\n message: NormalizedTraceMessageSchema.optional(),\n model: NormalizedTraceModelSchema.optional(),\n tool: NormalizedTraceToolSchema.optional(),\n sourceRef: NormalizedTraceSourceRefSchema.optional(),\n rawEvidence: z.array(NormalizedRawEvidenceSchema).optional(),\n redaction: NormalizedRedactionStateSchema.optional(),\n metadata: MetadataSchema.optional(),\n});\n\n/**\n * Canonical trajectory schema exposed to custom graders.\n *\n * AgentV-owned persisted trajectory artifacts use the snake_case wire schemas\n * and converters in @agentv/core. This SDK schema mirrors the internal\n * camelCase model that grader authors receive.\n */\nexport const NormalizedTrajectorySchema = z.object({\n schemaVersion: z.literal(NORMALIZED_TRAJECTORY_SCHEMA_VERSION),\n source: NormalizedTraceSourceSchema,\n session: NormalizedTraceSessionSchema,\n branch: NormalizedTraceBranchSchema.optional(),\n events: z.array(NormalizedTraceEventSchema),\n tokenUsage: TokenUsageSchema.optional(),\n costUsd: z.number().optional(),\n durationMs: z.number().optional(),\n startedAt: z.string().optional(),\n endedAt: z.string().optional(),\n metadata: MetadataSchema.optional(),\n});\n\n/**\n * Tool call schema.\n */\nexport const ToolCallSchema = z.object({\n tool: z.string(),\n input: z.unknown().optional(),\n output: z.unknown().optional(),\n id: z.string().optional(),\n startTime: z.string().optional(),\n endTime: z.string().optional(),\n durationMs: z.number().optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Content block schemas (discriminated union on `type`)\n// ---------------------------------------------------------------------------\n\n/** Text content block. */\nexport const ContentTextSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n});\n\n/**\n * Image content block.\n * `path` is a filesystem path — never inline base64.\n */\nexport const ContentImageSchema = z.object({\n type: z.literal('image'),\n media_type: z.string(),\n path: z.string(),\n});\n\n/** File content block. */\nexport const ContentFileSchema = z.object({\n type: z.literal('file'),\n media_type: z.string(),\n path: z.string(),\n});\n\n/** Discriminated union of all content block types. */\nexport const ContentSchema = z.discriminatedUnion('type', [\n ContentTextSchema,\n ContentImageSchema,\n ContentFileSchema,\n]);\n\nconst MessageContentBlockSchema = z.union([ContentSchema, z.record(z.unknown())]);\n\n/**\n * Unified message schema for input, expected, and output messages.\n *\n * `content` is a plain string, an array of structured blocks, or a\n * structured object from YAML/JSON eval files. Use `getTextContent()` from\n * `@agentv/core` to extract plain text when the content is textual.\n */\nexport const MessageSchema = z.object({\n role: z.enum(['assistant', 'user', 'system', 'tool']),\n content: z\n .union([z.string(), z.array(MessageContentBlockSchema), z.record(z.unknown())])\n .optional(),\n toolCalls: z.array(ToolCallSchema).optional(),\n name: z.string().optional(),\n startTime: z.string().optional(),\n endTime: z.string().optional(),\n durationMs: z.number().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n/**\n * Code grader input schema (camelCase, converted from snake_case wire format).\n *\n * Structured fields (`input`, `output`, `expectedOutput`) are always `Message[]`.\n * To extract plain text from message content, use `getTextContent()` from `@agentv/core`.\n */\nexport const CodeGraderInputSchema = z.object({\n criteria: z.string(),\n expectedOutput: z.array(MessageSchema),\n output: z.array(MessageSchema).nullable().optional(),\n /** Path to a temp file containing the output JSON (used for large payloads). */\n outputPath: z.string().optional(),\n inputFiles: z.array(z.string()),\n input: z.array(MessageSchema),\n metadata: z.record(z.unknown()).nullable().optional(),\n trace: TraceSummarySchema.nullable().optional(),\n tokenUsage: TokenUsageSchema.nullable().optional(),\n costUsd: z.number().nullable().optional(),\n durationMs: z.number().nullable().optional(),\n startTime: z.string().nullable().optional(),\n endTime: z.string().nullable().optional(),\n fileChanges: z.string().nullable().optional(),\n workspacePath: z.string().nullable().optional(),\n config: z.record(z.unknown()).nullable().optional(),\n});\n\n/**\n * Code grader result schema (validated before output).\n */\nexport const CodeGraderResultSchema = z.object({\n score: z.number().min(0).max(1),\n assertions: z\n .array(\n z.object({\n text: z.string(),\n passed: z.boolean(),\n evidence: z.string().optional(),\n }),\n )\n .optional()\n .default([]),\n /** Optional structured details for domain-specific metrics (e.g., TP/TN/FP/FN counts, alignments). */\n details: z.record(z.unknown()).optional(),\n});\n\n/**\n * Inferred types from schemas.\n */\nexport type CodeGraderInput = z.infer<typeof CodeGraderInputSchema>;\nexport type CodeGraderResult = z.infer<typeof CodeGraderResultSchema>;\n\nexport type TraceSummary = z.infer<typeof TraceSummarySchema>;\nexport type NormalizedTrajectory = z.infer<typeof NormalizedTrajectorySchema>;\nexport type NormalizedTraceSource = z.infer<typeof NormalizedTraceSourceSchema>;\nexport type NormalizedTraceSession = z.infer<typeof NormalizedTraceSessionSchema>;\nexport type NormalizedTraceBranch = z.infer<typeof NormalizedTraceBranchSchema>;\nexport type NormalizedTraceEvent = z.infer<typeof NormalizedTraceEventSchema>;\nexport type NormalizedTraceMessage = z.infer<typeof NormalizedTraceMessageSchema>;\nexport type NormalizedTraceModel = z.infer<typeof NormalizedTraceModelSchema>;\nexport type NormalizedTraceTool = z.infer<typeof NormalizedTraceToolSchema>;\nexport type NormalizedTraceError = z.infer<typeof NormalizedTraceErrorSchema>;\nexport type NormalizedTraceSourceRef = z.infer<typeof NormalizedTraceSourceRefSchema>;\nexport type NormalizedRawEvidence = z.infer<typeof NormalizedRawEvidenceSchema>;\nexport type NormalizedRedactionState = z.infer<typeof NormalizedRedactionStateSchema>;\nexport type Message = z.infer<typeof MessageSchema>;\nexport type ToolCall = z.infer<typeof ToolCallSchema>;\nexport type TokenUsage = z.infer<typeof TokenUsageSchema>;\n\nexport type ContentText = z.infer<typeof ContentTextSchema>;\nexport type ContentImage = z.infer<typeof ContentImageSchema>;\nexport type ContentFile = z.infer<typeof ContentFileSchema>;\nexport type Content = z.infer<typeof ContentSchema>;\n\n/**\n * Prompt template input schema (camelCase, converted from snake_case wire format).\n * Uses the same schema as CodeGraderInput since the orchestrator sends identical payloads.\n */\nexport const PromptTemplateInputSchema = CodeGraderInputSchema;\n\nexport type PromptTemplateInput = CodeGraderInput;\n\n// ── Backward-compat aliases (deprecated) ────────────────────────────────────────\n/** @deprecated Use CodeGraderInputSchema */\nexport const CodeJudgeInputSchema = CodeGraderInputSchema;\n/** @deprecated Use CodeGraderResultSchema */\nexport const CodeJudgeResultSchema = CodeGraderResultSchema;\n/** @deprecated Use CodeGraderInput */\nexport type CodeJudgeInput = CodeGraderInput;\n/** @deprecated Use CodeGraderResult */\nexport type CodeJudgeResult = CodeGraderResult;\n","/**\n * Client for invoking configured targets from code-grader scripts.\n *\n * Environment variables (set automatically by AgentV when `target` config is present):\n * - AGENTV_TARGET_PROXY_URL: The URL of the local proxy server\n * - AGENTV_TARGET_PROXY_TOKEN: Bearer token for authentication\n */\n\nimport type { TokenUsage } from './schemas.js';\n\n/**\n * Request to invoke the target\n */\nexport interface TargetInvokeRequest {\n readonly question: string;\n readonly systemPrompt?: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n /** Optional target override - use a different target for this invocation */\n readonly target?: string;\n}\n\n/**\n * Response from a target invocation\n */\nexport interface TargetInvokeResponse {\n readonly output: readonly unknown[];\n readonly rawText?: string;\n readonly tokenUsage?: TokenUsage;\n}\n\n/**\n * Information about the target proxy configuration\n */\nexport interface TargetInfo {\n /** Name of the default target being used */\n readonly targetName: string;\n /** Maximum number of calls allowed */\n readonly maxCalls: number;\n /** Current number of calls made */\n readonly callCount: number;\n /** List of all available target names */\n readonly availableTargets: readonly string[];\n}\n\n/**\n * Target client for making target invocations\n */\nexport interface TargetClient {\n /**\n * Invoke the configured target with a prompt.\n * @param request - The question and optional system prompt\n * @returns The target's response with output messages and optional raw text\n */\n invoke(request: TargetInvokeRequest): Promise<TargetInvokeResponse>;\n\n /**\n * Invoke the target with multiple requests in sequence.\n * Each request counts toward the max_calls limit.\n * @param requests - Array of target requests\n * @returns Array of target responses\n */\n invokeBatch(requests: readonly TargetInvokeRequest[]): Promise<readonly TargetInvokeResponse[]>;\n\n /**\n * Get information about the target proxy configuration.\n * Returns the default target name, max calls, current call count, and available targets.\n */\n getInfo(): Promise<TargetInfo>;\n}\n\n/**\n * Error thrown when target proxy is not available\n */\nexport class TargetNotAvailableError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TargetNotAvailableError';\n }\n}\n\n/**\n * Error thrown when target invocation fails\n */\nexport class TargetInvocationError extends Error {\n readonly statusCode?: number;\n\n constructor(message: string, statusCode?: number) {\n super(message);\n this.name = 'TargetInvocationError';\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Create a target client from environment variables.\n *\n * This function reads the proxy URL and token from environment variables\n * that are automatically set by AgentV when a `target` config block is present\n * on a `code_grader` evaluator.\n *\n * @returns A target client if environment variables are set, otherwise undefined\n * @throws TargetNotAvailableError if token is missing when URL is present\n *\n * @example\n * ```typescript\n * import { createTargetClient, defineCodeGrader } from '@agentv/eval';\n *\n * export default defineCodeGrader(async ({ question, criteria }) => {\n * const target = createTargetClient();\n *\n * if (!target) {\n * // Target not available - no target config on this evaluator\n * return { score: 0.5, assertions: [{ text: 'Target not available', passed: false }] };\n * }\n *\n * const response = await target.invoke({\n * question: `Is this answer correct? Question: ${question}, Expected: ${criteria}`,\n * systemPrompt: 'You are an expert grader. Respond with JSON: { \"correct\": true/false }'\n * });\n *\n * const result = JSON.parse(response.rawText ?? '{}');\n * return { score: result.correct ? 1.0 : 0.0 };\n * });\n * ```\n */\nexport function createTargetClient(): TargetClient | undefined {\n const proxyUrl = process.env.AGENTV_TARGET_PROXY_URL;\n const proxyToken = process.env.AGENTV_TARGET_PROXY_TOKEN;\n\n if (!proxyUrl) {\n return undefined;\n }\n\n if (!proxyToken) {\n throw new TargetNotAvailableError(\n 'AGENTV_TARGET_PROXY_URL is set but AGENTV_TARGET_PROXY_TOKEN is missing',\n );\n }\n\n return createTargetClientInternal(proxyUrl, proxyToken);\n}\n\n/**\n * Internal: Create a target client with explicit URL and token.\n * Exported for testing only - use createTargetClient() in production.\n */\nexport function createTargetClientInternal(url: string, token: string): TargetClient {\n const headers = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n };\n\n return {\n async invoke(request: TargetInvokeRequest): Promise<TargetInvokeResponse> {\n const response = await fetch(`${url}/invoke`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n question: request.question,\n systemPrompt: request.systemPrompt,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n target: request.target,\n }),\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n let errorMessage: string;\n try {\n const errorJson = JSON.parse(errorBody) as { error?: string };\n errorMessage = errorJson.error ?? `HTTP ${response.status}`;\n } catch {\n errorMessage = errorBody || `HTTP ${response.status}`;\n }\n throw new TargetInvocationError(errorMessage, response.status);\n }\n\n return (await response.json()) as TargetInvokeResponse;\n },\n\n async invokeBatch(\n requests: readonly TargetInvokeRequest[],\n ): Promise<readonly TargetInvokeResponse[]> {\n const response = await fetch(`${url}/invokeBatch`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n requests: requests.map((r) => ({\n question: r.question,\n systemPrompt: r.systemPrompt,\n evalCaseId: r.evalCaseId,\n attempt: r.attempt,\n target: r.target,\n })),\n }),\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n let errorMessage: string;\n try {\n const errorJson = JSON.parse(errorBody) as { error?: string };\n errorMessage = errorJson.error ?? `HTTP ${response.status}`;\n } catch {\n errorMessage = errorBody || `HTTP ${response.status}`;\n }\n throw new TargetInvocationError(errorMessage, response.status);\n }\n\n const result = (await response.json()) as { responses: TargetInvokeResponse[] };\n return result.responses;\n },\n\n async getInfo(): Promise<TargetInfo> {\n const response = await fetch(`${url}/info`, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n let errorMessage: string;\n try {\n const errorJson = JSON.parse(errorBody) as { error?: string };\n errorMessage = errorJson.error ?? `HTTP ${response.status}`;\n } catch {\n errorMessage = errorBody || `HTTP ${response.status}`;\n }\n throw new TargetInvocationError(errorMessage, response.status);\n }\n\n return (await response.json()) as TargetInfo;\n },\n };\n}\n","/**\n * Runtime for custom assertion evaluators.\n * Handles stdin parsing, validation, error handling, and output formatting.\n *\n * Assertions receive the same input as code graders but use a simplified result\n * contract focused on pass/fail with optional score granularity.\n */\nimport { readFileSync } from 'node:fs';\n\nimport { toCamelCaseDeep } from './case-conversion.js';\nimport { enrichInput } from './deprecation.js';\nimport {\n type CodeGraderInput,\n CodeGraderInputSchema,\n type CodeGraderResult,\n CodeGraderResultSchema,\n} from './schemas.js';\n\n/**\n * Context provided to assertion handlers.\n */\nexport type AssertionContext = CodeGraderInput;\n\n/**\n * Known built-in assertion types. Custom types are extensible via string.\n *\n * Use in EVAL.yaml `assertions` blocks:\n * ```yaml\n * assertions:\n * - type: contains\n * value: \"Paris\"\n * ```\n *\n * Custom types registered via `.agentv/assertions/` or `defineAssertion()`\n * are also valid — the `string & {}` escape hatch provides autocomplete\n * for known types while accepting any string.\n */\nexport type AssertionType =\n // kebab-case (canonical internal form)\n | 'llm-grader'\n | 'code-grader'\n | 'rubrics'\n | 'composite'\n | 'tool-trajectory'\n | 'field-accuracy'\n | 'latency'\n | 'cost'\n | 'token-usage'\n | 'execution-metrics'\n | 'skill-trigger'\n | 'contains'\n | 'contains-any'\n | 'contains-all'\n | 'icontains'\n | 'icontains-any'\n | 'icontains-all'\n | 'starts-with'\n | 'ends-with'\n | 'equals'\n | 'regex'\n | 'is-json'\n // legacy snake_case aliases (still accepted)\n | 'llm_grader'\n | 'code_grader'\n | 'tool_trajectory'\n | 'field_accuracy'\n | 'token_usage'\n | 'execution_metrics'\n | 'contains_any'\n | 'contains_all'\n | 'icontains_any'\n | 'icontains_all'\n | 'starts_with'\n | 'ends_with'\n | 'is_json'\n | (string & {});\n\n/**\n * Result returned from an assertion handler.\n *\n * @example Pass with score\n * ```ts\n * { pass: true, assertions: [{ text: 'Output contains expected keywords', passed: true }] }\n * ```\n *\n * @example Fail with evidence\n * ```ts\n * { pass: false, score: 0.3, assertions: [{ text: 'Missing required header', passed: false }] }\n * ```\n *\n * @example Granular score (0-1)\n * ```ts\n * { score: 0.75, assertions: [\n * { text: 'Format correct', passed: true },\n * { text: 'Content relevant', passed: true },\n * { text: 'Missing citation', passed: false },\n * ] }\n * ```\n */\nexport interface AssertionScore {\n /** Explicit pass/fail. If omitted, derived from score (>= 0.5 = pass). */\n readonly pass?: boolean;\n /** Numeric score between 0 and 1. Defaults to 1 if pass=true, 0 if pass=false. */\n readonly score?: number;\n /** Per-assertion verdicts with optional evidence. */\n readonly assertions?: readonly {\n readonly text: string;\n readonly passed: boolean;\n readonly evidence?: string;\n }[];\n /** Optional structured details for domain-specific metrics. */\n readonly details?: Record<string, unknown>;\n}\n\n/**\n * Handler function type for assertions.\n */\nexport type AssertionHandler = (ctx: AssertionContext) => AssertionScore | Promise<AssertionScore>;\n\n/**\n * Read stdin synchronously.\n */\nfunction readStdin(): string {\n return readFileSync(0, 'utf8');\n}\n\n/**\n * Clamp a value to the range [0, 1].\n */\nfunction clampScore(value: number): number {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return 0;\n }\n return Math.max(0, Math.min(1, value));\n}\n\nfunction formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Normalize an AssertionScore to a CodeGraderResult for wire compatibility.\n */\nfunction normalizeScore(result: AssertionScore): CodeGraderResult {\n let score: number;\n if (result.score !== undefined) {\n score = clampScore(result.score);\n } else if (result.pass !== undefined) {\n score = result.pass ? 1 : 0;\n } else {\n score = 0;\n }\n\n return {\n score,\n assertions: result.assertions ? [...result.assertions] : [],\n details: result.details,\n };\n}\n\n/**\n * Run an assertion handler with full stdin/stdout handling.\n * This is the internal implementation called by defineAssertion.\n */\nexport async function runAssertion(handler: AssertionHandler): Promise<void> {\n try {\n const stdin = readStdin();\n const rawInput = JSON.parse(stdin) as Record<string, unknown>;\n const camelInput = toCamelCaseDeep(rawInput);\n const input = CodeGraderInputSchema.parse(camelInput);\n\n // Lazy file-backed output loading\n if (input.outputPath && (input.output === null || input.output === undefined)) {\n let cachedOutput: CodeGraderInput['output'] | undefined;\n const filePath = input.outputPath;\n Object.defineProperty(input, 'output', {\n get() {\n if (cachedOutput === undefined) {\n cachedOutput = JSON.parse(readFileSync(filePath, 'utf8'));\n }\n return cachedOutput;\n },\n configurable: true,\n enumerable: true,\n });\n }\n\n // Enrich input — no-op pass-through\n enrichInput(input);\n\n // Run handler\n const rawResult = await handler(input);\n const normalized = normalizeScore(rawResult);\n const result = CodeGraderResultSchema.parse(normalized);\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n const errorMessage = formatError(error);\n const errorResult: CodeGraderResult = {\n score: 0,\n assertions: [{ text: `Assertion failed: ${errorMessage}`, passed: false }],\n };\n console.log(JSON.stringify(errorResult, null, 2));\n process.exit(1);\n }\n}\n","/**\n * Case conversion utilities for JSON payloads.\n * Converts between snake_case (wire format) and camelCase (TypeScript).\n */\n\nfunction toCamelCase(str: string): string {\n // Don't convert keys that start with uppercase (proper nouns/tool names)\n if (/^[A-Z]/.test(str)) {\n return str;\n }\n return str.replace(/_([a-z0-9])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Recursively converts all keys in an object from snake_case to camelCase.\n * Used to map wire payloads into TypeScript-friendly shapes.\n *\n * @param obj - The object to convert (can be any JSON-serializable value)\n * @returns A new object with all keys converted to camelCase\n */\nexport function toCamelCaseDeep(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => toCamelCaseDeep(item));\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const camelKey = toCamelCase(key);\n result[camelKey] = toCamelCaseDeep(value);\n }\n return result;\n }\n\n return obj;\n}\n","/**\n * Input enrichment utilities for code grader and assertion runtimes.\n *\n * With the removal of text convenience accessors (`inputText`, `outputText`,\n * `expectedOutputText`) from CodeGraderInput, this module is a no-op pass-through.\n * Kept for backward compatibility — existing runtimes call `enrichInput()` and\n * the call is harmless.\n */\nimport type { CodeGraderInput } from './schemas.js';\n\n/**\n * Enrich a validated CodeGraderInput.\n *\n * Previously populated text convenience accessors; now a no-op pass-through since\n * those fields were removed. Code graders should extract text from `Message.content`\n * using `getTextContent()` from `@agentv/core` instead.\n */\nexport function enrichInput(input: CodeGraderInput): CodeGraderInput {\n return input;\n}\n","/**\n * Runtime for prompt template evaluators.\n * Handles stdin parsing, validation, error handling, and string output.\n */\nimport { readFileSync } from 'node:fs';\n\nimport { toCamelCaseDeep } from './case-conversion.js';\nimport { enrichInput } from './deprecation.js';\nimport { type CodeGraderInput, PromptTemplateInputSchema } from './schemas.js';\n\n/**\n * Handler function type for prompt templates.\n * Returns the prompt string to use for evaluation.\n */\nexport type PromptTemplateHandler = (input: CodeGraderInput) => string | Promise<string>;\n\n/**\n * Read stdin synchronously (works in both Node.js and Bun).\n */\nfunction readStdin(): string {\n return readFileSync(0, 'utf8');\n}\n\n/**\n * Run a prompt template handler with full stdin/stdout handling.\n * This is the internal implementation called by definePromptTemplate.\n */\nexport async function runPromptTemplate(handler: PromptTemplateHandler): Promise<void> {\n try {\n // 1. Read stdin\n const stdin = readStdin();\n\n // 2. Parse JSON\n const rawInput = JSON.parse(stdin) as Record<string, unknown>;\n\n // 3. Convert snake_case to camelCase\n const camelInput = toCamelCaseDeep(rawInput);\n\n // 4. Validate input with Zod\n const input = PromptTemplateInputSchema.parse(camelInput);\n\n // 5. Enrich input — no-op pass-through\n enrichInput(input);\n\n // 6. Run handler\n const prompt = await handler(input);\n\n // 6. Output raw string (not JSON) - the prompt itself\n console.log(prompt);\n } catch (error) {\n // Output error to stderr and exit with non-zero code\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\n/**\n * Define a prompt template with automatic stdin/stdout handling.\n *\n * This function:\n * 1. Reads JSON from stdin (snake_case format)\n * 2. Converts to camelCase and validates with Zod\n * 3. Calls your handler with typed input\n * 4. Outputs the generated prompt string to stdout\n * 5. Handles errors gracefully with proper exit codes\n *\n * @param handler - Function that generates the prompt string from input\n *\n * @example\n * ```typescript\n * import { definePromptTemplate, type CodeGraderInput } from '@agentv/eval';\n * import { getTextContent } from '@agentv/core';\n *\n * export default definePromptTemplate((ctx: CodeGraderInput) => {\n * const question = ctx.input.map(m => getTextContent(m.content)).join('\\n');\n * const answer = ctx.output?.map(m => getTextContent(m.content)).join('\\n') ?? '';\n * return `Question: ${question}\\nAnswer: ${answer}`;\n * });\n * ```\n */\nexport function definePromptTemplate(handler: PromptTemplateHandler): void {\n // Run immediately when module is loaded\n runPromptTemplate(handler);\n}\n","/**\n * Runtime for code grader evaluators.\n * Handles stdin parsing, validation, error handling, and output formatting.\n */\nimport { readFileSync } from 'node:fs';\n\nimport { toCamelCaseDeep } from './case-conversion.js';\nimport { enrichInput } from './deprecation.js';\nimport {\n type CodeGraderInput,\n CodeGraderInputSchema,\n type CodeGraderResult,\n CodeGraderResultSchema,\n} from './schemas.js';\n\n/**\n * Handler function type for code graders.\n */\nexport type CodeGraderHandler = (\n input: CodeGraderInput,\n) => CodeGraderResult | Promise<CodeGraderResult>;\n\n/**\n * Read stdin synchronously (works in both Node.js and Bun).\n */\nfunction readStdin(): string {\n return readFileSync(0, 'utf8');\n}\n\n/**\n * Clamp a value to the range [0, 1].\n */\nfunction clampScore(value: number): number {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return 0;\n }\n return Math.max(0, Math.min(1, value));\n}\n\n/**\n * Format an error for output.\n */\nfunction formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Run a code grader handler with full stdin/stdout handling.\n * This is the internal implementation called by defineCodeGrader.\n */\nexport async function runCodeGrader(handler: CodeGraderHandler): Promise<void> {\n try {\n // 1. Read stdin\n const stdin = readStdin();\n\n // 2. Parse JSON\n const rawInput = JSON.parse(stdin) as Record<string, unknown>;\n\n // 3. Convert snake_case to camelCase\n const camelInput = toCamelCaseDeep(rawInput);\n\n // 4. Validate input with Zod\n const input = CodeGraderInputSchema.parse(camelInput);\n\n // 5. Set up lazy file-backed output loading if applicable\n if (input.outputPath && (input.output === null || input.output === undefined)) {\n let cachedOutput: CodeGraderInput['output'] | undefined;\n const filePath = input.outputPath;\n Object.defineProperty(input, 'output', {\n get() {\n if (cachedOutput === undefined) {\n cachedOutput = JSON.parse(readFileSync(filePath, 'utf8'));\n }\n return cachedOutput;\n },\n configurable: true,\n enumerable: true,\n });\n }\n\n // 6. Enrich input — no-op pass-through\n enrichInput(input);\n\n // 7. Run handler\n const rawResult = await handler(input);\n\n // 8. Validate and normalize output\n const result = CodeGraderResultSchema.parse({\n ...rawResult,\n score: clampScore(rawResult.score),\n });\n\n // 9. Output JSON\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n // Output failure result\n const errorMessage = formatError(error);\n const errorResult: CodeGraderResult = {\n score: 0,\n assertions: [{ text: `Evaluation failed: ${errorMessage}`, passed: false }],\n };\n console.log(JSON.stringify(errorResult, null, 2));\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["import_zod","import_node_fs","readStdin","import_node_fs","readStdin","clampScore","formatError"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/schemas.ts","../src/target-client.ts","../src/assertion.ts","../src/case-conversion.ts","../src/deprecation.ts","../src/prompt-template.ts","../src/runtime.ts"],"sourcesContent":["/**\n * AgentV Evaluation SDK\n *\n * Build custom graders for AI agent outputs.\n *\n * @example Custom assertion (simplest way to add evaluation logic)\n * ```typescript\n * #!/usr/bin/env bun\n * import { defineAssertion } from '@agentv/eval';\n *\n * export default defineAssertion(({ output, criteria }) => {\n * return {\n * pass: output.includes('hello'),\n * assertions: [{ text: 'Checks greeting', passed: output.includes('hello') }],\n * };\n * }));\n * ```\n *\n * @example Code grader (full control)\n * ```typescript\n * #!/usr/bin/env bun\n * import { defineCodeGrader } from '@agentv/eval';\n *\n * export default defineCodeGrader(({ trace, output }) => {\n * return {\n * score: trace?.eventCount <= 5 ? 1.0 : 0.5,\n * assertions: [{ text: 'Efficient tool usage', passed: trace?.eventCount <= 5 }],\n * };\n * }));\n * ```\n *\n * @packageDocumentation\n */\n\n// Re-export schemas and types\nexport {\n CodeGraderInputSchema,\n CodeGraderResultSchema,\n NORMALIZED_REDACTION_LEVELS,\n NORMALIZED_TOOL_STATUSES,\n NORMALIZED_TRACE_EVENT_TYPES,\n NORMALIZED_TRACE_SOURCE_KINDS,\n NORMALIZED_TRAJECTORY_SCHEMA_VERSION,\n TRACE_REDACTION_LEVELS,\n TRACE_SCHEMA_VERSION,\n TRACE_SOURCE_KINDS,\n TRACE_EVENT_TYPES,\n TRACE_TOOL_STATUSES,\n TraceSummarySchema,\n TraceSchema,\n TraceArtifactSchema,\n TraceRawEvidenceSchema,\n TraceRedactionStateSchema,\n TraceBranchSchema,\n TraceErrorSchema,\n TraceEventSchema,\n TraceMessageSchema,\n TraceModelSchema,\n TraceSessionSchema,\n TraceSourceRefSchema,\n TraceSourceSchema,\n TraceToolSchema,\n NormalizedRawEvidenceSchema,\n NormalizedRedactionStateSchema,\n NormalizedTraceBranchSchema,\n NormalizedTraceErrorSchema,\n NormalizedTraceEventSchema,\n NormalizedTraceMessageSchema,\n NormalizedTraceModelSchema,\n NormalizedTraceSessionSchema,\n NormalizedTraceSourceRefSchema,\n NormalizedTraceSourceSchema,\n NormalizedTraceToolSchema,\n NormalizedTrajectorySchema,\n MessageSchema,\n ToolCallSchema,\n TokenUsageSchema,\n PromptTemplateInputSchema,\n ContentTextSchema,\n ContentImageSchema,\n ContentFileSchema,\n ContentSchema,\n type CodeGraderInput,\n type CodeGraderResult,\n type TraceArtifact,\n type TraceRawEvidence,\n type TraceRedactionState,\n type TraceBranch,\n type TraceError,\n type TraceEvent,\n type TraceMessage,\n type TraceModel,\n type TraceSession,\n type TraceSource,\n type TraceSourceRef,\n type TraceTool,\n type NormalizedRawEvidence,\n type NormalizedRedactionState,\n type NormalizedTraceBranch,\n type NormalizedTraceError,\n type NormalizedTraceEvent,\n type NormalizedTraceMessage,\n type NormalizedTraceModel,\n type NormalizedTraceSession,\n type NormalizedTraceSource,\n type NormalizedTraceSourceRef,\n type NormalizedTraceTool,\n type NormalizedTrajectory,\n type TraceSummary,\n type Trace,\n type Message,\n type ToolCall,\n type TokenUsage,\n type PromptTemplateInput,\n type ContentText,\n type ContentImage,\n type ContentFile,\n type Content,\n} from './schemas.js';\n\n// Re-export target client\nexport {\n createTargetClient,\n TargetNotAvailableError,\n TargetInvocationError,\n type TargetClient,\n type TargetInfo,\n type TargetInvokeRequest,\n type TargetInvokeResponse,\n} from './target-client.js';\n\n// Re-export Zod for typed config support\nexport { z } from 'zod';\n\n// Re-export assertion types\nexport type {\n AssertionContext,\n AssertionHandler,\n AssertionScore,\n AssertionType,\n} from './assertion.js';\n\nimport { type AssertionHandler, runAssertion } from './assertion.js';\nimport { type PromptTemplateHandler, runPromptTemplate } from './prompt-template.js';\nimport { type CodeGraderHandler, runCodeGrader } from './runtime.js';\n\nexport type { CodeGraderHandler };\nexport type { PromptTemplateHandler };\n\n/**\n * Define a code grader with automatic stdin/stdout handling.\n *\n * This function:\n * 1. Reads JSON from stdin (snake_case format)\n * 2. Converts to camelCase and validates with Zod\n * 3. Calls your handler with typed input\n * 4. Validates the result and outputs JSON to stdout\n * 5. Handles errors gracefully with proper exit codes\n *\n * @param handler - Function that evaluates the input and returns a result\n *\n * @example\n * ```typescript\n * import { defineCodeGrader } from '@agentv/eval';\n *\n * export default defineCodeGrader(({ trace }) => {\n * if (!trace) {\n * return { score: 0.5, assertions: [{ text: 'No trace available', passed: false }] };\n * }\n *\n * const efficient = trace.eventCount <= 10;\n * return {\n * score: efficient ? 1.0 : 0.5,\n * assertions: [{ text: efficient ? 'Efficient execution' : 'Too many tool calls', passed: efficient }],\n * };\n * });\n * ```\n *\n * @example With typed config\n * ```typescript\n * import { defineCodeGrader, z } from '@agentv/eval';\n *\n * const ConfigSchema = z.object({\n * maxToolCalls: z.number().default(10),\n * });\n *\n * export default defineCodeGrader(({ trace, config }) => {\n * const { maxToolCalls } = ConfigSchema.parse(config ?? {});\n * // Use maxToolCalls...\n * });\n * ```\n */\nexport function defineCodeGrader(handler: CodeGraderHandler): void {\n // Run immediately when module is loaded\n runCodeGrader(handler);\n}\n\n/**\n * Define a prompt template with automatic stdin/stdout handling.\n *\n * This function:\n * 1. Reads JSON from stdin (snake_case format)\n * 2. Converts to camelCase and validates with Zod\n * 3. Calls your handler with typed input\n * 4. Outputs the generated prompt string to stdout\n * 5. Handles errors gracefully with proper exit codes\n *\n * @param handler - Function that generates the prompt string from input\n *\n * @example\n * ```typescript\n * import { definePromptTemplate } from '@agentv/eval';\n *\n * export default definePromptTemplate((ctx) => {\n * const question = ctx.input.map(m => String(m.content ?? '')).join('\\n');\n * const answer = ctx.output?.map(m => String(m.content ?? '')).join('\\n') ?? '';\n * return `Question: ${question}\\nAnswer: ${answer}`;\n * });\n * ```\n */\nexport function definePromptTemplate(handler: PromptTemplateHandler): void {\n // Run immediately when module is loaded\n runPromptTemplate(handler);\n}\n\n/**\n * Define a custom assertion grader with automatic stdin/stdout handling.\n *\n * Assertions are the simplest way to add custom evaluation logic. They receive\n * the full evaluation context and return a pass/fail result with optional\n * granular scoring.\n *\n * This function:\n * 1. Reads JSON from stdin (snake_case format)\n * 2. Converts to camelCase and validates with Zod\n * 3. Calls your handler with typed context\n * 4. Normalizes the result (pass→score, clamp, etc.)\n * 5. Outputs JSON to stdout\n * 6. Handles errors gracefully with proper exit codes\n *\n * @param handler - Function that evaluates the context and returns a result\n *\n * @example Simple pass/fail\n * ```typescript\n * import { defineAssertion } from '@agentv/eval';\n *\n * export default defineAssertion(({ output }) => {\n * const text = output?.map(m => String(m.content ?? '')).join(' ') ?? '';\n * return {\n * pass: text.toLowerCase().includes('hello'),\n * assertions: [{ text: 'Checks for greeting', passed: text.toLowerCase().includes('hello') }],\n * };\n * }));\n * ```\n *\n * @example Granular scoring\n * ```typescript\n * import { defineAssertion } from '@agentv/eval';\n *\n * export default defineAssertion(({ output, trace }) => {\n * const text = output?.map(m => String(m.content ?? '')).join(' ') ?? '';\n * const hasContent = text.length > 0 ? 0.5 : 0;\n * const isEfficient = (trace?.eventCount ?? 0) <= 5 ? 0.5 : 0;\n * return {\n * score: hasContent + isEfficient,\n * assertions: [\n * { text: 'Has content', passed: !!hasContent },\n * { text: 'Efficient', passed: !!isEfficient },\n * ],\n * };\n * }));\n * ```\n */\nexport function defineAssertion(handler: AssertionHandler): void {\n runAssertion(handler);\n}\n","/**\n * Zod schemas for code grader input/output validation.\n * Provides both compile-time types and runtime validation.\n *\n * ## Content model\n *\n * `Message.content` accepts `string | object[] | object`:\n * - `string` — backward-compatible plain text (most common case)\n * - `object[]` — typed content blocks for multimodal messages, plus AgentV\n * eval input blocks such as `{ type: \"file\", value, path, text }`\n * - `object` — structured YAML/JSON content such as expected outputs\n *\n * Content variants:\n * - `ContentText` — `{ type: 'text', text: string }`\n * - `ContentImage` — `{ type: 'image', media_type: string, path: string }` (file path, not base64)\n * - `ContentFile` — `{ type: 'file', media_type: string, path: string }`\n *\n * To add a new content variant:\n * 1. Define a new Zod schema with a unique `type` literal\n * 2. Add it to `ContentSchema` discriminated union\n * 3. Re-export from `index.ts`\n */\nimport { z } from 'zod';\n\n/**\n * Token usage metrics schema.\n */\nexport const TokenUsageSchema = z.object({\n input: z.number(),\n output: z.number(),\n cached: z.number().optional(),\n reasoning: z.number().optional(),\n});\n\n/**\n * Derived trace summary schema (camelCase for TypeScript ergonomics).\n *\n * This is a compact read model for metric-style graders. Full transcript/tool\n * evidence lives in the canonical `Trace` under `messages` and `events`.\n */\nexport const TraceSummarySchema = z.object({\n eventCount: z.number(),\n toolCalls: z.record(z.string(), z.number()),\n errorCount: z.number(),\n toolDurations: z.record(z.string(), z.array(z.number())).optional(),\n llmCallCount: z.number().optional(),\n});\n\nexport const NORMALIZED_TRAJECTORY_SCHEMA_VERSION = 'agentv.trace.v1' as const;\n\nexport const NORMALIZED_TRACE_SOURCE_KINDS = [\n 'agentv_run',\n 'otlp',\n 'phoenix',\n 'langfuse',\n 'pi_session',\n 'imported_transcript',\n 'compact_transcript',\n] as const;\n\nexport const NORMALIZED_TRACE_EVENT_TYPES = [\n 'message',\n 'model_turn',\n 'tool_call',\n 'tool_result',\n 'final_response',\n 'error',\n] as const;\n\nexport const NORMALIZED_TOOL_STATUSES = ['ok', 'error', 'timeout', 'cancelled', 'unknown'] as const;\n\nexport const NORMALIZED_REDACTION_LEVELS = ['none', 'partial', 'full'] as const;\n\nexport const TRACE_SCHEMA_VERSION = NORMALIZED_TRAJECTORY_SCHEMA_VERSION;\nexport const TRACE_SOURCE_KINDS = NORMALIZED_TRACE_SOURCE_KINDS;\nexport const TRACE_EVENT_TYPES = NORMALIZED_TRACE_EVENT_TYPES;\nexport const TRACE_TOOL_STATUSES = NORMALIZED_TOOL_STATUSES;\nexport const TRACE_REDACTION_LEVELS = NORMALIZED_REDACTION_LEVELS;\n\nconst MetadataSchema = z.record(z.string(), z.unknown());\n\nexport const NormalizedRedactionStateSchema = z.object({\n level: z.enum(NORMALIZED_REDACTION_LEVELS),\n fields: z.array(z.string()).optional(),\n reason: z.string().optional(),\n});\n\nexport const NormalizedTraceErrorSchema = z.object({\n message: z.string(),\n name: z.string().optional(),\n code: z.string().optional(),\n stack: z.string().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedTraceSourceSchema = z.object({\n kind: z.enum(NORMALIZED_TRACE_SOURCE_KINDS),\n path: z.string().optional(),\n url: z.string().optional(),\n provider: z.string().optional(),\n format: z.string().optional(),\n version: z.string().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedTraceSessionSchema = z.object({\n sessionId: z.string().optional(),\n conversationId: z.string().optional(),\n cwd: z.string().optional(),\n startedAt: z.string().optional(),\n endedAt: z.string().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedTraceBranchSchema = z.object({\n selectedLeafId: z.string().optional(),\n selectedPathIds: z.array(z.string()).optional(),\n includedEventIds: z.array(z.string()).optional(),\n omittedEventIds: z.array(z.string()).optional(),\n selectionReason: z.string().optional(),\n});\n\nexport const NormalizedTraceSourceRefSchema = z.object({\n eventId: z.string().optional(),\n messageId: z.string().optional(),\n spanId: z.string().optional(),\n traceId: z.string().optional(),\n rawKind: z.string().optional(),\n path: z.string().optional(),\n line: z.number().int().nonnegative().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedRawEvidenceSchema = z.object({\n kind: z.string(),\n ref: z.string().optional(),\n mediaType: z.string().optional(),\n content: z.unknown().optional(),\n redacted: z.boolean().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedTraceMessageSchema = z.object({\n role: z.string(),\n name: z.string().optional(),\n content: z.unknown().optional(),\n redaction: NormalizedRedactionStateSchema.optional(),\n tokenUsage: TokenUsageSchema.optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedTraceModelSchema = z.object({\n provider: z.string().optional(),\n name: z.string().optional(),\n invocationId: z.string().optional(),\n tokenUsage: TokenUsageSchema.optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedTraceToolSchema = z.object({\n name: z.string(),\n callId: z.string().optional(),\n input: z.unknown().optional(),\n output: z.unknown().optional(),\n status: z.enum(NORMALIZED_TOOL_STATUSES).optional(),\n error: NormalizedTraceErrorSchema.optional(),\n redaction: NormalizedRedactionStateSchema.optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const NormalizedTraceEventSchema = z.object({\n eventId: z.string(),\n parentEventId: z.string().optional(),\n ordinal: z.number().int().nonnegative(),\n type: z.enum(NORMALIZED_TRACE_EVENT_TYPES),\n timestamp: z.string().optional(),\n durationMs: z.number().nonnegative().optional(),\n durationInferred: z.boolean().optional(),\n turnIndex: z.number().int().nonnegative().optional(),\n message: NormalizedTraceMessageSchema.optional(),\n model: NormalizedTraceModelSchema.optional(),\n tool: NormalizedTraceToolSchema.optional(),\n error: NormalizedTraceErrorSchema.optional(),\n sourceRef: NormalizedTraceSourceRefSchema.optional(),\n rawEvidence: z.array(NormalizedRawEvidenceSchema).optional(),\n redaction: NormalizedRedactionStateSchema.optional(),\n metadata: MetadataSchema.optional(),\n});\n\n/**\n * Canonical trajectory schema exposed to custom graders.\n *\n * AgentV-owned persisted trajectory artifacts use the snake_case wire schemas\n * and converters in @agentv/core. This SDK schema mirrors the internal\n * camelCase model that grader authors receive.\n */\nexport const NormalizedTrajectorySchema = z.object({\n schemaVersion: z.literal(NORMALIZED_TRAJECTORY_SCHEMA_VERSION),\n source: NormalizedTraceSourceSchema,\n session: NormalizedTraceSessionSchema,\n branch: NormalizedTraceBranchSchema.optional(),\n events: z.array(NormalizedTraceEventSchema),\n tokenUsage: TokenUsageSchema.optional(),\n costUsd: z.number().optional(),\n durationMs: z.number().optional(),\n startedAt: z.string().optional(),\n endedAt: z.string().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const TraceRedactionStateSchema = NormalizedRedactionStateSchema;\nexport const TraceErrorSchema = NormalizedTraceErrorSchema;\nexport const TraceSourceSchema = NormalizedTraceSourceSchema;\nexport const TraceSessionSchema = NormalizedTraceSessionSchema;\nexport const TraceBranchSchema = NormalizedTraceBranchSchema;\nexport const TraceSourceRefSchema = NormalizedTraceSourceRefSchema;\nexport const TraceRawEvidenceSchema = NormalizedRawEvidenceSchema;\nexport const TraceMessageSchema = NormalizedTraceMessageSchema;\nexport const TraceModelSchema = NormalizedTraceModelSchema;\nexport const TraceToolSchema = NormalizedTraceToolSchema;\nexport const TraceEventSchema = NormalizedTraceEventSchema;\nexport const TraceArtifactSchema = NormalizedTrajectorySchema;\n\n/**\n * Tool call schema.\n */\nexport const ToolCallSchema = z.object({\n tool: z.string(),\n input: z.unknown().optional(),\n output: z.unknown().optional(),\n id: z.string().optional(),\n startTime: z.string().optional(),\n endTime: z.string().optional(),\n durationMs: z.number().optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Content block schemas (discriminated union on `type`)\n// ---------------------------------------------------------------------------\n\n/** Text content block. */\nexport const ContentTextSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n});\n\n/**\n * Image content block.\n * `path` is a filesystem path — never inline base64.\n */\nexport const ContentImageSchema = z.object({\n type: z.literal('image'),\n media_type: z.string(),\n path: z.string(),\n});\n\n/** File content block. */\nexport const ContentFileSchema = z.object({\n type: z.literal('file'),\n media_type: z.string(),\n path: z.string(),\n});\n\n/** Discriminated union of all content block types. */\nexport const ContentSchema = z.discriminatedUnion('type', [\n ContentTextSchema,\n ContentImageSchema,\n ContentFileSchema,\n]);\n\nconst MessageContentBlockSchema = z.union([ContentSchema, z.record(z.unknown())]);\n\n/**\n * Unified message schema for input, expected, and output messages.\n *\n * `content` is a plain string, an array of structured blocks, or a\n * structured object from YAML/JSON eval files. Use `getTextContent()` from\n * `@agentv/core` to extract plain text when the content is textual.\n */\nexport const MessageSchema = z.object({\n role: z.enum(['assistant', 'user', 'system', 'tool']),\n content: z\n .union([z.string(), z.array(MessageContentBlockSchema), z.record(z.unknown())])\n .optional(),\n toolCalls: z.array(ToolCallSchema).optional(),\n name: z.string().optional(),\n startTime: z.string().optional(),\n endTime: z.string().optional(),\n durationMs: z.number().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n/**\n * Canonical evaluation trace exposed to custom graders.\n *\n * Top-level summary fields (`eventCount`, `toolCalls`, `errorCount`) remain\n * available for existing metric graders; full transcript/tool evidence is under\n * `messages` and structured execution events under `events`.\n */\nexport const TraceSchema = TraceSummarySchema.extend({\n schemaVersion: z.literal(TRACE_SCHEMA_VERSION),\n messages: z.array(MessageSchema),\n events: z.array(TraceEventSchema),\n tokenUsage: TokenUsageSchema.optional(),\n costUsd: z.number().optional(),\n durationMs: z.number().optional(),\n startTime: z.string().optional(),\n endTime: z.string().optional(),\n metadata: MetadataSchema.optional(),\n});\n\n/**\n * Code grader input schema (camelCase, converted from snake_case wire format).\n *\n * `output` is the final answer/scored result only. Transcript-aware graders\n * should inspect `messages`, `trace.messages`, or `trace.events`.\n */\nexport const CodeGraderInputSchema = z.object({\n criteria: z.string(),\n expectedOutput: z.array(MessageSchema),\n output: z.string().nullable().optional(),\n /** Deprecated migration alias; same value as output for text agents. */\n answer: z.string().optional(),\n messages: z.array(MessageSchema).optional().default([]),\n /** Path to a temp file containing the output JSON (used for large payloads). */\n outputPath: z.string().optional(),\n inputFiles: z.array(z.string()),\n input: z.array(MessageSchema),\n metadata: z.record(z.unknown()).nullable().optional(),\n trace: TraceSchema.nullable().optional(),\n traceSummary: TraceSummarySchema.nullable().optional(),\n tokenUsage: TokenUsageSchema.nullable().optional(),\n costUsd: z.number().nullable().optional(),\n durationMs: z.number().nullable().optional(),\n startTime: z.string().nullable().optional(),\n endTime: z.string().nullable().optional(),\n fileChanges: z.string().nullable().optional(),\n workspacePath: z.string().nullable().optional(),\n config: z.record(z.unknown()).nullable().optional(),\n});\n\n/**\n * Code grader result schema (validated before output).\n */\nexport const CodeGraderResultSchema = z.object({\n score: z.number().min(0).max(1),\n assertions: z\n .array(\n z.object({\n text: z.string(),\n passed: z.boolean(),\n evidence: z.string().optional(),\n }),\n )\n .optional()\n .default([]),\n /** Optional structured details for domain-specific metrics (e.g., TP/TN/FP/FN counts, alignments). */\n details: z.record(z.unknown()).optional(),\n});\n\n/**\n * Inferred types from schemas.\n */\nexport type CodeGraderInput = z.infer<typeof CodeGraderInputSchema>;\nexport type CodeGraderResult = z.infer<typeof CodeGraderResultSchema>;\n\nexport type TraceSummary = z.infer<typeof TraceSummarySchema>;\nexport type Trace = z.infer<typeof TraceSchema>;\nexport type TraceArtifact = z.infer<typeof TraceArtifactSchema>;\nexport type TraceSource = z.infer<typeof TraceSourceSchema>;\nexport type TraceSession = z.infer<typeof TraceSessionSchema>;\nexport type TraceBranch = z.infer<typeof TraceBranchSchema>;\nexport type TraceEvent = z.infer<typeof TraceEventSchema>;\nexport type TraceMessage = z.infer<typeof TraceMessageSchema>;\nexport type TraceModel = z.infer<typeof TraceModelSchema>;\nexport type TraceTool = z.infer<typeof TraceToolSchema>;\nexport type TraceError = z.infer<typeof TraceErrorSchema>;\nexport type TraceSourceRef = z.infer<typeof TraceSourceRefSchema>;\nexport type TraceRawEvidence = z.infer<typeof TraceRawEvidenceSchema>;\nexport type TraceRedactionState = z.infer<typeof TraceRedactionStateSchema>;\n/** @deprecated Use TraceArtifact for legacy import/replay artifacts or Trace for evaluation results. */\nexport type NormalizedTrajectory = TraceArtifact;\n/** @deprecated Use TraceSource. */\nexport type NormalizedTraceSource = TraceSource;\n/** @deprecated Use TraceSession. */\nexport type NormalizedTraceSession = TraceSession;\n/** @deprecated Use TraceBranch. */\nexport type NormalizedTraceBranch = TraceBranch;\n/** @deprecated Use TraceEvent. */\nexport type NormalizedTraceEvent = TraceEvent;\n/** @deprecated Use TraceMessage. */\nexport type NormalizedTraceMessage = TraceMessage;\n/** @deprecated Use TraceModel. */\nexport type NormalizedTraceModel = TraceModel;\n/** @deprecated Use TraceTool. */\nexport type NormalizedTraceTool = TraceTool;\n/** @deprecated Use TraceError. */\nexport type NormalizedTraceError = TraceError;\n/** @deprecated Use TraceSourceRef. */\nexport type NormalizedTraceSourceRef = TraceSourceRef;\n/** @deprecated Use TraceRawEvidence. */\nexport type NormalizedRawEvidence = TraceRawEvidence;\n/** @deprecated Use TraceRedactionState. */\nexport type NormalizedRedactionState = TraceRedactionState;\nexport type Message = z.infer<typeof MessageSchema>;\nexport type ToolCall = z.infer<typeof ToolCallSchema>;\nexport type TokenUsage = z.infer<typeof TokenUsageSchema>;\n\nexport type ContentText = z.infer<typeof ContentTextSchema>;\nexport type ContentImage = z.infer<typeof ContentImageSchema>;\nexport type ContentFile = z.infer<typeof ContentFileSchema>;\nexport type Content = z.infer<typeof ContentSchema>;\n\n/**\n * Prompt template input schema (camelCase, converted from snake_case wire format).\n * Uses the same schema as CodeGraderInput since the orchestrator sends identical payloads.\n */\nexport const PromptTemplateInputSchema = CodeGraderInputSchema;\n\nexport type PromptTemplateInput = CodeGraderInput;\n\n// ── Backward-compat aliases (deprecated) ────────────────────────────────────────\n/** @deprecated Use CodeGraderInputSchema */\nexport const CodeJudgeInputSchema = CodeGraderInputSchema;\n/** @deprecated Use CodeGraderResultSchema */\nexport const CodeJudgeResultSchema = CodeGraderResultSchema;\n/** @deprecated Use CodeGraderInput */\nexport type CodeJudgeInput = CodeGraderInput;\n/** @deprecated Use CodeGraderResult */\nexport type CodeJudgeResult = CodeGraderResult;\n","/**\n * Client for invoking configured targets from code-grader scripts.\n *\n * Environment variables (set automatically by AgentV when `target` config is present):\n * - AGENTV_TARGET_PROXY_URL: The URL of the local proxy server\n * - AGENTV_TARGET_PROXY_TOKEN: Bearer token for authentication\n */\n\nimport type { TokenUsage } from './schemas.js';\n\n/**\n * Request to invoke the target\n */\nexport interface TargetInvokeRequest {\n readonly question: string;\n readonly systemPrompt?: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n /** Optional target override - use a different target for this invocation */\n readonly target?: string;\n}\n\n/**\n * Response from a target invocation\n */\nexport interface TargetInvokeResponse {\n readonly output: readonly unknown[];\n readonly rawText?: string;\n readonly tokenUsage?: TokenUsage;\n}\n\n/**\n * Information about the target proxy configuration\n */\nexport interface TargetInfo {\n /** Name of the default target being used */\n readonly targetName: string;\n /** Maximum number of calls allowed */\n readonly maxCalls: number;\n /** Current number of calls made */\n readonly callCount: number;\n /** List of all available target names */\n readonly availableTargets: readonly string[];\n}\n\n/**\n * Target client for making target invocations\n */\nexport interface TargetClient {\n /**\n * Invoke the configured target with a prompt.\n * @param request - The question and optional system prompt\n * @returns The target's response with output messages and optional raw text\n */\n invoke(request: TargetInvokeRequest): Promise<TargetInvokeResponse>;\n\n /**\n * Invoke the target with multiple requests in sequence.\n * Each request counts toward the max_calls limit.\n * @param requests - Array of target requests\n * @returns Array of target responses\n */\n invokeBatch(requests: readonly TargetInvokeRequest[]): Promise<readonly TargetInvokeResponse[]>;\n\n /**\n * Get information about the target proxy configuration.\n * Returns the default target name, max calls, current call count, and available targets.\n */\n getInfo(): Promise<TargetInfo>;\n}\n\n/**\n * Error thrown when target proxy is not available\n */\nexport class TargetNotAvailableError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TargetNotAvailableError';\n }\n}\n\n/**\n * Error thrown when target invocation fails\n */\nexport class TargetInvocationError extends Error {\n readonly statusCode?: number;\n\n constructor(message: string, statusCode?: number) {\n super(message);\n this.name = 'TargetInvocationError';\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Create a target client from environment variables.\n *\n * This function reads the proxy URL and token from environment variables\n * that are automatically set by AgentV when a `target` config block is present\n * on a `code_grader` evaluator.\n *\n * @returns A target client if environment variables are set, otherwise undefined\n * @throws TargetNotAvailableError if token is missing when URL is present\n *\n * @example\n * ```typescript\n * import { createTargetClient, defineCodeGrader } from '@agentv/eval';\n *\n * export default defineCodeGrader(async ({ question, criteria }) => {\n * const target = createTargetClient();\n *\n * if (!target) {\n * // Target not available - no target config on this evaluator\n * return { score: 0.5, assertions: [{ text: 'Target not available', passed: false }] };\n * }\n *\n * const response = await target.invoke({\n * question: `Is this answer correct? Question: ${question}, Expected: ${criteria}`,\n * systemPrompt: 'You are an expert grader. Respond with JSON: { \"correct\": true/false }'\n * });\n *\n * const result = JSON.parse(response.rawText ?? '{}');\n * return { score: result.correct ? 1.0 : 0.0 };\n * });\n * ```\n */\nexport function createTargetClient(): TargetClient | undefined {\n const proxyUrl = process.env.AGENTV_TARGET_PROXY_URL;\n const proxyToken = process.env.AGENTV_TARGET_PROXY_TOKEN;\n\n if (!proxyUrl) {\n return undefined;\n }\n\n if (!proxyToken) {\n throw new TargetNotAvailableError(\n 'AGENTV_TARGET_PROXY_URL is set but AGENTV_TARGET_PROXY_TOKEN is missing',\n );\n }\n\n return createTargetClientInternal(proxyUrl, proxyToken);\n}\n\n/**\n * Internal: Create a target client with explicit URL and token.\n * Exported for testing only - use createTargetClient() in production.\n */\nexport function createTargetClientInternal(url: string, token: string): TargetClient {\n const headers = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n };\n\n return {\n async invoke(request: TargetInvokeRequest): Promise<TargetInvokeResponse> {\n const response = await fetch(`${url}/invoke`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n question: request.question,\n systemPrompt: request.systemPrompt,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n target: request.target,\n }),\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n let errorMessage: string;\n try {\n const errorJson = JSON.parse(errorBody) as { error?: string };\n errorMessage = errorJson.error ?? `HTTP ${response.status}`;\n } catch {\n errorMessage = errorBody || `HTTP ${response.status}`;\n }\n throw new TargetInvocationError(errorMessage, response.status);\n }\n\n return (await response.json()) as TargetInvokeResponse;\n },\n\n async invokeBatch(\n requests: readonly TargetInvokeRequest[],\n ): Promise<readonly TargetInvokeResponse[]> {\n const response = await fetch(`${url}/invokeBatch`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n requests: requests.map((r) => ({\n question: r.question,\n systemPrompt: r.systemPrompt,\n evalCaseId: r.evalCaseId,\n attempt: r.attempt,\n target: r.target,\n })),\n }),\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n let errorMessage: string;\n try {\n const errorJson = JSON.parse(errorBody) as { error?: string };\n errorMessage = errorJson.error ?? `HTTP ${response.status}`;\n } catch {\n errorMessage = errorBody || `HTTP ${response.status}`;\n }\n throw new TargetInvocationError(errorMessage, response.status);\n }\n\n const result = (await response.json()) as { responses: TargetInvokeResponse[] };\n return result.responses;\n },\n\n async getInfo(): Promise<TargetInfo> {\n const response = await fetch(`${url}/info`, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n let errorMessage: string;\n try {\n const errorJson = JSON.parse(errorBody) as { error?: string };\n errorMessage = errorJson.error ?? `HTTP ${response.status}`;\n } catch {\n errorMessage = errorBody || `HTTP ${response.status}`;\n }\n throw new TargetInvocationError(errorMessage, response.status);\n }\n\n return (await response.json()) as TargetInfo;\n },\n };\n}\n","/**\n * Runtime for custom assertion evaluators.\n * Handles stdin parsing, validation, error handling, and output formatting.\n *\n * Assertions receive the same input as code graders but use a simplified result\n * contract focused on pass/fail with optional score granularity.\n */\nimport { readFileSync } from 'node:fs';\n\nimport { toCamelCaseDeep } from './case-conversion.js';\nimport { enrichInput } from './deprecation.js';\nimport {\n type CodeGraderInput,\n CodeGraderInputSchema,\n type CodeGraderResult,\n CodeGraderResultSchema,\n} from './schemas.js';\n\n/**\n * Context provided to assertion handlers.\n */\nexport type AssertionContext = CodeGraderInput;\n\n/**\n * Known built-in assertion types. Custom types are extensible via string.\n *\n * Use in EVAL.yaml `assertions` blocks:\n * ```yaml\n * assertions:\n * - type: contains\n * value: \"Paris\"\n * ```\n *\n * Custom types registered via `.agentv/assertions/` or `defineAssertion()`\n * are also valid — the `string & {}` escape hatch provides autocomplete\n * for known types while accepting any string.\n */\nexport type AssertionType =\n // kebab-case (canonical internal form)\n | 'llm-grader'\n | 'code-grader'\n | 'rubrics'\n | 'composite'\n | 'tool-trajectory'\n | 'field-accuracy'\n | 'latency'\n | 'cost'\n | 'token-usage'\n | 'execution-metrics'\n | 'skill-trigger'\n | 'contains'\n | 'contains-any'\n | 'contains-all'\n | 'icontains'\n | 'icontains-any'\n | 'icontains-all'\n | 'starts-with'\n | 'ends-with'\n | 'equals'\n | 'regex'\n | 'is-json'\n // legacy snake_case aliases (still accepted)\n | 'llm_grader'\n | 'code_grader'\n | 'tool_trajectory'\n | 'field_accuracy'\n | 'token_usage'\n | 'execution_metrics'\n | 'contains_any'\n | 'contains_all'\n | 'icontains_any'\n | 'icontains_all'\n | 'starts_with'\n | 'ends_with'\n | 'is_json'\n | (string & {});\n\n/**\n * Result returned from an assertion handler.\n *\n * @example Pass with score\n * ```ts\n * { pass: true, assertions: [{ text: 'Output contains expected keywords', passed: true }] }\n * ```\n *\n * @example Fail with evidence\n * ```ts\n * { pass: false, score: 0.3, assertions: [{ text: 'Missing required header', passed: false }] }\n * ```\n *\n * @example Granular score (0-1)\n * ```ts\n * { score: 0.75, assertions: [\n * { text: 'Format correct', passed: true },\n * { text: 'Content relevant', passed: true },\n * { text: 'Missing citation', passed: false },\n * ] }\n * ```\n */\nexport interface AssertionScore {\n /** Explicit pass/fail. If omitted, derived from score (>= 0.5 = pass). */\n readonly pass?: boolean;\n /** Numeric score between 0 and 1. Defaults to 1 if pass=true, 0 if pass=false. */\n readonly score?: number;\n /** Per-assertion verdicts with optional evidence. */\n readonly assertions?: readonly {\n readonly text: string;\n readonly passed: boolean;\n readonly evidence?: string;\n }[];\n /** Optional structured details for domain-specific metrics. */\n readonly details?: Record<string, unknown>;\n}\n\n/**\n * Handler function type for assertions.\n */\nexport type AssertionHandler = (ctx: AssertionContext) => AssertionScore | Promise<AssertionScore>;\n\n/**\n * Read stdin synchronously.\n */\nfunction readStdin(): string {\n return readFileSync(0, 'utf8');\n}\n\n/**\n * Clamp a value to the range [0, 1].\n */\nfunction clampScore(value: number): number {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return 0;\n }\n return Math.max(0, Math.min(1, value));\n}\n\nfunction formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Normalize an AssertionScore to a CodeGraderResult for wire compatibility.\n */\nfunction normalizeScore(result: AssertionScore): CodeGraderResult {\n let score: number;\n if (result.score !== undefined) {\n score = clampScore(result.score);\n } else if (result.pass !== undefined) {\n score = result.pass ? 1 : 0;\n } else {\n score = 0;\n }\n\n return {\n score,\n assertions: result.assertions ? [...result.assertions] : [],\n details: result.details,\n };\n}\n\n/**\n * Run an assertion handler with full stdin/stdout handling.\n * This is the internal implementation called by defineAssertion.\n */\nexport async function runAssertion(handler: AssertionHandler): Promise<void> {\n try {\n const stdin = readStdin();\n const rawInput = JSON.parse(stdin) as Record<string, unknown>;\n const camelInput = toCamelCaseDeep(rawInput);\n const input = CodeGraderInputSchema.parse(camelInput);\n\n // Lazy file-backed output loading\n if (input.outputPath && (input.output === null || input.output === undefined)) {\n let cachedOutput: CodeGraderInput['output'] | undefined;\n const filePath = input.outputPath;\n Object.defineProperty(input, 'output', {\n get() {\n if (cachedOutput === undefined) {\n cachedOutput = JSON.parse(readFileSync(filePath, 'utf8'));\n }\n return cachedOutput;\n },\n configurable: true,\n enumerable: true,\n });\n }\n\n // Enrich input — no-op pass-through\n enrichInput(input);\n\n // Run handler\n const rawResult = await handler(input);\n const normalized = normalizeScore(rawResult);\n const result = CodeGraderResultSchema.parse(normalized);\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n const errorMessage = formatError(error);\n const errorResult: CodeGraderResult = {\n score: 0,\n assertions: [{ text: `Assertion failed: ${errorMessage}`, passed: false }],\n };\n console.log(JSON.stringify(errorResult, null, 2));\n process.exit(1);\n }\n}\n","/**\n * Case conversion utilities for JSON payloads.\n * Converts between snake_case (wire format) and camelCase (TypeScript).\n */\n\nfunction toCamelCase(str: string): string {\n // Don't convert keys that start with uppercase (proper nouns/tool names)\n if (/^[A-Z]/.test(str)) {\n return str;\n }\n return str.replace(/_([a-z0-9])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Recursively converts all keys in an object from snake_case to camelCase.\n * Used to map wire payloads into TypeScript-friendly shapes.\n *\n * @param obj - The object to convert (can be any JSON-serializable value)\n * @returns A new object with all keys converted to camelCase\n */\nexport function toCamelCaseDeep(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => toCamelCaseDeep(item));\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const camelKey = toCamelCase(key);\n result[camelKey] = toCamelCaseDeep(value);\n }\n return result;\n }\n\n return obj;\n}\n","/**\n * Input enrichment utilities for code grader and assertion runtimes.\n *\n * With the removal of text convenience accessors (`inputText`, `outputText`,\n * `expectedOutputText`) from CodeGraderInput, this module is a no-op pass-through.\n * Kept for backward compatibility — existing runtimes call `enrichInput()` and\n * the call is harmless.\n */\nimport type { CodeGraderInput } from './schemas.js';\n\n/**\n * Enrich a validated CodeGraderInput.\n *\n * Previously populated text convenience accessors; now a no-op pass-through since\n * those fields were removed. Code graders should extract text from `Message.content`\n * using `getTextContent()` from `@agentv/core` instead.\n */\nexport function enrichInput(input: CodeGraderInput): CodeGraderInput {\n return input;\n}\n","/**\n * Runtime for prompt template evaluators.\n * Handles stdin parsing, validation, error handling, and string output.\n */\nimport { readFileSync } from 'node:fs';\n\nimport { toCamelCaseDeep } from './case-conversion.js';\nimport { enrichInput } from './deprecation.js';\nimport { type CodeGraderInput, PromptTemplateInputSchema } from './schemas.js';\n\n/**\n * Handler function type for prompt templates.\n * Returns the prompt string to use for evaluation.\n */\nexport type PromptTemplateHandler = (input: CodeGraderInput) => string | Promise<string>;\n\n/**\n * Read stdin synchronously (works in both Node.js and Bun).\n */\nfunction readStdin(): string {\n return readFileSync(0, 'utf8');\n}\n\n/**\n * Run a prompt template handler with full stdin/stdout handling.\n * This is the internal implementation called by definePromptTemplate.\n */\nexport async function runPromptTemplate(handler: PromptTemplateHandler): Promise<void> {\n try {\n // 1. Read stdin\n const stdin = readStdin();\n\n // 2. Parse JSON\n const rawInput = JSON.parse(stdin) as Record<string, unknown>;\n\n // 3. Convert snake_case to camelCase\n const camelInput = toCamelCaseDeep(rawInput);\n\n // 4. Validate input with Zod\n const input = PromptTemplateInputSchema.parse(camelInput);\n\n // 5. Enrich input — no-op pass-through\n enrichInput(input);\n\n // 6. Run handler\n const prompt = await handler(input);\n\n // 6. Output raw string (not JSON) - the prompt itself\n console.log(prompt);\n } catch (error) {\n // Output error to stderr and exit with non-zero code\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\n/**\n * Define a prompt template with automatic stdin/stdout handling.\n *\n * This function:\n * 1. Reads JSON from stdin (snake_case format)\n * 2. Converts to camelCase and validates with Zod\n * 3. Calls your handler with typed input\n * 4. Outputs the generated prompt string to stdout\n * 5. Handles errors gracefully with proper exit codes\n *\n * @param handler - Function that generates the prompt string from input\n *\n * @example\n * ```typescript\n * import { definePromptTemplate, type CodeGraderInput } from '@agentv/eval';\n * import { getTextContent } from '@agentv/core';\n *\n * export default definePromptTemplate((ctx: CodeGraderInput) => {\n * const question = ctx.input.map(m => getTextContent(m.content)).join('\\n');\n * const answer = ctx.output?.map(m => getTextContent(m.content)).join('\\n') ?? '';\n * return `Question: ${question}\\nAnswer: ${answer}`;\n * });\n * ```\n */\nexport function definePromptTemplate(handler: PromptTemplateHandler): void {\n // Run immediately when module is loaded\n runPromptTemplate(handler);\n}\n","/**\n * Runtime for code grader evaluators.\n * Handles stdin parsing, validation, error handling, and output formatting.\n */\nimport { readFileSync } from 'node:fs';\n\nimport { toCamelCaseDeep } from './case-conversion.js';\nimport { enrichInput } from './deprecation.js';\nimport {\n type CodeGraderInput,\n CodeGraderInputSchema,\n type CodeGraderResult,\n CodeGraderResultSchema,\n} from './schemas.js';\n\n/**\n * Handler function type for code graders.\n */\nexport type CodeGraderHandler = (\n input: CodeGraderInput,\n) => CodeGraderResult | Promise<CodeGraderResult>;\n\n/**\n * Read stdin synchronously (works in both Node.js and Bun).\n */\nfunction readStdin(): string {\n return readFileSync(0, 'utf8');\n}\n\n/**\n * Clamp a value to the range [0, 1].\n */\nfunction clampScore(value: number): number {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return 0;\n }\n return Math.max(0, Math.min(1, value));\n}\n\n/**\n * Format an error for output.\n */\nfunction formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Run a code grader handler with full stdin/stdout handling.\n * This is the internal implementation called by defineCodeGrader.\n */\nexport async function runCodeGrader(handler: CodeGraderHandler): Promise<void> {\n try {\n // 1. Read stdin\n const stdin = readStdin();\n\n // 2. Parse JSON\n const rawInput = JSON.parse(stdin) as Record<string, unknown>;\n\n // 3. Convert snake_case to camelCase\n const camelInput = toCamelCaseDeep(rawInput);\n\n // 4. Validate input with Zod\n const input = CodeGraderInputSchema.parse(camelInput);\n\n // 5. Set up lazy file-backed output loading if applicable\n if (input.outputPath && (input.output === null || input.output === undefined)) {\n let cachedOutput: CodeGraderInput['output'] | undefined;\n const filePath = input.outputPath;\n Object.defineProperty(input, 'output', {\n get() {\n if (cachedOutput === undefined) {\n cachedOutput = JSON.parse(readFileSync(filePath, 'utf8'));\n }\n return cachedOutput;\n },\n configurable: true,\n enumerable: true,\n });\n }\n\n // 6. Enrich input — no-op pass-through\n enrichInput(input);\n\n // 7. Run handler\n const rawResult = await handler(input);\n\n // 8. Validate and normalize output\n const result = CodeGraderResultSchema.parse({\n ...rawResult,\n score: clampScore(rawResult.score),\n });\n\n // 9. Output JSON\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n // Output failure result\n const errorMessage = formatError(error);\n const errorResult: CodeGraderResult = {\n score: 0,\n assertions: [{ text: `Evaluation failed: ${errorMessage}`, passed: false }],\n };\n console.log(JSON.stringify(errorResult, null, 2));\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["import_zod","import_node_fs","readStdin","import_node_fs","readStdin","clampScore","formatError"]}
|