braintrust 3.23.1 → 3.24.0

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 (51) hide show
  1. package/dev/dist/index.d.mts +6 -0
  2. package/dev/dist/index.d.ts +6 -0
  3. package/dev/dist/index.js +902 -586
  4. package/dev/dist/index.mjs +320 -4
  5. package/dist/apply-auto-instrumentation.js +211 -189
  6. package/dist/apply-auto-instrumentation.mjs +23 -1
  7. package/dist/auto-instrumentations/bundler/esbuild.cjs +40 -0
  8. package/dist/auto-instrumentations/bundler/esbuild.mjs +2 -2
  9. package/dist/auto-instrumentations/bundler/next.cjs +40 -0
  10. package/dist/auto-instrumentations/bundler/next.mjs +3 -3
  11. package/dist/auto-instrumentations/bundler/rollup.cjs +40 -0
  12. package/dist/auto-instrumentations/bundler/rollup.mjs +2 -2
  13. package/dist/auto-instrumentations/bundler/vite.cjs +40 -0
  14. package/dist/auto-instrumentations/bundler/vite.d.mts +1 -1
  15. package/dist/auto-instrumentations/bundler/vite.d.ts +1 -1
  16. package/dist/auto-instrumentations/bundler/vite.mjs +2 -2
  17. package/dist/auto-instrumentations/bundler/webpack-loader.cjs +40 -0
  18. package/dist/auto-instrumentations/bundler/webpack.cjs +40 -0
  19. package/dist/auto-instrumentations/bundler/webpack.mjs +3 -3
  20. package/dist/auto-instrumentations/{chunk-KIMLYPRW.mjs → chunk-BURMPO7L.mjs} +1 -1
  21. package/dist/auto-instrumentations/{chunk-YXLNSAMJ.mjs → chunk-F43DNLPD.mjs} +40 -0
  22. package/dist/auto-instrumentations/{chunk-EXY7QCJD.mjs → chunk-GSZHTAQW.mjs} +1 -1
  23. package/dist/auto-instrumentations/hook.mjs +150 -1
  24. package/dist/auto-instrumentations/index.cjs +40 -0
  25. package/dist/auto-instrumentations/index.mjs +1 -1
  26. package/dist/browser.d.mts +131 -9
  27. package/dist/browser.d.ts +131 -9
  28. package/dist/browser.js +703 -65
  29. package/dist/browser.mjs +703 -65
  30. package/dist/{chunk-CDIKAHDZ.js → chunk-7AUY2XWX.js} +21 -1
  31. package/dist/{chunk-36IPYKMG.mjs → chunk-7F6GCRHH.mjs} +20 -0
  32. package/dist/{chunk-B6ZQIAK3.js → chunk-SU6EHKJV.js} +1085 -799
  33. package/dist/{chunk-RBXD2KYN.mjs → chunk-XE5FS7QY.mjs} +291 -5
  34. package/dist/cli.js +328 -8
  35. package/dist/edge-light.js +703 -65
  36. package/dist/edge-light.mjs +703 -65
  37. package/dist/index.d.mts +131 -9
  38. package/dist/index.d.ts +131 -9
  39. package/dist/index.js +891 -532
  40. package/dist/index.mjs +423 -64
  41. package/dist/instrumentation/index.d.mts +130 -9
  42. package/dist/instrumentation/index.d.ts +130 -9
  43. package/dist/instrumentation/index.js +601 -65
  44. package/dist/instrumentation/index.mjs +601 -65
  45. package/dist/vitest-evals-reporter.js +17 -16
  46. package/dist/vitest-evals-reporter.mjs +3 -2
  47. package/dist/workerd.js +703 -65
  48. package/dist/workerd.mjs +703 -65
  49. package/package.json +3 -3
  50. package/util/dist/index.js +4 -0
  51. package/util/dist/index.mjs +4 -0
package/dist/cli.js CHANGED
@@ -7,7 +7,11 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
7
7
  var __getProtoOf = Object.getPrototypeOf;
8
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
9
  var __commonJS = (cb, mod) => function __require() {
10
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10
+ try {
11
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
12
+ } catch (e) {
13
+ throw mod = 0, e;
14
+ }
11
15
  };
12
16
  var __export = (target, all) => {
13
17
  for (var name in all)
@@ -1232,7 +1236,7 @@ var require_package = __commonJS({
1232
1236
  "package.json"(exports2, module2) {
1233
1237
  module2.exports = {
1234
1238
  name: "braintrust",
1235
- version: "3.23.1",
1239
+ version: "3.24.0",
1236
1240
  description: "SDK for integrating Braintrust",
1237
1241
  repository: {
1238
1242
  type: "git",
@@ -1438,7 +1442,7 @@ var require_package = __commonJS({
1438
1442
  typedoc: "^0.25.13",
1439
1443
  "typedoc-plugin-markdown": "^3.17.1",
1440
1444
  typescript: "5.4.4",
1441
- vite: "^6.4.3",
1445
+ vite: "^8.1.5",
1442
1446
  "vite-tsconfig-paths": "^4.3.2",
1443
1447
  vitest: "4.1.5",
1444
1448
  webpack: "^5.106.2",
@@ -1458,7 +1462,7 @@ var require_package = __commonJS({
1458
1462
  cors: "^2.8.5",
1459
1463
  "dc-browser": "^1.0.4",
1460
1464
  dotenv: "^16.4.5",
1461
- esbuild: "0.28.0",
1465
+ esbuild: "0.28.1",
1462
1466
  esquery: "^1.7.0",
1463
1467
  "eventsource-parser": "^1.1.2",
1464
1468
  express: "^5.2.1",
@@ -1537,6 +1541,7 @@ var DefaultChannel = class {
1537
1541
  constructor(name) {
1538
1542
  this.name = name;
1539
1543
  }
1544
+ name;
1540
1545
  hasSubscribers = false;
1541
1546
  subscribe(_subscription) {
1542
1547
  }
@@ -2586,6 +2591,7 @@ var SpanComponentsV3 = class _SpanComponentsV3 {
2586
2591
  constructor(data) {
2587
2592
  this.data = data;
2588
2593
  }
2594
+ data;
2589
2595
  toStr() {
2590
2596
  const jsonObj = {
2591
2597
  compute_object_metadata_args: this.data.compute_object_metadata_args || void 0,
@@ -3104,6 +3110,7 @@ var SpanComponentsV4 = class _SpanComponentsV4 {
3104
3110
  constructor(data) {
3105
3111
  this.data = data;
3106
3112
  }
3113
+ data;
3107
3114
  toStr() {
3108
3115
  const jsonObj = {
3109
3116
  compute_object_metadata_args: this.data.compute_object_metadata_args || void 0,
@@ -6353,6 +6360,97 @@ var SpanCache = class {
6353
6360
  }
6354
6361
  };
6355
6362
 
6363
+ // src/span-origin.ts
6364
+ var SDK_VERSION = true ? "3.24.0" : "0.0.0";
6365
+ function detectSpanOriginEnvironment(explicit) {
6366
+ if (explicit) return explicit;
6367
+ const envType = isomorph_default.getEnv("BRAINTRUST_ENVIRONMENT_TYPE");
6368
+ const envName = isomorph_default.getEnv("BRAINTRUST_ENVIRONMENT_NAME");
6369
+ if (envType || envName) {
6370
+ return {
6371
+ ...envType ? { type: envType } : {},
6372
+ ...envName ? { name: envName } : {}
6373
+ };
6374
+ }
6375
+ const ci = firstPresent([
6376
+ ["GITHUB_ACTIONS", "github_actions"],
6377
+ ["GITLAB_CI", "gitlab_ci"],
6378
+ ["CIRCLECI", "circleci"],
6379
+ ["BUILDKITE", "buildkite"],
6380
+ ["JENKINS_URL", "jenkins"],
6381
+ ["JENKINS_HOME", "jenkins"],
6382
+ ["TF_BUILD", "azure_pipelines"],
6383
+ ["TEAMCITY_VERSION", "teamcity"],
6384
+ ["TRAVIS", "travis"],
6385
+ ["BITBUCKET_BUILD_NUMBER", "bitbucket"]
6386
+ ]);
6387
+ if (ci) return { type: "ci", name: ci };
6388
+ if (isomorph_default.getEnv("CI")) return { type: "ci", name: "ci" };
6389
+ const earlyServer = firstPresent([
6390
+ ["VERCEL", "vercel"],
6391
+ ["NETLIFY", "netlify"]
6392
+ ]);
6393
+ if (earlyServer) return { type: "server", name: earlyServer };
6394
+ if (isomorph_default.getEnv("ECS_CONTAINER_METADATA_URI") || isomorph_default.getEnv("ECS_CONTAINER_METADATA_URI_V4")) {
6395
+ return { type: "server", name: "ecs" };
6396
+ }
6397
+ const awsExecutionEnv = isomorph_default.getEnv("AWS_EXECUTION_ENV");
6398
+ if (awsExecutionEnv?.startsWith("AWS_ECS_")) {
6399
+ return { type: "server", name: "ecs" };
6400
+ }
6401
+ if (awsExecutionEnv?.startsWith("AWS_Lambda_")) {
6402
+ return { type: "server", name: "aws_lambda" };
6403
+ }
6404
+ if (isomorph_default.getEnv("AWS_LAMBDA_FUNCTION_NAME")) {
6405
+ return { type: "server", name: "aws_lambda" };
6406
+ }
6407
+ const server = firstPresent([
6408
+ ["K_SERVICE", "cloud_run"],
6409
+ ["FUNCTION_TARGET", "gcp_functions"],
6410
+ ["KUBERNETES_SERVICE_HOST", "kubernetes"],
6411
+ ["DYNO", "heroku"],
6412
+ ["FLY_APP_NAME", "fly"],
6413
+ ["RAILWAY_ENVIRONMENT", "railway"],
6414
+ ["RENDER_SERVICE_NAME", "render"]
6415
+ ]);
6416
+ if (server) return { type: "server", name: server };
6417
+ return deploymentModeEnvironment("NODE_ENV", isomorph_default.getEnv("NODE_ENV"));
6418
+ }
6419
+ function makeSpanOrigin(instrumentationName, environment) {
6420
+ return {
6421
+ name: "braintrust.sdk.javascript",
6422
+ version: SDK_VERSION,
6423
+ instrumentation: { name: instrumentationName },
6424
+ ...environment ? { environment } : {}
6425
+ };
6426
+ }
6427
+ function mergeSpanOriginContext(context2, instrumentationName, environment) {
6428
+ const next = { ...context2 ?? {} };
6429
+ const current = isObject2(next.span_origin) ? { ...next.span_origin } : {};
6430
+ next.span_origin = {
6431
+ ...makeSpanOrigin(instrumentationName, environment),
6432
+ ...current
6433
+ };
6434
+ return next;
6435
+ }
6436
+ function firstPresent(entries) {
6437
+ return entries.find(([key]) => Boolean(isomorph_default.getEnv(key)))?.[1];
6438
+ }
6439
+ function deploymentModeEnvironment(_key, value) {
6440
+ if (!value) return void 0;
6441
+ const normalized = value.toLowerCase();
6442
+ if (normalized === "production" || normalized === "staging") {
6443
+ return { type: "server", name: normalized };
6444
+ }
6445
+ if (normalized === "development" || normalized === "local") {
6446
+ return { type: "local", name: normalized };
6447
+ }
6448
+ return { name: value };
6449
+ }
6450
+ function isObject2(value) {
6451
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6452
+ }
6453
+
6356
6454
  // src/logger.ts
6357
6455
  var BRAINTRUST_ATTACHMENT = BraintrustAttachmentReference.shape.type.value;
6358
6456
  var EXTERNAL_ATTACHMENT = ExternalAttachmentReference.shape.type.value;
@@ -6401,6 +6499,7 @@ var LoginInvalidOrgError = class extends Error {
6401
6499
  super(message);
6402
6500
  this.message = message;
6403
6501
  }
6502
+ message;
6404
6503
  };
6405
6504
  var REDACTION_FIELDS = [
6406
6505
  "input",
@@ -6416,6 +6515,8 @@ var MaskingError = class {
6416
6515
  this.fieldName = fieldName;
6417
6516
  this.errorType = errorType;
6418
6517
  }
6518
+ fieldName;
6519
+ errorType;
6419
6520
  get errorMsg() {
6420
6521
  return `ERROR: Failed to mask field '${this.fieldName}' - ${this.errorType}`;
6421
6522
  }
@@ -6625,7 +6726,9 @@ var BraintrustState = class _BraintrustState {
6625
6726
  diskCache: parametersDiskCache
6626
6727
  });
6627
6728
  this.spanCache = new SpanCache({ disabled: loginParams.disableSpanCache });
6729
+ this.spanOriginEnvironment = detectSpanOriginEnvironment();
6628
6730
  }
6731
+ loginParams;
6629
6732
  id;
6630
6733
  currentExperiment;
6631
6734
  // Note: the value of IsAsyncFlush doesn't really matter here, since we
@@ -6660,6 +6763,7 @@ var BraintrustState = class _BraintrustState {
6660
6763
  _idGenerator = null;
6661
6764
  _contextManager = null;
6662
6765
  _otelFlushCallback = null;
6766
+ spanOriginEnvironment;
6663
6767
  resetLoginInfo() {
6664
6768
  this.appUrl = null;
6665
6769
  this.appPublicUrl = null;
@@ -9013,6 +9117,7 @@ function initLogger(options = {}) {
9013
9117
  orgName,
9014
9118
  forceLogin,
9015
9119
  debugLogLevel,
9120
+ environment,
9016
9121
  fetch: fetch2,
9017
9122
  state: stateArg
9018
9123
  } = options || {};
@@ -9029,6 +9134,7 @@ function initLogger(options = {}) {
9029
9134
  };
9030
9135
  const state = stateArg ?? _globalState;
9031
9136
  state.setDebugLogLevel(debugLogLevel);
9137
+ state.spanOriginEnvironment = detectSpanOriginEnvironment(environment);
9032
9138
  state.enforceQueueSizeLimit(true);
9033
9139
  const lazyMetadata = new LazyValue(
9034
9140
  async () => {
@@ -9737,6 +9843,11 @@ var ObjectFetcher = class {
9737
9843
  this._internal_btql = _internal_btql;
9738
9844
  this._internalBrainstoreRealtime = _internalBrainstoreRealtime;
9739
9845
  }
9846
+ objectType;
9847
+ pinnedVersion;
9848
+ mutateRecord;
9849
+ _internal_btql;
9850
+ _internalBrainstoreRealtime;
9740
9851
  _fetchedData = void 0;
9741
9852
  get id() {
9742
9853
  throw new Error("ObjectFetcher subclasses must have an 'id' attribute");
@@ -10175,6 +10286,8 @@ var ReadonlyExperiment = class extends ObjectFetcher {
10175
10286
  this.state = state;
10176
10287
  this.lazyMetadata = lazyMetadata;
10177
10288
  }
10289
+ state;
10290
+ lazyMetadata;
10178
10291
  get id() {
10179
10292
  return (async () => {
10180
10293
  return (await this.lazyMetadata.get()).experiment.id;
@@ -10297,7 +10410,11 @@ var SpanImpl = class _SpanImpl {
10297
10410
  metrics: {
10298
10411
  start: args.startTime ?? getCurrentUnixTimestamp()
10299
10412
  },
10300
- context: { ...callerLocation },
10413
+ context: mergeSpanOriginContext(
10414
+ { ...callerLocation },
10415
+ "braintrust-js-logger",
10416
+ this._state.spanOriginEnvironment
10417
+ ),
10301
10418
  span_attributes: {
10302
10419
  name,
10303
10420
  type,
@@ -10671,6 +10788,7 @@ var Dataset2 = class extends ObjectFetcher {
10671
10788
  this.pinnedEnvironment = pinState?.pinnedEnvironment;
10672
10789
  this.pinnedSnapshotName = pinState?.pinnedSnapshotName;
10673
10790
  }
10791
+ state;
10674
10792
  lazyMetadata;
10675
10793
  __braintrust_dataset_marker = true;
10676
10794
  newRecords = 0;
@@ -11182,6 +11300,9 @@ var Prompt2 = class _Prompt {
11182
11300
  this.noTrace = noTrace;
11183
11301
  void this.__braintrust_prompt_marker;
11184
11302
  }
11303
+ metadata;
11304
+ defaults;
11305
+ noTrace;
11185
11306
  parsedPromptData;
11186
11307
  hasParsedPromptData = false;
11187
11308
  __braintrust_prompt_marker = true;
@@ -11419,6 +11540,7 @@ var RemoteEvalParameters = class {
11419
11540
  this.metadata = metadata;
11420
11541
  void this.__braintrust_parameters_marker;
11421
11542
  }
11543
+ metadata;
11422
11544
  __braintrust_parameters_marker = true;
11423
11545
  get id() {
11424
11546
  return this.metadata.id;
@@ -12663,6 +12785,10 @@ var SpanFetcher = class _SpanFetcher extends ObjectFetcher {
12663
12785
  this._state = _state;
12664
12786
  this.spanTypeFilter = spanTypeFilter;
12665
12787
  }
12788
+ _objectId;
12789
+ rootSpanId;
12790
+ _state;
12791
+ spanTypeFilter;
12666
12792
  static buildFilter(rootSpanId, spanTypeFilter, includeScorers = false) {
12667
12793
  const children = [
12668
12794
  // Base filter: root_span_id = 'value'
@@ -13097,6 +13223,8 @@ var EvalResultWithSummary = class {
13097
13223
  this.summary = summary;
13098
13224
  this.results = results;
13099
13225
  }
13226
+ summary;
13227
+ results;
13100
13228
  /**
13101
13229
  * @deprecated Use `summary` instead.
13102
13230
  */
@@ -18877,6 +19005,24 @@ var aiSDKChannels = defineChannels("ai", {
18877
19005
  kind: "sync-stream"
18878
19006
  })
18879
19007
  });
19008
+ var harnessAgentChannels = defineChannels("@ai-sdk/harness", {
19009
+ generate: channel({
19010
+ channelName: "HarnessAgent.generate",
19011
+ kind: "async"
19012
+ }),
19013
+ stream: channel({
19014
+ channelName: "HarnessAgent.stream",
19015
+ kind: "async"
19016
+ }),
19017
+ continueGenerate: channel({
19018
+ channelName: "HarnessAgent.continueGenerate",
19019
+ kind: "async"
19020
+ }),
19021
+ continueStream: channel({
19022
+ channelName: "HarnessAgent.continueStream",
19023
+ kind: "async"
19024
+ })
19025
+ });
18880
19026
 
18881
19027
  // src/instrumentation/plugins/ai-sdk-plugin.ts
18882
19028
  var DEFAULT_DENY_OUTPUT_PATHS = [
@@ -19145,6 +19291,84 @@ var AISDKPlugin = class extends BasePlugin {
19145
19291
  })
19146
19292
  })
19147
19293
  );
19294
+ this.unsubscribers.push(
19295
+ traceStreamingChannel(harnessAgentChannels.generate, {
19296
+ name: "HarnessAgent.generate",
19297
+ type: "task" /* TASK */,
19298
+ extractInput: ([params], event) => prepareAISDKHarnessAgentInput(params, event.self),
19299
+ extractOutput: (result, endEvent) => processAISDKOutput(
19300
+ result,
19301
+ resolveDenyOutputPaths(endEvent, denyOutputPaths)
19302
+ ),
19303
+ extractMetrics: (result) => extractTokenMetrics(result),
19304
+ aggregateChunks: aggregateAISDKChunks
19305
+ })
19306
+ );
19307
+ this.unsubscribers.push(
19308
+ traceStreamingChannel(harnessAgentChannels.stream, {
19309
+ name: "HarnessAgent.stream",
19310
+ type: "task" /* TASK */,
19311
+ extractInput: ([params], event) => prepareAISDKHarnessAgentInput(params, event.self),
19312
+ extractOutput: (result, endEvent) => processAISDKOutput(
19313
+ result,
19314
+ resolveDenyOutputPaths(endEvent, denyOutputPaths)
19315
+ ),
19316
+ extractMetrics: (result, startTime) => ({
19317
+ ...extractTokenMetrics(result),
19318
+ ...startTime === void 0 ? {} : {
19319
+ time_to_first_token: getCurrentUnixTimestamp() - startTime
19320
+ }
19321
+ }),
19322
+ aggregateChunks: aggregateAISDKChunks,
19323
+ patchResult: ({ endEvent, result, span, startTime }) => patchAISDKStreamingResult({
19324
+ defaultDenyOutputPaths: denyOutputPaths,
19325
+ endEvent,
19326
+ result,
19327
+ resolvePromiseUsage: true,
19328
+ span,
19329
+ startTime
19330
+ })
19331
+ })
19332
+ );
19333
+ this.unsubscribers.push(
19334
+ traceStreamingChannel(harnessAgentChannels.continueGenerate, {
19335
+ name: "HarnessAgent.continueGenerate",
19336
+ type: "task" /* TASK */,
19337
+ extractInput: ([params], event) => prepareAISDKHarnessAgentInput(params, event.self),
19338
+ extractOutput: (result, endEvent) => processAISDKOutput(
19339
+ result,
19340
+ resolveDenyOutputPaths(endEvent, denyOutputPaths)
19341
+ ),
19342
+ extractMetrics: (result) => extractTokenMetrics(result),
19343
+ aggregateChunks: aggregateAISDKChunks
19344
+ })
19345
+ );
19346
+ this.unsubscribers.push(
19347
+ traceStreamingChannel(harnessAgentChannels.continueStream, {
19348
+ name: "HarnessAgent.continueStream",
19349
+ type: "task" /* TASK */,
19350
+ extractInput: ([params], event) => prepareAISDKHarnessAgentInput(params, event.self),
19351
+ extractOutput: (result, endEvent) => processAISDKOutput(
19352
+ result,
19353
+ resolveDenyOutputPaths(endEvent, denyOutputPaths)
19354
+ ),
19355
+ extractMetrics: (result, startTime) => ({
19356
+ ...extractTokenMetrics(result),
19357
+ ...startTime === void 0 ? {} : {
19358
+ time_to_first_token: getCurrentUnixTimestamp() - startTime
19359
+ }
19360
+ }),
19361
+ aggregateChunks: aggregateAISDKChunks,
19362
+ patchResult: ({ endEvent, result, span, startTime }) => patchAISDKStreamingResult({
19363
+ defaultDenyOutputPaths: denyOutputPaths,
19364
+ endEvent,
19365
+ result,
19366
+ resolvePromiseUsage: true,
19367
+ span,
19368
+ startTime
19369
+ })
19370
+ })
19371
+ );
19148
19372
  this.unsubscribers.push(
19149
19373
  traceStreamingChannel(aiSDKChannels.toolLoopAgentGenerate, {
19150
19374
  name: "ToolLoopAgent.generate",
@@ -19675,6 +19899,45 @@ function prepareAISDKCallInput(params, event, span, defaultDenyOutputPaths, chil
19675
19899
  metadata
19676
19900
  };
19677
19901
  }
19902
+ function prepareAISDKHarnessAgentInput(params, self) {
19903
+ if (isObject(self)) {
19904
+ try {
19905
+ if (isObject(self.settings)) {
19906
+ const settings = self.settings;
19907
+ if (settings.telemetry === void 0) {
19908
+ Reflect.set(self, "settings", { ...settings, telemetry: {} });
19909
+ }
19910
+ }
19911
+ } catch {
19912
+ }
19913
+ }
19914
+ const selectedInput = {};
19915
+ if (params.prompt !== void 0) {
19916
+ selectedInput.prompt = params.prompt;
19917
+ }
19918
+ if (params.messages !== void 0) {
19919
+ selectedInput.messages = params.messages;
19920
+ }
19921
+ if (params.toolApprovalContinuations !== void 0) {
19922
+ selectedInput.toolApprovalContinuations = params.toolApprovalContinuations;
19923
+ }
19924
+ const metadata = extractMetadataFromCallParams({}, self);
19925
+ if (isObject(params.session) && typeof params.session.sessionId === "string") {
19926
+ metadata.sessionId = params.session.sessionId;
19927
+ }
19928
+ if (isObject(self)) {
19929
+ if (typeof self.harnessId === "string") {
19930
+ metadata.harnessId = self.harnessId;
19931
+ }
19932
+ if (typeof self.permissionMode === "string") {
19933
+ metadata.permissionMode = self.permissionMode;
19934
+ }
19935
+ }
19936
+ return {
19937
+ input: processAISDKCallInput(selectedInput).input,
19938
+ metadata
19939
+ };
19940
+ }
19678
19941
  function prepareAISDKWorkflowAgentStreamInput(params, event, span, defaultDenyOutputPaths) {
19679
19942
  registerWorkflowAgentWrapperSpan(span);
19680
19943
  const { input } = processAISDKWorkflowAgentCallInput(params);
@@ -20522,6 +20785,7 @@ function patchAISDKStreamingResult(args) {
20522
20785
  endEvent,
20523
20786
  onComplete,
20524
20787
  result,
20788
+ resolvePromiseUsage,
20525
20789
  span,
20526
20790
  startTime
20527
20791
  } = args;
@@ -20548,6 +20812,22 @@ function patchAISDKStreamingResult(args) {
20548
20812
  outputLogged = true;
20549
20813
  try {
20550
20814
  const metrics = extractTopLevelAISDKMetrics(result, endEvent);
20815
+ if (resolvePromiseUsage) {
20816
+ try {
20817
+ const resultRecord2 = result;
20818
+ const pendingUsage = resultRecord2.totalUsage ?? resultRecord2.usage;
20819
+ if (isPromiseLike(pendingUsage)) {
20820
+ const usage = await Promise.resolve(pendingUsage);
20821
+ if (isObject(usage)) {
20822
+ Object.assign(
20823
+ metrics,
20824
+ extractTokenMetrics({ usage })
20825
+ );
20826
+ }
20827
+ }
20828
+ } catch {
20829
+ }
20830
+ }
20551
20831
  if (metrics.time_to_first_token === void 0 && firstChunkTime !== void 0) {
20552
20832
  metrics.time_to_first_token = firstChunkTime - startTime;
20553
20833
  }
@@ -32805,6 +33085,16 @@ function cleanObject(obj) {
32805
33085
  })
32806
33086
  );
32807
33087
  }
33088
+ function normalizeTokenMetrics(obj) {
33089
+ const metrics = cleanObject(obj);
33090
+ if (metrics.total_tokens !== void 0) {
33091
+ metrics.tokens = metrics.total_tokens;
33092
+ } else if (metrics.prompt_tokens !== void 0 && metrics.completion_tokens !== void 0) {
33093
+ metrics.tokens = metrics.prompt_tokens + metrics.completion_tokens;
33094
+ }
33095
+ delete metrics.total_tokens;
33096
+ return metrics;
33097
+ }
32808
33098
  function walkGenerations(response) {
32809
33099
  const result = [];
32810
33100
  const generations = response.generations || [];
@@ -32851,7 +33141,7 @@ function getMetricsFromResponse(response) {
32851
33141
  continue;
32852
33142
  }
32853
33143
  const inputTokenDetails = usageMetadata.input_token_details;
32854
- return cleanObject({
33144
+ return normalizeTokenMetrics({
32855
33145
  total_tokens: usageMetadata.total_tokens,
32856
33146
  prompt_tokens: usageMetadata.input_tokens,
32857
33147
  completion_tokens: usageMetadata.output_tokens,
@@ -32861,7 +33151,7 @@ function getMetricsFromResponse(response) {
32861
33151
  }
32862
33152
  const llmOutput = response.llmOutput || {};
32863
33153
  const tokenUsage = isRecord(llmOutput.tokenUsage) ? llmOutput.tokenUsage : isRecord(llmOutput.estimatedTokens) ? llmOutput.estimatedTokens : {};
32864
- return cleanObject({
33154
+ return normalizeTokenMetrics({
32865
33155
  total_tokens: tokenUsage.totalTokens,
32866
33156
  prompt_tokens: tokenUsage.promptTokens,
32867
33157
  completion_tokens: tokenUsage.completionTokens
@@ -35971,7 +36261,13 @@ function configureNode() {
35971
36261
  isomorph_default.getPastNAncestors = getPastNAncestors;
35972
36262
  isomorph_default.getEnv = (name) => {
35973
36263
  const value = process.env[name];
35974
- return name === "BRAINTRUST_API_KEY" && !value?.trim() ? void 0 : value;
36264
+ if (name === "BRAINTRUST_API_KEY") {
36265
+ return value?.trim() ? value : void 0;
36266
+ }
36267
+ if ((name === "BRAINTRUST_ENVIRONMENT_TYPE" || name === "BRAINTRUST_ENVIRONMENT_NAME") && !value?.trim()) {
36268
+ return getNearestBraintrustEnvValue(name);
36269
+ }
36270
+ return value;
35975
36271
  };
35976
36272
  isomorph_default.getBraintrustApiKey = async () => {
35977
36273
  const value = process.env.BRAINTRUST_API_KEY;
@@ -36056,6 +36352,24 @@ function configureNode() {
36056
36352
  }
36057
36353
  registry.enable();
36058
36354
  }
36355
+ function getNearestBraintrustEnvValue(name) {
36356
+ for (let dir2 = process.cwd(), depth = 0; depth <= BRAINTRUST_ENV_SEARCH_PARENT_LIMIT; dir2 = path.dirname(dir2), depth++) {
36357
+ const envPath = path.join(dir2, ".env.braintrust");
36358
+ try {
36359
+ const parsed = dotenv.parse(fsSync.readFileSync(envPath, "utf8"));
36360
+ const value = parsed[name];
36361
+ return value?.trim() ? value : void 0;
36362
+ } catch (e) {
36363
+ if (typeof e !== "object" || e === null || !("code" in e) || e.code !== "ENOENT") {
36364
+ return void 0;
36365
+ }
36366
+ }
36367
+ if (path.dirname(dir2) === dir2) {
36368
+ break;
36369
+ }
36370
+ }
36371
+ return void 0;
36372
+ }
36059
36373
 
36060
36374
  // src/cli/index.ts
36061
36375
  var import_env2 = require("@next/env");
@@ -36388,6 +36702,7 @@ var ToolBuilder = class {
36388
36702
  constructor(project) {
36389
36703
  this.project = project;
36390
36704
  }
36705
+ project;
36391
36706
  taskCounter = 0;
36392
36707
  // This type definition is just a catch all so that the implementation can be
36393
36708
  // less specific than the two more specific declarations above.
@@ -36418,6 +36733,7 @@ var ScorerBuilder = class {
36418
36733
  constructor(project) {
36419
36734
  this.project = project;
36420
36735
  }
36736
+ project;
36421
36737
  taskCounter = 0;
36422
36738
  create(opts) {
36423
36739
  this.taskCounter++;
@@ -36477,6 +36793,7 @@ var ClassifierBuilder = class {
36477
36793
  constructor(project) {
36478
36794
  this.project = project;
36479
36795
  }
36796
+ project;
36480
36797
  taskCounter = 0;
36481
36798
  create(opts) {
36482
36799
  this.taskCounter++;
@@ -36512,6 +36829,7 @@ var CodeFunction = class {
36512
36829
  throw new Error("parameters are required if return type is defined");
36513
36830
  }
36514
36831
  }
36832
+ project;
36515
36833
  handler;
36516
36834
  name;
36517
36835
  slug;
@@ -36599,6 +36917,7 @@ var PromptBuilder = class {
36599
36917
  constructor(project) {
36600
36918
  this.project = project;
36601
36919
  }
36920
+ project;
36602
36921
  create(opts) {
36603
36922
  const toolFunctions = [];
36604
36923
  const rawTools = [];
@@ -36675,6 +36994,7 @@ var ParametersBuilder = class {
36675
36994
  constructor(project) {
36676
36995
  this.project = project;
36677
36996
  }
36997
+ project;
36678
36998
  create(opts) {
36679
36999
  const slug = opts.slug ?? slugify(opts.name, { lower: true, strict: true });
36680
37000
  const codeParameters = new CodeParameters(this.project, {