agentv 4.44.0-next.1 → 5.1.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.
Files changed (108) hide show
  1. package/README.md +236 -54
  2. package/dist/{agentv-provider-AYXH7WLW-NJRC6UQX.js → agentv-provider-AYXH7WLW-6YZKZ7PS.js} +2 -2
  3. package/dist/{artifact-writer-72MQQELS.js → artifact-writer-IORG7CW5.js} +21 -12
  4. package/dist/{chunk-NPVGBFF6.js → chunk-7BGERE6L.js} +2 -43
  5. package/dist/chunk-7BGERE6L.js.map +1 -0
  6. package/dist/{chunk-CXHYTYHU.js → chunk-AM2IPHKS.js} +3496 -1955
  7. package/dist/chunk-AM2IPHKS.js.map +1 -0
  8. package/dist/{chunk-KAGZRUO6.js → chunk-CBBBRTQ3.js} +127 -80
  9. package/dist/chunk-CBBBRTQ3.js.map +1 -0
  10. package/dist/{chunk-2N3YSEMI.js → chunk-GIRUNQGP.js} +8323 -9226
  11. package/dist/chunk-GIRUNQGP.js.map +1 -0
  12. package/dist/{chunk-NCNDA3F6.js → chunk-GJWPQXHN.js} +1070 -791
  13. package/dist/chunk-GJWPQXHN.js.map +1 -0
  14. package/dist/{chunk-BPGJ4HBU.js → chunk-PEUTJS7B.js} +3 -3
  15. package/dist/{chunk-5H446C7X.js → chunk-QMRVH5ZP.js} +2 -8
  16. package/dist/{chunk-5DYGN547.js → chunk-ZGPCX334.js} +44263 -30424
  17. package/dist/chunk-ZGPCX334.js.map +1 -0
  18. package/dist/cli.js +8 -9
  19. package/dist/cli.js.map +1 -1
  20. package/dist/dashboard/assets/{index-DitffAxS.js → index-BSHoWrdr.js} +1 -1
  21. package/dist/dashboard/assets/index-BaLLxmVO.js +121 -0
  22. package/dist/dashboard/assets/index-zvUKAkKn.css +1 -0
  23. package/dist/dashboard/index.html +2 -2
  24. package/dist/{dist-L4YCQOQ6.js → dist-2D2GBHZV.js} +101 -51
  25. package/dist/{docker-workspace-RPPXBT27-B4AQHVWA.js → docker-workspace-NNK4Z6FR-QRTIG6TM.js} +3 -3
  26. package/dist/{exec-AR6JUUN5-6MBPURPR.js → exec-4HFFRQ3B-AXDMJNLJ.js} +3 -3
  27. package/dist/index.js +8 -9
  28. package/dist/{interactive-DRNRKLEQ.js → interactive-V4SEHLNY.js} +13 -29
  29. package/dist/interactive-V4SEHLNY.js.map +1 -0
  30. package/dist/skills/agentv-bench/SKILL.md +26 -26
  31. package/dist/skills/agentv-bench/agents/analyzer.md +7 -7
  32. package/dist/skills/agentv-bench/agents/comparator.md +4 -5
  33. package/dist/skills/agentv-bench/agents/grader.md +4 -4
  34. package/dist/skills/agentv-bench/references/autoresearch.md +4 -4
  35. package/dist/skills/agentv-bench/references/description-optimization.md +2 -2
  36. package/dist/skills/agentv-bench/references/environment-adaptation.md +10 -10
  37. package/dist/skills/agentv-bench/references/eval-yaml-spec.md +52 -26
  38. package/dist/skills/agentv-bench/references/migrating-from-skill-creator.md +6 -6
  39. package/dist/skills/agentv-bench/references/schemas.md +6 -6
  40. package/dist/skills/agentv-bench/references/subagent-pipeline.md +14 -13
  41. package/dist/skills/agentv-eval-migrations/SKILL.md +33 -0
  42. package/dist/skills/agentv-eval-migrations/references/breaking-changes.md +1013 -0
  43. package/dist/skills/agentv-eval-review/SKILL.md +6 -3
  44. package/dist/skills/agentv-eval-review/scripts/lint_eval.py +1 -1
  45. package/dist/skills/agentv-eval-writer/SKILL.md +329 -200
  46. package/dist/skills/agentv-eval-writer/references/{config-schema.json → config.schema.json} +6 -5
  47. package/dist/skills/agentv-eval-writer/references/custom-evaluators.md +23 -18
  48. package/dist/skills/agentv-eval-writer/references/eval.schema.json +10447 -0
  49. package/dist/skills/agentv-eval-writer/references/python-helpers.md +8 -8
  50. package/dist/skills/agentv-eval-writer/references/rubric-evaluator.md +21 -22
  51. package/dist/skills/agentv-trace-analyst/SKILL.md +4 -4
  52. package/dist/templates/.agentv/targets.yaml +41 -40
  53. package/dist/{ts-eval-loader-S7ESROX2-6CB3HB6H.js → ts-eval-loader-SSPJVEHD-AL2A3V5Z.js} +4 -4
  54. package/package.json +13 -4
  55. package/dist/chunk-2N3YSEMI.js.map +0 -1
  56. package/dist/chunk-5DYGN547.js.map +0 -1
  57. package/dist/chunk-76FOHROU.js +0 -96
  58. package/dist/chunk-76FOHROU.js.map +0 -1
  59. package/dist/chunk-CXHYTYHU.js.map +0 -1
  60. package/dist/chunk-HSHTTN6C.js +0 -565
  61. package/dist/chunk-HSHTTN6C.js.map +0 -1
  62. package/dist/chunk-KAGZRUO6.js.map +0 -1
  63. package/dist/chunk-LRULMAAA.js +0 -1711
  64. package/dist/chunk-LRULMAAA.js.map +0 -1
  65. package/dist/chunk-NCNDA3F6.js.map +0 -1
  66. package/dist/chunk-NPVGBFF6.js.map +0 -1
  67. package/dist/chunk-R3CXYNTN.js +0 -1238
  68. package/dist/chunk-R3CXYNTN.js.map +0 -1
  69. package/dist/chunk-VQ2ZO7XJ.js +0 -2098
  70. package/dist/chunk-VQ2ZO7XJ.js.map +0 -1
  71. package/dist/chunk-XALGXSKB.js +0 -21
  72. package/dist/chunk-XALGXSKB.js.map +0 -1
  73. package/dist/dashboard/assets/index-1Hvy8sBy.js +0 -119
  74. package/dist/dashboard/assets/index-J5sPcQO3.css +0 -1
  75. package/dist/esm-NNMQYIKT.js +0 -32
  76. package/dist/esm-R77SNOF5.js +0 -65
  77. package/dist/esm-RVQPUGWH.js +0 -1207
  78. package/dist/esm-RVQPUGWH.js.map +0 -1
  79. package/dist/esm-TTEMJEVV.js +0 -933
  80. package/dist/esm-TTEMJEVV.js.map +0 -1
  81. package/dist/esm-ZADQ4XQH-QUFGGZL4.js +0 -924
  82. package/dist/esm-ZADQ4XQH-QUFGGZL4.js.map +0 -1
  83. package/dist/exec-AR6JUUN5-6MBPURPR.js.map +0 -1
  84. package/dist/getMachineId-bsd-HSK5LZMG.js +0 -41
  85. package/dist/getMachineId-bsd-HSK5LZMG.js.map +0 -1
  86. package/dist/getMachineId-darwin-4DP6CCJV.js +0 -41
  87. package/dist/getMachineId-darwin-4DP6CCJV.js.map +0 -1
  88. package/dist/getMachineId-linux-44LJ5UJB.js +0 -33
  89. package/dist/getMachineId-linux-44LJ5UJB.js.map +0 -1
  90. package/dist/getMachineId-unsupported-NVK6IATM.js +0 -24
  91. package/dist/getMachineId-unsupported-NVK6IATM.js.map +0 -1
  92. package/dist/getMachineId-win-YZ36S7VA.js +0 -43
  93. package/dist/getMachineId-win-YZ36S7VA.js.map +0 -1
  94. package/dist/interactive-DRNRKLEQ.js.map +0 -1
  95. package/dist/otlp-json-file-exporter-RY63S3IG-PZBQPVYY.js +0 -9
  96. package/dist/otlp-json-file-exporter-RY63S3IG-PZBQPVYY.js.map +0 -1
  97. package/dist/skills/agentv-eval-writer/references/eval-schema.json +0 -17355
  98. package/dist/src-76ISS3LH.js +0 -1733
  99. package/dist/src-76ISS3LH.js.map +0 -1
  100. package/dist/ts-eval-loader-S7ESROX2-6CB3HB6H.js.map +0 -1
  101. /package/dist/{agentv-provider-AYXH7WLW-NJRC6UQX.js.map → agentv-provider-AYXH7WLW-6YZKZ7PS.js.map} +0 -0
  102. /package/dist/{artifact-writer-72MQQELS.js.map → artifact-writer-IORG7CW5.js.map} +0 -0
  103. /package/dist/{chunk-BPGJ4HBU.js.map → chunk-PEUTJS7B.js.map} +0 -0
  104. /package/dist/{chunk-5H446C7X.js.map → chunk-QMRVH5ZP.js.map} +0 -0
  105. /package/dist/{dist-L4YCQOQ6.js.map → dist-2D2GBHZV.js.map} +0 -0
  106. /package/dist/{docker-workspace-RPPXBT27-B4AQHVWA.js.map → docker-workspace-NNK4Z6FR-QRTIG6TM.js.map} +0 -0
  107. /package/dist/{esm-NNMQYIKT.js.map → exec-4HFFRQ3B-AXDMJNLJ.js.map} +0 -0
  108. /package/dist/{esm-R77SNOF5.js.map → ts-eval-loader-SSPJVEHD-AL2A3V5Z.js.map} +0 -0
@@ -3,9 +3,10 @@ import {
3
3
  buildIndexArtifactEntry,
4
4
  buildResultIndexArtifact,
5
5
  parseYamlValue,
6
+ toSnakeCaseDeep,
6
7
  writeArtifactsFromResults,
7
8
  writePerTestArtifacts
8
- } from "./chunk-5DYGN547.js";
9
+ } from "./chunk-ZGPCX334.js";
9
10
 
10
11
  // src/commands/eval/artifact-writer.ts
11
12
  import path2 from "node:path";
@@ -15,38 +16,12 @@ import { createHash } from "node:crypto";
15
16
  import { mkdir, readFile, readdir, stat, writeFile } from "node:fs/promises";
16
17
  import path from "node:path";
17
18
  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";
19
+ var TEST_BUNDLE_DIRNAME = "test";
46
20
  var TASK_EVAL_FILENAME = "EVAL.yaml";
47
21
  var TASK_TARGETS_FILENAME = "targets.yaml";
48
22
  var TASK_FILES_DIRNAME = "files";
49
23
  var TASK_GRADERS_DIRNAME = "graders";
24
+ var INPUT_PROMPT = "{{ input }}";
50
25
  var BUNDLE_EVALS_DIRNAME = "evals";
51
26
  var BUNDLE_MANIFEST_FILENAME = "agentv_bundle.json";
52
27
  var BUNDLE_TARGETS_FILENAME = "targets.yaml";
@@ -66,6 +41,27 @@ var SKIPPED_DIR_NAMES = /* @__PURE__ */ new Set([
66
41
  ".beads",
67
42
  ".DS_Store"
68
43
  ]);
44
+ var AUTHORING_TOP_LEVEL_TARGET_FIELDS = /* @__PURE__ */ new Set([
45
+ "label",
46
+ "provider",
47
+ "prompts",
48
+ "transform",
49
+ "delay",
50
+ "env",
51
+ "model",
52
+ "use_target",
53
+ "fallback_targets",
54
+ "grader_target",
55
+ "max_budget_usd",
56
+ "workers",
57
+ "batch_requests",
58
+ "subagent_mode_allowed",
59
+ "max_retries",
60
+ "retry_initial_delay_ms",
61
+ "retry_max_delay_ms",
62
+ "retry_backoff_factor",
63
+ "retry_status_codes"
64
+ ]);
69
65
  function isRecord(value) {
70
66
  return typeof value === "object" && value !== null && !Array.isArray(value);
71
67
  }
@@ -204,7 +200,7 @@ async function copyDirectory(sourcePath, destinationPath) {
204
200
  return copiedAny;
205
201
  }
206
202
  function shouldCopyDirectory(reference) {
207
- if (reference.kind !== "code_grader_cwd") {
203
+ if (reference.kind !== "script_grader_cwd" && reference.kind !== "code_grader_cwd") {
208
204
  return true;
209
205
  }
210
206
  return !path.isAbsolute(reference.displayPath);
@@ -366,25 +362,46 @@ function parseSourceTestCase(test) {
366
362
  }
367
363
  function withoutLegacyAssertionKeys(testCase) {
368
364
  return Object.fromEntries(
369
- Object.entries(testCase).filter(([key]) => key !== "assert" && key !== "evaluators")
365
+ Object.entries(testCase).filter(([key]) => key !== "assert" && key !== "assertions")
370
366
  );
371
367
  }
368
+ function moveInputToVars(testCase) {
369
+ if (!Object.hasOwn(testCase, "input")) {
370
+ return testCase;
371
+ }
372
+ const { input, input_files: _inputFiles, ...caseWithoutInput } = testCase;
373
+ return {
374
+ ...caseWithoutInput,
375
+ vars: {
376
+ ...isRecord(testCase.vars) ? testCase.vars : {},
377
+ input
378
+ }
379
+ };
380
+ }
381
+ function serializeGraderDefinition(definition, rewrites) {
382
+ const serialized = rewritePathsDeep(toSnakeCaseDeep(definition), rewrites);
383
+ if (!isRecord(serialized)) {
384
+ return serialized;
385
+ }
386
+ const { name, metric, ...rest } = serialized;
387
+ return typeof name === "string" && metric === void 0 ? { metric: name, ...rest } : serialized;
388
+ }
372
389
  function buildEvalCase(test, rewrites) {
373
390
  const testCase = rewritePathsDeep(parseSourceTestCase(test), rewrites);
374
391
  const graderDefinitions = test.source?.graderDefinitions ?? [];
375
392
  if (graderDefinitions.length > 0) {
376
- return {
393
+ return moveInputToVars({
377
394
  ...withoutLegacyAssertionKeys(testCase),
378
- assertions: graderDefinitions.map(
379
- (grader) => rewritePathsDeep(toSnakeCaseDeep(grader.definition), rewrites)
395
+ assert: graderDefinitions.map(
396
+ (grader) => serializeGraderDefinition(grader.definition, rewrites)
380
397
  )
381
- };
398
+ });
382
399
  }
383
- return testCase;
400
+ return moveInputToVars(testCase);
384
401
  }
385
402
  function targetReferenceNames(target) {
386
403
  const references = [];
387
- for (const key of ["use_target", "grader_target", "judge_target"]) {
404
+ for (const key of ["use_target", "grader_target"]) {
388
405
  const value = target[key];
389
406
  if (typeof value === "string" && value.trim().length > 0 && !value.includes("${{")) {
390
407
  references.push(value.trim());
@@ -451,6 +468,37 @@ function uniqueTargetDefinitions(selections) {
451
468
  }
452
469
  return selected;
453
470
  }
471
+ function serializeTargetDefinition(definition) {
472
+ const target = { id: definition.name };
473
+ if (definition.id !== void 0) {
474
+ target.id = definition.id;
475
+ }
476
+ const config = {};
477
+ for (const [key, value] of Object.entries(definition)) {
478
+ if (value === void 0 || key === "name" || key === "id" || key === "label" || key === "config") {
479
+ continue;
480
+ }
481
+ if (AUTHORING_TOP_LEVEL_TARGET_FIELDS.has(key)) {
482
+ target[key] = value;
483
+ } else {
484
+ config[key] = value;
485
+ }
486
+ }
487
+ if (isRecord(definition.config)) {
488
+ for (const [key, value] of Object.entries(definition.config)) {
489
+ if (value !== void 0) {
490
+ config[key] = value;
491
+ }
492
+ }
493
+ }
494
+ if (Object.keys(config).length > 0) {
495
+ target.config = config;
496
+ }
497
+ return target;
498
+ }
499
+ function serializeTargetDefinitions(definitions) {
500
+ return definitions.map((definition) => serializeTargetDefinition(definition));
501
+ }
454
502
  function uniqueTargetNames(selections) {
455
503
  const names = [];
456
504
  const seen = /* @__PURE__ */ new Set();
@@ -524,19 +572,16 @@ function serializeExpectedMessage(message, rewrites) {
524
572
  return rewritePathsDeep(serialized, rewrites);
525
573
  }
526
574
  function serializeWorkspace(workspace, rewrites) {
527
- const {
528
- workspaceFileDir: _workspaceFileDir,
529
- path: _path,
530
- mode,
531
- ...portableWorkspace
532
- } = workspace;
533
- const withoutStaticMode = mode === "static" ? portableWorkspace : { ...portableWorkspace, ...mode ? { mode } : {} };
534
- return rewritePathsDeep(withoutStaticMode, rewrites);
575
+ const { workspaceFileDir: _workspaceFileDir, ...portableWorkspace } = workspace;
576
+ return rewritePathsDeep(portableWorkspace, rewrites);
535
577
  }
536
578
  function buildPortableEvalCase(test, rewrites) {
537
579
  const testCase = buildEvalCase(test, rewrites);
538
580
  testCase.id = test.id;
539
- testCase.input = test.input.map((message) => serializeMessage(message, rewrites));
581
+ testCase.vars = {
582
+ ...isRecord(testCase.vars) ? testCase.vars : {},
583
+ input: test.input.map((message) => serializeMessage(message, rewrites))
584
+ };
540
585
  if (test.criteria.trim().length > 0) {
541
586
  testCase.criteria = test.criteria;
542
587
  }
@@ -551,13 +596,12 @@ function buildPortableEvalCase(test, rewrites) {
551
596
  if (test.metadata && Object.keys(test.metadata).length > 0) {
552
597
  testCase.metadata = rewritePathsDeep(test.metadata, rewrites);
553
598
  }
599
+ if (test.run && Object.keys(test.run).length > 0) {
600
+ testCase.run = rewritePathsDeep(test.run, rewrites);
601
+ }
554
602
  if (test.conversation_id) {
555
603
  testCase.conversation_id = test.conversation_id;
556
604
  }
557
- if (test.targets && test.targets.length > 0) {
558
- const existingExecution = isRecord(testCase.execution) ? testCase.execution : {};
559
- testCase.execution = { ...existingExecution, targets: test.targets };
560
- }
561
605
  if (test.threshold !== void 0) {
562
606
  const existingExecution = isRecord(testCase.execution) ? testCase.execution : {};
563
607
  testCase.execution = { ...existingExecution, threshold: test.threshold };
@@ -615,11 +659,6 @@ async function collectWorkspaceReferences(tests, evalFileDir) {
615
659
  if (!workspace) {
616
660
  continue;
617
661
  }
618
- if (workspace.path || workspace.mode === "static") {
619
- errors.push(
620
- `workspace.path for test "${test.id}" cannot be bundled because it points at an existing static workspace. Use workspace.template, workspace.repos, or workspace.hooks for portable bundles.`
621
- );
622
- }
623
662
  if (workspace.template) {
624
663
  references.push({
625
664
  kind: "workspace_template",
@@ -634,7 +673,7 @@ async function collectWorkspaceReferences(tests, evalFileDir) {
634
673
  }
635
674
  for (const hookName of ["before_all", "before_each", "after_each", "after_all"]) {
636
675
  const hook = hooks[hookName];
637
- const command = hook?.command ?? hook?.script;
676
+ const command = hook?.command;
638
677
  if (!command || command.length === 0) {
639
678
  continue;
640
679
  }
@@ -712,24 +751,25 @@ async function materializeTaskBundle(options) {
712
751
  if (targetDefinitions.length === 0) {
713
752
  return void 0;
714
753
  }
715
- const taskDir = path.join(options.outputDir, TASK_DIRNAME);
716
- await mkdir(taskDir, { recursive: true });
717
- const copiedReferences = await copyReferences(options.test.source.references, taskDir, options);
754
+ const testDir = path.join(options.outputDir, TEST_BUNDLE_DIRNAME);
755
+ await mkdir(testDir, { recursive: true });
756
+ const copiedReferences = await copyReferences(options.test.source.references, testDir, options);
718
757
  const rewrites = buildPathRewrites(copiedReferences);
719
758
  const evalCase = buildEvalCase(options.test, rewrites);
720
- const evalPath = path.join(taskDir, TASK_EVAL_FILENAME);
721
- const targetsPath = path.join(taskDir, TASK_TARGETS_FILENAME);
759
+ const evalPath = path.join(testDir, TASK_EVAL_FILENAME);
760
+ const targetsPath = path.join(testDir, TASK_TARGETS_FILENAME);
722
761
  await writeYamlFile(evalPath, {
723
- execution: { target: options.targetName },
762
+ target: options.targetName,
763
+ prompts: [INPUT_PROMPT],
724
764
  tests: [evalCase]
725
765
  });
726
- await writeYamlFile(targetsPath, { targets: targetDefinitions });
766
+ await writeYamlFile(targetsPath, { targets: serializeTargetDefinitions(targetDefinitions) });
727
767
  return {
728
- taskDir,
768
+ testDir,
729
769
  evalPath,
730
770
  targetsPath,
731
- ...hasCopiedBucket(copiedReferences, "files") ? { filesPath: path.join(taskDir, TASK_FILES_DIRNAME) } : {},
732
- ...hasCopiedBucket(copiedReferences, "graders") ? { gradersPath: path.join(taskDir, TASK_GRADERS_DIRNAME) } : {}
771
+ ...hasCopiedBucket(copiedReferences, "files") ? { filesPath: path.join(testDir, TASK_FILES_DIRNAME) } : {},
772
+ ...hasCopiedBucket(copiedReferences, "graders") ? { gradersPath: path.join(testDir, TASK_GRADERS_DIRNAME) } : {}
733
773
  };
734
774
  }
735
775
  async function materializeEvalBundle(options) {
@@ -766,13 +806,14 @@ ${errors.map((error) => `- ${error}`).join("\n")}`);
766
806
  const evalPath = path.join(evalsDir, bundledEvalFileName(options.evalFilePath));
767
807
  const targetsPath = path.join(outputDir, BUNDLE_TARGETS_FILENAME);
768
808
  const manifestPath = path.join(outputDir, BUNDLE_MANIFEST_FILENAME);
769
- const execution = options.execution ?? (targetNames.length === 1 ? { target: targetNames[0] } : { targets: targetNames });
809
+ const runtime = options.runtime ?? (targetNames.length === 1 ? { target: targetNames[0] } : void 0);
770
810
  await writeYamlFile(evalPath, {
771
- execution,
811
+ ...runtime ?? {},
812
+ prompts: [INPUT_PROMPT],
772
813
  tests: options.tests.map((test) => buildPortableEvalCase(test, rewrites))
773
814
  });
774
815
  await writeYamlFile(targetsPath, {
775
- targets: uniqueTargetDefinitions(options.targetSelections)
816
+ targets: serializeTargetDefinitions(uniqueTargetDefinitions(options.targetSelections))
776
817
  });
777
818
  const manifest = bundleManifest({
778
819
  outputDir,
@@ -808,7 +849,7 @@ function buildTaskBundleIndexFields(outputDir, taskBundle) {
808
849
  return {};
809
850
  }
810
851
  return {
811
- task_dir: toRelativeArtifactPath(outputDir, taskBundle.taskDir),
852
+ test_dir: toRelativeArtifactPath(outputDir, taskBundle.testDir),
812
853
  eval_path: toRelativeArtifactPath(outputDir, taskBundle.evalPath),
813
854
  targets_path: toRelativeArtifactPath(outputDir, taskBundle.targetsPath),
814
855
  ...taskBundle.filesPath ? { files_path: toRelativeArtifactPath(outputDir, taskBundle.filesPath) } : {},
@@ -822,13 +863,13 @@ function buildIndexArtifactEntry2(result, options) {
822
863
  });
823
864
  }
824
865
  function buildResultIndexArtifact2(result, taskBundle) {
825
- const artifactSubdir = (buildResultIndexArtifact(result).artifact_dir ?? "").trim();
866
+ const artifactSubdir = (buildResultIndexArtifact(result).result_dir ?? "").trim();
826
867
  const extraIndexFields = taskBundle ? {
827
- task_dir: path2.posix.join(artifactSubdir, "task"),
828
- eval_path: path2.posix.join(artifactSubdir, "task", "EVAL.yaml"),
829
- targets_path: path2.posix.join(artifactSubdir, "task", "targets.yaml"),
830
- ...taskBundle.filesPath ? { files_path: path2.posix.join(artifactSubdir, "task", "files") } : {},
831
- ...taskBundle.gradersPath ? { graders_path: path2.posix.join(artifactSubdir, "task", "graders") } : {}
868
+ test_dir: path2.posix.join(artifactSubdir, "test"),
869
+ eval_path: path2.posix.join(artifactSubdir, "test", "EVAL.yaml"),
870
+ targets_path: path2.posix.join(artifactSubdir, "test", "targets.yaml"),
871
+ ...taskBundle.filesPath ? { files_path: path2.posix.join(artifactSubdir, "test", "files") } : {},
872
+ ...taskBundle.gradersPath ? { graders_path: path2.posix.join(artifactSubdir, "test", "graders") } : {}
832
873
  } : void 0;
833
874
  return buildResultIndexArtifact(result, extraIndexFields);
834
875
  }
@@ -886,30 +927,36 @@ function createTaskBundleArtifactsWriter(options) {
886
927
  async function writePerTestArtifacts2(results, outputDir, options) {
887
928
  await writePerTestArtifacts(results, outputDir, {
888
929
  experiment: options?.experiment,
930
+ resultGroup: options?.resultGroup,
889
931
  runId: options?.runId,
890
932
  duplicatePolicy: options?.duplicatePolicy,
891
933
  sourceTests: options?.sourceTests,
892
- additionalArtifacts: createTaskBundleArtifactsWriter(options)
934
+ additionalArtifacts: options?.additionalArtifacts ?? createTaskBundleArtifactsWriter(options),
935
+ runtimeSource: options?.runtimeSource,
936
+ tags: options?.tags
893
937
  });
894
938
  }
895
939
  async function writeArtifactsFromResults2(results, outputDir, options) {
896
940
  return writeArtifactsFromResults(results, outputDir, {
897
941
  evalFile: options?.evalFile,
898
942
  experiment: options?.experiment,
943
+ experimentMetadata: options?.experimentMetadata,
899
944
  plannedTestCount: options?.plannedTestCount,
900
945
  runId: options?.runId,
901
946
  duplicatePolicy: options?.duplicatePolicy,
947
+ resultGroup: options?.resultGroup,
902
948
  sourceTests: options?.sourceTests,
903
- additionalArtifacts: createTaskBundleArtifactsWriter(options)
949
+ additionalArtifacts: options?.additionalArtifacts ?? createTaskBundleArtifactsWriter(options),
950
+ runtimeSource: options?.runtimeSource,
951
+ tags: options?.tags
904
952
  });
905
953
  }
906
954
 
907
955
  export {
908
- toSnakeCaseDeep,
909
956
  materializeEvalBundle,
910
957
  buildIndexArtifactEntry2 as buildIndexArtifactEntry,
911
958
  buildResultIndexArtifact2 as buildResultIndexArtifact,
912
959
  writePerTestArtifacts2 as writePerTestArtifacts,
913
960
  writeArtifactsFromResults2 as writeArtifactsFromResults
914
961
  };
915
- //# sourceMappingURL=chunk-KAGZRUO6.js.map
962
+ //# sourceMappingURL=chunk-CBBBRTQ3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/eval/artifact-writer.ts","../src/commands/eval/task-bundle.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n type AdditionalResultArtifactsWriter,\n type AggregateGradingArtifact,\n type EvalTest,\n type EvaluationResult,\n type ExperimentArtifactMetadata,\n type ExportDuplicatePolicy,\n type GradingArtifact,\n type IndexArtifactEntry,\n RESULT_INDEX_FILENAME,\n RUN_CONFIG_FILENAME,\n RUN_SUMMARY_FILENAME,\n type ResultIndexArtifact,\n type RunConfigArtifact,\n type RunRuntimeSourceMetadata,\n type RunSummaryArtifact,\n type TimingArtifact,\n aggregateRunDir,\n buildAggregateGradingArtifact,\n buildIndexArtifactEntry as buildCoreIndexArtifactEntry,\n buildResultIndexArtifact as buildCoreResultIndexArtifact,\n buildEvalTestTargetKey,\n buildEvaluationResultTargetKey,\n buildGradingArtifact,\n buildRunSummaryArtifact,\n buildTestTargetKey,\n buildTimingArtifact,\n deduplicateByTestIdTarget,\n parseJsonlResults,\n readRunConfigArtifact,\n writeArtifacts,\n writeArtifactsFromResults as writeCoreArtifactsFromResults,\n writePerTestArtifacts as writeCorePerTestArtifacts,\n writeInitialRunSummaryArtifact,\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 buildEvalTestTargetKey,\n buildEvaluationResultTargetKey,\n buildRunSummaryArtifact,\n buildGradingArtifact,\n buildTestTargetKey,\n buildTimingArtifact,\n deduplicateByTestIdTarget,\n parseJsonlResults,\n RESULT_INDEX_FILENAME,\n RUN_CONFIG_FILENAME,\n RUN_SUMMARY_FILENAME,\n readRunConfigArtifact,\n writeArtifacts,\n writeInitialRunSummaryArtifact,\n};\nexport type {\n AggregateGradingArtifact,\n GradingArtifact,\n IndexArtifactEntry,\n ResultIndexArtifact,\n RunConfigArtifact,\n RunSummaryArtifact,\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 'test_dir' | 'eval_path' | 'targets_path' | 'files_path' | 'graders_path'\n> {\n if (!taskBundle) {\n return {};\n }\n return {\n test_dir: toRelativeArtifactPath(outputDir, taskBundle.testDir),\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 resultDir?: string;\n gradingPath?: string;\n summaryPath?: string;\n outputPath?: string;\n answerPath?: string;\n transcriptPath?: string;\n transcriptRawPath?: string;\n metricsPath?: string;\n fileChangesPath?: string;\n rawProviderLogPath?: 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).result_dir ?? '').trim();\n const extraIndexFields = taskBundle\n ? {\n test_dir: path.posix.join(artifactSubdir, 'test'),\n eval_path: path.posix.join(artifactSubdir, 'test', 'EVAL.yaml'),\n targets_path: path.posix.join(artifactSubdir, 'test', 'targets.yaml'),\n ...(taskBundle.filesPath\n ? { files_path: path.posix.join(artifactSubdir, 'test', 'files') }\n : {}),\n ...(taskBundle.gradersPath\n ? { graders_path: path.posix.join(artifactSubdir, 'test', '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 runId?: string;\n duplicatePolicy?: ExportDuplicatePolicy;\n resultGroup?: string;\n cwd?: string;\n repoRoot?: string;\n sourceTests?: readonly EvalTest[];\n taskBundleTargets?: readonly TaskBundleTargetSelection[];\n additionalArtifacts?: AdditionalResultArtifactsWriter;\n runtimeSource?: RunRuntimeSourceMetadata;\n tags?: Record<string, string>;\n },\n): Promise<void> {\n await writeCorePerTestArtifacts(results, outputDir, {\n experiment: options?.experiment,\n resultGroup: options?.resultGroup,\n runId: options?.runId,\n duplicatePolicy: options?.duplicatePolicy,\n sourceTests: options?.sourceTests,\n additionalArtifacts: options?.additionalArtifacts ?? createTaskBundleArtifactsWriter(options),\n runtimeSource: options?.runtimeSource,\n tags: options?.tags,\n });\n}\n\nexport async function writeArtifactsFromResults(\n results: readonly EvaluationResult[],\n outputDir: string,\n options?: {\n evalFile?: string;\n experiment?: string;\n experimentMetadata?: ExperimentArtifactMetadata;\n plannedTestCount?: number;\n runId?: string;\n duplicatePolicy?: ExportDuplicatePolicy;\n resultGroup?: string;\n cwd?: string;\n repoRoot?: string;\n sourceTests?: readonly EvalTest[];\n taskBundleTargets?: readonly TaskBundleTargetSelection[];\n additionalArtifacts?: AdditionalResultArtifactsWriter;\n runtimeSource?: RunRuntimeSourceMetadata;\n tags?: Record<string, string>;\n },\n): Promise<{\n testArtifactDir: string;\n summaryPath: string;\n indexPath: string;\n}> {\n return writeCoreArtifactsFromResults(results, outputDir, {\n evalFile: options?.evalFile,\n experiment: options?.experiment,\n experimentMetadata: options?.experimentMetadata,\n plannedTestCount: options?.plannedTestCount,\n runId: options?.runId,\n duplicatePolicy: options?.duplicatePolicy,\n resultGroup: options?.resultGroup,\n sourceTests: options?.sourceTests,\n additionalArtifacts: options?.additionalArtifacts ?? createTaskBundleArtifactsWriter(options),\n runtimeSource: options?.runtimeSource,\n tags: options?.tags,\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 JsonObject,\n type TargetDefinition,\n type TestMessage,\n type WorkspaceConfig,\n parseYamlValue,\n toSnakeCaseDeep,\n} from '@agentv/core';\nimport { stringify as stringifyYaml } from 'yaml';\n\nconst TEST_BUNDLE_DIRNAME = 'test';\nconst TASK_EVAL_FILENAME = 'EVAL.yaml';\nconst TASK_TARGETS_FILENAME = 'targets.yaml';\nconst TASK_FILES_DIRNAME = 'files';\nconst TASK_GRADERS_DIRNAME = 'graders';\nconst INPUT_PROMPT = '{{ input }}';\nconst BUNDLE_EVALS_DIRNAME = 'evals';\nconst BUNDLE_MANIFEST_FILENAME = 'agentv_bundle.json';\nconst BUNDLE_TARGETS_FILENAME = 'targets.yaml';\nconst BUNDLE_WORKSPACES_DIRNAME = 'workspaces';\nconst BUNDLE_SCRIPTS_DIRNAME = 'scripts';\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]);\nconst AUTHORING_TOP_LEVEL_TARGET_FIELDS = new Set([\n 'label',\n 'provider',\n 'prompts',\n 'transform',\n 'delay',\n 'env',\n 'model',\n 'use_target',\n 'fallback_targets',\n 'grader_target',\n 'max_budget_usd',\n 'workers',\n 'batch_requests',\n 'subagent_mode_allowed',\n 'max_retries',\n 'retry_initial_delay_ms',\n 'retry_max_delay_ms',\n 'retry_backoff_factor',\n 'retry_status_codes',\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 testDir: string;\n readonly evalPath: string;\n readonly targetsPath: string;\n readonly filesPath?: string;\n readonly gradersPath?: string;\n}\n\nexport interface MaterializeEvalBundleOptions {\n readonly evalFilePath: string;\n readonly tests: readonly EvalTest[];\n readonly targetSelections: readonly TaskBundleTargetSelection[];\n readonly outputDir: string;\n readonly cwd?: string;\n readonly repoRoot?: string;\n readonly runtime?: Record<string, unknown>;\n readonly now?: () => Date;\n}\n\nexport interface MaterializedEvalBundlePaths {\n readonly bundleDir: string;\n readonly evalsDir: string;\n readonly evalPath: string;\n readonly targetsPath: string;\n readonly manifestPath: string;\n readonly filesPath?: string;\n readonly gradersPath?: string;\n readonly workspacesPath?: string;\n readonly scriptsPath?: string;\n}\n\ntype BundleReferenceKind =\n | EvalSourceReference['kind']\n | 'expected_output_file'\n | 'workspace_template'\n | 'workspace_hook_command';\n\ninterface BundleSourceReference extends Omit<EvalSourceReference, 'kind'> {\n readonly kind: BundleReferenceKind;\n readonly location?: string;\n}\n\ninterface CopiedReference {\n readonly reference: BundleSourceReference;\n readonly localPath: string;\n readonly destinationPath: string;\n}\n\ninterface BundleReferenceFailure {\n readonly reference: BundleSourceReference;\n readonly reason: 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: BundleSourceReference,\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(\n reference: BundleSourceReference,\n): 'files' | 'graders' | 'workspaces' | 'scripts' {\n if (reference.kind === 'input_file' || reference.kind === 'expected_output_file') {\n return TASK_FILES_DIRNAME;\n }\n if (reference.kind === 'workspace_template') {\n return BUNDLE_WORKSPACES_DIRNAME;\n }\n if (reference.kind === 'workspace_hook_command') {\n return BUNDLE_SCRIPTS_DIRNAME;\n }\n return 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: BundleSourceReference): boolean {\n if (reference.kind !== 'script_grader_cwd' && reference.kind !== 'code_grader_cwd') {\n return true;\n }\n return !path.isAbsolute(reference.displayPath);\n}\n\nasync function copyReferenceWithFailure(\n reference: BundleSourceReference,\n taskDir: string,\n options: Pick<MaterializeTaskBundleOptions, 'cwd' | 'repoRoot'>,\n): Promise<{ copied?: CopiedReference; failure?: BundleReferenceFailure }> {\n if (!reference.resolvedPath) {\n return {\n failure: {\n reference,\n reason: `${reference.location ?? reference.kind} has no resolved path: ${reference.displayPath}`,\n },\n };\n }\n\n const relPath = relativeReferencePath(reference, options);\n if (!relPath) {\n return {\n failure: {\n reference,\n reason: `${reference.location ?? reference.kind} could not be assigned a portable path: ${reference.displayPath}`,\n },\n };\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 {\n failure: {\n reference,\n reason: `${reference.location ?? reference.kind} not found: ${reference.displayPath} (resolved to ${sourcePath})`,\n },\n };\n }\n\n if (sourceStat.isDirectory()) {\n if (!shouldCopyDirectory(reference)) {\n return {\n failure: {\n reference,\n reason: `${reference.location ?? reference.kind} uses an absolute directory that is not safe to copy automatically: ${reference.displayPath}`,\n },\n };\n }\n if (!(await copyDirectory(sourcePath, destinationPath))) {\n return {\n failure: {\n reference,\n reason: `${reference.location ?? reference.kind} directory contained no bundleable files: ${reference.displayPath}`,\n },\n };\n }\n } else if (sourceStat.isFile()) {\n if (!(await copyFileRedactingText(sourcePath, destinationPath))) {\n return {\n failure: {\n reference,\n reason: `${reference.location ?? reference.kind} could not be copied: ${reference.displayPath}`,\n },\n };\n }\n } else {\n return {\n failure: {\n reference,\n reason: `${reference.location ?? reference.kind} is not a regular file or directory: ${reference.displayPath}`,\n },\n };\n }\n\n return { copied: { reference, localPath: localPath.split(path.sep).join('/'), destinationPath } };\n}\n\nasync function copyReference(\n reference: BundleSourceReference,\n taskDir: string,\n options: Pick<MaterializeTaskBundleOptions, 'cwd' | 'repoRoot'>,\n): Promise<CopiedReference | undefined> {\n return (await copyReferenceWithFailure(reference, taskDir, options)).copied;\n}\n\nasync function copyReferences(\n references: readonly BundleSourceReference[],\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\nasync function copyReferencesStrict(\n references: readonly BundleSourceReference[],\n taskDir: string,\n options: Pick<MaterializeEvalBundleOptions, 'cwd' | 'repoRoot'>,\n): Promise<{\n readonly copied: readonly CopiedReference[];\n readonly failures: readonly BundleReferenceFailure[];\n}> {\n const copied: CopiedReference[] = [];\n const failures: BundleReferenceFailure[] = [];\n const seenDestinations = new Set<string>();\n const seenFailures = new Set<string>();\n\n for (const reference of references) {\n const result = await copyReferenceWithFailure(reference, taskDir, options);\n if (result.copied) {\n if (seenDestinations.has(result.copied.destinationPath)) {\n continue;\n }\n seenDestinations.add(result.copied.destinationPath);\n copied.push(result.copied);\n continue;\n }\n\n if (result.failure) {\n const key = `${result.failure.reference.kind}:${result.failure.reference.displayPath}:${result.failure.reason}`;\n if (!seenFailures.has(key)) {\n seenFailures.add(key);\n failures.push(result.failure);\n }\n }\n }\n\n return { copied, failures };\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 !== 'assertions'),\n );\n}\n\nfunction moveInputToVars(testCase: Record<string, unknown>): Record<string, unknown> {\n if (!Object.hasOwn(testCase, 'input')) {\n return testCase;\n }\n const { input, input_files: _inputFiles, ...caseWithoutInput } = testCase;\n return {\n ...caseWithoutInput,\n vars: {\n ...(isRecord(testCase.vars) ? testCase.vars : {}),\n input,\n },\n };\n}\n\nfunction serializeGraderDefinition(\n definition: Record<string, unknown>,\n rewrites: ReadonlyMap<string, string>,\n): unknown {\n const serialized = rewritePathsDeep(toSnakeCaseDeep(definition), rewrites);\n if (!isRecord(serialized)) {\n return serialized;\n }\n const { name, metric, ...rest } = serialized;\n return typeof name === 'string' && metric === undefined ? { metric: name, ...rest } : serialized;\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 moveInputToVars({\n ...withoutLegacyAssertionKeys(testCase),\n assert: graderDefinitions.map((grader) =>\n serializeGraderDefinition(grader.definition, rewrites),\n ),\n });\n }\n return moveInputToVars(testCase);\n}\n\nfunction targetReferenceNames(target: TargetDefinition): readonly string[] {\n const references: string[] = [];\n for (const key of ['use_target', 'grader_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(\n copied: readonly CopiedReference[],\n bucket: 'files' | 'graders' | 'workspaces' | 'scripts',\n): boolean {\n return copied.some((entry) => entry.localPath.startsWith(`${bucket}/`));\n}\n\nfunction bundledEvalFileName(evalFilePath: string): string {\n const basename = path.basename(evalFilePath);\n const withoutKnownExtension = basename\n .replace(/\\.eval\\.[cm]?ts$/i, '')\n .replace(/\\.eval\\.ya?ml$/i, '')\n .replace(/\\.[cm]?ts$/i, '')\n .replace(/\\.ya?ml$/i, '')\n .replace(/\\.jsonl?$/i, '');\n const safeName = withoutKnownExtension\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return `${safeName || 'bundle'}.eval.yaml`;\n}\n\nfunction uniqueTargetDefinitions(\n selections: readonly TaskBundleTargetSelection[],\n): readonly TargetDefinition[] {\n const selected: TargetDefinition[] = [];\n const seen = new Set<string>();\n\n for (const selection of selections) {\n for (const definition of selectTargetDefinitions(selection.targetName, selection.definitions)) {\n if (seen.has(definition.name)) {\n continue;\n }\n seen.add(definition.name);\n selected.push(definition);\n }\n }\n\n return selected;\n}\n\nfunction serializeTargetDefinition(definition: TargetDefinition): Record<string, unknown> {\n const target: Record<string, unknown> = { id: definition.name };\n if (definition.id !== undefined) {\n target.id = definition.id;\n }\n const config: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(definition)) {\n if (\n value === undefined ||\n key === 'name' ||\n key === 'id' ||\n key === 'label' ||\n key === 'config'\n ) {\n continue;\n }\n if (AUTHORING_TOP_LEVEL_TARGET_FIELDS.has(key)) {\n target[key] = value;\n } else {\n config[key] = value;\n }\n }\n\n if (isRecord(definition.config)) {\n for (const [key, value] of Object.entries(definition.config)) {\n if (value !== undefined) {\n config[key] = value;\n }\n }\n }\n if (Object.keys(config).length > 0) {\n target.config = config;\n }\n\n return target;\n}\n\nfunction serializeTargetDefinitions(\n definitions: readonly TargetDefinition[],\n): readonly Record<string, unknown>[] {\n return definitions.map((definition) => serializeTargetDefinition(definition));\n}\n\nfunction uniqueTargetNames(selections: readonly TaskBundleTargetSelection[]): readonly string[] {\n const names: string[] = [];\n const seen = new Set<string>();\n for (const selection of selections) {\n if (seen.has(selection.targetName)) {\n continue;\n }\n seen.add(selection.targetName);\n names.push(selection.targetName);\n }\n return names;\n}\n\nfunction rewritePathString(value: string, rewrites: ReadonlyMap<string, string>): string {\n const direct = rewrites.get(value);\n if (direct) {\n return direct.startsWith('file://') ? direct.slice('file://'.length) : direct;\n }\n const fileUrl = rewrites.get(`file://${value}`);\n if (fileUrl) {\n return fileUrl.startsWith('file://') ? fileUrl.slice('file://'.length) : fileUrl;\n }\n return value;\n}\n\nfunction serializeContentValue(value: unknown, rewrites: ReadonlyMap<string, string>): unknown {\n if (typeof value === 'string') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => serializeContentItem(item, rewrites));\n }\n\n if (isRecord(value)) {\n return rewritePathsDeep(value, rewrites);\n }\n\n return value;\n}\n\nfunction serializeContentItem(value: unknown, rewrites: ReadonlyMap<string, string>): unknown {\n if (typeof value === 'string') {\n return value;\n }\n if (!isRecord(value)) {\n return value;\n }\n\n const type = value.type;\n if (type === 'text') {\n const text = typeof value.value === 'string' ? value.value : value.text;\n return { type: 'text', value: typeof text === 'string' ? text : '' };\n }\n\n if (type === 'file') {\n const source =\n typeof value.value === 'string'\n ? value.value\n : typeof value.path === 'string'\n ? value.path\n : typeof value.resolvedPath === 'string'\n ? value.resolvedPath\n : undefined;\n return source\n ? { type: 'file', value: rewritePathString(source, rewrites) }\n : { type: 'file', value: '' };\n }\n\n if (type === 'image') {\n const source =\n typeof value.value === 'string'\n ? value.value\n : typeof value.path === 'string'\n ? value.path\n : typeof value.resolvedPath === 'string'\n ? value.resolvedPath\n : undefined;\n if (source) {\n return { type: 'image', value: rewritePathString(source, rewrites) };\n }\n }\n\n return rewritePathsDeep(value, rewrites);\n}\n\nfunction serializeMessage(\n message: TestMessage,\n rewrites: ReadonlyMap<string, string>,\n): Record<string, unknown> {\n return {\n role: message.role,\n content: serializeContentValue(message.content, rewrites),\n };\n}\n\nfunction serializeExpectedMessage(\n message: JsonObject,\n rewrites: ReadonlyMap<string, string>,\n): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(message)) {\n serialized[key] = key === 'content' ? serializeContentValue(value, rewrites) : value;\n }\n return rewritePathsDeep(serialized, rewrites) as Record<string, unknown>;\n}\n\nfunction serializeWorkspace(\n workspace: WorkspaceConfig,\n rewrites: ReadonlyMap<string, string>,\n): Record<string, unknown> {\n const { workspaceFileDir: _workspaceFileDir, ...portableWorkspace } = workspace;\n return rewritePathsDeep(portableWorkspace, rewrites) as Record<string, unknown>;\n}\n\nfunction buildPortableEvalCase(\n test: EvalTest,\n rewrites: ReadonlyMap<string, string>,\n): Record<string, unknown> {\n const testCase = buildEvalCase(test, rewrites);\n testCase.id = test.id;\n testCase.vars = {\n ...(isRecord(testCase.vars) ? testCase.vars : {}),\n input: test.input.map((message) => serializeMessage(message, rewrites)),\n };\n\n if (test.criteria.trim().length > 0) {\n testCase.criteria = test.criteria;\n }\n if (test.expected_output.length > 0) {\n testCase.expected_output = test.expected_output.map((message) =>\n serializeExpectedMessage(message, rewrites),\n );\n }\n if (test.workspace) {\n testCase.workspace = serializeWorkspace(test.workspace, rewrites);\n }\n if (test.metadata && Object.keys(test.metadata).length > 0) {\n testCase.metadata = rewritePathsDeep(test.metadata, rewrites);\n }\n if (test.run && Object.keys(test.run).length > 0) {\n testCase.run = rewritePathsDeep(test.run, rewrites);\n }\n if (test.conversation_id) {\n testCase.conversation_id = test.conversation_id;\n }\n if (test.threshold !== undefined) {\n const existingExecution = isRecord(testCase.execution) ? testCase.execution : {};\n testCase.execution = { ...existingExecution, threshold: test.threshold };\n }\n if (test.mode) {\n testCase.mode = test.mode;\n }\n if (test.turns && test.turns.length > 0) {\n testCase.turns = rewritePathsDeep(test.turns, rewrites);\n }\n if (test.aggregation) {\n testCase.aggregation = test.aggregation;\n }\n if (test.on_turn_failure) {\n testCase.on_turn_failure = test.on_turn_failure;\n }\n if (test.window_size !== undefined) {\n testCase.window_size = test.window_size;\n }\n if (test.depends_on && test.depends_on.length > 0) {\n testCase.depends_on = test.depends_on;\n }\n if (test.on_dependency_failure) {\n testCase.on_dependency_failure = test.on_dependency_failure;\n }\n\n return testCase;\n}\n\nfunction isLikelyCommandPath(value: string): boolean {\n if (value.trim().length === 0 || value.startsWith('-') || value.includes('${{')) {\n return false;\n }\n return (\n value.startsWith('.') ||\n value.includes('/') ||\n value.includes('\\\\') ||\n path.extname(value).length > 0\n );\n}\n\nasync function maybeWorkspaceHookCommandReference(options: {\n readonly arg: string;\n readonly baseDir: string;\n readonly testId: string;\n readonly hookName: string;\n}): Promise<BundleSourceReference | undefined> {\n if (!isLikelyCommandPath(options.arg)) {\n return undefined;\n }\n const resolvedPath = path.isAbsolute(options.arg)\n ? path.resolve(options.arg)\n : path.resolve(options.baseDir, options.arg);\n const sourceStat = await stat(resolvedPath).catch(() => undefined);\n if (!sourceStat?.isFile()) {\n return undefined;\n }\n return {\n kind: 'workspace_hook_command',\n displayPath: options.arg,\n resolvedPath,\n location: `workspace.hooks.${options.hookName}.command for test \"${options.testId}\"`,\n };\n}\n\nasync function collectWorkspaceReferences(\n tests: readonly EvalTest[],\n evalFileDir: string,\n): Promise<{\n readonly references: readonly BundleSourceReference[];\n readonly errors: readonly string[];\n}> {\n const references: BundleSourceReference[] = [];\n const errors: string[] = [];\n\n for (const test of tests) {\n const workspace = test.workspace;\n if (!workspace) {\n continue;\n }\n\n if (workspace.template) {\n references.push({\n kind: 'workspace_template',\n displayPath: workspace.template,\n resolvedPath: workspace.template,\n location: `workspace.template for test \"${test.id}\"`,\n });\n }\n\n const hooks = workspace.hooks;\n if (!hooks) {\n continue;\n }\n\n for (const hookName of ['before_all', 'before_each', 'after_each', 'after_all'] as const) {\n const hook = hooks[hookName];\n const command = hook?.command;\n if (!command || command.length === 0) {\n continue;\n }\n if (hook?.cwd) {\n errors.push(\n `workspace.hooks.${hookName}.cwd for test \"${test.id}\" cannot be bundled safely yet: ${hook.cwd}`,\n );\n continue;\n }\n\n const baseDir = workspace.workspaceFileDir ?? evalFileDir;\n for (const arg of command) {\n const reference = await maybeWorkspaceHookCommandReference({\n arg,\n baseDir,\n testId: test.id,\n hookName,\n });\n if (reference) {\n references.push(reference);\n }\n }\n }\n }\n\n return { references, errors };\n}\n\nfunction collectExpectedOutputReferences(\n tests: readonly EvalTest[],\n): readonly BundleSourceReference[] {\n const references: BundleSourceReference[] = [];\n for (const test of tests) {\n for (const message of test.expected_output) {\n const content = message.content;\n if (!Array.isArray(content)) {\n continue;\n }\n for (const segment of content) {\n if (!isRecord(segment) || segment.type !== 'file') {\n continue;\n }\n const resolvedPath =\n typeof segment.resolvedPath === 'string' ? path.resolve(segment.resolvedPath) : undefined;\n const displayPath =\n typeof segment.path === 'string'\n ? segment.path\n : typeof segment.value === 'string'\n ? segment.value\n : resolvedPath;\n if (!displayPath) {\n continue;\n }\n references.push({\n kind: 'expected_output_file',\n displayPath,\n ...(resolvedPath ? { resolvedPath } : {}),\n location: `expected_output file for test \"${test.id}\"`,\n });\n }\n }\n }\n return references;\n}\n\nfunction bundleManifest(options: {\n readonly outputDir: string;\n readonly evalFilePath: string;\n readonly evalPath: string;\n readonly targetsPath: string;\n readonly copiedReferences: readonly CopiedReference[];\n readonly tests: readonly EvalTest[];\n readonly targetNames: readonly string[];\n readonly createdAt: string;\n}): Record<string, unknown> {\n const relative = (filePath: string) =>\n path.relative(options.outputDir, filePath).split(path.sep).join('/');\n return {\n schema_version: 1,\n created_at: options.createdAt,\n source_eval: options.evalFilePath,\n eval_path: relative(options.evalPath),\n targets_path: relative(options.targetsPath),\n test_count: options.tests.length,\n targets: options.targetNames,\n ...(hasCopiedBucket(options.copiedReferences, 'files') ? { files_path: 'evals/files' } : {}),\n ...(hasCopiedBucket(options.copiedReferences, 'graders')\n ? { graders_path: 'evals/graders' }\n : {}),\n ...(hasCopiedBucket(options.copiedReferences, 'workspaces')\n ? { workspaces_path: 'evals/workspaces' }\n : {}),\n ...(hasCopiedBucket(options.copiedReferences, 'scripts')\n ? { scripts_path: 'evals/scripts' }\n : {}),\n };\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 testDir = path.join(options.outputDir, TEST_BUNDLE_DIRNAME);\n await mkdir(testDir, { recursive: true });\n\n const copiedReferences = await copyReferences(options.test.source.references, testDir, options);\n const rewrites = buildPathRewrites(copiedReferences);\n const evalCase = buildEvalCase(options.test, rewrites);\n const evalPath = path.join(testDir, TASK_EVAL_FILENAME);\n const targetsPath = path.join(testDir, TASK_TARGETS_FILENAME);\n\n await writeYamlFile(evalPath, {\n target: options.targetName,\n prompts: [INPUT_PROMPT],\n tests: [evalCase],\n });\n await writeYamlFile(targetsPath, { targets: serializeTargetDefinitions(targetDefinitions) });\n\n return {\n testDir,\n evalPath,\n targetsPath,\n ...(hasCopiedBucket(copiedReferences, 'files')\n ? { filesPath: path.join(testDir, TASK_FILES_DIRNAME) }\n : {}),\n ...(hasCopiedBucket(copiedReferences, 'graders')\n ? { gradersPath: path.join(testDir, TASK_GRADERS_DIRNAME) }\n : {}),\n };\n}\n\n/**\n * Materialize a whole eval suite as a portable directory.\n *\n * This reuses the same source snapshots, dependency copying, path rewriting,\n * target slicing, and secret redaction used by per-result test bundles. The\n * output eval is intentionally explicit: inherited suite defaults are written\n * onto each bundled test case so the bundle can run without the source tree.\n */\nexport async function materializeEvalBundle(\n options: MaterializeEvalBundleOptions,\n): Promise<MaterializedEvalBundlePaths> {\n if (options.tests.length === 0) {\n throw new Error('Cannot bundle eval with no runnable tests.');\n }\n if (options.targetSelections.length === 0) {\n throw new Error('Cannot bundle eval without a selected target.');\n }\n\n const missingSource = options.tests.find((test) => !test.source);\n if (missingSource) {\n throw new Error(\n `Cannot bundle test \"${missingSource.id}\" because it has no source metadata. YAML evals are supported; programmatic evals with inline functions are not portable yet.`,\n );\n }\n\n const outputDir = path.resolve(options.outputDir);\n const evalsDir = path.join(outputDir, BUNDLE_EVALS_DIRNAME);\n await mkdir(evalsDir, { recursive: true });\n\n const evalFileDir = path.dirname(path.resolve(options.evalFilePath));\n const workspaceReferences = await collectWorkspaceReferences(options.tests, evalFileDir);\n const references: BundleSourceReference[] = [\n ...options.tests.flatMap((test) => test.source?.references ?? []),\n ...collectExpectedOutputReferences(options.tests),\n ...workspaceReferences.references,\n ];\n\n const { copied, failures } = await copyReferencesStrict(references, evalsDir, options);\n const errors = [...workspaceReferences.errors, ...failures.map((failure) => failure.reason)];\n if (errors.length > 0) {\n throw new Error(`Cannot bundle eval:\\n${errors.map((error) => `- ${error}`).join('\\n')}`);\n }\n\n const rewrites = buildPathRewrites(copied);\n const targetNames = uniqueTargetNames(options.targetSelections);\n const evalPath = path.join(evalsDir, bundledEvalFileName(options.evalFilePath));\n const targetsPath = path.join(outputDir, BUNDLE_TARGETS_FILENAME);\n const manifestPath = path.join(outputDir, BUNDLE_MANIFEST_FILENAME);\n const runtime =\n options.runtime ?? (targetNames.length === 1 ? { target: targetNames[0] } : undefined);\n\n await writeYamlFile(evalPath, {\n ...(runtime ?? {}),\n prompts: [INPUT_PROMPT],\n tests: options.tests.map((test) => buildPortableEvalCase(test, rewrites)),\n });\n await writeYamlFile(targetsPath, {\n targets: serializeTargetDefinitions(uniqueTargetDefinitions(options.targetSelections)),\n });\n\n const manifest = bundleManifest({\n outputDir,\n evalFilePath: path.resolve(options.evalFilePath),\n evalPath,\n targetsPath,\n copiedReferences: copied,\n tests: options.tests,\n targetNames,\n createdAt: (options.now ?? (() => new Date()))().toISOString(),\n });\n await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n\n return {\n bundleDir: outputDir,\n evalsDir,\n evalPath,\n targetsPath,\n manifestPath,\n ...(hasCopiedBucket(copied, 'files')\n ? { filesPath: path.join(evalsDir, TASK_FILES_DIRNAME) }\n : {}),\n ...(hasCopiedBucket(copied, 'graders')\n ? { gradersPath: path.join(evalsDir, TASK_GRADERS_DIRNAME) }\n : {}),\n ...(hasCopiedBucket(copied, 'workspaces')\n ? { workspacesPath: path.join(evalsDir, BUNDLE_WORKSPACES_DIRNAME) }\n : {}),\n ...(hasCopiedBucket(copied, 'scripts')\n ? { scriptsPath: path.join(evalsDir, BUNDLE_SCRIPTS_DIRNAME) }\n : {}),\n };\n}\n"],"mappings":"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","names":["path","path","buildIndexArtifactEntry","buildResultIndexArtifact","writePerTestArtifacts","writeArtifactsFromResults"]}