agentv 5.0.0-next.1 → 5.2.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 +239 -53
  2. package/dist/{agentv-provider-AYXH7WLW-NJRC6UQX.js → agentv-provider-AYXH7WLW-6YZKZ7PS.js} +2 -2
  3. package/dist/{artifact-writer-QD52FC56.js → artifact-writer-SN6UNL5G.js} +15 -8
  4. package/dist/{chunk-GZJMODLW.js → chunk-3S6A2RKR.js} +45880 -30542
  5. package/dist/chunk-3S6A2RKR.js.map +1 -0
  6. package/dist/{chunk-6Q56CEXV.js → chunk-3X357HS4.js} +7900 -8985
  7. package/dist/chunk-3X357HS4.js.map +1 -0
  8. package/dist/{chunk-6JVM4GJI.js → chunk-46K2OET3.js} +187 -80
  9. package/dist/chunk-46K2OET3.js.map +1 -0
  10. package/dist/{chunk-IJEZFZJR.js → chunk-7BGERE6L.js} +2 -2
  11. package/dist/chunk-7BGERE6L.js.map +1 -0
  12. package/dist/{chunk-UG4JHZYM.js → chunk-ALVZQUZP.js} +670 -1427
  13. package/dist/chunk-ALVZQUZP.js.map +1 -0
  14. package/dist/{chunk-RCIEHFQ2.js → chunk-PEUTJS7B.js} +3 -3
  15. package/dist/{chunk-5H446C7X.js → chunk-QMRVH5ZP.js} +2 -8
  16. package/dist/{chunk-IBI7A5RP.js → chunk-T4AD3H3Y.js} +3444 -2251
  17. package/dist/chunk-T4AD3H3Y.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-D5_8DE_B.js → index-DNgf3qJ2.js} +1 -1
  21. package/dist/dashboard/assets/index-D_bokML8.css +1 -0
  22. package/dist/dashboard/assets/index-r_jSJmlw.js +121 -0
  23. package/dist/dashboard/index.html +2 -2
  24. package/dist/{dist-KJ6PELQY.js → dist-DEPJOMCA.js} +74 -60
  25. package/dist/{docker-workspace-ZJ2ESVBI-6UDETQII.js → docker-workspace-NNK4Z6FR-QRTIG6TM.js} +3 -3
  26. package/dist/{exec-MYPAJJP7-C5HD5WG5.js → exec-4HFFRQ3B-AXDMJNLJ.js} +3 -3
  27. package/dist/index.js +8 -9
  28. package/dist/{interactive-2WMVAASS.js → interactive-36ZNMQB2.js} +13 -29
  29. package/dist/interactive-36ZNMQB2.js.map +1 -0
  30. package/dist/skills/agentv-bench/SKILL.md +38 -34
  31. package/dist/skills/agentv-bench/agents/analyzer.md +6 -6
  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 +3 -3
  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 +51 -30
  38. package/dist/skills/agentv-bench/references/migrating-from-skill-creator.md +4 -4
  39. package/dist/skills/agentv-bench/references/subagent-pipeline.md +13 -12
  40. package/dist/skills/agentv-eval-migrations/SKILL.md +33 -0
  41. package/dist/skills/agentv-eval-migrations/references/breaking-changes.md +1012 -0
  42. package/dist/skills/agentv-eval-review/SKILL.md +6 -3
  43. package/dist/skills/agentv-eval-review/scripts/lint_eval.py +1 -1
  44. package/dist/skills/agentv-eval-writer/SKILL.md +380 -246
  45. package/dist/skills/agentv-eval-writer/references/{config-schema.json → config.schema.json} +6 -5
  46. package/dist/skills/agentv-eval-writer/references/custom-evaluators.md +23 -18
  47. package/dist/skills/agentv-eval-writer/references/eval.schema.json +9852 -0
  48. package/dist/skills/agentv-eval-writer/references/python-helpers.md +8 -8
  49. package/dist/skills/agentv-eval-writer/references/rubric-evaluator.md +21 -22
  50. package/dist/skills/agentv-trace-analyst/SKILL.md +4 -4
  51. package/dist/templates/.agentv/targets.yaml +41 -40
  52. package/dist/{ts-eval-loader-RE43OAGX-AMRCUKBZ.js → ts-eval-loader-OMG2JBHP-OP5RR7A3.js} +5 -4
  53. package/package.json +19 -4
  54. package/dist/chunk-6JVM4GJI.js.map +0 -1
  55. package/dist/chunk-6Q56CEXV.js.map +0 -1
  56. package/dist/chunk-76FOHROU.js +0 -96
  57. package/dist/chunk-76FOHROU.js.map +0 -1
  58. package/dist/chunk-GZJMODLW.js.map +0 -1
  59. package/dist/chunk-HSHTTN6C.js +0 -565
  60. package/dist/chunk-HSHTTN6C.js.map +0 -1
  61. package/dist/chunk-IBI7A5RP.js.map +0 -1
  62. package/dist/chunk-IJEZFZJR.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-R3CXYNTN.js +0 -1238
  66. package/dist/chunk-R3CXYNTN.js.map +0 -1
  67. package/dist/chunk-UG4JHZYM.js.map +0 -1
  68. package/dist/chunk-VQ2ZO7XJ.js +0 -2098
  69. package/dist/chunk-VQ2ZO7XJ.js.map +0 -1
  70. package/dist/chunk-XALGXSKB.js +0 -21
  71. package/dist/chunk-XALGXSKB.js.map +0 -1
  72. package/dist/dashboard/assets/index-BVMrdN8a.js +0 -119
  73. package/dist/dashboard/assets/index-DZWXfWsv.css +0 -1
  74. package/dist/esm-NNMQYIKT.js +0 -32
  75. package/dist/esm-R77SNOF5.js +0 -65
  76. package/dist/esm-RVQPUGWH.js +0 -1207
  77. package/dist/esm-RVQPUGWH.js.map +0 -1
  78. package/dist/esm-TTEMJEVV.js +0 -933
  79. package/dist/esm-TTEMJEVV.js.map +0 -1
  80. package/dist/esm-ZADQ4XQH-QUFGGZL4.js +0 -924
  81. package/dist/esm-ZADQ4XQH-QUFGGZL4.js.map +0 -1
  82. package/dist/exec-MYPAJJP7-C5HD5WG5.js.map +0 -1
  83. package/dist/getMachineId-bsd-HSK5LZMG.js +0 -41
  84. package/dist/getMachineId-bsd-HSK5LZMG.js.map +0 -1
  85. package/dist/getMachineId-darwin-4DP6CCJV.js +0 -41
  86. package/dist/getMachineId-darwin-4DP6CCJV.js.map +0 -1
  87. package/dist/getMachineId-linux-44LJ5UJB.js +0 -33
  88. package/dist/getMachineId-linux-44LJ5UJB.js.map +0 -1
  89. package/dist/getMachineId-unsupported-NVK6IATM.js +0 -24
  90. package/dist/getMachineId-unsupported-NVK6IATM.js.map +0 -1
  91. package/dist/getMachineId-win-YZ36S7VA.js +0 -43
  92. package/dist/getMachineId-win-YZ36S7VA.js.map +0 -1
  93. package/dist/interactive-2WMVAASS.js.map +0 -1
  94. package/dist/otlp-json-file-exporter-RY63S3IG-PZBQPVYY.js +0 -9
  95. package/dist/otlp-json-file-exporter-RY63S3IG-PZBQPVYY.js.map +0 -1
  96. package/dist/skills/agentv-eval-writer/references/eval-schema.json +0 -17295
  97. package/dist/skills/agentv-eval-writer/references/experiment-schema.json +0 -278
  98. package/dist/src-76ISS3LH.js +0 -1733
  99. package/dist/src-76ISS3LH.js.map +0 -1
  100. package/dist/ts-eval-loader-RE43OAGX-AMRCUKBZ.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-QD52FC56.js.map → artifact-writer-SN6UNL5G.js.map} +0 -0
  103. /package/dist/{chunk-RCIEHFQ2.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-KJ6PELQY.js.map → dist-DEPJOMCA.js.map} +0 -0
  106. /package/dist/{docker-workspace-ZJ2ESVBI-6UDETQII.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-OMG2JBHP-OP5RR7A3.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-GZJMODLW.js";
9
+ } from "./chunk-3S6A2RKR.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
  }
@@ -107,7 +103,10 @@ function referenceBucket(reference) {
107
103
  if (reference.kind === "workspace_template") {
108
104
  return BUNDLE_WORKSPACES_DIRNAME;
109
105
  }
110
- if (reference.kind === "workspace_hook_command") {
106
+ if (reference.kind === "environment_workdir") {
107
+ return BUNDLE_WORKSPACES_DIRNAME;
108
+ }
109
+ if (reference.kind === "workspace_hook_command" || reference.kind === "environment_setup_command") {
111
110
  return BUNDLE_SCRIPTS_DIRNAME;
112
111
  }
113
112
  return TASK_GRADERS_DIRNAME;
@@ -204,7 +203,7 @@ async function copyDirectory(sourcePath, destinationPath) {
204
203
  return copiedAny;
205
204
  }
206
205
  function shouldCopyDirectory(reference) {
207
- if (reference.kind !== "code_grader_cwd") {
206
+ if (reference.kind !== "script_grader_cwd" && reference.kind !== "code_grader_cwd") {
208
207
  return true;
209
208
  }
210
209
  return !path.isAbsolute(reference.displayPath);
@@ -366,25 +365,46 @@ function parseSourceTestCase(test) {
366
365
  }
367
366
  function withoutLegacyAssertionKeys(testCase) {
368
367
  return Object.fromEntries(
369
- Object.entries(testCase).filter(([key]) => key !== "assert" && key !== "evaluators")
368
+ Object.entries(testCase).filter(([key]) => key !== "assert" && key !== "assertions")
370
369
  );
371
370
  }
371
+ function moveInputToVars(testCase) {
372
+ if (!Object.hasOwn(testCase, "input")) {
373
+ return testCase;
374
+ }
375
+ const { input, input_files: _inputFiles, ...caseWithoutInput } = testCase;
376
+ return {
377
+ ...caseWithoutInput,
378
+ vars: {
379
+ ...isRecord(testCase.vars) ? testCase.vars : {},
380
+ input
381
+ }
382
+ };
383
+ }
384
+ function serializeGraderDefinition(definition, rewrites) {
385
+ const serialized = rewritePathsDeep(toSnakeCaseDeep(definition), rewrites);
386
+ if (!isRecord(serialized)) {
387
+ return serialized;
388
+ }
389
+ const { name, metric, ...rest } = serialized;
390
+ return typeof name === "string" && metric === void 0 ? { metric: name, ...rest } : serialized;
391
+ }
372
392
  function buildEvalCase(test, rewrites) {
373
393
  const testCase = rewritePathsDeep(parseSourceTestCase(test), rewrites);
374
394
  const graderDefinitions = test.source?.graderDefinitions ?? [];
375
395
  if (graderDefinitions.length > 0) {
376
- return {
396
+ return moveInputToVars({
377
397
  ...withoutLegacyAssertionKeys(testCase),
378
- assertions: graderDefinitions.map(
379
- (grader) => rewritePathsDeep(toSnakeCaseDeep(grader.definition), rewrites)
398
+ assert: graderDefinitions.map(
399
+ (grader) => serializeGraderDefinition(grader.definition, rewrites)
380
400
  )
381
- };
401
+ });
382
402
  }
383
- return testCase;
403
+ return moveInputToVars(testCase);
384
404
  }
385
405
  function targetReferenceNames(target) {
386
406
  const references = [];
387
- for (const key of ["use_target", "grader_target", "judge_target"]) {
407
+ for (const key of ["use_target", "grader_target"]) {
388
408
  const value = target[key];
389
409
  if (typeof value === "string" && value.trim().length > 0 && !value.includes("${{")) {
390
410
  references.push(value.trim());
@@ -451,6 +471,37 @@ function uniqueTargetDefinitions(selections) {
451
471
  }
452
472
  return selected;
453
473
  }
474
+ function serializeTargetDefinition(definition) {
475
+ const target = { id: definition.name };
476
+ if (definition.id !== void 0) {
477
+ target.id = definition.id;
478
+ }
479
+ const config = {};
480
+ for (const [key, value] of Object.entries(definition)) {
481
+ if (value === void 0 || key === "name" || key === "id" || key === "label" || key === "config") {
482
+ continue;
483
+ }
484
+ if (AUTHORING_TOP_LEVEL_TARGET_FIELDS.has(key)) {
485
+ target[key] = value;
486
+ } else {
487
+ config[key] = value;
488
+ }
489
+ }
490
+ if (isRecord(definition.config)) {
491
+ for (const [key, value] of Object.entries(definition.config)) {
492
+ if (value !== void 0) {
493
+ config[key] = value;
494
+ }
495
+ }
496
+ }
497
+ if (Object.keys(config).length > 0) {
498
+ target.config = config;
499
+ }
500
+ return target;
501
+ }
502
+ function serializeTargetDefinitions(definitions) {
503
+ return definitions.map((definition) => serializeTargetDefinition(definition));
504
+ }
454
505
  function uniqueTargetNames(selections) {
455
506
  const names = [];
456
507
  const seen = /* @__PURE__ */ new Set();
@@ -524,19 +575,27 @@ function serializeExpectedMessage(message, rewrites) {
524
575
  return rewritePathsDeep(serialized, rewrites);
525
576
  }
526
577
  function serializeWorkspace(workspace, rewrites) {
578
+ const { workspaceFileDir: _workspaceFileDir, ...portableWorkspace } = workspace;
579
+ return rewritePathsDeep(portableWorkspace, rewrites);
580
+ }
581
+ function serializeEnvironment(environment, rewrites) {
527
582
  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);
583
+ authoredReference: _authoredReference,
584
+ recipeFilePath: _recipeFilePath,
585
+ recipeFileSha256: _recipeFileSha256,
586
+ recipeSha256: _recipeSha256,
587
+ sourceDir: _sourceDir,
588
+ ...portableEnvironment
589
+ } = environment;
590
+ return rewritePathsDeep(portableEnvironment, rewrites);
535
591
  }
536
592
  function buildPortableEvalCase(test, rewrites) {
537
593
  const testCase = buildEvalCase(test, rewrites);
538
594
  testCase.id = test.id;
539
- testCase.input = test.input.map((message) => serializeMessage(message, rewrites));
595
+ testCase.vars = {
596
+ ...isRecord(testCase.vars) ? testCase.vars : {},
597
+ input: test.input.map((message) => serializeMessage(message, rewrites))
598
+ };
540
599
  if (test.criteria.trim().length > 0) {
541
600
  testCase.criteria = test.criteria;
542
601
  }
@@ -548,16 +607,18 @@ function buildPortableEvalCase(test, rewrites) {
548
607
  if (test.workspace) {
549
608
  testCase.workspace = serializeWorkspace(test.workspace, rewrites);
550
609
  }
610
+ if (test.environment) {
611
+ testCase.environment = serializeEnvironment(test.environment, rewrites);
612
+ }
551
613
  if (test.metadata && Object.keys(test.metadata).length > 0) {
552
614
  testCase.metadata = rewritePathsDeep(test.metadata, rewrites);
553
615
  }
616
+ if (test.run && Object.keys(test.run).length > 0) {
617
+ testCase.run = rewritePathsDeep(test.run, rewrites);
618
+ }
554
619
  if (test.conversation_id) {
555
620
  testCase.conversation_id = test.conversation_id;
556
621
  }
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
622
  if (test.threshold !== void 0) {
562
623
  const existingExecution = isRecord(testCase.execution) ? testCase.execution : {};
563
624
  testCase.execution = { ...existingExecution, threshold: test.threshold };
@@ -607,6 +668,48 @@ async function maybeWorkspaceHookCommandReference(options) {
607
668
  location: `workspace.hooks.${options.hookName}.command for test "${options.testId}"`
608
669
  };
609
670
  }
671
+ function environmentBaseDir(environment, evalFileDir) {
672
+ return environment.recipeFilePath ? path.dirname(environment.recipeFilePath) : evalFileDir;
673
+ }
674
+ async function collectEnvironmentReferences(tests, evalFileDir) {
675
+ const references = [];
676
+ for (const test of tests) {
677
+ const environment = test.environment;
678
+ if (!environment) {
679
+ continue;
680
+ }
681
+ if (environment.type === "host") {
682
+ references.push({
683
+ kind: "environment_workdir",
684
+ displayPath: environment.workdir,
685
+ resolvedPath: environment.workdir,
686
+ location: `environment.workdir for test "${test.id}"`
687
+ });
688
+ }
689
+ const command = environment.setup?.command;
690
+ if (!command) {
691
+ continue;
692
+ }
693
+ const baseDir = environmentBaseDir(environment, evalFileDir);
694
+ const commandArgs = Array.isArray(command) ? command : [command];
695
+ for (const arg of commandArgs) {
696
+ const reference = await maybeWorkspaceHookCommandReference({
697
+ arg,
698
+ baseDir,
699
+ testId: test.id,
700
+ hookName: "setup"
701
+ });
702
+ if (reference) {
703
+ references.push({
704
+ ...reference,
705
+ kind: "environment_setup_command",
706
+ location: `environment.setup.command for test "${test.id}"`
707
+ });
708
+ }
709
+ }
710
+ }
711
+ return references;
712
+ }
610
713
  async function collectWorkspaceReferences(tests, evalFileDir) {
611
714
  const references = [];
612
715
  const errors = [];
@@ -615,11 +718,6 @@ async function collectWorkspaceReferences(tests, evalFileDir) {
615
718
  if (!workspace) {
616
719
  continue;
617
720
  }
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
721
  if (workspace.template) {
624
722
  references.push({
625
723
  kind: "workspace_template",
@@ -634,7 +732,7 @@ async function collectWorkspaceReferences(tests, evalFileDir) {
634
732
  }
635
733
  for (const hookName of ["before_all", "before_each", "after_each", "after_all"]) {
636
734
  const hook = hooks[hookName];
637
- const command = hook?.command ?? hook?.script;
735
+ const command = hook?.command;
638
736
  if (!command || command.length === 0) {
639
737
  continue;
640
738
  }
@@ -712,24 +810,25 @@ async function materializeTaskBundle(options) {
712
810
  if (targetDefinitions.length === 0) {
713
811
  return void 0;
714
812
  }
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);
813
+ const testDir = path.join(options.outputDir, TEST_BUNDLE_DIRNAME);
814
+ await mkdir(testDir, { recursive: true });
815
+ const copiedReferences = await copyReferences(options.test.source.references, testDir, options);
718
816
  const rewrites = buildPathRewrites(copiedReferences);
719
817
  const evalCase = buildEvalCase(options.test, rewrites);
720
- const evalPath = path.join(taskDir, TASK_EVAL_FILENAME);
721
- const targetsPath = path.join(taskDir, TASK_TARGETS_FILENAME);
818
+ const evalPath = path.join(testDir, TASK_EVAL_FILENAME);
819
+ const targetsPath = path.join(testDir, TASK_TARGETS_FILENAME);
722
820
  await writeYamlFile(evalPath, {
723
- execution: { target: options.targetName },
821
+ target: options.targetName,
822
+ prompts: [INPUT_PROMPT],
724
823
  tests: [evalCase]
725
824
  });
726
- await writeYamlFile(targetsPath, { targets: targetDefinitions });
825
+ await writeYamlFile(targetsPath, { targets: serializeTargetDefinitions(targetDefinitions) });
727
826
  return {
728
- taskDir,
827
+ testDir,
729
828
  evalPath,
730
829
  targetsPath,
731
- ...hasCopiedBucket(copiedReferences, "files") ? { filesPath: path.join(taskDir, TASK_FILES_DIRNAME) } : {},
732
- ...hasCopiedBucket(copiedReferences, "graders") ? { gradersPath: path.join(taskDir, TASK_GRADERS_DIRNAME) } : {}
830
+ ...hasCopiedBucket(copiedReferences, "files") ? { filesPath: path.join(testDir, TASK_FILES_DIRNAME) } : {},
831
+ ...hasCopiedBucket(copiedReferences, "graders") ? { gradersPath: path.join(testDir, TASK_GRADERS_DIRNAME) } : {}
733
832
  };
734
833
  }
735
834
  async function materializeEvalBundle(options) {
@@ -750,9 +849,11 @@ async function materializeEvalBundle(options) {
750
849
  await mkdir(evalsDir, { recursive: true });
751
850
  const evalFileDir = path.dirname(path.resolve(options.evalFilePath));
752
851
  const workspaceReferences = await collectWorkspaceReferences(options.tests, evalFileDir);
852
+ const environmentReferences = await collectEnvironmentReferences(options.tests, evalFileDir);
753
853
  const references = [
754
854
  ...options.tests.flatMap((test) => test.source?.references ?? []),
755
855
  ...collectExpectedOutputReferences(options.tests),
856
+ ...environmentReferences,
756
857
  ...workspaceReferences.references
757
858
  ];
758
859
  const { copied, failures } = await copyReferencesStrict(references, evalsDir, options);
@@ -766,13 +867,14 @@ ${errors.map((error) => `- ${error}`).join("\n")}`);
766
867
  const evalPath = path.join(evalsDir, bundledEvalFileName(options.evalFilePath));
767
868
  const targetsPath = path.join(outputDir, BUNDLE_TARGETS_FILENAME);
768
869
  const manifestPath = path.join(outputDir, BUNDLE_MANIFEST_FILENAME);
769
- const execution = options.execution ?? (targetNames.length === 1 ? { target: targetNames[0] } : { targets: targetNames });
870
+ const runtime = options.runtime ?? (targetNames.length === 1 ? { target: targetNames[0] } : void 0);
770
871
  await writeYamlFile(evalPath, {
771
- execution,
872
+ ...runtime ?? {},
873
+ prompts: [INPUT_PROMPT],
772
874
  tests: options.tests.map((test) => buildPortableEvalCase(test, rewrites))
773
875
  });
774
876
  await writeYamlFile(targetsPath, {
775
- targets: uniqueTargetDefinitions(options.targetSelections)
877
+ targets: serializeTargetDefinitions(uniqueTargetDefinitions(options.targetSelections))
776
878
  });
777
879
  const manifest = bundleManifest({
778
880
  outputDir,
@@ -808,7 +910,7 @@ function buildTaskBundleIndexFields(outputDir, taskBundle) {
808
910
  return {};
809
911
  }
810
912
  return {
811
- task_dir: toRelativeArtifactPath(outputDir, taskBundle.taskDir),
913
+ test_dir: toRelativeArtifactPath(outputDir, taskBundle.testDir),
812
914
  eval_path: toRelativeArtifactPath(outputDir, taskBundle.evalPath),
813
915
  targets_path: toRelativeArtifactPath(outputDir, taskBundle.targetsPath),
814
916
  ...taskBundle.filesPath ? { files_path: toRelativeArtifactPath(outputDir, taskBundle.filesPath) } : {},
@@ -822,13 +924,13 @@ function buildIndexArtifactEntry2(result, options) {
822
924
  });
823
925
  }
824
926
  function buildResultIndexArtifact2(result, taskBundle) {
825
- const artifactSubdir = (buildResultIndexArtifact(result).artifact_dir ?? "").trim();
927
+ const artifactSubdir = (buildResultIndexArtifact(result).result_dir ?? "").trim();
826
928
  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") } : {}
929
+ test_dir: path2.posix.join(artifactSubdir, "test"),
930
+ eval_path: path2.posix.join(artifactSubdir, "test", "EVAL.yaml"),
931
+ targets_path: path2.posix.join(artifactSubdir, "test", "targets.yaml"),
932
+ ...taskBundle.filesPath ? { files_path: path2.posix.join(artifactSubdir, "test", "files") } : {},
933
+ ...taskBundle.gradersPath ? { graders_path: path2.posix.join(artifactSubdir, "test", "graders") } : {}
832
934
  } : void 0;
833
935
  return buildResultIndexArtifact(result, extraIndexFields);
834
936
  }
@@ -886,10 +988,13 @@ function createTaskBundleArtifactsWriter(options) {
886
988
  async function writePerTestArtifacts2(results, outputDir, options) {
887
989
  await writePerTestArtifacts(results, outputDir, {
888
990
  experiment: options?.experiment,
991
+ resultGroup: options?.resultGroup,
889
992
  runId: options?.runId,
890
993
  duplicatePolicy: options?.duplicatePolicy,
891
994
  sourceTests: options?.sourceTests,
892
- additionalArtifacts: createTaskBundleArtifactsWriter(options)
995
+ additionalArtifacts: options?.additionalArtifacts ?? createTaskBundleArtifactsWriter(options),
996
+ runtimeSource: options?.runtimeSource,
997
+ tags: options?.tags
893
998
  });
894
999
  }
895
1000
  async function writeArtifactsFromResults2(results, outputDir, options) {
@@ -900,17 +1005,19 @@ async function writeArtifactsFromResults2(results, outputDir, options) {
900
1005
  plannedTestCount: options?.plannedTestCount,
901
1006
  runId: options?.runId,
902
1007
  duplicatePolicy: options?.duplicatePolicy,
1008
+ resultGroup: options?.resultGroup,
903
1009
  sourceTests: options?.sourceTests,
904
- additionalArtifacts: createTaskBundleArtifactsWriter(options)
1010
+ additionalArtifacts: options?.additionalArtifacts ?? createTaskBundleArtifactsWriter(options),
1011
+ runtimeSource: options?.runtimeSource,
1012
+ tags: options?.tags
905
1013
  });
906
1014
  }
907
1015
 
908
1016
  export {
909
- toSnakeCaseDeep,
910
1017
  materializeEvalBundle,
911
1018
  buildIndexArtifactEntry2 as buildIndexArtifactEntry,
912
1019
  buildResultIndexArtifact2 as buildResultIndexArtifact,
913
1020
  writePerTestArtifacts2 as writePerTestArtifacts,
914
1021
  writeArtifactsFromResults2 as writeArtifactsFromResults
915
1022
  };
916
- //# sourceMappingURL=chunk-6JVM4GJI.js.map
1023
+ //# sourceMappingURL=chunk-46K2OET3.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 EnvironmentSummaryWire,\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 EnvironmentSummaryWire,\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 EnvironmentRecipe,\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 | 'environment_workdir'\n | 'environment_setup_command'\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 === 'environment_workdir') {\n return BUNDLE_WORKSPACES_DIRNAME;\n }\n if (\n reference.kind === 'workspace_hook_command' ||\n reference.kind === 'environment_setup_command'\n ) {\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 serializeEnvironment(\n environment: EnvironmentRecipe,\n rewrites: ReadonlyMap<string, string>,\n): Record<string, unknown> {\n const {\n authoredReference: _authoredReference,\n recipeFilePath: _recipeFilePath,\n recipeFileSha256: _recipeFileSha256,\n recipeSha256: _recipeSha256,\n sourceDir: _sourceDir,\n ...portableEnvironment\n } = environment;\n return rewritePathsDeep(portableEnvironment, 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.environment) {\n testCase.environment = serializeEnvironment(test.environment, 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\nfunction environmentBaseDir(environment: EnvironmentRecipe, evalFileDir: string): string {\n return environment.recipeFilePath ? path.dirname(environment.recipeFilePath) : evalFileDir;\n}\n\nasync function collectEnvironmentReferences(\n tests: readonly EvalTest[],\n evalFileDir: string,\n): Promise<readonly BundleSourceReference[]> {\n const references: BundleSourceReference[] = [];\n\n for (const test of tests) {\n const environment = test.environment;\n if (!environment) {\n continue;\n }\n\n if (environment.type === 'host') {\n references.push({\n kind: 'environment_workdir',\n displayPath: environment.workdir,\n resolvedPath: environment.workdir,\n location: `environment.workdir for test \"${test.id}\"`,\n });\n }\n\n const command = environment.setup?.command;\n if (!command) {\n continue;\n }\n\n const baseDir = environmentBaseDir(environment, evalFileDir);\n const commandArgs = Array.isArray(command) ? command : [command];\n for (const arg of commandArgs) {\n const reference = await maybeWorkspaceHookCommandReference({\n arg,\n baseDir,\n testId: test.id,\n hookName: 'setup',\n });\n if (reference) {\n references.push({\n ...reference,\n kind: 'environment_setup_command',\n location: `environment.setup.command for test \"${test.id}\"`,\n });\n }\n }\n }\n\n return references;\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 environmentReferences = await collectEnvironmentReferences(options.tests, evalFileDir);\n const references: BundleSourceReference[] = [\n ...options.tests.flatMap((test) => test.source?.references ?? []),\n ...collectExpectedOutputReferences(options.tests),\n ...environmentReferences,\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"]}
@@ -1,6 +1,6 @@
1
1
  import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
2
 
3
- // ../../packages/core/dist/chunk-AJU6HAAW.js
3
+ // ../../packages/core/dist/chunk-F4TEFL4T.js
4
4
  function shellEscapePath(value) {
5
5
  if (process.platform === "win32") {
6
6
  return `"${value.replaceAll('"', '""')}"`;
@@ -107,4 +107,4 @@ export {
107
107
  execFileWithStdin,
108
108
  execShellWithStdin
109
109
  };
110
- //# sourceMappingURL=chunk-IJEZFZJR.js.map
110
+ //# sourceMappingURL=chunk-7BGERE6L.js.map