agentv 4.35.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/{artifact-writer-G57MG52C.js → artifact-writer-3YRN6YTA.js} +4 -4
- package/dist/{chunk-CRMGUVRZ.js → chunk-4M6FAQTW.js} +85 -19
- package/dist/chunk-4M6FAQTW.js.map +1 -0
- package/dist/{chunk-INOKS5LF.js → chunk-7KZ2AF26.js} +269 -57
- package/dist/chunk-7KZ2AF26.js.map +1 -0
- package/dist/{chunk-KJGYL3M3.js → chunk-HVBAVOAH.js} +72 -50
- package/dist/chunk-HVBAVOAH.js.map +1 -0
- package/dist/{chunk-KNF3AGCI.js → chunk-P5JONEWJ.js} +231 -35
- package/dist/chunk-P5JONEWJ.js.map +1 -0
- package/dist/{chunk-6QEIZ33V.js → chunk-TUTURE2B.js} +1227 -372
- package/dist/chunk-TUTURE2B.js.map +1 -0
- package/dist/cli.js +5 -5
- package/dist/dashboard/assets/index-DA96FAM5.js +119 -0
- package/dist/dashboard/assets/{index-Bdk-9a_8.js → index-l4t97uO8.js} +1 -1
- package/dist/dashboard/assets/index-nmrFBoNd.css +1 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/{dist-M4B77IW4.js → dist-BSFUYS54.js} +73 -3
- package/dist/index.js +5 -5
- package/dist/{interactive-VYQ5SYMR.js → interactive-IEC63EVP.js} +5 -5
- package/dist/skills/agentv-eval-writer/SKILL.md +6 -0
- package/dist/{ts-eval-loader-EQJX3OLT-THE7D3GR.js → ts-eval-loader-4DU65XGW-YM47FFG2.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-6QEIZ33V.js.map +0 -1
- package/dist/chunk-CRMGUVRZ.js.map +0 -1
- package/dist/chunk-INOKS5LF.js.map +0 -1
- package/dist/chunk-KJGYL3M3.js.map +0 -1
- package/dist/chunk-KNF3AGCI.js.map +0 -1
- package/dist/dashboard/assets/index-BPMAZqjE.css +0 -1
- package/dist/dashboard/assets/index-BWO0UcxG.js +0 -118
- /package/dist/{artifact-writer-G57MG52C.js.map → artifact-writer-3YRN6YTA.js.map} +0 -0
- /package/dist/{dist-M4B77IW4.js.map → dist-BSFUYS54.js.map} +0 -0
- /package/dist/{interactive-VYQ5SYMR.js.map → interactive-IEC63EVP.js.map} +0 -0
- /package/dist/{ts-eval-loader-EQJX3OLT-THE7D3GR.js.map → ts-eval-loader-4DU65XGW-YM47FFG2.js.map} +0 -0
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
} from "./chunk-
|
|
3
|
+
traceToTranscriptJsonLines
|
|
4
|
+
} from "./chunk-P5JONEWJ.js";
|
|
5
5
|
import {
|
|
6
6
|
DEFAULT_THRESHOLD,
|
|
7
|
+
buildTraceFromMessages,
|
|
8
|
+
extractLastAssistantContent,
|
|
7
9
|
parseYamlValue
|
|
8
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-TUTURE2B.js";
|
|
9
11
|
|
|
10
12
|
// src/commands/eval/artifact-writer.ts
|
|
11
13
|
import { mkdir as mkdir2, readFile as readFile2, writeFile as writeFile2 } from "node:fs/promises";
|
|
@@ -528,18 +530,8 @@ function isExecutionError(result) {
|
|
|
528
530
|
return result.executionStatus === "execution_error";
|
|
529
531
|
}
|
|
530
532
|
function countToolCalls(result) {
|
|
531
|
-
const toolCalls = {};
|
|
532
|
-
|
|
533
|
-
const trace = result.trace;
|
|
534
|
-
if (trace?.steps) {
|
|
535
|
-
for (const step of trace.steps) {
|
|
536
|
-
if (step.toolName || step.type === "tool") {
|
|
537
|
-
const name = step.toolName ?? "unknown";
|
|
538
|
-
toolCalls[name] = (toolCalls[name] ?? 0) + 1;
|
|
539
|
-
total += 1;
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
}
|
|
533
|
+
const toolCalls = { ...result.trace?.toolCalls ?? {} };
|
|
534
|
+
const total = Object.values(toolCalls).reduce((sum, count) => sum + count, 0);
|
|
543
535
|
return { toolCalls, total };
|
|
544
536
|
}
|
|
545
537
|
function parseWorkspaceChanges(fileChanges) {
|
|
@@ -611,7 +603,7 @@ function buildGradingArtifact(result) {
|
|
|
611
603
|
graders: buildEvaluators(result.scores),
|
|
612
604
|
workspace_changes: parseWorkspaceChanges(result.fileChanges),
|
|
613
605
|
conversation: result.conversationId ? {
|
|
614
|
-
turns: result.trace
|
|
606
|
+
turns: result.trace?.messages.filter((message) => message.role === "assistant").length ?? 0,
|
|
615
607
|
conversation_id: result.conversationId
|
|
616
608
|
} : void 0
|
|
617
609
|
};
|
|
@@ -832,6 +824,11 @@ function buildIndexArtifactEntry(result, options) {
|
|
|
832
824
|
conversation_id: result.conversationId,
|
|
833
825
|
score: result.score,
|
|
834
826
|
target: result.target ?? "unknown",
|
|
827
|
+
token_usage: result.tokenUsage,
|
|
828
|
+
cost_usd: result.costUsd,
|
|
829
|
+
duration_ms: result.durationMs,
|
|
830
|
+
start_time: result.startTime,
|
|
831
|
+
end_time: result.endTime,
|
|
835
832
|
scores: result.scores ? toSnakeCaseDeep(result.scores) : void 0,
|
|
836
833
|
execution_status: result.executionStatus,
|
|
837
834
|
error: result.error,
|
|
@@ -842,7 +839,10 @@ function buildIndexArtifactEntry(result, options) {
|
|
|
842
839
|
grading_path: toRelativeArtifactPath(options.outputDir, options.gradingPath),
|
|
843
840
|
timing_path: toRelativeArtifactPath(options.outputDir, options.timingPath),
|
|
844
841
|
output_path: options.outputPath ? toRelativeArtifactPath(options.outputDir, options.outputPath) : void 0,
|
|
842
|
+
answer_path: options.answerPath ? toRelativeArtifactPath(options.outputDir, options.answerPath) : void 0,
|
|
843
|
+
transcript_path: options.transcriptPath ? toRelativeArtifactPath(options.outputDir, options.transcriptPath) : void 0,
|
|
845
844
|
input_path: options.inputPath ? toRelativeArtifactPath(options.outputDir, options.inputPath) : void 0,
|
|
845
|
+
response_path: options.responsePath ? toRelativeArtifactPath(options.outputDir, options.responsePath) : void 0,
|
|
846
846
|
...buildTaskBundleIndexFields(options.outputDir, options.taskBundle),
|
|
847
847
|
metadata: result.metadata
|
|
848
848
|
};
|
|
@@ -850,7 +850,8 @@ function buildIndexArtifactEntry(result, options) {
|
|
|
850
850
|
function buildResultIndexArtifact(result, taskBundle) {
|
|
851
851
|
const artifactSubdir = buildArtifactSubdir(result);
|
|
852
852
|
const input = extractInput(result);
|
|
853
|
-
const
|
|
853
|
+
const hasAnswer = result.output.length > 0;
|
|
854
|
+
const hasTranscript = result.trace.messages.length > 0 || result.trace.events.length > 0;
|
|
854
855
|
return {
|
|
855
856
|
timestamp: result.timestamp,
|
|
856
857
|
test_id: result.testId ?? "unknown",
|
|
@@ -859,6 +860,11 @@ function buildResultIndexArtifact(result, taskBundle) {
|
|
|
859
860
|
conversation_id: result.conversationId,
|
|
860
861
|
score: result.score,
|
|
861
862
|
target: result.target ?? "unknown",
|
|
863
|
+
token_usage: result.tokenUsage,
|
|
864
|
+
cost_usd: result.costUsd,
|
|
865
|
+
duration_ms: result.durationMs,
|
|
866
|
+
start_time: result.startTime,
|
|
867
|
+
end_time: result.endTime,
|
|
862
868
|
scores: result.scores ? toSnakeCaseDeep(result.scores) : void 0,
|
|
863
869
|
execution_status: result.executionStatus,
|
|
864
870
|
error: result.error,
|
|
@@ -869,8 +875,10 @@ function buildResultIndexArtifact(result, taskBundle) {
|
|
|
869
875
|
grading_path: path3.posix.join(artifactSubdir, "grading.json"),
|
|
870
876
|
timing_path: path3.posix.join(artifactSubdir, "timing.json"),
|
|
871
877
|
input_path: input ? path3.posix.join(artifactSubdir, "input.md") : void 0,
|
|
872
|
-
output_path:
|
|
873
|
-
|
|
878
|
+
output_path: hasAnswer ? path3.posix.join(artifactSubdir, "outputs", "answer.md") : void 0,
|
|
879
|
+
answer_path: hasAnswer ? path3.posix.join(artifactSubdir, "outputs", "answer.md") : void 0,
|
|
880
|
+
transcript_path: hasTranscript ? path3.posix.join(artifactSubdir, "outputs", "transcript.jsonl") : void 0,
|
|
881
|
+
response_path: hasAnswer ? path3.posix.join(artifactSubdir, "outputs", "response.md") : void 0,
|
|
874
882
|
...taskBundle ? {
|
|
875
883
|
task_dir: path3.posix.join(artifactSubdir, "task"),
|
|
876
884
|
eval_path: path3.posix.join(artifactSubdir, "task", "EVAL.yaml"),
|
|
@@ -886,6 +894,15 @@ async function writeJsonlFile(filePath, records) {
|
|
|
886
894
|
`;
|
|
887
895
|
await writeFile2(filePath, content, "utf8");
|
|
888
896
|
}
|
|
897
|
+
async function writeTranscriptJsonl(filePath, result) {
|
|
898
|
+
const lines = traceToTranscriptJsonLines(result.trace, {
|
|
899
|
+
testId: result.testId,
|
|
900
|
+
target: result.target
|
|
901
|
+
});
|
|
902
|
+
const content = lines.length > 0 ? `${lines.map((line) => JSON.stringify(line)).join("\n")}
|
|
903
|
+
` : "";
|
|
904
|
+
await writeFile2(filePath, content, "utf8");
|
|
905
|
+
}
|
|
889
906
|
function isRecord2(value) {
|
|
890
907
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
891
908
|
}
|
|
@@ -977,11 +994,28 @@ function isOutputMessage(value) {
|
|
|
977
994
|
function isExecutionStatus(value) {
|
|
978
995
|
return typeof value === "string" && EXECUTION_STATUSES.has(value);
|
|
979
996
|
}
|
|
997
|
+
function isTraceRecord(value) {
|
|
998
|
+
return !!value && typeof value === "object" && !Array.isArray(value) && Array.isArray(value.messages) && Array.isArray(value.events);
|
|
999
|
+
}
|
|
980
1000
|
function normalizeParsedResult(value) {
|
|
981
1001
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
982
1002
|
return void 0;
|
|
983
1003
|
}
|
|
984
1004
|
const result = value;
|
|
1005
|
+
const legacyOutputMessages = Array.isArray(result.output) ? result.output.filter(isOutputMessage) : void 0;
|
|
1006
|
+
const output = typeof result.output === "string" ? result.output : extractLastAssistantContent(legacyOutputMessages);
|
|
1007
|
+
const legacySummary = result.trace && typeof result.trace === "object" && !Array.isArray(result.trace) ? result.trace : void 0;
|
|
1008
|
+
const trace = isTraceRecord(result.trace) ? result.trace : buildTraceFromMessages({
|
|
1009
|
+
input: Array.isArray(result.input) ? result.input : [],
|
|
1010
|
+
output: legacyOutputMessages,
|
|
1011
|
+
summary: legacySummary,
|
|
1012
|
+
finalOutput: output,
|
|
1013
|
+
tokenUsage: result.tokenUsage,
|
|
1014
|
+
costUsd: typeof result.costUsd === "number" ? result.costUsd : void 0,
|
|
1015
|
+
durationMs: typeof result.durationMs === "number" ? result.durationMs : void 0,
|
|
1016
|
+
target: typeof result.target === "string" ? result.target : void 0,
|
|
1017
|
+
testId: typeof result.testId === "string" ? result.testId : void 0
|
|
1018
|
+
});
|
|
985
1019
|
return {
|
|
986
1020
|
...result,
|
|
987
1021
|
timestamp: typeof result.timestamp === "string" ? result.timestamp : (/* @__PURE__ */ new Date(0)).toISOString(),
|
|
@@ -989,7 +1023,8 @@ function normalizeParsedResult(value) {
|
|
|
989
1023
|
score: typeof result.score === "number" ? result.score : 0,
|
|
990
1024
|
assertions: Array.isArray(result.assertions) ? result.assertions.filter(isAssertionEntry) : [],
|
|
991
1025
|
target: typeof result.target === "string" ? result.target : "unknown",
|
|
992
|
-
output
|
|
1026
|
+
output,
|
|
1027
|
+
trace,
|
|
993
1028
|
executionStatus: isExecutionStatus(result.executionStatus) ? result.executionStatus : "ok"
|
|
994
1029
|
};
|
|
995
1030
|
}
|
|
@@ -1021,23 +1056,10 @@ async function writeArtifacts(jsonlPath, outputDir, options) {
|
|
|
1021
1056
|
function buildTranscriptMessageLines(results) {
|
|
1022
1057
|
const lines = [];
|
|
1023
1058
|
for (const result of results) {
|
|
1024
|
-
const transcriptLines =
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
provider: result.target,
|
|
1029
|
-
sessionId: result.conversationId ?? result.testId,
|
|
1030
|
-
startedAt: result.timestamp
|
|
1031
|
-
},
|
|
1032
|
-
tokenUsage: result.tokenUsage,
|
|
1033
|
-
durationMs: result.durationMs,
|
|
1034
|
-
costUsd: result.costUsd
|
|
1035
|
-
},
|
|
1036
|
-
{
|
|
1037
|
-
testId: result.testId,
|
|
1038
|
-
target: result.target
|
|
1039
|
-
}
|
|
1040
|
-
);
|
|
1059
|
+
const transcriptLines = traceToTranscriptJsonLines(result.trace, {
|
|
1060
|
+
testId: result.testId,
|
|
1061
|
+
target: result.target
|
|
1062
|
+
});
|
|
1041
1063
|
lines.push(...transcriptLines.map((line) => JSON.stringify(line)));
|
|
1042
1064
|
}
|
|
1043
1065
|
return lines.length > 0 ? `${lines.join("\n")}
|
|
@@ -1115,14 +1137,14 @@ async function writePerTestArtifacts(results, outputDir, options) {
|
|
|
1115
1137
|
if (input) {
|
|
1116
1138
|
await writeFile2(path3.join(testDir, "input.md"), input, "utf8");
|
|
1117
1139
|
}
|
|
1118
|
-
if (result.output
|
|
1140
|
+
if (result.output.length > 0 || result.trace.messages.length > 0) {
|
|
1119
1141
|
const outputsDir = path3.join(testDir, "outputs");
|
|
1120
1142
|
await mkdir2(outputsDir, { recursive: true });
|
|
1121
|
-
|
|
1122
|
-
path3.join(outputsDir, "
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
);
|
|
1143
|
+
if (result.output.length > 0) {
|
|
1144
|
+
await writeFile2(path3.join(outputsDir, "answer.md"), result.output, "utf8");
|
|
1145
|
+
await writeFile2(path3.join(outputsDir, "response.md"), result.output, "utf8");
|
|
1146
|
+
}
|
|
1147
|
+
await writeTranscriptJsonl(path3.join(outputsDir, "transcript.jsonl"), result);
|
|
1126
1148
|
}
|
|
1127
1149
|
const taskBundle = await materializeTaskBundleForResult({
|
|
1128
1150
|
result,
|
|
@@ -1164,14 +1186,14 @@ async function writeArtifactsFromResults(results, outputDir, options) {
|
|
|
1164
1186
|
if (input) {
|
|
1165
1187
|
await writeFile2(path3.join(testDir, "input.md"), input, "utf8");
|
|
1166
1188
|
}
|
|
1167
|
-
if (result.output
|
|
1189
|
+
if (result.output.length > 0 || result.trace.messages.length > 0) {
|
|
1168
1190
|
const outputsDir = path3.join(testDir, "outputs");
|
|
1169
1191
|
await mkdir2(outputsDir, { recursive: true });
|
|
1170
|
-
|
|
1171
|
-
path3.join(outputsDir, "
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
);
|
|
1192
|
+
if (result.output.length > 0) {
|
|
1193
|
+
await writeFile2(path3.join(outputsDir, "answer.md"), result.output, "utf8");
|
|
1194
|
+
await writeFile2(path3.join(outputsDir, "response.md"), result.output, "utf8");
|
|
1195
|
+
}
|
|
1196
|
+
await writeTranscriptJsonl(path3.join(outputsDir, "transcript.jsonl"), result);
|
|
1175
1197
|
}
|
|
1176
1198
|
const taskBundle = await materializeTaskBundleForResult({
|
|
1177
1199
|
result,
|
|
@@ -1231,4 +1253,4 @@ export {
|
|
|
1231
1253
|
writePerTestArtifacts,
|
|
1232
1254
|
writeArtifactsFromResults
|
|
1233
1255
|
};
|
|
1234
|
-
//# sourceMappingURL=chunk-
|
|
1256
|
+
//# sourceMappingURL=chunk-HVBAVOAH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/eval/artifact-writer.ts","../src/utils/case-conversion.ts","../src/commands/eval/result-layout.ts","../src/commands/eval/task-bundle.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport {\n DEFAULT_THRESHOLD,\n type EvalTest,\n type EvaluationResult,\n type GraderResult,\n type Message,\n type TargetDefinition,\n type TraceSummary,\n buildTraceFromMessages,\n extractLastAssistantContent,\n traceToTranscriptJsonLines,\n} from '@agentv/core';\nimport { toSnakeCaseDeep } from '../../utils/case-conversion.js';\nimport { RESULT_INDEX_FILENAME } from './result-layout.js';\nimport {\n type MaterializedTaskBundlePaths,\n type TaskBundleTargetSelection,\n materializeTaskBundle,\n} from './task-bundle.js';\n\nexport function buildTestTargetKey(testId?: string, target?: string): string {\n return `${testId ?? 'unknown'}::${target ?? 'unknown'}`;\n}\n\n// Deduplication helper — keeps the last entry per (test_id, target) pair.\nexport function deduplicateByTestIdTarget(\n results: readonly EvaluationResult[],\n): EvaluationResult[] {\n const seen = new Map<string, number>();\n for (let i = 0; i < results.length; i++) {\n seen.set(buildTestTargetKey(results[i].testId, results[i].target), i);\n }\n const deduped: EvaluationResult[] = [];\n for (let i = 0; i < results.length; i++) {\n const key = buildTestTargetKey(results[i].testId, results[i].target);\n if (seen.get(key) === i) {\n deduped.push(results[i]);\n }\n }\n return deduped;\n}\n\nexport async function aggregateRunDir(\n runDir: string,\n options?: { evalFile?: string; experiment?: string; plannedTestCount?: number },\n): Promise<{ benchmarkPath: string; timingPath: string; testCount: number; targetCount: number }> {\n const indexPath = path.join(runDir, RESULT_INDEX_FILENAME);\n const content = await readFile(indexPath, 'utf8');\n const allResults = parseJsonlResults(content);\n const results = deduplicateByTestIdTarget(allResults);\n\n const timing = buildTimingArtifact(results);\n const timingPath = path.join(runDir, 'timing.json');\n await writeFile(timingPath, `${JSON.stringify(timing, null, 2)}\\n`, 'utf8');\n\n // Preserve `planned_test_count` from any pre-existing benchmark.json (e.g.\n // the stub written at run start, or from the original run when this is a\n // resume) unless an explicit value was passed.\n const plannedTestCount =\n options?.plannedTestCount ?? (await readPlannedTestCount(path.join(runDir, 'benchmark.json')));\n\n const benchmark = buildBenchmarkArtifact(\n results,\n options?.evalFile,\n options?.experiment,\n plannedTestCount,\n );\n const benchmarkPath = path.join(runDir, 'benchmark.json');\n await writeFile(benchmarkPath, `${JSON.stringify(benchmark, null, 2)}\\n`, 'utf8');\n\n const targetSet = new Set(results.map((r) => r.target ?? 'unknown'));\n return { benchmarkPath, timingPath, testCount: results.length, targetCount: targetSet.size };\n}\n\nasync function readPlannedTestCount(benchmarkPath: string): Promise<number | undefined> {\n try {\n const raw = await readFile(benchmarkPath, 'utf8');\n const parsed = JSON.parse(raw) as { metadata?: { planned_test_count?: number } };\n const value = parsed.metadata?.planned_test_count;\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Artifact interfaces (snake_case to match skill-creator conventions)\n// ---------------------------------------------------------------------------\n\nexport interface GradingArtifact {\n readonly assertions: readonly {\n readonly text: string;\n readonly passed: boolean;\n readonly evidence: string;\n }[];\n readonly summary: {\n readonly passed: number;\n readonly failed: number;\n readonly total: number;\n readonly pass_rate: number;\n };\n readonly execution_metrics: {\n readonly tool_calls: Record<string, number>;\n readonly total_tool_calls: number;\n readonly errors_encountered: number;\n };\n readonly graders?: readonly {\n readonly name: string;\n readonly type: string;\n readonly score: number;\n readonly reasoning: string;\n readonly [key: string]: unknown;\n }[];\n readonly workspace_changes?: {\n readonly files_modified: number;\n readonly files_created: number;\n readonly diff_summary: string;\n };\n readonly conversation?: {\n readonly turns: number;\n readonly conversation_id: string;\n };\n}\n\nexport interface TimingArtifact {\n readonly total_tokens: number;\n readonly duration_ms: number;\n readonly total_duration_seconds: number;\n readonly token_usage: {\n readonly input: number;\n readonly output: number;\n readonly reasoning: number;\n };\n}\n\nexport interface BenchmarkArtifact {\n readonly metadata: {\n readonly eval_file: string;\n readonly timestamp: string;\n readonly targets: readonly string[];\n readonly tests_run: readonly string[];\n readonly experiment?: string;\n /**\n * Total number of test cases the run was planned to execute (across all\n * targets and eval files). Written at run start so an interrupted run\n * can be diagnosed as resumable when `tests_run.length < planned_test_count`,\n * even if every recorded row has `execution_status: ok`.\n */\n readonly planned_test_count?: number;\n };\n readonly run_summary: Record<\n string,\n {\n readonly pass_rate: { readonly mean: number; readonly stddev: number };\n readonly time_seconds: { readonly mean: number; readonly stddev: number };\n readonly tokens: { readonly mean: number; readonly stddev: number };\n readonly tool_calls?: { readonly mean: number; readonly stddev: number };\n readonly cost_usd?: { readonly mean: number; readonly stddev: number };\n }\n >;\n readonly per_grader_summary?: Record<string, { readonly mean: number; readonly stddev: number }>;\n readonly notes: readonly string[];\n}\n\nexport interface AggregateGradingArtifact {\n readonly assertions: readonly {\n readonly test_id: string;\n readonly text: string;\n readonly passed: boolean;\n readonly evidence: string;\n }[];\n readonly summary: {\n readonly passed: number;\n readonly failed: number;\n readonly total: number;\n readonly pass_rate: number;\n };\n}\n\nexport interface IndexArtifactEntry {\n readonly timestamp: string;\n readonly test_id: string;\n readonly suite?: string;\n readonly category?: string;\n readonly conversation_id?: string;\n readonly experiment?: string;\n readonly score: number;\n readonly target: string;\n readonly token_usage?: EvaluationResult['tokenUsage'];\n readonly cost_usd?: number;\n readonly duration_ms?: number;\n readonly start_time?: string;\n readonly end_time?: string;\n readonly scores?: readonly Record<string, unknown>[];\n readonly execution_status?: string;\n readonly error?: string;\n readonly failure_stage?: string;\n readonly failure_reason_code?: string;\n readonly workspace_path?: string;\n readonly artifact_dir?: string;\n readonly grading_path: string;\n readonly timing_path: string;\n readonly output_path?: string;\n readonly answer_path?: string;\n readonly transcript_path?: string;\n readonly input_path?: string;\n /** @deprecated Use output_path/answer_path for the final answer. */\n readonly response_path?: string;\n readonly task_dir?: string;\n readonly eval_path?: string;\n readonly targets_path?: string;\n readonly files_path?: string;\n readonly graders_path?: string;\n /** Case-level metadata pass-through (governance taxonomies, skill tags, etc.). */\n readonly metadata?: Record<string, unknown>;\n}\n\nexport type ResultIndexArtifact = IndexArtifactEntry;\n\n// ---------------------------------------------------------------------------\n// Statistics helpers\n// ---------------------------------------------------------------------------\n\nfunction computeStats(values: readonly number[]): { mean: number; stddev: number } {\n if (values.length === 0) {\n return { mean: 0, stddev: 0 };\n }\n const mean = values.reduce((sum, v) => sum + v, 0) / values.length;\n const variance = values.reduce((sum, v) => sum + (v - mean) ** 2, 0) / values.length;\n return {\n mean: Math.round(mean * 1000) / 1000,\n stddev: Math.round(Math.sqrt(variance) * 1000) / 1000,\n };\n}\n\nfunction computePassRate(result: EvaluationResult): number {\n const scores = result.scores;\n if (scores && scores.length > 0) {\n const passed = scores.filter((s) => s.score >= DEFAULT_THRESHOLD).length;\n return passed / scores.length;\n }\n return (result.score ?? 0) >= DEFAULT_THRESHOLD ? 1.0 : 0.0;\n}\n\nfunction isExecutionError(result: EvaluationResult): boolean {\n return result.executionStatus === 'execution_error';\n}\n\n// ---------------------------------------------------------------------------\n// Tool-call counting from trace data\n// ---------------------------------------------------------------------------\n\nfunction countToolCalls(result: EvaluationResult): {\n toolCalls: Record<string, number>;\n total: number;\n} {\n const toolCalls = { ...(result.trace?.toolCalls ?? {}) };\n const total = Object.values(toolCalls).reduce((sum, count) => sum + count, 0);\n return { toolCalls, total };\n}\n\n// ---------------------------------------------------------------------------\n// Workspace change parsing from fileChanges diff\n// ---------------------------------------------------------------------------\n\nfunction parseWorkspaceChanges(\n fileChanges: string | undefined,\n): GradingArtifact['workspace_changes'] | undefined {\n if (!fileChanges) {\n return undefined;\n }\n\n let filesModified = 0;\n let filesCreated = 0;\n\n const lines = fileChanges.split('\\n');\n for (const line of lines) {\n if (line.startsWith('--- /dev/null')) {\n filesCreated += 1;\n } else if (line.startsWith('--- a/')) {\n filesModified += 1;\n }\n }\n\n const summaryLines = lines.slice(0, 20);\n const diffSummary =\n lines.length > 20\n ? `${summaryLines.join('\\n')}\\n... (${lines.length - 20} more lines)`\n : fileChanges;\n\n return {\n files_modified: filesModified,\n files_created: filesCreated,\n diff_summary: diffSummary,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Build assertions from evaluation result (skill-creator compatible)\n// ---------------------------------------------------------------------------\n\nfunction buildAssertions(result: EvaluationResult): GradingArtifact['assertions'] {\n if (!result.assertions) return [];\n return result.assertions.map((a) => ({\n text: a.text,\n passed: a.passed,\n evidence: a.evidence ?? '',\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Build graders list\n// ---------------------------------------------------------------------------\n\nfunction buildEvaluators(scores: readonly GraderResult[] | undefined): GradingArtifact['graders'] {\n if (!scores || scores.length === 0) {\n return undefined;\n }\n\n return scores.map((s) => ({\n name: s.name,\n type: s.type,\n score: s.score,\n reasoning: '',\n weight: s.weight,\n verdict: s.verdict,\n assertions: s.assertions,\n details: s.details,\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Public artifact builders\n// ---------------------------------------------------------------------------\n\nexport function buildGradingArtifact(result: EvaluationResult): GradingArtifact {\n const assertions = buildAssertions(result);\n const passed = assertions.filter((e) => e.passed).length;\n const failed = assertions.filter((e) => !e.passed).length;\n const total = assertions.length;\n\n const { toolCalls, total: totalToolCalls } = countToolCalls(result);\n const errorsEncountered = result.error ? 1 : 0;\n\n return {\n assertions,\n summary: {\n passed,\n failed,\n total,\n pass_rate: total > 0 ? Math.round((passed / total) * 1000) / 1000 : 0,\n },\n execution_metrics: {\n tool_calls: toolCalls,\n total_tool_calls: totalToolCalls,\n errors_encountered: errorsEncountered,\n },\n graders: buildEvaluators(result.scores),\n workspace_changes: parseWorkspaceChanges(result.fileChanges),\n conversation: result.conversationId\n ? {\n turns:\n result.trace?.messages.filter((message) => message.role === 'assistant').length ?? 0,\n conversation_id: result.conversationId,\n }\n : undefined,\n };\n}\n\nexport function buildTimingArtifact(results: readonly EvaluationResult[]): TimingArtifact {\n let totalInput = 0;\n let totalOutput = 0;\n let totalReasoning = 0;\n let totalDurationMs = 0;\n\n for (const result of results) {\n const usage = result.tokenUsage as\n | { input?: number; output?: number; reasoning?: number }\n | undefined;\n if (usage) {\n totalInput += usage.input ?? 0;\n totalOutput += usage.output ?? 0;\n totalReasoning += usage.reasoning ?? 0;\n }\n if (result.durationMs != null) {\n totalDurationMs += result.durationMs;\n }\n }\n\n return {\n total_tokens: totalInput + totalOutput,\n duration_ms: totalDurationMs,\n total_duration_seconds: Math.round((totalDurationMs / 1000) * 1000) / 1000,\n token_usage: {\n input: totalInput,\n output: totalOutput,\n reasoning: totalReasoning,\n },\n };\n}\n\nexport function buildBenchmarkArtifact(\n results: readonly EvaluationResult[],\n evalFile = '',\n experiment?: string,\n plannedTestCount?: number,\n): BenchmarkArtifact {\n const targetSet = new Set<string>();\n const testIdSet = new Set<string>();\n for (const result of results) {\n targetSet.add(result.target ?? 'unknown');\n testIdSet.add(result.testId ?? 'unknown');\n }\n\n const targets = [...targetSet].sort();\n const testIds = [...testIdSet].sort();\n\n const runSummary: BenchmarkArtifact['run_summary'] = {};\n const notes: string[] = [];\n\n for (const target of targets) {\n const targetResults = results.filter((r) => r.target === target);\n const qualityResults = targetResults.filter((r) => !isExecutionError(r));\n\n const passRates = qualityResults.map(computePassRate);\n const timings = targetResults\n .filter((r) => r.durationMs != null)\n .map((r) => (r.durationMs as number) / 1000);\n const tokens = targetResults\n .filter((r) => r.tokenUsage != null)\n .map((r) => {\n const usage = r.tokenUsage as { input?: number; output?: number };\n return (usage.input ?? 0) + (usage.output ?? 0);\n });\n\n const entry: Record<string, unknown> = {\n pass_rate: computeStats(passRates),\n time_seconds: computeStats(timings),\n tokens: computeStats(tokens),\n };\n\n // Optional tool_calls stats from trace data\n const toolCallCounts = targetResults.map((r) => countToolCalls(r).total);\n if (toolCallCounts.some((c) => c > 0)) {\n entry.tool_calls = computeStats(toolCallCounts);\n }\n\n // Optional cost stats\n const costs = targetResults.filter((r) => r.costUsd != null).map((r) => r.costUsd as number);\n if (costs.length > 0) {\n entry.cost_usd = computeStats(costs);\n }\n\n runSummary[target] = entry as (typeof runSummary)[string];\n }\n\n // Per-grader summary across all results\n const evaluatorScores = new Map<string, number[]>();\n for (const result of results) {\n if (isExecutionError(result)) {\n continue;\n }\n if (result.scores) {\n for (const score of result.scores) {\n const key = `${score.name}:${score.type}`;\n if (!evaluatorScores.has(key)) {\n evaluatorScores.set(key, []);\n }\n evaluatorScores.get(key)?.push(score.score);\n }\n }\n }\n\n let perEvaluatorSummary: Record<string, { mean: number; stddev: number }> | undefined;\n if (evaluatorScores.size > 0) {\n perEvaluatorSummary = {};\n for (const [key, scores] of evaluatorScores) {\n perEvaluatorSummary[key] = computeStats(scores);\n }\n }\n\n const errorCount = results.filter(\n (r) => r.executionStatus != null && r.executionStatus === 'execution_error',\n ).length;\n if (errorCount > 0) {\n notes.push(\n `${errorCount} test(s) had execution errors and are excluded from quality pass_rate`,\n );\n }\n if (results.length === 0) {\n notes.push('No results to summarize');\n }\n\n const firstResult = results[0];\n const timestamp = firstResult?.timestamp ?? new Date().toISOString();\n\n return {\n metadata: {\n eval_file: evalFile,\n timestamp,\n targets,\n tests_run: testIds,\n experiment,\n planned_test_count: plannedTestCount,\n },\n run_summary: runSummary,\n per_grader_summary: perEvaluatorSummary,\n notes,\n };\n}\n\n/**\n * Write a stub `benchmark.json` at the start of a run, before any tests\n * have executed. Carries `planned_test_count` so an interrupted run can\n * still be detected as resumable even when every recorded row has\n * `execution_status: ok`.\n *\n * The end-of-run write (writeArtifactsFromResults / aggregateRunDir)\n * overwrites this file with the full summary; preserve `planned_test_count`\n * by passing it through.\n */\nexport async function writeInitialBenchmarkArtifact(\n runDir: string,\n options: {\n evalFile: string;\n plannedTestCount: number;\n experiment?: string;\n },\n): Promise<void> {\n await mkdir(runDir, { recursive: true });\n const stub = buildBenchmarkArtifact(\n [],\n options.evalFile,\n options.experiment,\n options.plannedTestCount,\n );\n const benchmarkPath = path.join(runDir, 'benchmark.json');\n await writeFile(benchmarkPath, `${JSON.stringify(stub, null, 2)}\\n`, 'utf8');\n}\n\nexport function buildAggregateGradingArtifact(\n results: readonly EvaluationResult[],\n): AggregateGradingArtifact {\n const assertions: AggregateGradingArtifact['assertions'][number][] = [];\n\n for (const result of results.filter((r) => !isExecutionError(r))) {\n if (!result.assertions) continue;\n const testId = result.testId ?? 'unknown';\n for (const a of result.assertions) {\n assertions.push({\n test_id: testId,\n text: a.text,\n passed: a.passed,\n evidence: a.evidence ?? '',\n });\n }\n }\n\n const passed = assertions.filter((a) => a.passed).length;\n const failed = assertions.filter((a) => !a.passed).length;\n const total = assertions.length;\n\n return {\n assertions,\n summary: {\n passed,\n failed,\n total,\n pass_rate: total > 0 ? Math.round((passed / total) * 1000) / 1000 : 0,\n },\n };\n}\n\nfunction buildTestByTestId(sourceTests: readonly EvalTest[] | undefined): Map<string, EvalTest> {\n const testByTestId = new Map<string, EvalTest>();\n for (const test of sourceTests ?? []) {\n testByTestId.set(test.id, test);\n }\n return testByTestId;\n}\n\nfunction safeArtifactPathSegment(value: string | undefined, fallback: string): string {\n const trimmed = value?.trim();\n if (!trimmed) {\n return fallback;\n }\n return trimmed.replace(/[/\\\\:*?\"<>|]/g, '_');\n}\n\nfunction safeTestId(testId: string | undefined): string {\n return safeArtifactPathSegment(testId, 'unknown');\n}\n\nfunction getSuite(result: EvaluationResult): string | undefined {\n return result.suite;\n}\n\nfunction buildArtifactSubdir(result: EvaluationResult): string {\n const segments = [];\n const evalSet = getSuite(result);\n if (evalSet) {\n segments.push(safeArtifactPathSegment(evalSet, 'default'));\n }\n segments.push(safeTestId(result.testId));\n return path.posix.join(...segments);\n}\n\nfunction formatOutputMarkdown(output: readonly { role: string; content?: unknown }[]): string {\n return output.map((msg) => `@[${msg.role}]:\\n${String(msg.content ?? '')}`).join('\\n\\n');\n}\n\nfunction extractInput(result: EvaluationResult): string | null {\n const input = (result as unknown as Record<string, unknown>).input;\n if (!input) return null;\n if (typeof input === 'string') return input;\n if (Array.isArray(input) && input.length > 0) {\n return formatOutputMarkdown(input as { role: string; content?: unknown }[]);\n }\n return null;\n}\n\nfunction toRelativeArtifactPath(outputDir: string, filePath: string): string {\n return path.relative(outputDir, filePath).split(path.sep).join('/');\n}\n\nfunction buildTaskBundleIndexFields(\n outputDir: string,\n taskBundle: MaterializedTaskBundlePaths | undefined,\n): Pick<\n IndexArtifactEntry,\n 'task_dir' | 'eval_path' | 'targets_path' | 'files_path' | 'graders_path'\n> {\n if (!taskBundle) {\n return {};\n }\n return {\n task_dir: toRelativeArtifactPath(outputDir, taskBundle.taskDir),\n eval_path: toRelativeArtifactPath(outputDir, taskBundle.evalPath),\n targets_path: toRelativeArtifactPath(outputDir, taskBundle.targetsPath),\n ...(taskBundle.filesPath\n ? { files_path: toRelativeArtifactPath(outputDir, taskBundle.filesPath) }\n : {}),\n ...(taskBundle.gradersPath\n ? { graders_path: toRelativeArtifactPath(outputDir, taskBundle.gradersPath) }\n : {}),\n };\n}\n\nexport function buildIndexArtifactEntry(\n result: EvaluationResult,\n options: {\n outputDir: string;\n artifactDir?: string;\n gradingPath: string;\n timingPath: string;\n outputPath?: string;\n answerPath?: string;\n transcriptPath?: string;\n inputPath?: string;\n responsePath?: string;\n taskBundle?: MaterializedTaskBundlePaths;\n },\n): IndexArtifactEntry {\n return {\n timestamp: result.timestamp,\n test_id: result.testId ?? 'unknown',\n suite: getSuite(result),\n category: result.category,\n conversation_id: result.conversationId,\n score: result.score,\n target: result.target ?? 'unknown',\n token_usage: result.tokenUsage,\n cost_usd: result.costUsd,\n duration_ms: result.durationMs,\n start_time: result.startTime,\n end_time: result.endTime,\n scores: result.scores\n ? (toSnakeCaseDeep(result.scores) as IndexArtifactEntry['scores'])\n : undefined,\n execution_status: result.executionStatus,\n error: result.error,\n failure_stage: result.failureStage,\n failure_reason_code: result.failureReasonCode,\n workspace_path: result.workspacePath,\n artifact_dir: options.artifactDir\n ? toRelativeArtifactPath(options.outputDir, options.artifactDir)\n : undefined,\n grading_path: toRelativeArtifactPath(options.outputDir, options.gradingPath),\n timing_path: toRelativeArtifactPath(options.outputDir, options.timingPath),\n output_path: options.outputPath\n ? toRelativeArtifactPath(options.outputDir, options.outputPath)\n : undefined,\n answer_path: options.answerPath\n ? toRelativeArtifactPath(options.outputDir, options.answerPath)\n : undefined,\n transcript_path: options.transcriptPath\n ? toRelativeArtifactPath(options.outputDir, options.transcriptPath)\n : undefined,\n input_path: options.inputPath\n ? toRelativeArtifactPath(options.outputDir, options.inputPath)\n : undefined,\n response_path: options.responsePath\n ? toRelativeArtifactPath(options.outputDir, options.responsePath)\n : undefined,\n ...buildTaskBundleIndexFields(options.outputDir, options.taskBundle),\n metadata: result.metadata,\n };\n}\n\nexport function buildResultIndexArtifact(\n result: EvaluationResult,\n taskBundle?: MaterializedTaskBundlePaths,\n): ResultIndexArtifact {\n const artifactSubdir = buildArtifactSubdir(result);\n const input = extractInput(result);\n const hasAnswer = result.output.length > 0;\n const hasTranscript = result.trace.messages.length > 0 || result.trace.events.length > 0;\n\n return {\n timestamp: result.timestamp,\n test_id: result.testId ?? 'unknown',\n suite: getSuite(result),\n category: result.category,\n conversation_id: result.conversationId,\n score: result.score,\n target: result.target ?? 'unknown',\n token_usage: result.tokenUsage,\n cost_usd: result.costUsd,\n duration_ms: result.durationMs,\n start_time: result.startTime,\n end_time: result.endTime,\n scores: result.scores\n ? (toSnakeCaseDeep(result.scores) as IndexArtifactEntry['scores'])\n : undefined,\n execution_status: result.executionStatus,\n error: result.error,\n failure_stage: result.failureStage,\n failure_reason_code: result.failureReasonCode,\n workspace_path: result.workspacePath,\n artifact_dir: artifactSubdir,\n grading_path: path.posix.join(artifactSubdir, 'grading.json'),\n timing_path: path.posix.join(artifactSubdir, 'timing.json'),\n input_path: input ? path.posix.join(artifactSubdir, 'input.md') : undefined,\n output_path: hasAnswer ? path.posix.join(artifactSubdir, 'outputs', 'answer.md') : undefined,\n answer_path: hasAnswer ? path.posix.join(artifactSubdir, 'outputs', 'answer.md') : undefined,\n transcript_path: hasTranscript\n ? path.posix.join(artifactSubdir, 'outputs', 'transcript.jsonl')\n : undefined,\n response_path: hasAnswer\n ? path.posix.join(artifactSubdir, 'outputs', 'response.md')\n : undefined,\n ...(taskBundle\n ? {\n task_dir: path.posix.join(artifactSubdir, 'task'),\n eval_path: path.posix.join(artifactSubdir, 'task', 'EVAL.yaml'),\n targets_path: path.posix.join(artifactSubdir, 'task', 'targets.yaml'),\n ...(taskBundle.filesPath\n ? { files_path: path.posix.join(artifactSubdir, 'task', 'files') }\n : {}),\n ...(taskBundle.gradersPath\n ? { graders_path: path.posix.join(artifactSubdir, 'task', 'graders') }\n : {}),\n }\n : {}),\n metadata: result.metadata,\n };\n}\n\nasync function writeJsonlFile(filePath: string, records: readonly unknown[]): Promise<void> {\n const content =\n records.length === 0\n ? ''\n : `${records.map((record) => JSON.stringify(toSnakeCaseDeep(record))).join('\\n')}\\n`;\n await writeFile(filePath, content, 'utf8');\n}\n\nasync function writeTranscriptJsonl(filePath: string, result: EvaluationResult): Promise<void> {\n const lines = traceToTranscriptJsonLines(result.trace, {\n testId: result.testId,\n target: result.target,\n });\n const content =\n lines.length > 0 ? `${lines.map((line) => JSON.stringify(line)).join('\\n')}\\n` : '';\n await writeFile(filePath, content, 'utf8');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction indexRecordKey(record: unknown): string | undefined {\n if (!isRecord(record)) {\n return undefined;\n }\n const testId =\n typeof record.test_id === 'string'\n ? record.test_id\n : typeof record.testId === 'string'\n ? record.testId\n : undefined;\n const target = typeof record.target === 'string' ? record.target : undefined;\n return testId ? buildTestTargetKey(testId, target) : undefined;\n}\n\nasync function rewriteExistingIndexRecords(\n outputDir: string,\n replacements: readonly ResultIndexArtifact[],\n): Promise<void> {\n if (replacements.length === 0) {\n return;\n }\n\n const indexPath = path.join(outputDir, RESULT_INDEX_FILENAME);\n const content = await readFile(indexPath, 'utf8').catch(() => undefined);\n if (content === undefined) {\n return;\n }\n\n const replacementsByKey = new Map(\n replacements.map((record) => [buildTestTargetKey(record.test_id, record.target), record]),\n );\n const seen = new Set<string>();\n const records: unknown[] = [];\n for (const line of content.split('\\n')) {\n if (line.trim().length === 0) {\n continue;\n }\n try {\n const parsed = JSON.parse(line) as unknown;\n const key = indexRecordKey(parsed);\n const replacement = key ? replacementsByKey.get(key) : undefined;\n if (key && replacement) {\n records.push(replacement);\n seen.add(key);\n } else {\n records.push(parsed);\n }\n } catch {}\n }\n\n for (const replacement of replacements) {\n const key = buildTestTargetKey(replacement.test_id, replacement.target);\n if (!seen.has(key)) {\n records.push(replacement);\n }\n }\n\n await writeJsonlFile(indexPath, records);\n}\n\n// ---------------------------------------------------------------------------\n// Snake_case to camelCase conversion for reading JSONL files\n// ---------------------------------------------------------------------------\n\nfunction toCamelCase(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nfunction toCamelCaseDeep(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map((item) => toCamelCaseDeep(item));\n }\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[toCamelCase(key)] = toCamelCaseDeep(value);\n }\n return result;\n }\n return obj;\n}\n\ntype ParsedEvaluationResult = Record<string, unknown> & {\n timestamp: string;\n testId: string;\n score: number;\n assertions: EvaluationResult['assertions'];\n target: string;\n output: EvaluationResult['output'];\n trace: EvaluationResult['trace'];\n executionStatus: EvaluationResult['executionStatus'];\n};\n\nconst EXECUTION_STATUSES = new Set<EvaluationResult['executionStatus']>([\n 'ok',\n 'quality_failure',\n 'execution_error',\n]);\n\nfunction isAssertionEntry(value: unknown): value is EvaluationResult['assertions'][number] {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n\n const candidate = value as { text?: unknown; passed?: unknown; evidence?: unknown };\n return (\n typeof candidate.text === 'string' &&\n typeof candidate.passed === 'boolean' &&\n (candidate.evidence === undefined || typeof candidate.evidence === 'string')\n );\n}\n\nfunction isOutputMessage(value: unknown): value is Message {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n\n const candidate = value as { role?: unknown };\n return typeof candidate.role === 'string';\n}\n\nfunction isExecutionStatus(value: unknown): value is EvaluationResult['executionStatus'] {\n return (\n typeof value === 'string' &&\n EXECUTION_STATUSES.has(value as EvaluationResult['executionStatus'])\n );\n}\n\nfunction isTraceRecord(value: unknown): value is EvaluationResult['trace'] {\n return (\n !!value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n Array.isArray((value as { messages?: unknown }).messages) &&\n Array.isArray((value as { events?: unknown }).events)\n );\n}\n\nfunction normalizeParsedResult(value: unknown): ParsedEvaluationResult | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n\n const result = value as Record<string, unknown>;\n const legacyOutputMessages = Array.isArray(result.output)\n ? result.output.filter(isOutputMessage)\n : undefined;\n const output =\n typeof result.output === 'string'\n ? result.output\n : extractLastAssistantContent(legacyOutputMessages);\n const legacySummary =\n result.trace && typeof result.trace === 'object' && !Array.isArray(result.trace)\n ? (result.trace as TraceSummary)\n : undefined;\n const trace = isTraceRecord(result.trace)\n ? result.trace\n : buildTraceFromMessages({\n input: Array.isArray(result.input) ? (result.input as EvaluationResult['input']) : [],\n output: legacyOutputMessages,\n summary: legacySummary,\n finalOutput: output,\n tokenUsage: result.tokenUsage as EvaluationResult['tokenUsage'],\n costUsd: typeof result.costUsd === 'number' ? result.costUsd : undefined,\n durationMs: typeof result.durationMs === 'number' ? result.durationMs : undefined,\n target: typeof result.target === 'string' ? result.target : undefined,\n testId: typeof result.testId === 'string' ? result.testId : undefined,\n });\n\n return {\n ...result,\n timestamp: typeof result.timestamp === 'string' ? result.timestamp : new Date(0).toISOString(),\n testId: typeof result.testId === 'string' ? result.testId : 'unknown',\n score: typeof result.score === 'number' ? result.score : 0,\n assertions: Array.isArray(result.assertions) ? result.assertions.filter(isAssertionEntry) : [],\n target: typeof result.target === 'string' ? result.target : 'unknown',\n output,\n trace,\n executionStatus: isExecutionStatus(result.executionStatus) ? result.executionStatus : 'ok',\n };\n}\n\n// ---------------------------------------------------------------------------\n// JSONL parsing\n// ---------------------------------------------------------------------------\n\nexport function parseJsonlResults(content: string): EvaluationResult[] {\n const results: EvaluationResult[] = [];\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n continue;\n }\n try {\n const parsed = JSON.parse(trimmed);\n // JSONL files from AgentV use snake_case; convert back to camelCase\n const camelCased = toCamelCaseDeep(parsed);\n const normalized = normalizeParsedResult(camelCased);\n if (normalized) {\n results.push(normalized);\n }\n } catch {\n // Skip malformed lines\n }\n }\n return results;\n}\n\n// ---------------------------------------------------------------------------\n// Artifact writer — reads JSONL and writes all three artifact types\n// ---------------------------------------------------------------------------\n\nexport async function writeArtifacts(\n jsonlPath: string,\n outputDir: string,\n options?: { evalFile?: string; experiment?: string },\n): Promise<{\n testArtifactDir: string;\n timingPath: string;\n benchmarkPath: string;\n indexPath: string;\n}> {\n const content = await readFile(jsonlPath, 'utf8');\n const results = parseJsonlResults(content);\n\n return writeArtifactsFromResults(results, outputDir, options);\n}\n\nfunction buildTranscriptMessageLines(results: readonly EvaluationResult[]): string {\n const lines: string[] = [];\n\n for (const result of results) {\n const transcriptLines = traceToTranscriptJsonLines(result.trace, {\n testId: result.testId,\n target: result.target,\n });\n\n lines.push(...transcriptLines.map((line) => JSON.stringify(line)));\n }\n\n return lines.length > 0 ? `${lines.join('\\n')}\\n` : '';\n}\n\nfunction targetSelectionKey(evalFileAbsolutePath: string | undefined, targetName: string): string {\n return `${evalFileAbsolutePath ? path.resolve(evalFileAbsolutePath) : ''}::${targetName}`;\n}\n\nfunction buildTargetSelectionMap(\n selections: readonly TaskBundleTargetSelection[] | undefined,\n): Map<string, TaskBundleTargetSelection> {\n const targets = new Map<string, TaskBundleTargetSelection>();\n for (const selection of selections ?? []) {\n targets.set(\n targetSelectionKey(selection.evalFileAbsolutePath, selection.targetName),\n selection,\n );\n if (selection.resolvedTargetName) {\n targets.set(\n targetSelectionKey(selection.evalFileAbsolutePath, selection.resolvedTargetName),\n selection,\n );\n }\n if (!selection.evalFileAbsolutePath) {\n targets.set(targetSelectionKey(undefined, selection.targetName), selection);\n if (selection.resolvedTargetName) {\n targets.set(targetSelectionKey(undefined, selection.resolvedTargetName), selection);\n }\n }\n }\n return targets;\n}\n\nfunction findTargetSelection(\n result: EvaluationResult,\n test: EvalTest | undefined,\n targets: ReadonlyMap<string, TaskBundleTargetSelection>,\n): TaskBundleTargetSelection | undefined {\n const targetName = result.target ?? 'unknown';\n const evalFileAbsolutePath = test?.source?.evalFileAbsolutePath;\n return (\n targets.get(targetSelectionKey(evalFileAbsolutePath, targetName)) ??\n targets.get(targetSelectionKey(undefined, targetName))\n );\n}\n\nasync function materializeTaskBundleForResult(params: {\n readonly result: EvaluationResult;\n readonly testDir: string;\n readonly testByTestId: ReadonlyMap<string, EvalTest>;\n readonly targetSelections: ReadonlyMap<string, TaskBundleTargetSelection>;\n readonly cwd?: string;\n readonly repoRoot?: string;\n}): Promise<MaterializedTaskBundlePaths | undefined> {\n const test = params.testByTestId.get(params.result.testId ?? 'unknown');\n const targetSelection = findTargetSelection(params.result, test, params.targetSelections);\n if (!test || !targetSelection) {\n return undefined;\n }\n\n return materializeTaskBundle({\n test,\n targetName: targetSelection.targetName,\n targetDefinitions: targetSelection.definitions as readonly TargetDefinition[],\n outputDir: params.testDir,\n cwd: params.cwd,\n repoRoot: params.repoRoot,\n });\n}\n\nexport async function writePerTestArtifacts(\n results: readonly EvaluationResult[],\n outputDir: string,\n options?: {\n experiment?: string;\n cwd?: string;\n repoRoot?: string;\n sourceTests?: readonly EvalTest[];\n taskBundleTargets?: readonly TaskBundleTargetSelection[];\n },\n): Promise<void> {\n await mkdir(outputDir, { recursive: true });\n const testByTestId = buildTestByTestId(options?.sourceTests);\n const targetSelections = buildTargetSelectionMap(options?.taskBundleTargets);\n const indexRecords: ResultIndexArtifact[] = [];\n for (const result of results) {\n const grading = buildGradingArtifact(result);\n const timing = buildTimingArtifact([result]);\n const artifactSubdir = buildArtifactSubdir(result);\n const testDir = path.join(outputDir, artifactSubdir);\n await mkdir(testDir, { recursive: true });\n await writeFile(\n path.join(testDir, 'grading.json'),\n `${JSON.stringify(grading, null, 2)}\\n`,\n 'utf8',\n );\n await writeFile(\n path.join(testDir, 'timing.json'),\n `${JSON.stringify(timing, null, 2)}\\n`,\n 'utf8',\n );\n\n const input = extractInput(result);\n if (input) {\n await writeFile(path.join(testDir, 'input.md'), input, 'utf8');\n }\n if (result.output.length > 0 || result.trace.messages.length > 0) {\n const outputsDir = path.join(testDir, 'outputs');\n await mkdir(outputsDir, { recursive: true });\n if (result.output.length > 0) {\n await writeFile(path.join(outputsDir, 'answer.md'), result.output, 'utf8');\n // Deprecated compatibility alias. New consumers should use answer.md\n // for scored output or transcript.jsonl for the full execution record.\n await writeFile(path.join(outputsDir, 'response.md'), result.output, 'utf8');\n }\n await writeTranscriptJsonl(path.join(outputsDir, 'transcript.jsonl'), result);\n }\n\n const taskBundle = await materializeTaskBundleForResult({\n result,\n testDir,\n testByTestId,\n targetSelections,\n cwd: options?.cwd,\n repoRoot: options?.repoRoot,\n });\n\n indexRecords.push({\n ...buildResultIndexArtifact(result, taskBundle),\n experiment: options?.experiment,\n });\n }\n await rewriteExistingIndexRecords(outputDir, indexRecords);\n}\n\nexport async function writeArtifactsFromResults(\n results: readonly EvaluationResult[],\n outputDir: string,\n options?: {\n evalFile?: string;\n experiment?: string;\n plannedTestCount?: number;\n cwd?: string;\n repoRoot?: string;\n sourceTests?: readonly EvalTest[];\n taskBundleTargets?: readonly TaskBundleTargetSelection[];\n },\n): Promise<{\n testArtifactDir: string;\n timingPath: string;\n benchmarkPath: string;\n indexPath: string;\n}> {\n const testArtifactDir = outputDir;\n const timingPath = path.join(outputDir, 'timing.json');\n const benchmarkPath = path.join(outputDir, 'benchmark.json');\n const indexPath = path.join(outputDir, RESULT_INDEX_FILENAME);\n await mkdir(outputDir, { recursive: true });\n const indexRecords: ResultIndexArtifact[] = [];\n const testByTestId = buildTestByTestId(options?.sourceTests);\n const targetSelections = buildTargetSelectionMap(options?.taskBundleTargets);\n\n // Write per-test grading artifacts\n for (const result of results) {\n const grading = buildGradingArtifact(result);\n const timing = buildTimingArtifact([result]);\n const artifactSubdir = buildArtifactSubdir(result);\n const testDir = path.join(outputDir, artifactSubdir);\n const gradingPath = path.join(testDir, 'grading.json');\n const perTestTimingPath = path.join(testDir, 'timing.json');\n await mkdir(testDir, { recursive: true });\n await writeFile(gradingPath, `${JSON.stringify(grading, null, 2)}\\n`, 'utf8');\n await writeFile(perTestTimingPath, `${JSON.stringify(timing, null, 2)}\\n`, 'utf8');\n\n const input = extractInput(result);\n if (input) {\n await writeFile(path.join(testDir, 'input.md'), input, 'utf8');\n }\n\n if (result.output.length > 0 || result.trace.messages.length > 0) {\n const outputsDir = path.join(testDir, 'outputs');\n await mkdir(outputsDir, { recursive: true });\n if (result.output.length > 0) {\n await writeFile(path.join(outputsDir, 'answer.md'), result.output, 'utf8');\n // Deprecated compatibility alias. New consumers should use answer.md\n // for scored output or transcript.jsonl for the full execution record.\n await writeFile(path.join(outputsDir, 'response.md'), result.output, 'utf8');\n }\n await writeTranscriptJsonl(path.join(outputsDir, 'transcript.jsonl'), result);\n }\n\n const taskBundle = await materializeTaskBundleForResult({\n result,\n testDir,\n testByTestId,\n targetSelections,\n cwd: options?.cwd,\n repoRoot: options?.repoRoot,\n });\n\n indexRecords.push({\n ...buildResultIndexArtifact(result, taskBundle),\n experiment: options?.experiment,\n });\n }\n\n // Write aggregate timing\n const timing = buildTimingArtifact(results);\n await writeFile(timingPath, `${JSON.stringify(timing, null, 2)}\\n`, 'utf8');\n\n // Write benchmark — preserve `planned_test_count` from the run-start stub\n // (or from the original run when this is a resume) unless an explicit\n // value was passed by the caller.\n const plannedTestCount = options?.plannedTestCount ?? (await readPlannedTestCount(benchmarkPath));\n const benchmark = buildBenchmarkArtifact(\n results,\n options?.evalFile,\n options?.experiment,\n plannedTestCount,\n );\n await writeFile(benchmarkPath, `${JSON.stringify(benchmark, null, 2)}\\n`, 'utf8');\n\n await writeJsonlFile(indexPath, indexRecords);\n\n // Write transcript JSONL (auto-generated on every eval run)\n const transcriptPath = path.join(outputDir, 'transcript.jsonl');\n await writeFile(transcriptPath, buildTranscriptMessageLines(results), 'utf8');\n\n return { testArtifactDir, timingPath, benchmarkPath, indexPath };\n}\n","/**\n * Converts a camelCase string to snake_case.\n * Examples:\n * testId -> test_id\n * outputText -> output_text\n * conversationId -> conversation_id\n *\n * Note: Keys that start with an uppercase letter are treated as proper nouns\n * and returned unchanged (e.g., \"Read\", \"Edit\" for tool names).\n */\nfunction toSnakeCase(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-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Recursively converts all keys in an object from camelCase to snake_case.\n * This is used to convert TypeScript internal representations to snake_case\n * for Python ecosystem compatibility in JSONL output files.\n *\n * Conversion rules:\n * - Object keys: camelCase -> snake_case\n * - Array elements: recursively converted\n * - Primitives: returned unchanged\n * - null/undefined: returned unchanged\n *\n * @param obj - The object to convert (can be any JSON-serializable value)\n * @returns A new object with all keys converted to snake_case\n */\nexport function toSnakeCaseDeep(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => toSnakeCaseDeep(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 snakeKey = toSnakeCase(key);\n result[snakeKey] = toSnakeCaseDeep(value);\n }\n return result;\n }\n\n return obj;\n}\n","import { existsSync, statSync } from 'node:fs';\nimport path from 'node:path';\n\nexport const RESULT_INDEX_FILENAME = 'index.jsonl';\nexport const RESULT_RUNS_DIRNAME = 'runs';\nexport const DEFAULT_EXPERIMENT_NAME = 'default';\n\nexport function normalizeExperimentName(experiment?: string): string {\n const trimmed = experiment?.trim();\n if (!trimmed) {\n return DEFAULT_EXPERIMENT_NAME;\n }\n if (!/^[A-Za-z0-9._-]+$/.test(trimmed)) {\n throw new Error(\n `Invalid experiment name \"${trimmed}\". Use only letters, numbers, \".\", \"_\" and \"-\".`,\n );\n }\n return trimmed;\n}\n\nexport function createRunDirName(timestamp = new Date()): string {\n return timestamp.toISOString().replace(/[:.]/g, '-');\n}\n\nexport function buildDefaultRunDir(\n cwd: string,\n experiment?: string,\n timestamp = new Date(),\n): string {\n return path.join(\n cwd,\n '.agentv',\n 'results',\n RESULT_RUNS_DIRNAME,\n normalizeExperimentName(experiment),\n createRunDirName(timestamp),\n );\n}\n\nexport function buildDefaultIndexPath(cwd: string, experiment?: string): string {\n return path.join(buildDefaultRunDir(cwd, experiment), RESULT_INDEX_FILENAME);\n}\n\nexport function resolveRunIndexPath(runDir: string): string {\n return path.join(runDir, RESULT_INDEX_FILENAME);\n}\n\nexport function isRunManifestPath(filePath: string): boolean {\n return path.basename(filePath) === RESULT_INDEX_FILENAME;\n}\n\nexport function resolveExistingRunPrimaryPath(runDir: string): string | undefined {\n const indexPath = resolveRunIndexPath(runDir);\n if (existsSync(indexPath)) {\n return indexPath;\n }\n\n return undefined;\n}\n\nexport function isDirectoryPath(filePath: string): boolean {\n try {\n return statSync(filePath).isDirectory();\n } catch {\n return false;\n }\n}\n\nexport function resolveWorkspaceOrFilePath(filePath: string): string {\n if (!isDirectoryPath(filePath)) {\n return filePath;\n }\n\n const existing = resolveExistingRunPrimaryPath(filePath);\n if (!existing) {\n throw new Error(`Result workspace is missing ${RESULT_INDEX_FILENAME}: ${filePath}`);\n }\n\n return existing;\n}\n\nexport function resolveRunManifestPath(filePath: string): string {\n if (isDirectoryPath(filePath)) {\n return resolveWorkspaceOrFilePath(filePath);\n }\n\n if (!isRunManifestPath(filePath)) {\n throw new Error(\n `Expected a run workspace directory or ${RESULT_INDEX_FILENAME} manifest: ${filePath}`,\n );\n }\n\n return filePath;\n}\n","import { createHash } from 'node:crypto';\nimport { mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport {\n type EvalSourceReference,\n type EvalTest,\n type TargetDefinition,\n parseYamlValue,\n} from '@agentv/core';\nimport { stringify as stringifyYaml } from 'yaml';\n\nimport { toSnakeCaseDeep } from '../../utils/case-conversion.js';\n\nconst TASK_DIRNAME = 'task';\nconst TASK_EVAL_FILENAME = 'EVAL.yaml';\nconst TASK_TARGETS_FILENAME = 'targets.yaml';\nconst TASK_FILES_DIRNAME = 'files';\nconst TASK_GRADERS_DIRNAME = 'graders';\nconst REDACTED_SOURCE_VALUE = '[redacted]';\nconst SECRET_KEY_PATTERN =\n /(?:api[_-]?key|authorization|bearer|credential|password|private[_-]?key|secret|token)/i;\nconst SOURCE_SECRET_LINE_PATTERN =\n /^(\\s*[\\w.-]*(?:api[_-]?key|authorization|bearer|credential|password|private[_-]?key|secret|token)[\\w.-]*\\s*:\\s*).+$/gim;\nconst SOURCE_SECRET_ASSIGNMENT_PATTERN =\n /^((?:--?)?[\\w.-]*(?:api[_-]?key|authorization|bearer|credential|password|private[_-]?key|secret|token)[\\w.-]*[=:]).+$/i;\nconst SOURCE_SECRET_FLAG_PATTERN =\n /^--?[\\w.-]*(?:api[_-]?key|authorization|bearer|credential|password|private[_-]?key|secret|token)[\\w.-]*$/i;\nconst SECRET_PATH_SEGMENT_PATTERN =\n /(^|[/\\\\._-])(?:\\.env(?:\\..*)?|id_rsa|id_dsa|id_ecdsa|id_ed25519|oauth|credentials?|secrets?|tokens?|private[_-]?key)(?:$|[/\\\\._-])/i;\nconst SKIPPED_DIR_NAMES = new Set([\n '.git',\n 'node_modules',\n '.agentv',\n '.ntm',\n '.beads',\n '.DS_Store',\n]);\n\nexport interface TaskBundleTargetSelection {\n readonly evalFileAbsolutePath?: string;\n readonly targetName: string;\n readonly resolvedTargetName?: string;\n readonly definitions: readonly TargetDefinition[];\n}\n\nexport interface MaterializeTaskBundleOptions {\n readonly test: EvalTest;\n readonly targetName: string;\n readonly targetDefinitions: readonly TargetDefinition[];\n readonly outputDir: string;\n readonly cwd?: string;\n readonly repoRoot?: string;\n}\n\nexport interface MaterializedTaskBundlePaths {\n readonly taskDir: string;\n readonly evalPath: string;\n readonly targetsPath: string;\n readonly filesPath?: string;\n readonly gradersPath?: string;\n}\n\ninterface CopiedReference {\n readonly reference: EvalSourceReference;\n readonly localPath: string;\n readonly destinationPath: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toPortableRelativePath(root: string | undefined, candidate: string): string | undefined {\n if (!root) {\n return undefined;\n }\n const relative = path.relative(root, candidate);\n if (relative && !relative.startsWith('..') && !path.isAbsolute(relative)) {\n return relative.split(path.sep).join('/');\n }\n return undefined;\n}\n\nfunction safeRelativePath(value: string): string | undefined {\n const normalized = value.replace(/\\\\/g, '/').replace(/^\\/+/, '');\n const segments = normalized.split('/').filter((segment) => segment && segment !== '.');\n if (segments.length === 0 || segments.some((segment) => segment === '..')) {\n return undefined;\n }\n return segments.join('/');\n}\n\nfunction hashedExternalPath(resolvedPath: string): string {\n const hash = createHash('sha256').update(path.resolve(resolvedPath)).digest('hex').slice(0, 10);\n const basename = path.basename(resolvedPath) || 'asset';\n return `external/${hash}-${basename}`;\n}\n\nfunction relativeReferencePath(\n reference: EvalSourceReference,\n options: Pick<MaterializeTaskBundleOptions, 'cwd' | 'repoRoot'>,\n): string | undefined {\n if (reference.resolvedPath) {\n const resolved = path.resolve(reference.resolvedPath);\n const portable =\n toPortableRelativePath(options.repoRoot, resolved) ??\n toPortableRelativePath(options.cwd, resolved);\n return safeRelativePath(portable ?? hashedExternalPath(resolved));\n }\n return safeRelativePath(reference.displayPath);\n}\n\nfunction referenceBucket(reference: EvalSourceReference): 'files' | 'graders' {\n return reference.kind === 'input_file' ? TASK_FILES_DIRNAME : TASK_GRADERS_DIRNAME;\n}\n\nfunction isLikelyBinary(buffer: Buffer): boolean {\n return buffer.subarray(0, Math.min(buffer.length, 8000)).includes(0);\n}\n\nfunction redactSecretLikeLines(content: string): string {\n return content.replace(SOURCE_SECRET_LINE_PATTERN, `$1${REDACTED_SOURCE_VALUE}`);\n}\n\nfunction isSecretLikePath(filePath: string): boolean {\n return SECRET_PATH_SEGMENT_PATTERN.test(filePath.replace(/\\\\/g, '/'));\n}\n\nfunction preservesPlaceholder(value: string): boolean {\n return value.includes('${{');\n}\n\nfunction sanitizeSecretString(value: string, keyHint?: string): string {\n if (preservesPlaceholder(value)) {\n return value;\n }\n if (keyHint && SECRET_KEY_PATTERN.test(keyHint)) {\n return REDACTED_SOURCE_VALUE;\n }\n if (SOURCE_SECRET_ASSIGNMENT_PATTERN.test(value)) {\n return value.replace(SOURCE_SECRET_ASSIGNMENT_PATTERN, `$1${REDACTED_SOURCE_VALUE}`);\n }\n return value;\n}\n\nfunction sanitizeBundleValue(value: unknown, keyHint?: string): unknown {\n if (typeof value === 'string') {\n return sanitizeSecretString(value, keyHint);\n }\n if (Array.isArray(value)) {\n let redactNext = false;\n return value.map((item) => {\n if (typeof item !== 'string') {\n return sanitizeBundleValue(item);\n }\n if (redactNext) {\n redactNext = false;\n return preservesPlaceholder(item) ? item : REDACTED_SOURCE_VALUE;\n }\n if (SOURCE_SECRET_FLAG_PATTERN.test(item)) {\n redactNext = true;\n return item;\n }\n return sanitizeSecretString(item);\n });\n }\n if (isRecord(value)) {\n const sanitized: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n sanitized[key] = sanitizeBundleValue(child, key);\n }\n return sanitized;\n }\n return value;\n}\n\nasync function copyFileRedactingText(\n sourcePath: string,\n destinationPath: string,\n): Promise<boolean> {\n await mkdir(path.dirname(destinationPath), { recursive: true });\n if (isSecretLikePath(sourcePath)) {\n await writeFile(destinationPath, `${REDACTED_SOURCE_VALUE}\\n`, 'utf8');\n return true;\n }\n\n const content = await readFile(sourcePath);\n if (isLikelyBinary(content)) {\n await writeFile(destinationPath, content);\n return true;\n }\n\n const redacted = redactSecretLikeLines(content.toString('utf8').replace(/\\r\\n/g, '\\n'));\n await writeFile(destinationPath, redacted, 'utf8');\n return true;\n}\n\nasync function copyDirectory(sourcePath: string, destinationPath: string): Promise<boolean> {\n if (isSecretLikePath(sourcePath)) {\n return false;\n }\n\n await mkdir(destinationPath, { recursive: true });\n let copiedAny = false;\n const entries = await readdir(sourcePath, { withFileTypes: true });\n for (const entry of entries) {\n if (SKIPPED_DIR_NAMES.has(entry.name) || isSecretLikePath(entry.name)) {\n continue;\n }\n const sourceChild = path.join(sourcePath, entry.name);\n const destinationChild = path.join(destinationPath, entry.name);\n if (entry.isDirectory()) {\n copiedAny = (await copyDirectory(sourceChild, destinationChild)) || copiedAny;\n } else if (entry.isFile()) {\n copiedAny = (await copyFileRedactingText(sourceChild, destinationChild)) || copiedAny;\n }\n }\n return copiedAny;\n}\n\nfunction shouldCopyDirectory(reference: EvalSourceReference): boolean {\n if (reference.kind !== 'code_grader_cwd') {\n return true;\n }\n return !path.isAbsolute(reference.displayPath);\n}\n\nasync function copyReference(\n reference: EvalSourceReference,\n taskDir: string,\n options: Pick<MaterializeTaskBundleOptions, 'cwd' | 'repoRoot'>,\n): Promise<CopiedReference | undefined> {\n if (!reference.resolvedPath) {\n return undefined;\n }\n\n const relPath = relativeReferencePath(reference, options);\n if (!relPath) {\n return undefined;\n }\n\n const bucket = referenceBucket(reference);\n const localPath = `${bucket}/${relPath}`;\n const destinationPath = path.join(taskDir, localPath);\n const sourcePath = path.resolve(reference.resolvedPath);\n const sourceStat = await stat(sourcePath).catch(() => undefined);\n if (!sourceStat) {\n return undefined;\n }\n\n if (sourceStat.isDirectory()) {\n if (!shouldCopyDirectory(reference)) {\n return undefined;\n }\n if (!(await copyDirectory(sourcePath, destinationPath))) {\n return undefined;\n }\n } else if (sourceStat.isFile()) {\n if (!(await copyFileRedactingText(sourcePath, destinationPath))) {\n return undefined;\n }\n } else {\n return undefined;\n }\n\n return { reference, localPath: localPath.split(path.sep).join('/'), destinationPath };\n}\n\nasync function copyReferences(\n references: readonly EvalSourceReference[],\n taskDir: string,\n options: Pick<MaterializeTaskBundleOptions, 'cwd' | 'repoRoot'>,\n): Promise<readonly CopiedReference[]> {\n const copied: CopiedReference[] = [];\n const seenDestinations = new Set<string>();\n for (const reference of references) {\n const result = await copyReference(reference, taskDir, options);\n if (!result || seenDestinations.has(result.destinationPath)) {\n continue;\n }\n seenDestinations.add(result.destinationPath);\n copied.push(result);\n }\n return copied;\n}\n\nfunction addRewrite(rewrites: Map<string, string>, from: string | undefined, to: string): void {\n if (!from || from.trim().length === 0) {\n return;\n }\n rewrites.set(from, to);\n}\n\nfunction buildPathRewrites(copiedReferences: readonly CopiedReference[]): Map<string, string> {\n const rewrites = new Map<string, string>();\n for (const { reference, localPath } of copiedReferences) {\n addRewrite(rewrites, reference.displayPath, localPath);\n addRewrite(rewrites, reference.resolvedPath, localPath);\n addRewrite(rewrites, `file://${reference.displayPath}`, `file://${localPath}`);\n if (reference.resolvedPath) {\n addRewrite(rewrites, `file://${reference.resolvedPath}`, `file://${localPath}`);\n }\n for (const arg of reference.command ?? []) {\n if (arg === reference.displayPath || arg === reference.resolvedPath) {\n addRewrite(rewrites, arg, localPath);\n }\n }\n }\n return rewrites;\n}\n\nfunction rewritePathsDeep(value: unknown, rewrites: ReadonlyMap<string, string>): unknown {\n if (typeof value === 'string') {\n return rewrites.get(value) ?? value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => rewritePathsDeep(item, rewrites));\n }\n if (isRecord(value)) {\n const rewritten: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n rewritten[key] = rewritePathsDeep(child, rewrites);\n }\n return rewritten;\n }\n return value;\n}\n\nfunction parseSourceTestCase(test: EvalTest): Record<string, unknown> {\n const parsed = test.source ? parseYamlValue(test.source.testSnapshotYaml) : undefined;\n const testCase = isRecord(parsed) ? { ...parsed } : { id: test.id, input: test.question };\n if (typeof testCase.id !== 'string' || testCase.id.length === 0) {\n testCase.id = test.id;\n }\n return testCase;\n}\n\nfunction withoutLegacyAssertionKeys(testCase: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(testCase).filter(([key]) => key !== 'assert' && key !== 'evaluators'),\n );\n}\n\nfunction buildEvalCase(\n test: EvalTest,\n rewrites: ReadonlyMap<string, string>,\n): Record<string, unknown> {\n const testCase = rewritePathsDeep(parseSourceTestCase(test), rewrites) as Record<string, unknown>;\n const graderDefinitions = test.source?.graderDefinitions ?? [];\n if (graderDefinitions.length > 0) {\n return {\n ...withoutLegacyAssertionKeys(testCase),\n assertions: graderDefinitions.map((grader) =>\n rewritePathsDeep(toSnakeCaseDeep(grader.definition), rewrites),\n ),\n };\n }\n return testCase;\n}\n\nfunction targetReferenceNames(target: TargetDefinition): readonly string[] {\n const references: string[] = [];\n for (const key of ['use_target', 'grader_target', 'judge_target'] as const) {\n const value = target[key];\n if (typeof value === 'string' && value.trim().length > 0 && !value.includes('${{')) {\n references.push(value.trim());\n }\n }\n\n const fallbackTargets = target.fallback_targets;\n if (Array.isArray(fallbackTargets)) {\n for (const value of fallbackTargets) {\n if (typeof value === 'string' && value.trim().length > 0 && !value.includes('${{')) {\n references.push(value.trim());\n }\n }\n }\n\n return references;\n}\n\nfunction selectTargetDefinitions(\n targetName: string,\n definitions: readonly TargetDefinition[],\n): readonly TargetDefinition[] {\n const byName = new Map(definitions.map((definition) => [definition.name, definition]));\n const selected: TargetDefinition[] = [];\n const seen = new Set<string>();\n\n function visit(name: string): void {\n if (seen.has(name)) {\n return;\n }\n const definition = byName.get(name);\n if (!definition) {\n return;\n }\n seen.add(name);\n selected.push(definition);\n for (const referenceName of targetReferenceNames(definition)) {\n visit(referenceName);\n }\n }\n\n visit(targetName);\n return selected;\n}\n\nasync function writeYamlFile(filePath: string, value: unknown): Promise<void> {\n const yaml = stringifyYaml(toSnakeCaseDeep(sanitizeBundleValue(value)), {\n lineWidth: 0,\n }).trimEnd();\n await writeFile(filePath, `${yaml}\\n`, 'utf8');\n}\n\nfunction hasCopiedBucket(copied: readonly CopiedReference[], bucket: 'files' | 'graders'): boolean {\n return copied.some((entry) => entry.localPath.startsWith(`${bucket}/`));\n}\n\n/**\n * Materialize the native AgentV task source for one completed result row.\n *\n * The bundle is intentionally just an eval file, a selected targets file, and\n * copied referenced assets. It does not create `.agentv/` under the result\n * artifact directory, so future reruns can choose their output root explicitly.\n */\nexport async function materializeTaskBundle(\n options: MaterializeTaskBundleOptions,\n): Promise<MaterializedTaskBundlePaths | undefined> {\n if (!options.test.source) {\n return undefined;\n }\n\n const targetDefinitions = selectTargetDefinitions(options.targetName, options.targetDefinitions);\n if (targetDefinitions.length === 0) {\n return undefined;\n }\n\n const taskDir = path.join(options.outputDir, TASK_DIRNAME);\n await mkdir(taskDir, { recursive: true });\n\n const copiedReferences = await copyReferences(options.test.source.references, taskDir, options);\n const rewrites = buildPathRewrites(copiedReferences);\n const evalCase = buildEvalCase(options.test, rewrites);\n const evalPath = path.join(taskDir, TASK_EVAL_FILENAME);\n const targetsPath = path.join(taskDir, TASK_TARGETS_FILENAME);\n\n await writeYamlFile(evalPath, {\n execution: { target: options.targetName },\n tests: [evalCase],\n });\n await writeYamlFile(targetsPath, { targets: targetDefinitions });\n\n return {\n taskDir,\n evalPath,\n targetsPath,\n ...(hasCopiedBucket(copiedReferences, 'files')\n ? { filesPath: path.join(taskDir, TASK_FILES_DIRNAME) }\n : {}),\n ...(hasCopiedBucket(copiedReferences, 'graders')\n ? { gradersPath: path.join(taskDir, TASK_GRADERS_DIRNAME) }\n : {}),\n };\n}\n"],"mappings":"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","names":["mkdir","readFile","writeFile","path","path","path","path","readFile","writeFile","mkdir","isRecord","timing"]}
|