braintrust 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -37,8 +37,8 @@ var require_async = __commonJS({
37
37
  "use strict";
38
38
  Object.defineProperty(exports2, "__esModule", { value: true });
39
39
  exports2.read = void 0;
40
- function read(path9, settings, callback) {
41
- settings.fs.lstat(path9, (lstatError, lstat) => {
40
+ function read(path8, settings, callback) {
41
+ settings.fs.lstat(path8, (lstatError, lstat) => {
42
42
  if (lstatError !== null) {
43
43
  callFailureCallback(callback, lstatError);
44
44
  return;
@@ -47,7 +47,7 @@ var require_async = __commonJS({
47
47
  callSuccessCallback(callback, lstat);
48
48
  return;
49
49
  }
50
- settings.fs.stat(path9, (statError, stat2) => {
50
+ settings.fs.stat(path8, (statError, stat2) => {
51
51
  if (statError !== null) {
52
52
  if (settings.throwErrorOnBrokenSymbolicLink) {
53
53
  callFailureCallback(callback, statError);
@@ -79,13 +79,13 @@ var require_sync = __commonJS({
79
79
  "use strict";
80
80
  Object.defineProperty(exports2, "__esModule", { value: true });
81
81
  exports2.read = void 0;
82
- function read(path9, settings) {
83
- const lstat = settings.fs.lstatSync(path9);
82
+ function read(path8, settings) {
83
+ const lstat = settings.fs.lstatSync(path8);
84
84
  if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {
85
85
  return lstat;
86
86
  }
87
87
  try {
88
- const stat2 = settings.fs.statSync(path9);
88
+ const stat2 = settings.fs.statSync(path8);
89
89
  if (settings.markSymbolicLink) {
90
90
  stat2.isSymbolicLink = () => true;
91
91
  }
@@ -156,17 +156,17 @@ var require_out = __commonJS({
156
156
  var sync = require_sync();
157
157
  var settings_1 = require_settings();
158
158
  exports2.Settings = settings_1.default;
159
- function stat2(path9, optionsOrSettingsOrCallback, callback) {
159
+ function stat2(path8, optionsOrSettingsOrCallback, callback) {
160
160
  if (typeof optionsOrSettingsOrCallback === "function") {
161
- async.read(path9, getSettings(), optionsOrSettingsOrCallback);
161
+ async.read(path8, getSettings(), optionsOrSettingsOrCallback);
162
162
  return;
163
163
  }
164
- async.read(path9, getSettings(optionsOrSettingsOrCallback), callback);
164
+ async.read(path8, getSettings(optionsOrSettingsOrCallback), callback);
165
165
  }
166
166
  exports2.stat = stat2;
167
- function statSync2(path9, optionsOrSettings) {
167
+ function statSync2(path8, optionsOrSettings) {
168
168
  const settings = getSettings(optionsOrSettings);
169
- return sync.read(path9, settings);
169
+ return sync.read(path8, settings);
170
170
  }
171
171
  exports2.statSync = statSync2;
172
172
  function getSettings(settingsOrOptions = {}) {
@@ -384,16 +384,16 @@ var require_async2 = __commonJS({
384
384
  return;
385
385
  }
386
386
  const tasks = names.map((name) => {
387
- const path9 = common.joinPathSegments(directory, name, settings.pathSegmentSeparator);
387
+ const path8 = common.joinPathSegments(directory, name, settings.pathSegmentSeparator);
388
388
  return (done) => {
389
- fsStat.stat(path9, settings.fsStatSettings, (error2, stats) => {
389
+ fsStat.stat(path8, settings.fsStatSettings, (error2, stats) => {
390
390
  if (error2 !== null) {
391
391
  done(error2);
392
392
  return;
393
393
  }
394
394
  const entry = {
395
395
  name,
396
- path: path9,
396
+ path: path8,
397
397
  dirent: utils.fs.createDirentFromStats(name, stats)
398
398
  };
399
399
  if (settings.stats) {
@@ -511,7 +511,7 @@ var require_settings2 = __commonJS({
511
511
  "../node_modules/@nodelib/fs.scandir/out/settings.js"(exports2) {
512
512
  "use strict";
513
513
  Object.defineProperty(exports2, "__esModule", { value: true });
514
- var path9 = require("path");
514
+ var path8 = require("path");
515
515
  var fsStat = require_out();
516
516
  var fs6 = require_fs3();
517
517
  var Settings = class {
@@ -519,7 +519,7 @@ var require_settings2 = __commonJS({
519
519
  this._options = _options;
520
520
  this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false);
521
521
  this.fs = fs6.createFileSystemAdapter(this._options.fs);
522
- this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path9.sep);
522
+ this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path8.sep);
523
523
  this.stats = this._getValue(this._options.stats, false);
524
524
  this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);
525
525
  this.fsStatSettings = new fsStat.Settings({
@@ -546,17 +546,17 @@ var require_out2 = __commonJS({
546
546
  var sync = require_sync2();
547
547
  var settings_1 = require_settings2();
548
548
  exports2.Settings = settings_1.default;
549
- function scandir(path9, optionsOrSettingsOrCallback, callback) {
549
+ function scandir(path8, optionsOrSettingsOrCallback, callback) {
550
550
  if (typeof optionsOrSettingsOrCallback === "function") {
551
- async.read(path9, getSettings(), optionsOrSettingsOrCallback);
551
+ async.read(path8, getSettings(), optionsOrSettingsOrCallback);
552
552
  return;
553
553
  }
554
- async.read(path9, getSettings(optionsOrSettingsOrCallback), callback);
554
+ async.read(path8, getSettings(optionsOrSettingsOrCallback), callback);
555
555
  }
556
556
  exports2.scandir = scandir;
557
- function scandirSync(path9, optionsOrSettings) {
557
+ function scandirSync(path8, optionsOrSettings) {
558
558
  const settings = getSettings(optionsOrSettings);
559
- return sync.read(path9, settings);
559
+ return sync.read(path8, settings);
560
560
  }
561
561
  exports2.scandirSync = scandirSync;
562
562
  function getSettings(settingsOrOptions = {}) {
@@ -1180,7 +1180,7 @@ var require_settings3 = __commonJS({
1180
1180
  "../node_modules/@nodelib/fs.walk/out/settings.js"(exports2) {
1181
1181
  "use strict";
1182
1182
  Object.defineProperty(exports2, "__esModule", { value: true });
1183
- var path9 = require("path");
1183
+ var path8 = require("path");
1184
1184
  var fsScandir = require_out2();
1185
1185
  var Settings = class {
1186
1186
  constructor(_options = {}) {
@@ -1190,7 +1190,7 @@ var require_settings3 = __commonJS({
1190
1190
  this.deepFilter = this._getValue(this._options.deepFilter, null);
1191
1191
  this.entryFilter = this._getValue(this._options.entryFilter, null);
1192
1192
  this.errorFilter = this._getValue(this._options.errorFilter, null);
1193
- this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path9.sep);
1193
+ this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path8.sep);
1194
1194
  this.fsScandirSettings = new fsScandir.Settings({
1195
1195
  followSymbolicLinks: this._options.followSymbolicLinks,
1196
1196
  fs: this._options.fs,
@@ -1252,7 +1252,7 @@ var require_package = __commonJS({
1252
1252
  "package.json"(exports2, module2) {
1253
1253
  module2.exports = {
1254
1254
  name: "braintrust",
1255
- version: "1.0.2",
1255
+ version: "1.0.3",
1256
1256
  description: "SDK for integrating Braintrust",
1257
1257
  repository: {
1258
1258
  type: "git",
@@ -1309,6 +1309,7 @@ var require_package = __commonJS({
1309
1309
  clean: "rm -r dist/* && rm -r dev/dist/*",
1310
1310
  docs: "npx typedoc --options typedoc.json src/index.ts",
1311
1311
  test: 'vitest run --exclude "src/wrappers/**/*.test.ts" --exclude "src/otel/**/*.test.ts" --exclude "smoke/**/*.test.ts"',
1312
+ "test:api-compat": "vitest run src/api-compatibility.test.ts",
1312
1313
  "test:anthropic": "vitest run src/wrappers/anthropic.test.ts",
1313
1314
  "test:openai": "vitest run src/wrappers/oai.test.ts",
1314
1315
  "test:otel": "vitest run --dir src/otel",
@@ -1340,7 +1341,10 @@ var require_package = __commonJS({
1340
1341
  "@types/mustache": "^4.2.5",
1341
1342
  "@types/node": "^20.10.5",
1342
1343
  "@types/pluralize": "^0.0.30",
1344
+ "@types/tar": "^6.1.13",
1343
1345
  "@types/uuid": "^9.0.7",
1346
+ "@typescript-eslint/eslint-plugin": "^8.49.0",
1347
+ "@typescript-eslint/parser": "^8.49.0",
1344
1348
  ai: "^4.3.16",
1345
1349
  async: "^3.2.5",
1346
1350
  autoevals: "^0.0.131",
@@ -1348,6 +1352,7 @@ var require_package = __commonJS({
1348
1352
  "npm-run-all": "^4.1.5",
1349
1353
  "openapi-zod-client": "^1.18.3",
1350
1354
  prettier: "^3.5.3",
1355
+ tar: "^7.5.2",
1351
1356
  tinybench: "^4.0.1",
1352
1357
  "ts-jest": "^29.1.4",
1353
1358
  tsup: "^8.5.1",
@@ -1378,7 +1383,6 @@ var require_package = __commonJS({
1378
1383
  mustache: "^4.2.0",
1379
1384
  pluralize: "^8.0.0",
1380
1385
  "simple-git": "^3.21.0",
1381
- slugify: "^1.6.6",
1382
1386
  "source-map": "^0.7.4",
1383
1387
  "termi-link": "^1.0.1",
1384
1388
  uuid: "^9.0.1",
@@ -1392,7 +1396,7 @@ var require_package = __commonJS({
1392
1396
  }
1393
1397
  });
1394
1398
 
1395
- // src/cli.ts
1399
+ // src/cli/index.ts
1396
1400
  var cli_exports = {};
1397
1401
  __export(cli_exports, {
1398
1402
  buildEvaluators: () => buildEvaluators,
@@ -1404,8 +1408,8 @@ var esbuild = __toESM(require("esbuild"));
1404
1408
  var dotenv2 = __toESM(require("dotenv"));
1405
1409
  var import_fs2 = __toESM(require("fs"));
1406
1410
  var import_os = __toESM(require("os"));
1407
- var import_path6 = __toESM(require("path"));
1408
- var import_util14 = __toESM(require("util"));
1411
+ var import_path5 = __toESM(require("path"));
1412
+ var import_util15 = __toESM(require("util"));
1409
1413
  var fsWalk = __toESM(require_out3());
1410
1414
  var import_minimatch = require("minimatch");
1411
1415
  var import_argparse = require("argparse");
@@ -2133,11 +2137,11 @@ function mergeDictsWithPaths({
2133
2137
  function mergeDictsWithPathsHelper({
2134
2138
  mergeInto,
2135
2139
  mergeFrom,
2136
- path: path9,
2140
+ path: path8,
2137
2141
  mergePaths
2138
2142
  }) {
2139
2143
  Object.entries(mergeFrom).forEach(([k, mergeFromV]) => {
2140
- const fullPath = path9.concat([k]);
2144
+ const fullPath = path8.concat([k]);
2141
2145
  const fullPathSerialized = JSON.stringify(fullPath);
2142
2146
  const mergeIntoV = recordFind(mergeInto, k);
2143
2147
  if (isObject(mergeIntoV) && isObject(mergeFromV) && !mergePaths.has(fullPathSerialized)) {
@@ -2168,9 +2172,9 @@ function mapAt(m, k) {
2168
2172
  function recordFind(m, k) {
2169
2173
  return m[k];
2170
2174
  }
2171
- function getObjValueByPath(row, path9) {
2175
+ function getObjValueByPath(row, path8) {
2172
2176
  let curr = row;
2173
- for (const p of path9) {
2177
+ for (const p of path8) {
2174
2178
  if (!isObjectOrArray(curr)) {
2175
2179
  return null;
2176
2180
  }
@@ -2449,6 +2453,93 @@ function capitalize(s, sep) {
2449
2453
  const items = sep ? s.split(sep) : [s];
2450
2454
  return items.map((s2) => s2 ? s2.charAt(0).toUpperCase() + s2.slice(1) : s2).join(sep || "");
2451
2455
  }
2456
+ function slugify(text, options) {
2457
+ if (typeof text !== "string") {
2458
+ throw new Error("slugify: string argument expected");
2459
+ }
2460
+ const charMap = {
2461
+ // Currency and symbols
2462
+ $: "dollar",
2463
+ "%": "percent",
2464
+ "&": "and",
2465
+ // Latin characters
2466
+ \u00C0: "A",
2467
+ \u00C1: "A",
2468
+ \u00C2: "A",
2469
+ \u00C3: "A",
2470
+ \u00C4: "A",
2471
+ \u00C5: "A",
2472
+ \u00C6: "AE",
2473
+ \u00C7: "C",
2474
+ \u00C8: "E",
2475
+ \u00C9: "E",
2476
+ \u00CA: "E",
2477
+ \u00CB: "E",
2478
+ \u00CC: "I",
2479
+ \u00CD: "I",
2480
+ \u00CE: "I",
2481
+ \u00CF: "I",
2482
+ \u00D1: "N",
2483
+ \u00D2: "O",
2484
+ \u00D3: "O",
2485
+ \u00D4: "O",
2486
+ \u00D5: "O",
2487
+ \u00D6: "O",
2488
+ \u00D8: "O",
2489
+ \u00D9: "U",
2490
+ \u00DA: "U",
2491
+ \u00DB: "U",
2492
+ \u00DC: "U",
2493
+ \u00DD: "Y",
2494
+ \u00E0: "a",
2495
+ \u00E1: "a",
2496
+ \u00E2: "a",
2497
+ \u00E3: "a",
2498
+ \u00E4: "a",
2499
+ \u00E5: "a",
2500
+ \u00E6: "ae",
2501
+ \u00E7: "c",
2502
+ \u00E8: "e",
2503
+ \u00E9: "e",
2504
+ \u00EA: "e",
2505
+ \u00EB: "e",
2506
+ \u00EC: "i",
2507
+ \u00ED: "i",
2508
+ \u00EE: "i",
2509
+ \u00EF: "i",
2510
+ \u00F1: "n",
2511
+ \u00F2: "o",
2512
+ \u00F3: "o",
2513
+ \u00F4: "o",
2514
+ \u00F5: "o",
2515
+ \u00F6: "o",
2516
+ \u00F8: "o",
2517
+ \u00F9: "u",
2518
+ \u00FA: "u",
2519
+ \u00FB: "u",
2520
+ \u00FC: "u",
2521
+ \u00FD: "y",
2522
+ \u00FF: "y"
2523
+ };
2524
+ const replacement = "-";
2525
+ const trim = options?.trim !== false;
2526
+ let slug = text.normalize().split("").reduce((result, ch) => {
2527
+ const mapped = charMap[ch] || ch;
2528
+ const appendChar = mapped === replacement ? " " : mapped;
2529
+ return result + appendChar.replace(/[^\w\s$*_+~.()'"!\-:@]+/g, "");
2530
+ }, "");
2531
+ if (options?.strict) {
2532
+ slug = slug.replace(/[^A-Za-z0-9\s]/g, "");
2533
+ }
2534
+ if (trim) {
2535
+ slug = slug.trim();
2536
+ }
2537
+ slug = slug.replace(/\s+/g, replacement);
2538
+ if (options?.lower) {
2539
+ slug = slug.toLowerCase();
2540
+ }
2541
+ return slug;
2542
+ }
2452
2543
 
2453
2544
  // util/span_identifier_v4.ts
2454
2545
  var import_v34 = require("zod/v3");
@@ -4357,7 +4448,9 @@ var iso = {
4357
4448
  getCallerLocation: () => void 0,
4358
4449
  newAsyncLocalStorage: () => new DefaultAsyncLocalStorage(),
4359
4450
  processOn: (_0, _1) => {
4360
- }
4451
+ },
4452
+ basename: (filepath) => filepath.split(/[\\/]/).pop() || filepath,
4453
+ writeln: (text) => console.log(text)
4361
4454
  };
4362
4455
  var isomorph_default = iso;
4363
4456
 
@@ -4443,10 +4536,10 @@ var DiskCache = class {
4443
4536
  return;
4444
4537
  }
4445
4538
  const stats = await Promise.all(
4446
- paths.map(async (path9) => {
4447
- const stat2 = await isomorph_default.stat(path9);
4539
+ paths.map(async (path8) => {
4540
+ const stat2 = await isomorph_default.stat(path8);
4448
4541
  return {
4449
- path: path9,
4542
+ path: path8,
4450
4543
  mtime: stat2.mtime.getTime()
4451
4544
  };
4452
4545
  })
@@ -5165,9 +5258,9 @@ var HTTPConnection = class _HTTPConnection {
5165
5258
  this.headers["Authorization"] = `Bearer ${this.token}`;
5166
5259
  }
5167
5260
  }
5168
- async get(path9, params = void 0, config3) {
5261
+ async get(path8, params = void 0, config3) {
5169
5262
  const { headers, ...rest } = config3 || {};
5170
- const url = new URL(_urljoin(this.base_url, path9));
5263
+ const url = new URL(_urljoin(this.base_url, path8));
5171
5264
  url.search = new URLSearchParams(
5172
5265
  params ? Object.entries(params).filter(([_, v]) => v !== void 0).flatMap(
5173
5266
  ([k, v]) => v !== void 0 ? typeof v === "string" ? [[k, v]] : v.map((x) => [k, x]) : []
@@ -5188,13 +5281,13 @@ var HTTPConnection = class _HTTPConnection {
5188
5281
  })
5189
5282
  );
5190
5283
  }
5191
- async post(path9, params, config3) {
5284
+ async post(path8, params, config3) {
5192
5285
  const { headers, ...rest } = config3 || {};
5193
5286
  const this_fetch = this.fetch;
5194
5287
  const this_base_url = this.base_url;
5195
5288
  const this_headers = this.headers;
5196
5289
  return await checkResponse(
5197
- await this_fetch(_urljoin(this_base_url, path9), {
5290
+ await this_fetch(_urljoin(this_base_url, path8), {
5198
5291
  method: "POST",
5199
5292
  headers: {
5200
5293
  Accept: "application/json",
@@ -8444,17 +8537,11 @@ var Prompt2 = class _Prompt {
8444
8537
  };
8445
8538
  var TEST_API_KEY = "___TEST_API_KEY__THIS_IS_NOT_REAL___";
8446
8539
 
8447
- // src/progress.ts
8540
+ // src/cli/reporters/progress.ts
8448
8541
  var import_chalk = __toESM(require("chalk"));
8449
8542
  var cliProgress = __toESM(require("cli-progress"));
8450
- var MAX_NAME_LENGTH = 40;
8451
- function fitNameToSpaces(name, length) {
8452
- const padded = name.padEnd(length);
8453
- if (padded.length <= length) {
8454
- return padded;
8455
- }
8456
- return padded.substring(0, length - 3) + "...";
8457
- }
8543
+
8544
+ // src/reporters/progress.ts
8458
8545
  var SimpleProgressReporter = class {
8459
8546
  start(name, _total) {
8460
8547
  console.log(`Running evaluator ${name}`);
@@ -8466,15 +8553,23 @@ var SimpleProgressReporter = class {
8466
8553
  setTotal(_name, _total) {
8467
8554
  }
8468
8555
  };
8556
+
8557
+ // src/cli/reporters/progress.ts
8558
+ var MAX_NAME_LENGTH = 40;
8559
+ function fitNameToSpaces(name, length) {
8560
+ const padded = name.padEnd(length);
8561
+ if (padded.length <= length) {
8562
+ return padded;
8563
+ }
8564
+ return padded.substring(0, length - 3) + "...";
8565
+ }
8469
8566
  var BarProgressReporter = class {
8470
8567
  multiBar;
8471
8568
  bars = {};
8472
8569
  constructor() {
8473
8570
  this.multiBar = new cliProgress.MultiBar(
8474
8571
  {
8475
- // clearOnComplete: true,
8476
8572
  format: `${import_chalk.default.blueBright("{bar}")} ${import_chalk.default.blue("{evaluator}")} {percentage}% ${import_chalk.default.gray("{value}/{total} {eta_formatted}")}`,
8477
- // autopadding: true,
8478
8573
  hideCursor: true,
8479
8574
  barsize: 10
8480
8575
  },
@@ -8498,7 +8593,7 @@ var BarProgressReporter = class {
8498
8593
  }
8499
8594
  };
8500
8595
 
8501
- // src/cli.ts
8596
+ // src/cli/index.ts
8502
8597
  var import_chalk3 = __toESM(require("chalk"));
8503
8598
  var import_termi_link2 = require("termi-link");
8504
8599
 
@@ -9538,20 +9633,12 @@ function waterfall(tasks, callback) {
9538
9633
  }
9539
9634
  var waterfall$1 = awaitify(waterfall);
9540
9635
 
9541
- // src/framework.ts
9542
- var import_chalk2 = __toESM(require("chalk"));
9543
- var import_termi_link = require("termi-link");
9544
- var import_boxen = __toESM(require("boxen"));
9545
- var import_pluralize = __toESM(require("pluralize"));
9546
- var import_cli_table3 = __toESM(require("cli-table3"));
9547
-
9548
9636
  // src/eval-parameters.ts
9549
9637
  var import_v310 = require("zod/v3");
9550
9638
 
9551
9639
  // src/framework2.ts
9552
- var import_path = __toESM(require("path"));
9553
- var import_slugify = __toESM(require("slugify"));
9554
9640
  var import_v39 = require("zod/v3");
9641
+ var currentFilename = typeof __filename !== "undefined" ? __filename : "unknown";
9555
9642
  var ProjectBuilder = class {
9556
9643
  create(opts) {
9557
9644
  return new Project2(opts);
@@ -9623,12 +9710,12 @@ var ToolBuilder = class {
9623
9710
  const { handler, name, slug, parameters, returns, ...rest } = opts;
9624
9711
  let resolvedName = name ?? handler.name;
9625
9712
  if (resolvedName.trim().length === 0) {
9626
- resolvedName = `Tool ${import_path.default.basename(__filename)} ${this.taskCounter}`;
9713
+ resolvedName = `Tool ${isomorph_default.basename(currentFilename)} ${this.taskCounter}`;
9627
9714
  }
9628
9715
  const tool = new CodeFunction(this.project, {
9629
9716
  handler,
9630
9717
  name: resolvedName,
9631
- slug: slug ?? (0, import_slugify.default)(resolvedName, { lower: true, strict: true }),
9718
+ slug: slug ?? slugify(resolvedName, { lower: true, strict: true }),
9632
9719
  type: "tool",
9633
9720
  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/consistent-type-assertions
9634
9721
  parameters,
@@ -9652,9 +9739,9 @@ var ScorerBuilder = class {
9652
9739
  resolvedName = opts.handler.name;
9653
9740
  }
9654
9741
  if (!resolvedName || resolvedName.trim().length === 0) {
9655
- resolvedName = `Scorer ${import_path.default.basename(__filename)} ${this.taskCounter}`;
9742
+ resolvedName = `Scorer ${isomorph_default.basename(currentFilename)} ${this.taskCounter}`;
9656
9743
  }
9657
- const slug = opts.slug ?? (0, import_slugify.default)(resolvedName, { lower: true, strict: true });
9744
+ const slug = opts.slug ?? slugify(resolvedName, { lower: true, strict: true });
9658
9745
  if ("handler" in opts) {
9659
9746
  const scorer = new CodeFunction(this.project, {
9660
9747
  ...opts,
@@ -9825,7 +9912,7 @@ var PromptBuilder = class {
9825
9912
  rawTools.push(tool);
9826
9913
  }
9827
9914
  }
9828
- const slug = opts.slug ?? (0, import_slugify.default)(opts.name, { lower: true, strict: true });
9915
+ const slug = opts.slug ?? slugify(opts.name, { lower: true, strict: true });
9829
9916
  const promptData = promptDefinitionToPromptData(opts, rawTools);
9830
9917
  const promptRow = {
9831
9918
  id: opts.id,
@@ -9950,8 +10037,11 @@ var EvalResultWithSummary = class {
9950
10037
  this.summary = summary;
9951
10038
  this.results = results;
9952
10039
  }
10040
+ /**
10041
+ * @deprecated Use `summary` instead.
10042
+ */
9953
10043
  toString() {
9954
- return formatExperimentSummary(this.summary);
10044
+ return JSON.stringify(this.summary);
9955
10045
  }
9956
10046
  [Symbol.for("nodejs.util.inspect.custom")]() {
9957
10047
  return `EvalResultWithSummary(summary="...", results=[...])`;
@@ -10030,7 +10120,7 @@ async function Eval(name, evaluator, reporterOrOpts) {
10030
10120
  []
10031
10121
  );
10032
10122
  }
10033
- const progressReporter = options.progress ?? new BarProgressReporter();
10123
+ const progressReporter = options.progress ?? new SimpleProgressReporter();
10034
10124
  const shouldCollectResults = options.returnResults ?? true;
10035
10125
  if (typeof options.reporter === "string") {
10036
10126
  throw new Error(
@@ -10133,21 +10223,21 @@ function parseFilters(filters) {
10133
10223
  if (equalsIdx === -1) {
10134
10224
  throw new Error(`Invalid filter ${f}`);
10135
10225
  }
10136
- const [path9, value] = [f.slice(0, equalsIdx), f.slice(equalsIdx + 1)];
10226
+ const [path8, value] = [f.slice(0, equalsIdx), f.slice(equalsIdx + 1)];
10137
10227
  let deserializedValue = deserializePlainStringAsJSON2(value).value;
10138
10228
  if (typeof deserializedValue !== "string") {
10139
10229
  deserializedValue = value;
10140
10230
  }
10141
10231
  result.push({
10142
- path: path9.split("."),
10232
+ path: path8.split("."),
10143
10233
  pattern: new RegExp(deserializedValue)
10144
10234
  });
10145
10235
  }
10146
10236
  return result;
10147
10237
  }
10148
10238
  function evaluateFilter(object, filter2) {
10149
- const { path: path9, pattern } = filter2;
10150
- const key = path9.reduce(
10239
+ const { path: path8, pattern } = filter2;
10240
+ const key = path8.reduce(
10151
10241
  (acc, p) => typeof acc === "object" && acc !== null ? (
10152
10242
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
10153
10243
  acc[p]
@@ -10517,7 +10607,7 @@ async function runEvaluatorInternal(experiment, evaluator, progressReporter, fil
10517
10607
  } catch (e) {
10518
10608
  q.kill();
10519
10609
  if (e instanceof InternalAbortError) {
10520
- if (process.env.BRAINTRUST_VERBOSE) {
10610
+ if (isomorph_default.getEnv("BRAINTRUST_VERBOSE")) {
10521
10611
  console.warn("Evaluator cancelled:", e.message);
10522
10612
  }
10523
10613
  }
@@ -10537,8 +10627,8 @@ async function runEvaluatorInternal(experiment, evaluator, progressReporter, fil
10537
10627
  collectResults ? collectedResults : []
10538
10628
  );
10539
10629
  }
10540
- var error = import_chalk2.default.red;
10541
- var warning = import_chalk2.default.yellow;
10630
+ var error = (text) => `Error: ${text}`;
10631
+ var warning = (text) => `Warning: ${text}`;
10542
10632
  function logError2(e, verbose) {
10543
10633
  if (!verbose) {
10544
10634
  console.error(`${e}`);
@@ -10587,11 +10677,7 @@ function reportFailures(evaluator, failingResults, { verbose, jsonl }) {
10587
10677
  if (failingResults.length > 0) {
10588
10678
  console.error(
10589
10679
  warning(
10590
- `Evaluator ${evaluator.evalName} failed with ${(0, import_pluralize.default)(
10591
- "error",
10592
- failingResults.length,
10593
- true
10594
- )}. This evaluation ("${evaluator.evalName}") will not be fully logged.`
10680
+ `Evaluator ${evaluator.evalName} failed with ${failingResults.length} error${failingResults.length === 1 ? "" : "s"}. This evaluation ("${evaluator.evalName}") will not be fully logged.`
10595
10681
  )
10596
10682
  );
10597
10683
  if (jsonl) {
@@ -10623,17 +10709,92 @@ var defaultReporter = {
10623
10709
  if (failingResults.length > 0) {
10624
10710
  reportFailures(evaluator, failingResults, { verbose, jsonl });
10625
10711
  }
10626
- process.stdout.write(
10627
- jsonl ? JSON.stringify(summary) : formatExperimentSummary(summary)
10628
- );
10629
- process.stdout.write("\n");
10712
+ if (jsonl) {
10713
+ isomorph_default.writeln(JSON.stringify(summary));
10714
+ } else {
10715
+ isomorph_default.writeln("Experiment summary");
10716
+ isomorph_default.writeln("==================");
10717
+ if (summary.comparisonExperimentName) {
10718
+ isomorph_default.writeln(
10719
+ `${summary.comparisonExperimentName} (baseline) <- ${summary.experimentName} (comparison)`
10720
+ );
10721
+ isomorph_default.writeln("");
10722
+ }
10723
+ const hasScores = Object.keys(summary.scores).length > 0;
10724
+ const hasMetrics = Object.keys(summary.metrics ?? {}).length > 0;
10725
+ const hasComparison = !!summary.comparisonExperimentName;
10726
+ if (hasScores || hasMetrics) {
10727
+ if (hasComparison) {
10728
+ isomorph_default.writeln(
10729
+ "Name Value Change Improvements Regressions"
10730
+ );
10731
+ isomorph_default.writeln(
10732
+ "----------------------------------------------------------------"
10733
+ );
10734
+ }
10735
+ for (const score of Object.values(summary.scores)) {
10736
+ const scorePercent = (score.score * 100).toFixed(2);
10737
+ const scoreValue = `${scorePercent}%`;
10738
+ if (hasComparison) {
10739
+ let diffString = "-";
10740
+ if (!isEmpty2(score.diff)) {
10741
+ const diffPercent = (score.diff * 100).toFixed(2);
10742
+ const diffSign = score.diff > 0 ? "+" : "";
10743
+ diffString = `${diffSign}${diffPercent}%`;
10744
+ }
10745
+ const improvements = score.improvements > 0 ? score.improvements.toString() : "-";
10746
+ const regressions = score.regressions > 0 ? score.regressions.toString() : "-";
10747
+ isomorph_default.writeln(
10748
+ `${score.name.padEnd(18)} ${scoreValue.padStart(10)} ${diffString.padStart(10)} ${improvements.padStart(12)} ${regressions.padStart(11)}`
10749
+ );
10750
+ } else {
10751
+ isomorph_default.writeln(`${score.name.padEnd(20)} ${scoreValue.padStart(15)}`);
10752
+ }
10753
+ }
10754
+ for (const metric of Object.values(summary.metrics ?? {})) {
10755
+ const fractionDigits = Number.isInteger(metric.metric) ? 0 : 2;
10756
+ const formattedValue = metric.metric.toFixed(fractionDigits);
10757
+ const metricValue = metric.unit === "$" ? `${metric.unit}${formattedValue}` : `${formattedValue}${metric.unit}`;
10758
+ if (hasComparison) {
10759
+ let diffString = "-";
10760
+ if (!isEmpty2(metric.diff)) {
10761
+ const diffPercent = (metric.diff * 100).toFixed(2);
10762
+ const diffSign = metric.diff > 0 ? "+" : "";
10763
+ diffString = `${diffSign}${diffPercent}%`;
10764
+ }
10765
+ const improvements = metric.improvements > 0 ? metric.improvements.toString() : "-";
10766
+ const regressions = metric.regressions > 0 ? metric.regressions.toString() : "-";
10767
+ isomorph_default.writeln(
10768
+ `${metric.name.padEnd(18)} ${metricValue.padStart(10)} ${diffString.padStart(10)} ${improvements.padStart(12)} ${regressions.padStart(11)}`
10769
+ );
10770
+ } else {
10771
+ isomorph_default.writeln(
10772
+ `${metric.name.padEnd(20)} ${metricValue.padStart(15)}`
10773
+ );
10774
+ }
10775
+ }
10776
+ }
10777
+ if (summary.experimentUrl) {
10778
+ isomorph_default.writeln("");
10779
+ isomorph_default.writeln(`View results for ${summary.experimentName}`);
10780
+ isomorph_default.writeln(`See results at ${summary.experimentUrl}`);
10781
+ }
10782
+ }
10783
+ isomorph_default.writeln("");
10630
10784
  return failingResults.length === 0;
10631
10785
  },
10632
10786
  async reportRun(evalReports) {
10633
10787
  return evalReports.every((r) => r);
10634
10788
  }
10635
10789
  };
10636
- function formatExperimentSummary(summary) {
10790
+
10791
+ // src/cli/reporters/eval.ts
10792
+ var import_chalk2 = __toESM(require("chalk"));
10793
+ var import_termi_link = require("termi-link");
10794
+ var import_boxen = __toESM(require("boxen"));
10795
+ var import_cli_table3 = __toESM(require("cli-table3"));
10796
+ var import_pluralize = __toESM(require("pluralize"));
10797
+ function formatExperimentSummaryFancy(summary) {
10637
10798
  let comparisonLine = "";
10638
10799
  if (summary.comparisonExperimentName) {
10639
10800
  comparisonLine = `${summary.comparisonExperimentName} ${import_chalk2.default.gray("(baseline)")} \u2190 ${summary.experimentName} ${import_chalk2.default.gray("(comparison)")}
@@ -10678,8 +10839,7 @@ function formatExperimentSummary(summary) {
10678
10839
  wordWrap: false
10679
10840
  });
10680
10841
  const scoreValues = Object.values(summary.scores);
10681
- for (let i = 0; i < scoreValues.length; i++) {
10682
- const score = scoreValues[i];
10842
+ for (const score of scoreValues) {
10683
10843
  const scorePercent = (score.score * 100).toFixed(2);
10684
10844
  const scoreValue = import_chalk2.default.white(`${scorePercent}%`);
10685
10845
  let diffString = "";
@@ -10700,8 +10860,7 @@ function formatExperimentSummary(summary) {
10700
10860
  combinedTable.push(row);
10701
10861
  }
10702
10862
  const metricValues = Object.values(summary.metrics ?? {});
10703
- for (let i = 0; i < metricValues.length; i++) {
10704
- const metric = metricValues[i];
10863
+ for (const metric of metricValues) {
10705
10864
  const fractionDigits = Number.isInteger(metric.metric) ? 0 : 2;
10706
10865
  const formattedValue = metric.metric.toFixed(fractionDigits);
10707
10866
  const metricValue = import_chalk2.default.white(
@@ -10733,18 +10892,57 @@ function formatExperimentSummary(summary) {
10733
10892
  { fallback: () => `See results at ${summary.experimentUrl}` }
10734
10893
  ) : "";
10735
10894
  const boxContent = [content, footer].filter(Boolean).join("\n\n");
10736
- return "\n" + (0, import_boxen.default)(boxContent, {
10737
- title: import_chalk2.default.gray("Experiment summary"),
10738
- titleAlignment: "left",
10739
- padding: 0.5,
10740
- borderColor: "gray",
10741
- borderStyle: "round"
10742
- });
10895
+ try {
10896
+ return "\n" + (0, import_boxen.default)(boxContent, {
10897
+ title: import_chalk2.default.gray("Experiment summary"),
10898
+ titleAlignment: "left",
10899
+ padding: 0.5,
10900
+ borderColor: "gray",
10901
+ borderStyle: "round"
10902
+ });
10903
+ } catch (error2) {
10904
+ return "\n" + import_chalk2.default.gray("Experiment summary") + "\n" + boxContent + "\n";
10905
+ }
10743
10906
  }
10907
+ var warning2 = import_chalk2.default.yellow;
10908
+ var fancyReporter = {
10909
+ name: "Braintrust fancy reporter",
10910
+ async reportEval(evaluator, result, { verbose, jsonl }) {
10911
+ const { results, summary } = result;
10912
+ const failingResults = results.filter(
10913
+ (r) => r.error !== void 0
10914
+ );
10915
+ if (failingResults.length > 0) {
10916
+ console.error(
10917
+ warning2(
10918
+ `Evaluator ${evaluator.evalName} failed with ${(0, import_pluralize.default)("error", failingResults.length, true)}. This evaluation ("${evaluator.evalName}") will not be fully logged.`
10919
+ )
10920
+ );
10921
+ if (jsonl) {
10922
+ for (const result2 of failingResults) {
10923
+ process.stdout.write(JSON.stringify(result2));
10924
+ process.stdout.write("\n");
10925
+ }
10926
+ } else if (verbose) {
10927
+ for (const result2 of failingResults) {
10928
+ console.error(result2);
10929
+ }
10930
+ }
10931
+ }
10932
+ process.stdout.write(
10933
+ jsonl ? JSON.stringify(summary) : formatExperimentSummaryFancy(summary)
10934
+ );
10935
+ process.stdout.write("\n");
10936
+ return failingResults.length === 0;
10937
+ },
10938
+ async reportRun(evalReports) {
10939
+ return evalReports.every((r) => r);
10940
+ }
10941
+ };
10744
10942
 
10745
10943
  // src/node.ts
10746
10944
  var import_node_async_hooks = require("async_hooks");
10747
- var path2 = __toESM(require("path"));
10945
+ var path = __toESM(require("path"));
10748
10946
  var fs = __toESM(require("fs/promises"));
10749
10947
  var os = __toESM(require("os"));
10750
10948
  var fsSync = __toESM(require("fs"));
@@ -10839,7 +11037,7 @@ async function getPastNAncestors(n = 1e3, remote = void 0) {
10839
11037
  return [];
10840
11038
  }
10841
11039
  const commits = await git.log({ from: ancestor, to: "HEAD", maxCount: n });
10842
- return commits.all.map((c) => c.hash);
11040
+ return commits.all.slice(0, n).map((c) => c.hash);
10843
11041
  }
10844
11042
  async function attempt(fn) {
10845
11043
  try {
@@ -10965,7 +11163,7 @@ function getCallerLocation() {
10965
11163
  }
10966
11164
 
10967
11165
  // src/node.ts
10968
- var import_util8 = require("util");
11166
+ var import_util9 = require("util");
10969
11167
  var zlib = __toESM(require("zlib"));
10970
11168
  function configureNode() {
10971
11169
  isomorph_default.getRepoInfo = getRepoInfo;
@@ -10976,8 +11174,10 @@ function configureNode() {
10976
11174
  isomorph_default.processOn = (event, handler) => {
10977
11175
  process.on(event, handler);
10978
11176
  };
10979
- isomorph_default.pathJoin = path2.join;
10980
- isomorph_default.pathDirname = path2.dirname;
11177
+ isomorph_default.basename = path.basename;
11178
+ isomorph_default.writeln = (text) => process.stdout.write(text + "\n");
11179
+ isomorph_default.pathJoin = path.join;
11180
+ isomorph_default.pathDirname = path.dirname;
10981
11181
  isomorph_default.mkdir = fs.mkdir;
10982
11182
  isomorph_default.writeFile = fs.writeFile;
10983
11183
  isomorph_default.readFile = fs.readFile;
@@ -10987,45 +11187,45 @@ function configureNode() {
10987
11187
  isomorph_default.utimes = fs.utimes;
10988
11188
  isomorph_default.unlink = fs.unlink;
10989
11189
  isomorph_default.homedir = os.homedir;
10990
- isomorph_default.gzip = (0, import_util8.promisify)(zlib.gzip);
10991
- isomorph_default.gunzip = (0, import_util8.promisify)(zlib.gunzip);
11190
+ isomorph_default.gzip = (0, import_util9.promisify)(zlib.gzip);
11191
+ isomorph_default.gunzip = (0, import_util9.promisify)(zlib.gunzip);
10992
11192
  isomorph_default.hash = (data) => crypto.createHash("sha256").update(data).digest("hex");
10993
11193
  _internalSetInitialState();
10994
11194
  }
10995
11195
 
10996
- // src/cli.ts
11196
+ // src/cli/index.ts
10997
11197
  var import_env2 = require("@next/env");
10998
11198
 
10999
- // src/functions/upload.ts
11199
+ // src/cli/functions/upload.ts
11000
11200
  var import_fs = __toESM(require("fs"));
11001
- var import_path4 = __toESM(require("path"));
11201
+ var import_path3 = __toESM(require("path"));
11002
11202
  var import_zlib = require("zlib");
11003
11203
  var import_v311 = require("zod/v3");
11004
11204
 
11005
- // src/functions/infer-source.ts
11205
+ // src/cli/functions/infer-source.ts
11006
11206
  var import_source_map = require("source-map");
11007
11207
  var fs2 = __toESM(require("fs/promises"));
11008
11208
 
11009
- // src/jest/nodeModulesPaths.ts
11010
- var path3 = __toESM(require("path"));
11209
+ // src/cli/jest/nodeModulesPaths.ts
11210
+ var path2 = __toESM(require("path"));
11011
11211
 
11012
- // src/jest/tryRealpath.ts
11212
+ // src/cli/jest/tryRealpath.ts
11013
11213
  var import_graceful_fs = require("graceful-fs");
11014
- function tryRealpath(path9) {
11214
+ function tryRealpath(path8) {
11015
11215
  try {
11016
- path9 = import_graceful_fs.realpathSync.native(path9);
11216
+ path8 = import_graceful_fs.realpathSync.native(path8);
11017
11217
  } catch (error2) {
11018
11218
  if (error2.code !== "ENOENT" && error2.code !== "EISDIR") {
11019
11219
  throw error2;
11020
11220
  }
11021
11221
  }
11022
- return path9;
11222
+ return path8;
11023
11223
  }
11024
11224
 
11025
- // src/jest/nodeModulesPaths.ts
11225
+ // src/cli/jest/nodeModulesPaths.ts
11026
11226
  function nodeModulesPaths(basedir, options) {
11027
11227
  const modules = options && options.moduleDirectory ? Array.from(options.moduleDirectory) : ["node_modules"];
11028
- const basedirAbs = path3.resolve(basedir);
11228
+ const basedirAbs = path2.resolve(basedir);
11029
11229
  let prefix = "/";
11030
11230
  if (/^([A-Za-z]:)/.test(basedirAbs)) {
11031
11231
  prefix = "";
@@ -11039,19 +11239,19 @@ function nodeModulesPaths(basedir, options) {
11039
11239
  physicalBasedir = basedirAbs;
11040
11240
  }
11041
11241
  const paths = [physicalBasedir];
11042
- let parsed = path3.parse(physicalBasedir);
11242
+ let parsed = path2.parse(physicalBasedir);
11043
11243
  while (parsed.dir !== paths[paths.length - 1]) {
11044
11244
  paths.push(parsed.dir);
11045
- parsed = path3.parse(parsed.dir);
11245
+ parsed = path2.parse(parsed.dir);
11046
11246
  }
11047
11247
  const dirs = paths.reduce((dirs2, aPath) => {
11048
11248
  for (const moduleDir of modules) {
11049
- if (path3.isAbsolute(moduleDir)) {
11249
+ if (path2.isAbsolute(moduleDir)) {
11050
11250
  if (aPath === basedirAbs && moduleDir) {
11051
11251
  dirs2.push(moduleDir);
11052
11252
  }
11053
11253
  } else {
11054
- dirs2.push(path3.join(prefix, aPath, moduleDir));
11254
+ dirs2.push(path2.join(prefix, aPath, moduleDir));
11055
11255
  }
11056
11256
  }
11057
11257
  return dirs2;
@@ -11062,8 +11262,8 @@ function nodeModulesPaths(basedir, options) {
11062
11262
  return dirs;
11063
11263
  }
11064
11264
  function findGlobalPaths() {
11065
- const { root } = path3.parse(process.cwd());
11066
- const globalPath = path3.join(root, "node_modules");
11265
+ const { root } = path2.parse(process.cwd());
11266
+ const globalPath = path2.join(root, "node_modules");
11067
11267
  const resolvePaths = require.resolve.paths("/");
11068
11268
  if (resolvePaths) {
11069
11269
  const rootIndex = resolvePaths.indexOf(globalPath);
@@ -11073,12 +11273,12 @@ function findGlobalPaths() {
11073
11273
  }
11074
11274
  var GlobalPaths = findGlobalPaths();
11075
11275
 
11076
- // src/functions/load-module.ts
11077
- var import_path2 = __toESM(require("path"));
11276
+ // src/cli/functions/load-module.ts
11277
+ var import_path = __toESM(require("path"));
11078
11278
  function evalWithModuleContext(inFile, evalFn) {
11079
11279
  const modulePaths = [...module.paths];
11080
11280
  try {
11081
- module.paths = nodeModulesPaths(import_path2.default.dirname(inFile), {});
11281
+ module.paths = nodeModulesPaths(import_path.default.dirname(inFile), {});
11082
11282
  return evalFn();
11083
11283
  } finally {
11084
11284
  module.paths = modulePaths;
@@ -11098,7 +11298,7 @@ function loadModule({
11098
11298
  globalThis._lazy_load = true;
11099
11299
  globalThis.__inherited_braintrust_state = _internalGetGlobalState();
11100
11300
  const __filename2 = inFile;
11101
- const __dirname = (0, import_path2.dirname)(__filename2);
11301
+ const __dirname = (0, import_path.dirname)(__filename2);
11102
11302
  new Function("require", "module", "__filename", "__dirname", moduleText)(
11103
11303
  require,
11104
11304
  module,
@@ -11109,8 +11309,8 @@ function loadModule({
11109
11309
  });
11110
11310
  }
11111
11311
 
11112
- // src/functions/infer-source.ts
11113
- var import_path3 = __toESM(require("path"));
11312
+ // src/cli/functions/infer-source.ts
11313
+ var import_path2 = __toESM(require("path"));
11114
11314
  async function makeSourceMapContext({
11115
11315
  inFile,
11116
11316
  outFile,
@@ -11129,7 +11329,7 @@ async function makeSourceMapContext({
11129
11329
  inFiles: { [inFile]: inFileContents.split("\n") },
11130
11330
  outFileModule: loadModule({ inFile, moduleText: outFileContents }),
11131
11331
  outFileLines: outFileContents.split("\n"),
11132
- sourceMapDir: import_path3.default.dirname(sourceMapFile),
11332
+ sourceMapDir: import_path2.default.dirname(sourceMapFile),
11133
11333
  sourceMap
11134
11334
  };
11135
11335
  }
@@ -11200,7 +11400,7 @@ async function findCodeDefinition({
11200
11400
  return void 0;
11201
11401
  }
11202
11402
  if (!inFiles[originalPosition.source]) {
11203
- const originalFile = import_path3.default.join(sourceMapDir, originalPosition.source);
11403
+ const originalFile = import_path2.default.join(sourceMapDir, originalPosition.source);
11204
11404
  inFiles[originalPosition.source] = (await fs2.readFile(originalFile, "utf-8")).split("\n");
11205
11405
  }
11206
11406
  const originalLines = inFiles[originalPosition.source];
@@ -11256,8 +11456,7 @@ async function getTsModule() {
11256
11456
  return tsModule;
11257
11457
  }
11258
11458
 
11259
- // src/functions/upload.ts
11260
- var import_slugify2 = __toESM(require("slugify"));
11459
+ // src/cli/functions/upload.ts
11261
11460
  var import_zod_to_json_schema = require("zod-to-json-schema");
11262
11461
  var import_pluralize2 = __toESM(require("pluralize"));
11263
11462
  var pathInfoSchema = import_v311.z.strictObject({
@@ -11441,7 +11640,7 @@ async function uploadBundles({
11441
11640
  if (isEmpty2(bundleFileName)) {
11442
11641
  throw new Error("No bundle file found");
11443
11642
  }
11444
- const bundleFile = import_path4.default.resolve(bundleFileName);
11643
+ const bundleFile = import_path3.default.resolve(bundleFileName);
11445
11644
  const uploadPromise = (async () => {
11446
11645
  if (!pathInfo) {
11447
11646
  return true;
@@ -11532,11 +11731,11 @@ function formatNameAndSlug(pieces) {
11532
11731
  const nonEmptyPieces = pieces.filter((piece) => piece.trim() !== "");
11533
11732
  return {
11534
11733
  name: capitalize(nonEmptyPieces.join(" ")),
11535
- slug: (0, import_slugify2.default)(nonEmptyPieces.join("-"))
11734
+ slug: slugify(nonEmptyPieces.join("-"))
11536
11735
  };
11537
11736
  }
11538
11737
 
11539
- // src/cli-util/bundle.ts
11738
+ // src/cli/util/bundle.ts
11540
11739
  var import_env = require("@next/env");
11541
11740
  var dotenv = __toESM(require("dotenv"));
11542
11741
  async function loadCLIEnv(args) {
@@ -11603,12 +11802,11 @@ async function bundleCommand(args) {
11603
11802
  }
11604
11803
  }
11605
11804
 
11606
- // src/cli-util/pull.ts
11805
+ // src/cli/util/pull.ts
11607
11806
  var import_v312 = require("zod/v3");
11608
11807
  var import_promises = __toESM(require("fs/promises"));
11609
- var import_util11 = __toESM(require("util"));
11610
- var import_slugify3 = __toESM(require("slugify"));
11611
- var import_path5 = __toESM(require("path"));
11808
+ var import_util12 = __toESM(require("util"));
11809
+ var import_path4 = __toESM(require("path"));
11612
11810
  var import_pluralize3 = __toESM(require("pluralize"));
11613
11811
  async function pullCommand(args) {
11614
11812
  await loadCLIEnv(args);
@@ -11650,15 +11848,15 @@ async function pullCommand(args) {
11650
11848
  const repoRoot = await git?.revparse(["--show-toplevel"]);
11651
11849
  const dirtyFiles = new Set(
11652
11850
  (diffSummary?.files ?? []).map(
11653
- (f) => import_path5.default.resolve(repoRoot ?? ".", f.file)
11851
+ (f) => import_path4.default.resolve(repoRoot ?? ".", f.file)
11654
11852
  )
11655
11853
  );
11656
11854
  for (const projectName of Object.keys(projectNameToFunctions)) {
11657
- const projectFile = import_path5.default.join(
11855
+ const projectFile = import_path4.default.join(
11658
11856
  outputDir,
11659
- `${(0, import_slugify3.default)(projectName, { lower: true, strict: true, trim: true })}.ts`
11857
+ `${slugify(projectName, { lower: true, strict: true, trim: true })}.ts`
11660
11858
  );
11661
- const resolvedProjectFile = import_path5.default.resolve(projectFile);
11859
+ const resolvedProjectFile = import_path4.default.resolve(projectFile);
11662
11860
  const fileExists = await import_promises.default.stat(projectFile).then(
11663
11861
  () => true,
11664
11862
  () => false
@@ -11878,7 +12076,7 @@ function safeStringify(obj) {
11878
12076
  return JSON.stringify(obj, null, 2);
11879
12077
  } catch (error2) {
11880
12078
  try {
11881
- return import_util11.default.inspect(obj, {
12079
+ return import_util12.default.inspect(obj, {
11882
12080
  depth: 5,
11883
12081
  maxStringLength: 1e3,
11884
12082
  breakLength: 80,
@@ -12426,7 +12624,7 @@ function makeEvalParametersSchema(parameters) {
12426
12624
  );
12427
12625
  }
12428
12626
 
12429
- // src/cli-util/external-packages-plugin.ts
12627
+ // src/cli/util/external-packages-plugin.ts
12430
12628
  function createMarkKnownPackagesExternalPlugin(additionalPackages = []) {
12431
12629
  return {
12432
12630
  name: "make-known-packages-external",
@@ -12458,7 +12656,7 @@ function createMarkKnownPackagesExternalPlugin(additionalPackages = []) {
12458
12656
  };
12459
12657
  }
12460
12658
 
12461
- // src/cli.ts
12659
+ // src/cli/index.ts
12462
12660
  var { version } = require_package();
12463
12661
  var INCLUDE_EVAL = [
12464
12662
  "**/*.eval.ts",
@@ -12512,7 +12710,7 @@ function resolveReporter(reporter, reporters) {
12512
12710
  } else if (!isEmpty2(reporter)) {
12513
12711
  return reporter;
12514
12712
  } else if (Object.keys(reporters).length === 0) {
12515
- return defaultReporter;
12713
+ return fancyReporter;
12516
12714
  } else if (Object.keys(reporters).length === 1) {
12517
12715
  return reporters[Object.keys(reporters)[0]];
12518
12716
  } else {
@@ -12719,7 +12917,7 @@ function updateEvaluators(evaluators, buildResults, opts) {
12719
12917
  )) {
12720
12918
  if (evaluators.reporters[reporterName] && evaluators.reporters[reporterName] !== reporter) {
12721
12919
  console.warn(
12722
- warning(
12920
+ warning2(
12723
12921
  `Reporter '${reporterName}' already exists. Will skip '${reporterName}' from ${result.sourceFile}.`
12724
12922
  )
12725
12923
  );
@@ -12851,7 +13049,7 @@ async function runOnce(handles, opts) {
12851
13049
  return allSuccess;
12852
13050
  }
12853
13051
  function checkMatch(pathInput, include_patterns, exclude_patterns) {
12854
- const p = import_path6.default.resolve(pathInput);
13052
+ const p = import_path5.default.resolve(pathInput);
12855
13053
  if (include_patterns !== null) {
12856
13054
  let include = false;
12857
13055
  for (const pattern of include_patterns) {
@@ -12893,14 +13091,14 @@ async function collectFiles(inputPath, mode) {
12893
13091
  )) {
12894
13092
  const prefix = mode === "eval" ? ".eval" : "";
12895
13093
  console.warn(
12896
- warning(
13094
+ warning2(
12897
13095
  `Reading ${inputPath} because it was specified directly. Rename it to end in ${prefix}.ts or .${prefix}.js to include it automatically when you specify a directory.`
12898
13096
  )
12899
13097
  );
12900
13098
  }
12901
13099
  files.push(inputPath);
12902
13100
  } else {
12903
- const walked = await import_util14.default.promisify(fsWalk.walk)(inputPath, {
13101
+ const walked = await import_util15.default.promisify(fsWalk.walk)(inputPath, {
12904
13102
  deepFilter: (entry) => {
12905
13103
  return checkMatch(entry.path, null, EXCLUDE);
12906
13104
  },
@@ -12935,8 +13133,8 @@ var nativeNodeModulesPlugin = {
12935
13133
  };
12936
13134
  build2.onResolve({ filter: /\.node$/ }, (args) => {
12937
13135
  try {
12938
- const path9 = require.resolve(args.path, { paths: [args.resolveDir] });
12939
- const match = path9.match(
13136
+ const path8 = require.resolve(args.path, { paths: [args.resolveDir] });
13137
+ const match = path8.match(
12940
13138
  /node_modules[/\\]((?:@[^/\\]+[/\\])?[^/\\]+)/
12941
13139
  );
12942
13140
  if (match) {
@@ -13006,30 +13204,30 @@ async function initializeHandles({
13006
13204
  const newFiles = await collectFiles(inputPath, mode);
13007
13205
  if (newFiles.length == 0) {
13008
13206
  console.warn(
13009
- warning(
13207
+ warning2(
13010
13208
  `Provided path ${inputPath} is not an eval file or a directory containing eval files, skipping...`
13011
13209
  )
13012
13210
  );
13013
13211
  }
13014
13212
  for (const file of newFiles) {
13015
- files[import_path6.default.resolve(file)] = true;
13213
+ files[import_path5.default.resolve(file)] = true;
13016
13214
  }
13017
13215
  }
13018
13216
  if (Object.keys(files).length == 0) {
13019
13217
  console.warn(
13020
- warning("No eval files were found in any of the provided paths.")
13218
+ warning2("No eval files were found in any of the provided paths.")
13021
13219
  );
13022
13220
  process.exit(0);
13023
13221
  }
13024
- const tmpDir = import_path6.default.join(import_os.default.tmpdir(), `btevals-${(0, import_uuid3.v4)().slice(0, 8)}`);
13222
+ const tmpDir = import_path5.default.join(import_os.default.tmpdir(), `btevals-${(0, import_uuid3.v4)().slice(0, 8)}`);
13025
13223
  const initPromises = [];
13026
13224
  for (const file of Object.keys(files)) {
13027
- const baseName = `${import_path6.default.basename(
13225
+ const baseName = `${import_path5.default.basename(
13028
13226
  file,
13029
- import_path6.default.extname(file)
13227
+ import_path5.default.extname(file)
13030
13228
  )}-${(0, import_uuid3.v4)().slice(0, 8)}`;
13031
- const outFile = import_path6.default.join(tmpDir, `${baseName}.${OUT_EXT}`);
13032
- const bundleFile = import_path6.default.join(tmpDir, `${baseName}.bundle.js`);
13229
+ const outFile = import_path5.default.join(tmpDir, `${baseName}.${OUT_EXT}`);
13230
+ const bundleFile = import_path5.default.join(tmpDir, `${baseName}.bundle.js`);
13033
13231
  initPromises.push(
13034
13232
  initFile({
13035
13233
  inFile: file,