agentv 4.22.0 → 4.24.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 (31) hide show
  1. package/dist/{artifact-writer-S7S6K3XA.js → artifact-writer-7CKE5ILM.js} +4 -4
  2. package/dist/{chunk-GMMIWIBF.js → chunk-AYXP3MTM.js} +12 -11
  3. package/dist/chunk-AYXP3MTM.js.map +1 -0
  4. package/dist/{chunk-762UZSGR.js → chunk-D5HCHBPT.js} +8 -9
  5. package/dist/chunk-D5HCHBPT.js.map +1 -0
  6. package/dist/{chunk-4YZDPAGZ.js → chunk-HL3MTSIW.js} +81 -32
  7. package/dist/chunk-HL3MTSIW.js.map +1 -0
  8. package/dist/{chunk-CM2AVQAM.js → chunk-KTHVVL7Q.js} +7 -5
  9. package/dist/chunk-KTHVVL7Q.js.map +1 -0
  10. package/dist/{chunk-5QF7PKZ4.js → chunk-TRA6SVUM.js} +37 -28
  11. package/dist/chunk-TRA6SVUM.js.map +1 -0
  12. package/dist/cli.js +5 -5
  13. package/dist/{dist-6LNJDZAI.js → dist-IA3D556U.js} +5 -3
  14. package/dist/index.js +5 -5
  15. package/dist/{interactive-7LC5WFP3.js → interactive-YXXNDPKI.js} +5 -5
  16. package/dist/studio/assets/index-DY-K3PKr.css +1 -0
  17. package/dist/studio/assets/{index-SZVrc1UE.js → index-DZpM1lzZ.js} +25 -25
  18. package/dist/studio/assets/{index-BVSHI8Eo.js → index-jBBmFdWd.js} +1 -1
  19. package/dist/studio/index.html +2 -2
  20. package/dist/{ts-eval-loader-PA4YFM5D-2DKQQQOZ.js → ts-eval-loader-SYQYQPMC-FKU23VX3.js} +2 -2
  21. package/package.json +1 -1
  22. package/dist/chunk-4YZDPAGZ.js.map +0 -1
  23. package/dist/chunk-5QF7PKZ4.js.map +0 -1
  24. package/dist/chunk-762UZSGR.js.map +0 -1
  25. package/dist/chunk-CM2AVQAM.js.map +0 -1
  26. package/dist/chunk-GMMIWIBF.js.map +0 -1
  27. package/dist/studio/assets/index-DcpbFwI5.css +0 -1
  28. /package/dist/{artifact-writer-S7S6K3XA.js.map → artifact-writer-7CKE5ILM.js.map} +0 -0
  29. /package/dist/{dist-6LNJDZAI.js.map → dist-IA3D556U.js.map} +0 -0
  30. /package/dist/{interactive-7LC5WFP3.js.map → interactive-YXXNDPKI.js.map} +0 -0
  31. /package/dist/{ts-eval-loader-PA4YFM5D-2DKQQQOZ.js.map → ts-eval-loader-SYQYQPMC-FKU23VX3.js.map} +0 -0
@@ -417,7 +417,8 @@ __export(external_exports2, {
417
417
  void: () => voidType
418
418
  });
419
419
 
420
- // ../../packages/core/dist/chunk-LKX4QW3G.js
420
+ // ../../packages/core/dist/chunk-4VLOUBFL.js
421
+ import { parse } from "yaml";
421
422
  import { constants } from "node:fs";
422
423
  import { access, readFile } from "node:fs/promises";
423
424
  import path from "node:path";
@@ -427,7 +428,6 @@ import path2 from "node:path";
427
428
  import { readFile as readFile2, readdir, stat } from "node:fs/promises";
428
429
  import path3 from "node:path";
429
430
  import fg from "fast-glob";
430
- import { parse as parseYaml } from "yaml";
431
431
  var CONTENT_TYPES = /* @__PURE__ */ new Set(["text", "image", "file"]);
432
432
  function isContent(value) {
433
433
  if (!value || typeof value !== "object") return false;
@@ -525,6 +525,10 @@ var GRADER_KIND_SET = new Set(GRADER_KIND_VALUES);
525
525
  function isGraderKind(value) {
526
526
  return typeof value === "string" && GRADER_KIND_SET.has(value);
527
527
  }
528
+ var PARSE_OPTIONS = { merge: true };
529
+ function parseYamlValue(content) {
530
+ return parse(content, PARSE_OPTIONS);
531
+ }
528
532
  async function fileExists(filePath) {
529
533
  try {
530
534
  await access(filePath, constants.F_OK);
@@ -2167,7 +2171,7 @@ function isGlobPattern(filePath) {
2167
2171
  return filePath.includes("*") || filePath.includes("?") || filePath.includes("{");
2168
2172
  }
2169
2173
  function parseYamlCases(content, filePath) {
2170
- const raw = parseYaml(content);
2174
+ const raw = parseYamlValue(content);
2171
2175
  const parsed = interpolateEnv(raw, process.env);
2172
2176
  if (!Array.isArray(parsed)) {
2173
2177
  throw new Error(
@@ -2286,7 +2290,7 @@ async function loadCasesFromDirectory(dirPath) {
2286
2290
  throw new Error(`Cannot read case file: ${caseFilePath}
2287
2291
  ${message}`);
2288
2292
  }
2289
- const raw = parseYaml(content);
2293
+ const raw = parseYamlValue(content);
2290
2294
  const parsed = interpolateEnv(raw, process.env);
2291
2295
  if (!isJsonObject(parsed)) {
2292
2296
  throw new Error(
@@ -8282,7 +8286,7 @@ var _a20;
8282
8286
  _a20 = symbol20;
8283
8287
  var defaultDownload2 = createDownload();
8284
8288
 
8285
- // ../../packages/core/dist/chunk-B3BLJRYI.js
8289
+ // ../../packages/core/dist/chunk-CUVG5O5P.js
8286
8290
  import path46 from "node:path";
8287
8291
  import { pathToFileURL as pathToFileURL2 } from "node:url";
8288
8292
  import { existsSync as existsSync6 } from "node:fs";
@@ -12972,7 +12976,7 @@ var openrouter = createOpenRouter({
12972
12976
  // strict for OpenRouter API
12973
12977
  });
12974
12978
 
12975
- // ../../packages/core/dist/chunk-B3BLJRYI.js
12979
+ // ../../packages/core/dist/chunk-CUVG5O5P.js
12976
12980
  import { spawn } from "node:child_process";
12977
12981
  import { randomUUID } from "node:crypto";
12978
12982
  import { createWriteStream } from "node:fs";
@@ -14476,7 +14480,7 @@ var RequestError = class _RequestError extends Error {
14476
14480
  }
14477
14481
  };
14478
14482
 
14479
- // ../../packages/core/dist/chunk-B3BLJRYI.js
14483
+ // ../../packages/core/dist/chunk-CUVG5O5P.js
14480
14484
  import { exec as execCallback } from "node:child_process";
14481
14485
  import { readdirSync, statSync } from "node:fs";
14482
14486
  import { readFile as readFile22, readdir as readdir2, stat as stat2 } from "node:fs/promises";
@@ -14493,7 +14497,6 @@ import path13 from "node:path";
14493
14497
  import { readFile as readFile32, readdir as readdir22, stat as stat22 } from "node:fs/promises";
14494
14498
  import { homedir as homedir32 } from "node:os";
14495
14499
  import path12 from "node:path";
14496
- import { parse as parseYaml2 } from "yaml";
14497
14500
  import { randomUUID as randomUUID6 } from "node:crypto";
14498
14501
  import { existsSync as existsSync22 } from "node:fs";
14499
14502
  import { mkdir as mkdir5 } from "node:fs/promises";
@@ -14538,7 +14541,6 @@ import path26 from "node:path";
14538
14541
  import { constants as constants32 } from "node:fs";
14539
14542
  import { access as access32, readFile as readFile7 } from "node:fs/promises";
14540
14543
  import path28 from "node:path";
14541
- import { parse } from "yaml";
14542
14544
  import path29 from "node:path";
14543
14545
  import fg2 from "fast-glob";
14544
14546
  import path30 from "node:path";
@@ -14563,24 +14565,20 @@ import path36 from "node:path";
14563
14565
  import { readFile as readFile15, stat as stat8 } from "node:fs/promises";
14564
14566
  import path43 from "node:path";
14565
14567
  import micromatch2 from "micromatch";
14566
- import { parse as parse4 } from "yaml";
14567
14568
  import { readFile as readFile9 } from "node:fs/promises";
14568
14569
  import path37 from "node:path";
14569
14570
  import { readFile as readFile10 } from "node:fs/promises";
14570
14571
  import path39 from "node:path";
14571
- import { parse as parse2 } from "yaml";
14572
14572
  import { constants as constants4 } from "node:fs";
14573
14573
  import { access as access4 } from "node:fs/promises";
14574
14574
  import path38 from "node:path";
14575
14575
  import { fileURLToPath as fileURLToPath4 } from "node:url";
14576
14576
  import { readFile as readFile12 } from "node:fs/promises";
14577
14577
  import path40 from "node:path";
14578
- import { parse as parse3 } from "yaml";
14579
14578
  import { readFile as readFile11 } from "node:fs/promises";
14580
14579
  import { readFile as readFile14 } from "node:fs/promises";
14581
14580
  import path422 from "node:path";
14582
14581
  import micromatch from "micromatch";
14583
- import { parse as parseYaml22 } from "yaml";
14584
14582
  import { readFile as readFile13 } from "node:fs/promises";
14585
14583
  import path41 from "node:path";
14586
14584
  var DEFAULT_THRESHOLD = 0.8;
@@ -22164,7 +22162,7 @@ async function discoverCopilotSessions(opts) {
22164
22162
  const eventsPath = path12.join(sessionDir, "events.jsonl");
22165
22163
  try {
22166
22164
  const workspaceContent = await readFile32(workspacePath, "utf8");
22167
- const workspace = parseYaml2(workspaceContent) ?? {};
22165
+ const workspace = parseYamlValue(workspaceContent) ?? {};
22168
22166
  const cwd = String(workspace.cwd ?? "");
22169
22167
  let updatedAt;
22170
22168
  try {
@@ -25686,7 +25684,7 @@ async function readTargetDefinitions(filePath) {
25686
25684
  throw new Error(`targets.yaml not found at ${absolutePath}`);
25687
25685
  }
25688
25686
  const raw = await readFile7(absolutePath, "utf8");
25689
- const parsed = parse(raw);
25687
+ const parsed = parseYamlValue(raw);
25690
25688
  if (!isRecord(parsed)) {
25691
25689
  throw new Error(`targets.yaml at ${absolutePath} must be a YAML object with a 'targets' field`);
25692
25690
  }
@@ -27269,7 +27267,7 @@ async function loadConfig(evalFilePath, repoRoot) {
27269
27267
  }
27270
27268
  try {
27271
27269
  const rawConfig = await readFile10(configPath, "utf8");
27272
- const parsed = interpolateEnv(parse2(rawConfig), process.env);
27270
+ const parsed = interpolateEnv(parseYamlValue(rawConfig), process.env);
27273
27271
  if (!isJsonObject(parsed)) {
27274
27272
  logWarning(`Invalid .agentv/config.yaml format at ${configPath}`);
27275
27273
  continue;
@@ -27808,7 +27806,7 @@ ${resolved.attempted.map((attempt) => ` Tried: ${attempt}`).join("\n")}` : "";
27808
27806
  throw new Error(`Assertion template cycle detected in '${evalId}': ${cycle}`);
27809
27807
  }
27810
27808
  const content = await readFile12(resolved.resolvedPath, "utf8");
27811
- const parsed = interpolateEnv(parse3(content), process.env);
27809
+ const parsed = interpolateEnv(parseYamlValue(content), process.env);
27812
27810
  if (!isJsonObject2(parsed)) {
27813
27811
  throw new Error(
27814
27812
  `Invalid assertion template file in '${evalId}': ${resolved.resolvedPath} (expected a YAML object with an assertions array)`
@@ -29828,7 +29826,7 @@ async function loadSidecarMetadata(jsonlPath, verbose) {
29828
29826
  }
29829
29827
  try {
29830
29828
  const content = await readFile14(sidecarPath, "utf8");
29831
- const parsed = interpolateEnv(parseYaml22(content), process.env);
29829
+ const parsed = interpolateEnv(parseYamlValue(content), process.env);
29832
29830
  if (!isJsonObject(parsed)) {
29833
29831
  logWarning4(`Invalid sidecar metadata format in ${sidecarPath}`);
29834
29832
  return {};
@@ -30008,7 +30006,7 @@ ${detailBlock}${ANSI_RESET7}`);
30008
30006
  }
30009
30007
  }
30010
30008
  var MetadataSchema = external_exports2.object({
30011
- name: external_exports2.string().min(1).max(64).regex(/^[a-z0-9-]+$/),
30009
+ name: external_exports2.string().min(1).max(64).regex(/^[a-z0-9-]+$/).optional(),
30012
30010
  description: external_exports2.string().min(1).max(1024).optional(),
30013
30011
  version: external_exports2.string().optional(),
30014
30012
  author: external_exports2.string().optional(),
@@ -30019,9 +30017,7 @@ var MetadataSchema = external_exports2.object({
30019
30017
  }).optional()
30020
30018
  });
30021
30019
  function parseMetadata(suite) {
30022
- const hasName = typeof suite.name === "string";
30023
- const hasDescription = typeof suite.description === "string";
30024
- if (!hasName) {
30020
+ if (typeof suite.name !== "string") {
30025
30021
  return void 0;
30026
30022
  }
30027
30023
  return MetadataSchema.parse({
@@ -30249,7 +30245,7 @@ async function readTestSuiteMetadata(testFilePath) {
30249
30245
  try {
30250
30246
  const absolutePath = path43.resolve(testFilePath);
30251
30247
  const content = await readFile15(absolutePath, "utf8");
30252
- const parsed = interpolateEnv(parse4(content), process.env);
30248
+ const parsed = interpolateEnv(parseYamlValue(content), process.env);
30253
30249
  if (!isJsonObject(parsed)) {
30254
30250
  return {};
30255
30251
  }
@@ -30272,7 +30268,7 @@ async function loadTestSuite(evalFilePath, repoRoot, options) {
30272
30268
  return { tests: await loadTestsFromAgentSkills(evalFilePath) };
30273
30269
  }
30274
30270
  if (format === "typescript") {
30275
- const { loadTsEvalSuite: loadTsEvalSuite2 } = await import("./ts-eval-loader-PA4YFM5D-2DKQQQOZ.js");
30271
+ const { loadTsEvalSuite: loadTsEvalSuite2 } = await import("./ts-eval-loader-SYQYQPMC-FKU23VX3.js");
30276
30272
  return loadTsEvalSuite2(evalFilePath, resolveToAbsolutePath(repoRoot), options);
30277
30273
  }
30278
30274
  const { tests, parsed, suiteWorkspacePath } = await loadTestsFromYaml(
@@ -30307,7 +30303,7 @@ async function loadTests(evalFilePath, repoRoot, options) {
30307
30303
  return loadTestsFromAgentSkills(evalFilePath);
30308
30304
  }
30309
30305
  if (format === "typescript") {
30310
- const { loadTsEvalSuite: loadTsEvalSuite2 } = await import("./ts-eval-loader-PA4YFM5D-2DKQQQOZ.js");
30306
+ const { loadTsEvalSuite: loadTsEvalSuite2 } = await import("./ts-eval-loader-SYQYQPMC-FKU23VX3.js");
30311
30307
  const suite = await loadTsEvalSuite2(evalFilePath, resolveToAbsolutePath(repoRoot), options);
30312
30308
  return suite.tests;
30313
30309
  }
@@ -30323,7 +30319,7 @@ async function loadTestsFromYaml(evalFilePath, repoRoot, options) {
30323
30319
  const searchRoots = buildSearchRoots2(absoluteTestPath, repoRootPath);
30324
30320
  const config = await loadConfig(absoluteTestPath, repoRootPath);
30325
30321
  const rawFile = await readFile15(absoluteTestPath, "utf8");
30326
- const interpolated = interpolateEnv(parse4(rawFile), process.env);
30322
+ const interpolated = interpolateEnv(parseYamlValue(rawFile), process.env);
30327
30323
  if (!isJsonObject(interpolated)) {
30328
30324
  throw new Error(`Invalid test file format: ${evalFilePath}`);
30329
30325
  }
@@ -30360,6 +30356,7 @@ async function loadTestsFromYaml(evalFilePath, repoRoot, options) {
30360
30356
  throw new Error(`Invalid test file format: ${evalFilePath} - missing 'tests' field`);
30361
30357
  }
30362
30358
  const suiteWorkspace = await resolveWorkspaceConfig(suite.workspace, evalFileDir);
30359
+ const suiteGovernance = extractSuiteGovernance(suite);
30363
30360
  const suiteInputMessages = expandInputShorthand(suite.input);
30364
30361
  const suiteInputFiles = suite.input_files;
30365
30362
  const rawGlobalExecution = isJsonObject(suite.execution) ? suite.execution : void 0;
@@ -30469,7 +30466,9 @@ async function loadTestsFromYaml(evalFilePath, repoRoot, options) {
30469
30466
  const userFilePaths = collectResolvedInputFilePaths(inputMessages);
30470
30467
  const caseWorkspace = await resolveWorkspaceConfig(testCaseConfig.workspace, evalFileDir);
30471
30468
  const mergedWorkspace = mergeWorkspaceConfigs(suiteWorkspace, caseWorkspace);
30472
- const metadata = isJsonObject(testCaseConfig.metadata) ? testCaseConfig.metadata : void 0;
30469
+ const rawCaseMetadata = isJsonObject(testCaseConfig.metadata) ? testCaseConfig.metadata : void 0;
30470
+ const suitePayload = suiteGovernance !== void 0 ? { governance: suiteGovernance } : void 0;
30471
+ const metadata = mergeSuiteMetadataPayload(rawCaseMetadata, suitePayload);
30473
30472
  const caseTargets = extractTargetsFromTestCase(testCaseConfig);
30474
30473
  const dependsOn = Array.isArray(testCaseConfig.depends_on) ? testCaseConfig.depends_on.filter(
30475
30474
  (v) => typeof v === "string"
@@ -30610,7 +30609,7 @@ async function resolveWorkspaceConfig(raw, evalFileDir) {
30610
30609
  } catch {
30611
30610
  throw new Error(`Workspace file not found: ${raw} (resolved to ${workspaceFilePath})`);
30612
30611
  }
30613
- const parsed = interpolateEnv(parse4(content), process.env);
30612
+ const parsed = interpolateEnv(parseYamlValue(content), process.env);
30614
30613
  if (!isJsonObject(parsed)) {
30615
30614
  throw new Error(
30616
30615
  `Invalid workspace file format: ${workspaceFilePath} (expected a YAML object)`
@@ -30717,6 +30716,47 @@ function mergeWorkspaceConfigs(suiteLevel, caseLevel) {
30717
30716
  function asString5(value) {
30718
30717
  return typeof value === "string" ? value : void 0;
30719
30718
  }
30719
+ function extractSuiteGovernance(suite) {
30720
+ const top = suite.governance;
30721
+ if (isJsonObject(top)) {
30722
+ return top;
30723
+ }
30724
+ const wrapper = suite.metadata;
30725
+ if (isJsonObject(wrapper)) {
30726
+ const nested = wrapper.governance;
30727
+ if (isJsonObject(nested)) {
30728
+ return nested;
30729
+ }
30730
+ }
30731
+ return void 0;
30732
+ }
30733
+ function mergeSuiteMetadataPayload(caseMetadata, suitePayload) {
30734
+ if (!suitePayload) return caseMetadata;
30735
+ const result = { ...caseMetadata ?? {} };
30736
+ for (const [key, suiteVal] of Object.entries(suitePayload)) {
30737
+ const caseVal = result[key];
30738
+ if (Array.isArray(suiteVal) && Array.isArray(caseVal)) {
30739
+ const seen = /* @__PURE__ */ new Set();
30740
+ const out = [];
30741
+ for (const v of [...suiteVal, ...caseVal]) {
30742
+ const k = typeof v === "string" ? v : JSON.stringify(v);
30743
+ if (!seen.has(k)) {
30744
+ seen.add(k);
30745
+ out.push(v);
30746
+ }
30747
+ }
30748
+ result[key] = out;
30749
+ } else if (isJsonObject(suiteVal) && isJsonObject(caseVal)) {
30750
+ result[key] = mergeSuiteMetadataPayload(
30751
+ caseVal,
30752
+ suiteVal
30753
+ );
30754
+ } else if (caseVal === void 0) {
30755
+ result[key] = suiteVal;
30756
+ }
30757
+ }
30758
+ return result;
30759
+ }
30720
30760
  function logWarning5(message, details) {
30721
30761
  if (details && details.length > 0) {
30722
30762
  const detailBlock = details.join("\n");
@@ -31623,6 +31663,9 @@ async function runEvaluation(options) {
31623
31663
  result = { ...result, beforeAllOutput };
31624
31664
  beforeAllOutputAttached = true;
31625
31665
  }
31666
+ if (evalCase.metadata && !result.metadata) {
31667
+ result = { ...result, metadata: evalCase.metadata };
31668
+ }
31626
31669
  if (onProgress) {
31627
31670
  await onProgress({
31628
31671
  workerId,
@@ -31633,7 +31676,9 @@ async function runEvaluation(options) {
31633
31676
  completedAt: Date.now(),
31634
31677
  error: result.error,
31635
31678
  score: result.score,
31636
- executionStatus: result.executionStatus
31679
+ executionStatus: result.executionStatus,
31680
+ durationMs: result.durationMs,
31681
+ evalRunDurationMs: result.evalRun?.durationMs
31637
31682
  });
31638
31683
  }
31639
31684
  if (onResult) {
@@ -31947,7 +31992,8 @@ async function runBatchEvaluation(options) {
31947
31992
  completedAt: Date.now(),
31948
31993
  error: error instanceof Error ? error.message : String(error),
31949
31994
  score: errorResult.score,
31950
- executionStatus: errorResult.executionStatus
31995
+ executionStatus: errorResult.executionStatus,
31996
+ evalRunDurationMs: errorResult.evalRun?.durationMs
31951
31997
  });
31952
31998
  }
31953
31999
  continue;
@@ -31965,7 +32011,9 @@ async function runBatchEvaluation(options) {
31965
32011
  completedAt: Date.now(),
31966
32012
  error: result.error,
31967
32013
  score: result.score,
31968
- executionStatus: result.executionStatus
32014
+ executionStatus: result.executionStatus,
32015
+ durationMs: result.durationMs,
32016
+ evalRunDurationMs: result.evalRun?.durationMs
31969
32017
  });
31970
32018
  }
31971
32019
  }
@@ -33942,6 +33990,7 @@ export {
33942
33990
  isJsonValue,
33943
33991
  isTestMessage,
33944
33992
  isGraderKind,
33993
+ parseYamlValue,
33945
33994
  fileExists,
33946
33995
  normalizeLineEndings,
33947
33996
  readTextFile,
@@ -34091,4 +34140,4 @@ export {
34091
34140
  loadTsEvalFile,
34092
34141
  loadTsEvalSuite
34093
34142
  };
34094
- //# sourceMappingURL=chunk-4YZDPAGZ.js.map
34143
+ //# sourceMappingURL=chunk-HL3MTSIW.js.map