agentv 4.38.1 → 4.40.1-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.
Files changed (40) hide show
  1. package/dist/{artifact-writer-MK5X5MSO.js → artifact-writer-GIAIMGPQ.js} +14 -11
  2. package/dist/{chunk-QOBQ5XYF.js → chunk-76FOHROU.js} +16 -4
  3. package/dist/chunk-76FOHROU.js.map +1 -0
  4. package/dist/{chunk-VBHHZQS6.js → chunk-BLXYBUU4.js} +1825 -333
  5. package/dist/chunk-BLXYBUU4.js.map +1 -0
  6. package/dist/{chunk-NLTIK3LV.js → chunk-I3SC4FOT.js} +499 -347
  7. package/dist/chunk-I3SC4FOT.js.map +1 -0
  8. package/dist/{chunk-OIN3MVOD.js → chunk-S2JJCLHV.js} +67 -68
  9. package/dist/chunk-S2JJCLHV.js.map +1 -0
  10. package/dist/chunk-TWQP7JYQ.js +494 -0
  11. package/dist/chunk-TWQP7JYQ.js.map +1 -0
  12. package/dist/{chunk-6M5S4IJW.js → chunk-WKA5QDNQ.js} +586 -183
  13. package/dist/chunk-WKA5QDNQ.js.map +1 -0
  14. package/dist/cli.js +6 -6
  15. package/dist/dashboard/assets/index-BnYCCJ7O.css +1 -0
  16. package/dist/dashboard/assets/index-DaueD7GO.js +118 -0
  17. package/dist/dashboard/assets/{index-SIl6NbIJ.js → index-_jpKSzIf.js} +1 -1
  18. package/dist/dashboard/index.html +2 -2
  19. package/dist/{dist-HVLBDG5F.js → dist-6Z4OSITR.js} +54 -16
  20. package/dist/index.js +6 -6
  21. package/dist/{interactive-45LPG2YJ.js → interactive-OUB3GZRC.js} +6 -6
  22. package/dist/{otlp-json-file-exporter-RJFPCKVK-T6N4OGWG.js → otlp-json-file-exporter-RY63S3IG-PZBQPVYY.js} +2 -2
  23. package/dist/skills/agentv-eval-writer/SKILL.md +49 -24
  24. package/dist/skills/agentv-eval-writer/references/custom-evaluators.md +21 -15
  25. package/dist/{ts-eval-loader-TJT6BGFF-DI7XNSO4.js → ts-eval-loader-NWH3B4HG-UXXCZKLP.js} +2 -2
  26. package/package.json +1 -1
  27. package/dist/chunk-6M5S4IJW.js.map +0 -1
  28. package/dist/chunk-DKUAETXE.js +0 -1362
  29. package/dist/chunk-DKUAETXE.js.map +0 -1
  30. package/dist/chunk-NLTIK3LV.js.map +0 -1
  31. package/dist/chunk-OIN3MVOD.js.map +0 -1
  32. package/dist/chunk-QOBQ5XYF.js.map +0 -1
  33. package/dist/chunk-VBHHZQS6.js.map +0 -1
  34. package/dist/dashboard/assets/index-BpnllKET.css +0 -1
  35. package/dist/dashboard/assets/index-Cm9SUopp.js +0 -118
  36. /package/dist/{artifact-writer-MK5X5MSO.js.map → artifact-writer-GIAIMGPQ.js.map} +0 -0
  37. /package/dist/{dist-HVLBDG5F.js.map → dist-6Z4OSITR.js.map} +0 -0
  38. /package/dist/{interactive-45LPG2YJ.js.map → interactive-OUB3GZRC.js.map} +0 -0
  39. /package/dist/{otlp-json-file-exporter-RJFPCKVK-T6N4OGWG.js.map → otlp-json-file-exporter-RY63S3IG-PZBQPVYY.js.map} +0 -0
  40. /package/dist/{ts-eval-loader-TJT6BGFF-DI7XNSO4.js.map → ts-eval-loader-NWH3B4HG-UXXCZKLP.js.map} +0 -0
@@ -0,0 +1,494 @@
1
+ import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
+ import {
3
+ buildIndexArtifactEntry,
4
+ buildResultIndexArtifact,
5
+ parseYamlValue,
6
+ writeArtifactsFromResults,
7
+ writePerTestArtifacts
8
+ } from "./chunk-BLXYBUU4.js";
9
+
10
+ // src/commands/eval/artifact-writer.ts
11
+ import path2 from "node:path";
12
+
13
+ // src/commands/eval/task-bundle.ts
14
+ import { createHash } from "node:crypto";
15
+ import { mkdir, readFile, readdir, stat, writeFile } from "node:fs/promises";
16
+ import path from "node:path";
17
+ import { stringify as stringifyYaml } from "yaml";
18
+
19
+ // src/utils/case-conversion.ts
20
+ function toSnakeCase(str) {
21
+ if (/^[A-Z]/.test(str)) {
22
+ return str;
23
+ }
24
+ return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
25
+ }
26
+ function toSnakeCaseDeep(obj) {
27
+ if (obj === null || obj === void 0) {
28
+ return obj;
29
+ }
30
+ if (Array.isArray(obj)) {
31
+ return obj.map((item) => toSnakeCaseDeep(item));
32
+ }
33
+ if (typeof obj === "object") {
34
+ const result = {};
35
+ for (const [key, value] of Object.entries(obj)) {
36
+ const snakeKey = toSnakeCase(key);
37
+ result[snakeKey] = toSnakeCaseDeep(value);
38
+ }
39
+ return result;
40
+ }
41
+ return obj;
42
+ }
43
+
44
+ // src/commands/eval/task-bundle.ts
45
+ var TASK_DIRNAME = "task";
46
+ var TASK_EVAL_FILENAME = "EVAL.yaml";
47
+ var TASK_TARGETS_FILENAME = "targets.yaml";
48
+ var TASK_FILES_DIRNAME = "files";
49
+ var TASK_GRADERS_DIRNAME = "graders";
50
+ var REDACTED_SOURCE_VALUE = "[redacted]";
51
+ var SECRET_KEY_PATTERN = /(?:api[_-]?key|authorization|bearer|credential|password|private[_-]?key|secret|token)/i;
52
+ var SOURCE_SECRET_LINE_PATTERN = /^(\s*[\w.-]*(?:api[_-]?key|authorization|bearer|credential|password|private[_-]?key|secret|token)[\w.-]*\s*:\s*).+$/gim;
53
+ var SOURCE_SECRET_ASSIGNMENT_PATTERN = /^((?:--?)?[\w.-]*(?:api[_-]?key|authorization|bearer|credential|password|private[_-]?key|secret|token)[\w.-]*[=:]).+$/i;
54
+ var SOURCE_SECRET_FLAG_PATTERN = /^--?[\w.-]*(?:api[_-]?key|authorization|bearer|credential|password|private[_-]?key|secret|token)[\w.-]*$/i;
55
+ var SECRET_PATH_SEGMENT_PATTERN = /(^|[/\\._-])(?:\.env(?:\..*)?|id_rsa|id_dsa|id_ecdsa|id_ed25519|oauth|credentials?|secrets?|tokens?|private[_-]?key)(?:$|[/\\._-])/i;
56
+ var SKIPPED_DIR_NAMES = /* @__PURE__ */ new Set([
57
+ ".git",
58
+ "node_modules",
59
+ ".agentv",
60
+ ".ntm",
61
+ ".beads",
62
+ ".DS_Store"
63
+ ]);
64
+ function isRecord(value) {
65
+ return typeof value === "object" && value !== null && !Array.isArray(value);
66
+ }
67
+ function toPortableRelativePath(root, candidate) {
68
+ if (!root) {
69
+ return void 0;
70
+ }
71
+ const relative = path.relative(root, candidate);
72
+ if (relative && !relative.startsWith("..") && !path.isAbsolute(relative)) {
73
+ return relative.split(path.sep).join("/");
74
+ }
75
+ return void 0;
76
+ }
77
+ function safeRelativePath(value) {
78
+ const normalized = value.replace(/\\/g, "/").replace(/^\/+/, "");
79
+ const segments = normalized.split("/").filter((segment) => segment && segment !== ".");
80
+ if (segments.length === 0 || segments.some((segment) => segment === "..")) {
81
+ return void 0;
82
+ }
83
+ return segments.join("/");
84
+ }
85
+ function hashedExternalPath(resolvedPath) {
86
+ const hash = createHash("sha256").update(path.resolve(resolvedPath)).digest("hex").slice(0, 10);
87
+ const basename = path.basename(resolvedPath) || "asset";
88
+ return `external/${hash}-${basename}`;
89
+ }
90
+ function relativeReferencePath(reference, options) {
91
+ if (reference.resolvedPath) {
92
+ const resolved = path.resolve(reference.resolvedPath);
93
+ const portable = toPortableRelativePath(options.repoRoot, resolved) ?? toPortableRelativePath(options.cwd, resolved);
94
+ return safeRelativePath(portable ?? hashedExternalPath(resolved));
95
+ }
96
+ return safeRelativePath(reference.displayPath);
97
+ }
98
+ function referenceBucket(reference) {
99
+ return reference.kind === "input_file" ? TASK_FILES_DIRNAME : TASK_GRADERS_DIRNAME;
100
+ }
101
+ function isLikelyBinary(buffer) {
102
+ return buffer.subarray(0, Math.min(buffer.length, 8e3)).includes(0);
103
+ }
104
+ function redactSecretLikeLines(content) {
105
+ return content.replace(SOURCE_SECRET_LINE_PATTERN, `$1${REDACTED_SOURCE_VALUE}`);
106
+ }
107
+ function isSecretLikePath(filePath) {
108
+ return SECRET_PATH_SEGMENT_PATTERN.test(filePath.replace(/\\/g, "/"));
109
+ }
110
+ function preservesPlaceholder(value) {
111
+ return value.includes("${{");
112
+ }
113
+ function sanitizeSecretString(value, keyHint) {
114
+ if (preservesPlaceholder(value)) {
115
+ return value;
116
+ }
117
+ if (keyHint && SECRET_KEY_PATTERN.test(keyHint)) {
118
+ return REDACTED_SOURCE_VALUE;
119
+ }
120
+ if (SOURCE_SECRET_ASSIGNMENT_PATTERN.test(value)) {
121
+ return value.replace(SOURCE_SECRET_ASSIGNMENT_PATTERN, `$1${REDACTED_SOURCE_VALUE}`);
122
+ }
123
+ return value;
124
+ }
125
+ function sanitizeBundleValue(value, keyHint) {
126
+ if (typeof value === "string") {
127
+ return sanitizeSecretString(value, keyHint);
128
+ }
129
+ if (Array.isArray(value)) {
130
+ let redactNext = false;
131
+ return value.map((item) => {
132
+ if (typeof item !== "string") {
133
+ return sanitizeBundleValue(item);
134
+ }
135
+ if (redactNext) {
136
+ redactNext = false;
137
+ return preservesPlaceholder(item) ? item : REDACTED_SOURCE_VALUE;
138
+ }
139
+ if (SOURCE_SECRET_FLAG_PATTERN.test(item)) {
140
+ redactNext = true;
141
+ return item;
142
+ }
143
+ return sanitizeSecretString(item);
144
+ });
145
+ }
146
+ if (isRecord(value)) {
147
+ const sanitized = {};
148
+ for (const [key, child] of Object.entries(value)) {
149
+ sanitized[key] = sanitizeBundleValue(child, key);
150
+ }
151
+ return sanitized;
152
+ }
153
+ return value;
154
+ }
155
+ async function copyFileRedactingText(sourcePath, destinationPath) {
156
+ await mkdir(path.dirname(destinationPath), { recursive: true });
157
+ if (isSecretLikePath(sourcePath)) {
158
+ await writeFile(destinationPath, `${REDACTED_SOURCE_VALUE}
159
+ `, "utf8");
160
+ return true;
161
+ }
162
+ const content = await readFile(sourcePath);
163
+ if (isLikelyBinary(content)) {
164
+ await writeFile(destinationPath, content);
165
+ return true;
166
+ }
167
+ const redacted = redactSecretLikeLines(content.toString("utf8").replace(/\r\n/g, "\n"));
168
+ await writeFile(destinationPath, redacted, "utf8");
169
+ return true;
170
+ }
171
+ async function copyDirectory(sourcePath, destinationPath) {
172
+ if (isSecretLikePath(sourcePath)) {
173
+ return false;
174
+ }
175
+ await mkdir(destinationPath, { recursive: true });
176
+ let copiedAny = false;
177
+ const entries = await readdir(sourcePath, { withFileTypes: true });
178
+ for (const entry of entries) {
179
+ if (SKIPPED_DIR_NAMES.has(entry.name) || isSecretLikePath(entry.name)) {
180
+ continue;
181
+ }
182
+ const sourceChild = path.join(sourcePath, entry.name);
183
+ const destinationChild = path.join(destinationPath, entry.name);
184
+ if (entry.isDirectory()) {
185
+ copiedAny = await copyDirectory(sourceChild, destinationChild) || copiedAny;
186
+ } else if (entry.isFile()) {
187
+ copiedAny = await copyFileRedactingText(sourceChild, destinationChild) || copiedAny;
188
+ }
189
+ }
190
+ return copiedAny;
191
+ }
192
+ function shouldCopyDirectory(reference) {
193
+ if (reference.kind !== "code_grader_cwd") {
194
+ return true;
195
+ }
196
+ return !path.isAbsolute(reference.displayPath);
197
+ }
198
+ async function copyReference(reference, taskDir, options) {
199
+ if (!reference.resolvedPath) {
200
+ return void 0;
201
+ }
202
+ const relPath = relativeReferencePath(reference, options);
203
+ if (!relPath) {
204
+ return void 0;
205
+ }
206
+ const bucket = referenceBucket(reference);
207
+ const localPath = `${bucket}/${relPath}`;
208
+ const destinationPath = path.join(taskDir, localPath);
209
+ const sourcePath = path.resolve(reference.resolvedPath);
210
+ const sourceStat = await stat(sourcePath).catch(() => void 0);
211
+ if (!sourceStat) {
212
+ return void 0;
213
+ }
214
+ if (sourceStat.isDirectory()) {
215
+ if (!shouldCopyDirectory(reference)) {
216
+ return void 0;
217
+ }
218
+ if (!await copyDirectory(sourcePath, destinationPath)) {
219
+ return void 0;
220
+ }
221
+ } else if (sourceStat.isFile()) {
222
+ if (!await copyFileRedactingText(sourcePath, destinationPath)) {
223
+ return void 0;
224
+ }
225
+ } else {
226
+ return void 0;
227
+ }
228
+ return { reference, localPath: localPath.split(path.sep).join("/"), destinationPath };
229
+ }
230
+ async function copyReferences(references, taskDir, options) {
231
+ const copied = [];
232
+ const seenDestinations = /* @__PURE__ */ new Set();
233
+ for (const reference of references) {
234
+ const result = await copyReference(reference, taskDir, options);
235
+ if (!result || seenDestinations.has(result.destinationPath)) {
236
+ continue;
237
+ }
238
+ seenDestinations.add(result.destinationPath);
239
+ copied.push(result);
240
+ }
241
+ return copied;
242
+ }
243
+ function addRewrite(rewrites, from, to) {
244
+ if (!from || from.trim().length === 0) {
245
+ return;
246
+ }
247
+ rewrites.set(from, to);
248
+ }
249
+ function buildPathRewrites(copiedReferences) {
250
+ const rewrites = /* @__PURE__ */ new Map();
251
+ for (const { reference, localPath } of copiedReferences) {
252
+ addRewrite(rewrites, reference.displayPath, localPath);
253
+ addRewrite(rewrites, reference.resolvedPath, localPath);
254
+ addRewrite(rewrites, `file://${reference.displayPath}`, `file://${localPath}`);
255
+ if (reference.resolvedPath) {
256
+ addRewrite(rewrites, `file://${reference.resolvedPath}`, `file://${localPath}`);
257
+ }
258
+ for (const arg of reference.command ?? []) {
259
+ if (arg === reference.displayPath || arg === reference.resolvedPath) {
260
+ addRewrite(rewrites, arg, localPath);
261
+ }
262
+ }
263
+ }
264
+ return rewrites;
265
+ }
266
+ function rewritePathsDeep(value, rewrites) {
267
+ if (typeof value === "string") {
268
+ return rewrites.get(value) ?? value;
269
+ }
270
+ if (Array.isArray(value)) {
271
+ return value.map((item) => rewritePathsDeep(item, rewrites));
272
+ }
273
+ if (isRecord(value)) {
274
+ const rewritten = {};
275
+ for (const [key, child] of Object.entries(value)) {
276
+ rewritten[key] = rewritePathsDeep(child, rewrites);
277
+ }
278
+ return rewritten;
279
+ }
280
+ return value;
281
+ }
282
+ function parseSourceTestCase(test) {
283
+ const parsed = test.source ? parseYamlValue(test.source.testSnapshotYaml) : void 0;
284
+ const testCase = isRecord(parsed) ? { ...parsed } : { id: test.id, input: test.question };
285
+ if (typeof testCase.id !== "string" || testCase.id.length === 0) {
286
+ testCase.id = test.id;
287
+ }
288
+ return testCase;
289
+ }
290
+ function withoutLegacyAssertionKeys(testCase) {
291
+ return Object.fromEntries(
292
+ Object.entries(testCase).filter(([key]) => key !== "assert" && key !== "evaluators")
293
+ );
294
+ }
295
+ function buildEvalCase(test, rewrites) {
296
+ const testCase = rewritePathsDeep(parseSourceTestCase(test), rewrites);
297
+ const graderDefinitions = test.source?.graderDefinitions ?? [];
298
+ if (graderDefinitions.length > 0) {
299
+ return {
300
+ ...withoutLegacyAssertionKeys(testCase),
301
+ assertions: graderDefinitions.map(
302
+ (grader) => rewritePathsDeep(toSnakeCaseDeep(grader.definition), rewrites)
303
+ )
304
+ };
305
+ }
306
+ return testCase;
307
+ }
308
+ function targetReferenceNames(target) {
309
+ const references = [];
310
+ for (const key of ["use_target", "grader_target", "judge_target"]) {
311
+ const value = target[key];
312
+ if (typeof value === "string" && value.trim().length > 0 && !value.includes("${{")) {
313
+ references.push(value.trim());
314
+ }
315
+ }
316
+ const fallbackTargets = target.fallback_targets;
317
+ if (Array.isArray(fallbackTargets)) {
318
+ for (const value of fallbackTargets) {
319
+ if (typeof value === "string" && value.trim().length > 0 && !value.includes("${{")) {
320
+ references.push(value.trim());
321
+ }
322
+ }
323
+ }
324
+ return references;
325
+ }
326
+ function selectTargetDefinitions(targetName, definitions) {
327
+ const byName = new Map(definitions.map((definition) => [definition.name, definition]));
328
+ const selected = [];
329
+ const seen = /* @__PURE__ */ new Set();
330
+ function visit(name) {
331
+ if (seen.has(name)) {
332
+ return;
333
+ }
334
+ const definition = byName.get(name);
335
+ if (!definition) {
336
+ return;
337
+ }
338
+ seen.add(name);
339
+ selected.push(definition);
340
+ for (const referenceName of targetReferenceNames(definition)) {
341
+ visit(referenceName);
342
+ }
343
+ }
344
+ visit(targetName);
345
+ return selected;
346
+ }
347
+ async function writeYamlFile(filePath, value) {
348
+ const yaml = stringifyYaml(toSnakeCaseDeep(sanitizeBundleValue(value)), {
349
+ lineWidth: 0
350
+ }).trimEnd();
351
+ await writeFile(filePath, `${yaml}
352
+ `, "utf8");
353
+ }
354
+ function hasCopiedBucket(copied, bucket) {
355
+ return copied.some((entry) => entry.localPath.startsWith(`${bucket}/`));
356
+ }
357
+ async function materializeTaskBundle(options) {
358
+ if (!options.test.source) {
359
+ return void 0;
360
+ }
361
+ const targetDefinitions = selectTargetDefinitions(options.targetName, options.targetDefinitions);
362
+ if (targetDefinitions.length === 0) {
363
+ return void 0;
364
+ }
365
+ const taskDir = path.join(options.outputDir, TASK_DIRNAME);
366
+ await mkdir(taskDir, { recursive: true });
367
+ const copiedReferences = await copyReferences(options.test.source.references, taskDir, options);
368
+ const rewrites = buildPathRewrites(copiedReferences);
369
+ const evalCase = buildEvalCase(options.test, rewrites);
370
+ const evalPath = path.join(taskDir, TASK_EVAL_FILENAME);
371
+ const targetsPath = path.join(taskDir, TASK_TARGETS_FILENAME);
372
+ await writeYamlFile(evalPath, {
373
+ execution: { target: options.targetName },
374
+ tests: [evalCase]
375
+ });
376
+ await writeYamlFile(targetsPath, { targets: targetDefinitions });
377
+ return {
378
+ taskDir,
379
+ evalPath,
380
+ targetsPath,
381
+ ...hasCopiedBucket(copiedReferences, "files") ? { filesPath: path.join(taskDir, TASK_FILES_DIRNAME) } : {},
382
+ ...hasCopiedBucket(copiedReferences, "graders") ? { gradersPath: path.join(taskDir, TASK_GRADERS_DIRNAME) } : {}
383
+ };
384
+ }
385
+
386
+ // src/commands/eval/artifact-writer.ts
387
+ function toRelativeArtifactPath(outputDir, filePath) {
388
+ return path2.relative(outputDir, filePath).split(path2.sep).join("/");
389
+ }
390
+ function buildTaskBundleIndexFields(outputDir, taskBundle) {
391
+ if (!taskBundle) {
392
+ return {};
393
+ }
394
+ return {
395
+ task_dir: toRelativeArtifactPath(outputDir, taskBundle.taskDir),
396
+ eval_path: toRelativeArtifactPath(outputDir, taskBundle.evalPath),
397
+ targets_path: toRelativeArtifactPath(outputDir, taskBundle.targetsPath),
398
+ ...taskBundle.filesPath ? { files_path: toRelativeArtifactPath(outputDir, taskBundle.filesPath) } : {},
399
+ ...taskBundle.gradersPath ? { graders_path: toRelativeArtifactPath(outputDir, taskBundle.gradersPath) } : {}
400
+ };
401
+ }
402
+ function buildIndexArtifactEntry2(result, options) {
403
+ return buildIndexArtifactEntry(result, {
404
+ ...options,
405
+ extraIndexFields: buildTaskBundleIndexFields(options.outputDir, options.taskBundle)
406
+ });
407
+ }
408
+ function buildResultIndexArtifact2(result, taskBundle) {
409
+ const artifactSubdir = (buildResultIndexArtifact(result).artifact_dir ?? "").trim();
410
+ const extraIndexFields = taskBundle ? {
411
+ task_dir: path2.posix.join(artifactSubdir, "task"),
412
+ eval_path: path2.posix.join(artifactSubdir, "task", "EVAL.yaml"),
413
+ targets_path: path2.posix.join(artifactSubdir, "task", "targets.yaml"),
414
+ ...taskBundle.filesPath ? { files_path: path2.posix.join(artifactSubdir, "task", "files") } : {},
415
+ ...taskBundle.gradersPath ? { graders_path: path2.posix.join(artifactSubdir, "task", "graders") } : {}
416
+ } : void 0;
417
+ return buildResultIndexArtifact(result, extraIndexFields);
418
+ }
419
+ function targetSelectionKey(evalFileAbsolutePath, targetName) {
420
+ return `${evalFileAbsolutePath ? path2.resolve(evalFileAbsolutePath) : ""}::${targetName}`;
421
+ }
422
+ function buildTargetSelectionMap(selections) {
423
+ const targets = /* @__PURE__ */ new Map();
424
+ for (const selection of selections ?? []) {
425
+ targets.set(
426
+ targetSelectionKey(selection.evalFileAbsolutePath, selection.targetName),
427
+ selection
428
+ );
429
+ if (selection.resolvedTargetName) {
430
+ targets.set(
431
+ targetSelectionKey(selection.evalFileAbsolutePath, selection.resolvedTargetName),
432
+ selection
433
+ );
434
+ }
435
+ if (!selection.evalFileAbsolutePath) {
436
+ targets.set(targetSelectionKey(void 0, selection.targetName), selection);
437
+ if (selection.resolvedTargetName) {
438
+ targets.set(targetSelectionKey(void 0, selection.resolvedTargetName), selection);
439
+ }
440
+ }
441
+ }
442
+ return targets;
443
+ }
444
+ function findTargetSelection(result, test, targets) {
445
+ const targetName = result.target ?? "unknown";
446
+ const evalFileAbsolutePath = test?.source?.evalFileAbsolutePath;
447
+ return targets.get(targetSelectionKey(evalFileAbsolutePath, targetName)) ?? targets.get(targetSelectionKey(void 0, targetName));
448
+ }
449
+ function createTaskBundleArtifactsWriter(options) {
450
+ const targetSelections = buildTargetSelectionMap(options?.taskBundleTargets);
451
+ if (targetSelections.size === 0) {
452
+ return void 0;
453
+ }
454
+ return async ({ outputDir, result, sourceTest, testDir }) => {
455
+ const targetSelection = findTargetSelection(result, sourceTest, targetSelections);
456
+ if (!sourceTest || !targetSelection) {
457
+ return void 0;
458
+ }
459
+ const taskBundle = await materializeTaskBundle({
460
+ test: sourceTest,
461
+ targetName: targetSelection.targetName,
462
+ targetDefinitions: targetSelection.definitions,
463
+ outputDir: testDir,
464
+ cwd: options?.cwd,
465
+ repoRoot: options?.repoRoot
466
+ });
467
+ return buildTaskBundleIndexFields(outputDir, taskBundle);
468
+ };
469
+ }
470
+ async function writePerTestArtifacts2(results, outputDir, options) {
471
+ await writePerTestArtifacts(results, outputDir, {
472
+ experiment: options?.experiment,
473
+ sourceTests: options?.sourceTests,
474
+ additionalArtifacts: createTaskBundleArtifactsWriter(options)
475
+ });
476
+ }
477
+ async function writeArtifactsFromResults2(results, outputDir, options) {
478
+ return writeArtifactsFromResults(results, outputDir, {
479
+ evalFile: options?.evalFile,
480
+ experiment: options?.experiment,
481
+ plannedTestCount: options?.plannedTestCount,
482
+ sourceTests: options?.sourceTests,
483
+ additionalArtifacts: createTaskBundleArtifactsWriter(options)
484
+ });
485
+ }
486
+
487
+ export {
488
+ toSnakeCaseDeep,
489
+ buildIndexArtifactEntry2 as buildIndexArtifactEntry,
490
+ buildResultIndexArtifact2 as buildResultIndexArtifact,
491
+ writePerTestArtifacts2 as writePerTestArtifacts,
492
+ writeArtifactsFromResults2 as writeArtifactsFromResults
493
+ };
494
+ //# sourceMappingURL=chunk-TWQP7JYQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/eval/artifact-writer.ts","../src/commands/eval/task-bundle.ts","../src/utils/case-conversion.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n type AdditionalResultArtifactsWriter,\n type AggregateGradingArtifact,\n type BenchmarkArtifact,\n type EvalTest,\n type EvaluationResult,\n type GradingArtifact,\n type IndexArtifactEntry,\n RESULT_INDEX_FILENAME,\n type ResultIndexArtifact,\n type TimingArtifact,\n aggregateRunDir,\n buildAggregateGradingArtifact,\n buildBenchmarkArtifact,\n buildIndexArtifactEntry as buildCoreIndexArtifactEntry,\n buildResultIndexArtifact as buildCoreResultIndexArtifact,\n buildGradingArtifact,\n buildTestTargetKey,\n buildTimingArtifact,\n deduplicateByTestIdTarget,\n parseJsonlResults,\n writeArtifacts,\n writeArtifactsFromResults as writeCoreArtifactsFromResults,\n writePerTestArtifacts as writeCorePerTestArtifacts,\n writeInitialBenchmarkArtifact,\n} from '@agentv/core';\nimport type { TargetDefinition } from '@agentv/core';\n\nimport {\n type MaterializedTaskBundlePaths,\n type TaskBundleTargetSelection,\n materializeTaskBundle,\n} from './task-bundle.js';\n\nexport {\n aggregateRunDir,\n buildAggregateGradingArtifact,\n buildBenchmarkArtifact,\n buildGradingArtifact,\n buildTestTargetKey,\n buildTimingArtifact,\n deduplicateByTestIdTarget,\n parseJsonlResults,\n RESULT_INDEX_FILENAME,\n writeArtifacts,\n writeInitialBenchmarkArtifact,\n};\nexport type {\n AggregateGradingArtifact,\n BenchmarkArtifact,\n GradingArtifact,\n IndexArtifactEntry,\n ResultIndexArtifact,\n TimingArtifact,\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 buildCoreIndexArtifactEntry(result, {\n ...options,\n extraIndexFields: buildTaskBundleIndexFields(options.outputDir, options.taskBundle),\n });\n}\n\nexport function buildResultIndexArtifact(\n result: EvaluationResult,\n taskBundle?: MaterializedTaskBundlePaths,\n): ResultIndexArtifact {\n const artifactSubdir = (buildCoreResultIndexArtifact(result).artifact_dir ?? '').trim();\n const extraIndexFields = 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 : undefined;\n return buildCoreResultIndexArtifact(result, extraIndexFields);\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\nfunction createTaskBundleArtifactsWriter(options?: {\n cwd?: string;\n repoRoot?: string;\n taskBundleTargets?: readonly TaskBundleTargetSelection[];\n}): AdditionalResultArtifactsWriter | undefined {\n const targetSelections = buildTargetSelectionMap(options?.taskBundleTargets);\n if (targetSelections.size === 0) {\n return undefined;\n }\n\n return async ({ outputDir, result, sourceTest, testDir }) => {\n const targetSelection = findTargetSelection(result, sourceTest, targetSelections);\n if (!sourceTest || !targetSelection) {\n return undefined;\n }\n\n const taskBundle = await materializeTaskBundle({\n test: sourceTest,\n targetName: targetSelection.targetName,\n targetDefinitions: targetSelection.definitions as readonly TargetDefinition[],\n outputDir: testDir,\n cwd: options?.cwd,\n repoRoot: options?.repoRoot,\n });\n\n return buildTaskBundleIndexFields(outputDir, taskBundle);\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 writeCorePerTestArtifacts(results, outputDir, {\n experiment: options?.experiment,\n sourceTests: options?.sourceTests,\n additionalArtifacts: createTaskBundleArtifactsWriter(options),\n });\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 return writeCoreArtifactsFromResults(results, outputDir, {\n evalFile: options?.evalFile,\n experiment: options?.experiment,\n plannedTestCount: options?.plannedTestCount,\n sourceTests: options?.sourceTests,\n additionalArtifacts: createTaskBundleArtifactsWriter(options),\n });\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","/**\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"],"mappings":"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","names":["path","path","buildIndexArtifactEntry","buildResultIndexArtifact","writePerTestArtifacts","writeArtifactsFromResults"]}