braintrust 3.26.0 → 3.28.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 (61) hide show
  1. package/dev/dist/index.d.mts +519 -186
  2. package/dev/dist/index.d.ts +519 -186
  3. package/dev/dist/index.js +3727 -1526
  4. package/dev/dist/index.mjs +2815 -614
  5. package/dist/apply-auto-instrumentation.js +372 -261
  6. package/dist/apply-auto-instrumentation.mjs +171 -60
  7. package/dist/auto-instrumentations/bundler/esbuild.cjs +458 -61
  8. package/dist/auto-instrumentations/bundler/esbuild.mjs +5 -4
  9. package/dist/auto-instrumentations/bundler/next.cjs +460 -63
  10. package/dist/auto-instrumentations/bundler/next.mjs +6 -5
  11. package/dist/auto-instrumentations/bundler/rollup.cjs +458 -61
  12. package/dist/auto-instrumentations/bundler/rollup.mjs +5 -4
  13. package/dist/auto-instrumentations/bundler/vite.cjs +487 -62
  14. package/dist/auto-instrumentations/bundler/vite.mjs +34 -5
  15. package/dist/auto-instrumentations/bundler/webpack-loader.cjs +444 -61
  16. package/dist/auto-instrumentations/bundler/webpack.cjs +458 -61
  17. package/dist/auto-instrumentations/bundler/webpack.mjs +6 -5
  18. package/dist/auto-instrumentations/{chunk-6E22MYSW.mjs → chunk-26PKVUKB.mjs} +109 -5
  19. package/dist/auto-instrumentations/{chunk-AKKPLXTP.mjs → chunk-2AMDGD65.mjs} +160 -57
  20. package/dist/auto-instrumentations/{chunk-V5LEODRX.mjs → chunk-HD35AM3M.mjs} +1 -1
  21. package/dist/auto-instrumentations/{chunk-XYN63IG5.mjs → chunk-I55G56ZL.mjs} +21 -58
  22. package/dist/auto-instrumentations/{chunk-NRE4QUQR.mjs → chunk-JPUFNW7X.mjs} +140 -0
  23. package/dist/auto-instrumentations/{chunk-XZHHE4Y3.mjs → chunk-NP7V4XB2.mjs} +157 -3
  24. package/dist/auto-instrumentations/hook.mjs +396 -32
  25. package/dist/auto-instrumentations/index.cjs +298 -2
  26. package/dist/auto-instrumentations/index.d.mts +5 -1
  27. package/dist/auto-instrumentations/index.d.ts +5 -1
  28. package/dist/auto-instrumentations/index.mjs +6 -2
  29. package/dist/auto-instrumentations/loader/cjs-patch.cjs +105 -57
  30. package/dist/auto-instrumentations/loader/cjs-patch.mjs +2 -2
  31. package/dist/auto-instrumentations/loader/esm-hook.mjs +1 -1
  32. package/dist/browser.d.mts +683 -56
  33. package/dist/browser.d.ts +683 -56
  34. package/dist/browser.js +4242 -655
  35. package/dist/browser.mjs +4242 -655
  36. package/dist/{chunk-VYNNEKSA.js → chunk-BBE7SNRV.js} +248 -10
  37. package/dist/{chunk-VRZZQPAA.js → chunk-OBBWQW6K.js} +3351 -1392
  38. package/dist/{chunk-XIZOM2HO.mjs → chunk-UPFNQCGB.mjs} +2419 -460
  39. package/dist/{chunk-PN7EWK66.mjs → chunk-ZHUHZWFY.mjs} +241 -3
  40. package/dist/cli.js +2867 -668
  41. package/dist/edge-light.d.mts +1 -1
  42. package/dist/edge-light.d.ts +1 -1
  43. package/dist/edge-light.js +4242 -655
  44. package/dist/edge-light.mjs +4242 -655
  45. package/dist/index.d.mts +1267 -640
  46. package/dist/index.d.ts +1267 -640
  47. package/dist/index.js +2107 -630
  48. package/dist/index.mjs +1649 -172
  49. package/dist/instrumentation/index.d.mts +198 -6
  50. package/dist/instrumentation/index.d.ts +198 -6
  51. package/dist/instrumentation/index.js +2661 -581
  52. package/dist/instrumentation/index.mjs +2661 -581
  53. package/dist/vitest-evals-reporter.js +45 -43
  54. package/dist/vitest-evals-reporter.mjs +5 -3
  55. package/dist/workerd.d.mts +1 -1
  56. package/dist/workerd.d.ts +1 -1
  57. package/dist/workerd.js +4242 -655
  58. package/dist/workerd.mjs +4242 -655
  59. package/package.json +2 -3
  60. package/util/dist/index.d.mts +1545 -100
  61. package/util/dist/index.d.ts +1545 -100
@@ -3,8 +3,10 @@ var GLOBAL_INSTRUMENTATION_HOOKS_KEY = "__braintrust_instrumentation_hooks";
3
3
  var GLOBAL_INSTRUMENTATION_HOOKS_PROTOCOL_VERSION = 1;
4
4
  var GLOBAL_INSTRUMENTATION_HOOKS_REGISTRY_BRAND = "braintrust.global-instrumentation-hooks.registry";
5
5
  var GLOBAL_INSTRUMENTATION_HOOK_BRAND = "braintrust.global-instrumentation-hooks.hook";
6
+ var GLOBAL_INVOCATION_HOOK_BRAND = "braintrust.global-instrumentation-hooks.invocation-hook";
6
7
  var registryBrand = Symbol.for(GLOBAL_INSTRUMENTATION_HOOKS_REGISTRY_BRAND);
7
8
  var hookBrand = Symbol.for(GLOBAL_INSTRUMENTATION_HOOK_BRAND);
9
+ var invocationHookBrand = Symbol.for(GLOBAL_INVOCATION_HOOK_BRAND);
8
10
  var errorReporter;
9
11
  function reportError(error) {
10
12
  try {
@@ -140,12 +142,69 @@ var traceEvents = [
140
142
  "asyncEnd",
141
143
  "error"
142
144
  ];
145
+ function traceInvocation(hook, operator, target, thisArg, args, additional, callbackIndex = -1) {
146
+ const context = {
147
+ ...additional,
148
+ arguments: args,
149
+ self: thisArg
150
+ };
151
+ const invoke = () => hook.invoke(target, thisArg, args, additional);
152
+ if (operator === "traceCallback") {
153
+ return hook.traceCallback(invoke, callbackIndex, context);
154
+ }
155
+ if (operator === "tracePromise") {
156
+ return hook.tracePromise(invoke, context);
157
+ }
158
+ return hook.traceSync(invoke, context);
159
+ }
160
+ var InvocationHook = class {
161
+ interceptors = [];
162
+ get hasInterceptors() {
163
+ return this.interceptors.length > 0;
164
+ }
165
+ intercept(interceptor) {
166
+ if (typeof interceptor !== "function") {
167
+ throw new TypeError("interceptor must be a function");
168
+ }
169
+ this.interceptors = [...this.interceptors, interceptor];
170
+ let active = true;
171
+ return () => {
172
+ if (!active) {
173
+ return;
174
+ }
175
+ active = false;
176
+ const index = this.interceptors.indexOf(interceptor);
177
+ if (index !== -1) {
178
+ this.interceptors = [
179
+ ...this.interceptors.slice(0, index),
180
+ ...this.interceptors.slice(index + 1)
181
+ ];
182
+ }
183
+ };
184
+ }
185
+ invoke(target, thisArg, args, additional) {
186
+ const interceptors = this.interceptors;
187
+ if (interceptors.length === 0) {
188
+ return Reflect.apply(target, thisArg, args);
189
+ }
190
+ let next = target;
191
+ for (let index = interceptors.length - 1; index >= 0; index -= 1) {
192
+ const interceptor = interceptors[index];
193
+ const downstream = next;
194
+ next = function(...nextArgs) {
195
+ return interceptor(downstream, this, nextArgs, additional);
196
+ };
197
+ }
198
+ return Reflect.apply(next, thisArg, args);
199
+ }
200
+ };
143
201
  var TracingHook = class {
144
202
  start;
145
203
  end;
146
204
  asyncStart;
147
205
  asyncEnd;
148
206
  error;
207
+ invocationHook = new InvocationHook();
149
208
  constructor(nameOrChannels) {
150
209
  Object.defineProperty(this, hookBrand, {
151
210
  configurable: false,
@@ -153,6 +212,12 @@ var TracingHook = class {
153
212
  value: GLOBAL_INSTRUMENTATION_HOOKS_PROTOCOL_VERSION,
154
213
  writable: false
155
214
  });
215
+ Object.defineProperty(this, invocationHookBrand, {
216
+ configurable: false,
217
+ enumerable: false,
218
+ value: GLOBAL_INSTRUMENTATION_HOOKS_PROTOCOL_VERSION,
219
+ writable: false
220
+ });
156
221
  if (typeof nameOrChannels === "string") {
157
222
  this.start = new HookChannel(`tracing:${nameOrChannels}:start`);
158
223
  this.end = new HookChannel(`tracing:${nameOrChannels}:end`);
@@ -170,6 +235,26 @@ var TracingHook = class {
170
235
  get hasSubscribers() {
171
236
  return this.start.hasSubscribers || this.end.hasSubscribers || this.asyncStart.hasSubscribers || this.asyncEnd.hasSubscribers || this.error.hasSubscribers;
172
237
  }
238
+ get hasInterceptors() {
239
+ return this.invocationHook.hasInterceptors;
240
+ }
241
+ intercept(interceptor) {
242
+ return this.invocationHook.intercept(interceptor);
243
+ }
244
+ invoke(target, thisArg, args, additional) {
245
+ return this.invocationHook.invoke(target, thisArg, args, additional);
246
+ }
247
+ traceInvocation(operator, target, thisArg, args, additional, callbackIndex = -1) {
248
+ return traceInvocation(
249
+ this,
250
+ operator,
251
+ target,
252
+ thisArg,
253
+ args,
254
+ additional,
255
+ callbackIndex
256
+ );
257
+ }
173
258
  subscribe(handlers) {
174
259
  for (const eventName of traceEvents) {
175
260
  const handler = handlers[eventName];
@@ -391,6 +476,60 @@ function hasTracingHookShape(value) {
391
476
  return false;
392
477
  }
393
478
  }
479
+ function hasInvocationHookShape(value) {
480
+ if (typeof value !== "object" && typeof value !== "function" || value === null) {
481
+ return false;
482
+ }
483
+ try {
484
+ const hook = value;
485
+ return value[invocationHookBrand] === GLOBAL_INSTRUMENTATION_HOOKS_PROTOCOL_VERSION && typeof hook.hasInterceptors === "boolean" && typeof hook.intercept === "function" && typeof hook.invoke === "function";
486
+ } catch {
487
+ return false;
488
+ }
489
+ }
490
+ function installInvocationHook(value) {
491
+ const hasInvocationHook = hasInvocationHookShape(value);
492
+ const invocationHook = new InvocationHook();
493
+ try {
494
+ if (!hasInvocationHook) {
495
+ Object.defineProperties(value, {
496
+ [invocationHookBrand]: {
497
+ configurable: false,
498
+ enumerable: false,
499
+ value: GLOBAL_INSTRUMENTATION_HOOKS_PROTOCOL_VERSION,
500
+ writable: false
501
+ },
502
+ hasInterceptors: {
503
+ configurable: false,
504
+ enumerable: false,
505
+ get: () => invocationHook.hasInterceptors
506
+ },
507
+ intercept: {
508
+ configurable: false,
509
+ enumerable: false,
510
+ value: invocationHook.intercept.bind(invocationHook),
511
+ writable: false
512
+ },
513
+ invoke: {
514
+ configurable: false,
515
+ enumerable: false,
516
+ value: invocationHook.invoke.bind(invocationHook),
517
+ writable: false
518
+ }
519
+ });
520
+ }
521
+ if (typeof value.traceInvocation !== "function") {
522
+ Object.defineProperty(value, "traceInvocation", {
523
+ configurable: false,
524
+ enumerable: false,
525
+ value: traceInvocation.bind(void 0, value),
526
+ writable: false
527
+ });
528
+ }
529
+ } catch (error) {
530
+ reportError(error);
531
+ }
532
+ }
394
533
  function isCompatibleTracingHook(value) {
395
534
  try {
396
535
  return value[hookBrand] === GLOBAL_INSTRUMENTATION_HOOKS_PROTOCOL_VERSION && hasTracingHookShape(value);
@@ -477,6 +616,7 @@ function newGlobalTracingChannel(nameOrChannels) {
477
616
  return inertTracingHook;
478
617
  }
479
618
  if (isCompatibleTracingHook(existing)) {
619
+ installInvocationHook(existing);
480
620
  return existing;
481
621
  }
482
622
  if (existing !== void 0) {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  newGlobalTracingChannel
3
- } from "./chunk-NRE4QUQR.mjs";
3
+ } from "./chunk-JPUFNW7X.mjs";
4
4
 
5
5
  // src/isomorph.ts
6
6
  var DefaultAsyncLocalStorage = class {
@@ -48,11 +48,21 @@ function defineChannels(pkg, channels, options) {
48
48
  const tracingChannel2 = () => isomorph_default.newTracingChannel(
49
49
  fullChannelName
50
50
  );
51
+ const intercept2 = (interceptor) => {
52
+ const hook = tracingChannel2();
53
+ return typeof hook.intercept === "function" ? hook.intercept(interceptor) : () => {
54
+ };
55
+ };
51
56
  return [
52
57
  key,
53
58
  {
54
59
  ...asyncSpec,
55
60
  instrumentationName,
61
+ intercept: intercept2,
62
+ invoke: (target, thisArg, args, additional) => {
63
+ const hook = tracingChannel2();
64
+ return typeof hook.invoke === "function" ? hook.invoke(target, thisArg, args, additional) : Reflect.apply(target, thisArg, args);
65
+ },
56
66
  tracingChannel: tracingChannel2,
57
67
  tracePromise: (fn, context) => tracingChannel2().tracePromise(
58
68
  fn,
@@ -66,11 +76,21 @@ function defineChannels(pkg, channels, options) {
66
76
  const tracingChannel = () => isomorph_default.newTracingChannel(
67
77
  fullChannelName
68
78
  );
79
+ const intercept = (interceptor) => {
80
+ const hook = tracingChannel();
81
+ return typeof hook.intercept === "function" ? hook.intercept(interceptor) : () => {
82
+ };
83
+ };
69
84
  return [
70
85
  key,
71
86
  {
72
87
  ...syncSpec,
73
88
  instrumentationName,
89
+ intercept,
90
+ invoke: (target, thisArg, args, additional) => {
91
+ const hook = tracingChannel();
92
+ return typeof hook.invoke === "function" ? hook.invoke(target, thisArg, args, additional) : Reflect.apply(target, thisArg, args);
93
+ },
74
94
  tracingChannel,
75
95
  traceSync: (fn, context) => tracingChannel().traceSync(
76
96
  fn,
@@ -92,6 +112,7 @@ var INSTRUMENTATION_NAMES = {
92
112
  CLAUDE_AGENT_SDK: "claude-agent-sdk",
93
113
  CLOUDFLARE_AI_CHAT: "cloudflare-ai-chat",
94
114
  CLOUDFLARE_AGENTS: "cloudflare-agents",
115
+ CLOUDFLARE_THINK: "cloudflare-think",
95
116
  COHERE: "cohere",
96
117
  CURSOR_SDK: "cursor-sdk",
97
118
  EVE: "eve",
@@ -106,13 +127,15 @@ var INSTRUMENTATION_NAMES = {
106
127
  LANGSMITH: "langsmith",
107
128
  MASTRA: "mastra",
108
129
  MISTRAL: "mistral",
130
+ OLLAMA: "ollama",
109
131
  OPENAI: "openai",
110
132
  OPENAI_AGENTS: "openai-agents",
111
133
  OPENAI_CODEX: "openai-codex",
112
134
  OPENROUTER: "openrouter",
113
135
  OPENROUTER_AGENT: "openrouter-agent",
114
136
  PI_CODING_AGENT: "pi-coding-agent",
115
- STRANDS_AGENT_SDK: "strands-agent-sdk"
137
+ STRANDS_AGENT_SDK: "strands-agent-sdk",
138
+ VOYAGEAI: "voyageai"
116
139
  };
117
140
 
118
141
  // src/instrumentation/plugins/openai-channels.ts
@@ -400,6 +423,14 @@ var anthropicChannels = defineChannels(
400
423
  betaMessagesToolRunner: channel({
401
424
  channelName: "beta.messages.toolRunner",
402
425
  kind: "sync-stream"
426
+ }),
427
+ betaSessionsEventsStream: channel({
428
+ channelName: "beta.sessions.events.stream",
429
+ kind: "async"
430
+ }),
431
+ betaSessionsThreadsEventsStream: channel({
432
+ channelName: "beta.sessions.threads.events.stream",
433
+ kind: "async"
403
434
  })
404
435
  },
405
436
  { instrumentationName: INSTRUMENTATION_NAMES.ANTHROPIC }
@@ -518,7 +549,40 @@ var anthropicConfigs = [
518
549
  methodName: "toolRunner",
519
550
  kind: "Sync"
520
551
  }
521
- }
552
+ },
553
+ // Managed Agents Sessions event streams are discovered automatically, but
554
+ // remain passive until the user calls collectAnthropicSession() on the
555
+ // returned stream.
556
+ ...["mjs", "js"].map(
557
+ (extension) => ({
558
+ channelName: anthropicChannels.betaSessionsEventsStream.channelName,
559
+ module: {
560
+ name: "@anthropic-ai/sdk",
561
+ versionRange: ">=0.86.0",
562
+ filePath: `resources/beta/sessions/events.${extension}`
563
+ },
564
+ functionQuery: {
565
+ className: "Events",
566
+ methodName: "stream",
567
+ kind: "Async"
568
+ }
569
+ })
570
+ ),
571
+ ...["mjs", "js"].map(
572
+ (extension) => ({
573
+ channelName: anthropicChannels.betaSessionsThreadsEventsStream.channelName,
574
+ module: {
575
+ name: "@anthropic-ai/sdk",
576
+ versionRange: ">=0.86.0",
577
+ filePath: `resources/beta/sessions/threads/events.${extension}`
578
+ },
579
+ functionQuery: {
580
+ className: "Events",
581
+ methodName: "stream",
582
+ kind: "Async"
583
+ }
584
+ })
585
+ )
522
586
  ];
523
587
 
524
588
  // src/instrumentation/plugins/bedrock-runtime-channels.ts
@@ -1169,6 +1233,36 @@ var cloudflareAgentsConfigs = [
1169
1233
  }
1170
1234
  ];
1171
1235
 
1236
+ // src/instrumentation/plugins/cloudflare-think-channels.ts
1237
+ var cloudflareThinkChannels = defineChannels(
1238
+ "@cloudflare/think",
1239
+ {
1240
+ runInferenceLoop: channel({
1241
+ channelName: "Think.runInferenceLoop",
1242
+ kind: "async"
1243
+ })
1244
+ },
1245
+ { instrumentationName: INSTRUMENTATION_NAMES.CLOUDFLARE_THINK }
1246
+ );
1247
+
1248
+ // src/auto-instrumentations/configs/cloudflare-think.ts
1249
+ var cloudflareThinkVersionRange = ">=0.13.0 <0.14.0";
1250
+ var cloudflareThinkConfigs = [
1251
+ {
1252
+ channelName: cloudflareThinkChannels.runInferenceLoop.channelName,
1253
+ module: {
1254
+ name: "@cloudflare/think",
1255
+ versionRange: cloudflareThinkVersionRange,
1256
+ filePath: "dist/think.js"
1257
+ },
1258
+ functionQuery: {
1259
+ className: "Think",
1260
+ methodName: "_runInferenceLoop",
1261
+ kind: "Async"
1262
+ }
1263
+ }
1264
+ ];
1265
+
1172
1266
  // src/instrumentation/plugins/cursor-sdk-channels.ts
1173
1267
  var cursorSDKChannels = defineChannels(
1174
1268
  "@cursor/sdk",
@@ -1786,6 +1880,19 @@ var openRouterConfigs = [
1786
1880
  kind: "Async"
1787
1881
  }
1788
1882
  },
1883
+ {
1884
+ channelName: openRouterChannels.betaResponsesSend.channelName,
1885
+ module: {
1886
+ name: "@openrouter/sdk",
1887
+ versionRange: ">=1.1.2 <2.0.0",
1888
+ filePath: "esm/sdk/betaresponses.js"
1889
+ },
1890
+ functionQuery: {
1891
+ className: "BetaResponses",
1892
+ methodName: "send",
1893
+ kind: "Async"
1894
+ }
1895
+ },
1789
1896
  {
1790
1897
  channelName: openRouterChannels.callModel.channelName,
1791
1898
  module: {
@@ -2143,6 +2250,51 @@ var mistralConfigs = [
2143
2250
  }
2144
2251
  ];
2145
2252
 
2253
+ // src/instrumentation/plugins/ollama-channels.ts
2254
+ var ollamaChannels = defineChannels(
2255
+ "ollama",
2256
+ {
2257
+ chat: channel({
2258
+ channelName: "chat",
2259
+ kind: "async"
2260
+ }),
2261
+ generate: channel({
2262
+ channelName: "generate",
2263
+ kind: "async"
2264
+ }),
2265
+ embed: channel({
2266
+ channelName: "embed",
2267
+ kind: "async"
2268
+ })
2269
+ },
2270
+ { instrumentationName: INSTRUMENTATION_NAMES.OLLAMA }
2271
+ );
2272
+
2273
+ // src/auto-instrumentations/configs/ollama.ts
2274
+ var methods = [
2275
+ ["chat", ollamaChannels.chat.channelName],
2276
+ ["generate", ollamaChannels.generate.channelName],
2277
+ ["embed", ollamaChannels.embed.channelName]
2278
+ ];
2279
+ var implementationFiles = ["dist/browser.mjs", "dist/browser.cjs"];
2280
+ var ollamaConfigs = [
2281
+ ...implementationFiles.flatMap(
2282
+ (filePath) => methods.map(([methodName, channelName]) => ({
2283
+ channelName,
2284
+ module: {
2285
+ name: "ollama",
2286
+ versionRange: ">=0.6.0 <0.7.0",
2287
+ filePath
2288
+ },
2289
+ functionQuery: {
2290
+ className: "Ollama",
2291
+ methodName,
2292
+ kind: "Async"
2293
+ }
2294
+ }))
2295
+ )
2296
+ ];
2297
+
2146
2298
  // src/instrumentation/plugins/google-adk-channels.ts
2147
2299
  var googleADKChannels = defineChannels(
2148
2300
  "@google/adk",
@@ -3215,6 +3367,7 @@ export {
3215
3367
  aiSDKConfigs,
3216
3368
  claudeAgentSDKConfigs,
3217
3369
  cloudflareAgentsConfigs,
3370
+ cloudflareThinkConfigs,
3218
3371
  cursorSDKConfigs,
3219
3372
  openAIAgentsCoreConfigs,
3220
3373
  googleGenAIConfigs,
@@ -3222,6 +3375,7 @@ export {
3222
3375
  openRouterAgentConfigs,
3223
3376
  openRouterConfigs,
3224
3377
  mistralConfigs,
3378
+ ollamaConfigs,
3225
3379
  googleADKConfigs,
3226
3380
  cloudflareAIChatConfigs,
3227
3381
  cohereConfigs,