bitfab 0.20.0 → 0.21.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.
package/dist/index.cjs CHANGED
@@ -491,6 +491,7 @@ __export(index_exports, {
491
491
  ReplayEnvironment: () => ReplayEnvironment,
492
492
  SUPPORTED_PROVIDERS: () => SUPPORTED_PROVIDERS,
493
493
  __version__: () => __version__,
494
+ finalizers: () => finalizers,
494
495
  flushTraces: () => flushTraces,
495
496
  getCurrentSpan: () => getCurrentSpan,
496
497
  getCurrentTrace: () => getCurrentTrace
@@ -498,7 +499,7 @@ __export(index_exports, {
498
499
  module.exports = __toCommonJS(index_exports);
499
500
 
500
501
  // src/version.generated.ts
501
- var __version__ = "0.20.0";
502
+ var __version__ = "0.21.0";
502
503
 
503
504
  // src/constants.ts
504
505
  var DEFAULT_SERVICE_URL = "https://bitfab.ai";
@@ -3156,11 +3157,11 @@ var Bitfab = class {
3156
3157
  startedAt,
3157
3158
  spanType: options.type ?? "custom"
3158
3159
  };
3159
- const sendSpan = async (params) => {
3160
+ const sendSpan = async (params, spanOpts) => {
3160
3161
  const replayCtx = getReplayContext();
3161
3162
  const persistenceCollector = isRootSpan ? replayCtx?.pendingPersistence : void 0;
3162
3163
  let resolvePersistence;
3163
- if (persistenceCollector) {
3164
+ if (persistenceCollector && !spanOpts?.skipPersistenceRegistration) {
3164
3165
  persistenceCollector.push(
3165
3166
  new Promise((resolve) => {
3166
3167
  resolvePersistence = resolve;
@@ -3260,11 +3261,41 @@ var Bitfab = class {
3260
3261
  }
3261
3262
  }
3262
3263
  }
3264
+ const recordSpan = (result) => {
3265
+ if (options.finalize) {
3266
+ const replayCtx = getReplayContext();
3267
+ const persistenceCollector = isRootSpan ? replayCtx?.pendingPersistence : void 0;
3268
+ let resolvePersistence;
3269
+ if (persistenceCollector) {
3270
+ persistenceCollector.push(
3271
+ new Promise((resolve) => {
3272
+ resolvePersistence = resolve;
3273
+ })
3274
+ );
3275
+ }
3276
+ void Promise.resolve().then(() => options.finalize(result)).then(
3277
+ (output) => sendSpan(
3278
+ { result: output },
3279
+ { skipPersistenceRegistration: true }
3280
+ )
3281
+ ).catch(
3282
+ (error) => sendSpan(
3283
+ {
3284
+ result: void 0,
3285
+ error: error instanceof Error ? `finalize failed: ${error.message}` : `finalize failed: ${String(error)}`
3286
+ },
3287
+ { skipPersistenceRegistration: true }
3288
+ )
3289
+ ).finally(() => resolvePersistence?.());
3290
+ } else {
3291
+ void sendSpan({ result });
3292
+ }
3293
+ };
3263
3294
  const executeWithContext = () => {
3264
3295
  const result = fn(...args);
3265
3296
  if (result instanceof Promise) {
3266
3297
  return result.then((resolvedResult) => {
3267
- void sendSpan({ result: resolvedResult });
3298
+ recordSpan(resolvedResult);
3268
3299
  return resolvedResult;
3269
3300
  }).catch((error) => {
3270
3301
  void sendSpan({
@@ -3277,7 +3308,7 @@ var Bitfab = class {
3277
3308
  if (isAsyncGenerator(result)) {
3278
3309
  return wrapAsyncGenerator(result, newStack, sendSpan);
3279
3310
  }
3280
- void sendSpan({ result });
3311
+ recordSpan(result);
3281
3312
  return result;
3282
3313
  };
3283
3314
  return runWithSpanStack(newStack, executeWithContext);
@@ -3560,6 +3591,54 @@ var BitfabFunction = class {
3560
3591
  );
3561
3592
  }
3562
3593
  };
3594
+
3595
+ // src/finalizers.ts
3596
+ async function settle(value) {
3597
+ try {
3598
+ return await value;
3599
+ } catch {
3600
+ return void 0;
3601
+ }
3602
+ }
3603
+ async function aiSdk(result) {
3604
+ const r = result ?? {};
3605
+ const [text, usage, totalUsage, finishReason, toolCalls, toolResults] = await Promise.all([
3606
+ settle(r.text),
3607
+ settle(r.usage),
3608
+ settle(r.totalUsage),
3609
+ settle(r.finishReason),
3610
+ settle(r.toolCalls),
3611
+ settle(r.toolResults)
3612
+ ]);
3613
+ return {
3614
+ text,
3615
+ usage: totalUsage ?? usage,
3616
+ finishReason,
3617
+ toolCalls,
3618
+ toolResults
3619
+ };
3620
+ }
3621
+ async function readableStream(stream, onLive) {
3622
+ const [live, copy] = stream.tee();
3623
+ onLive(live);
3624
+ const chunks = [];
3625
+ const reader = copy.getReader();
3626
+ try {
3627
+ for (; ; ) {
3628
+ const { done, value } = await reader.read();
3629
+ if (done) {
3630
+ break;
3631
+ }
3632
+ chunks.push(value);
3633
+ }
3634
+ } catch {
3635
+ }
3636
+ return { chunks };
3637
+ }
3638
+ var finalizers = {
3639
+ aiSdk,
3640
+ readableStream
3641
+ };
3563
3642
  // Annotate the CommonJS export names for ESM import in node:
3564
3643
  0 && (module.exports = {
3565
3644
  Bitfab,
@@ -3573,6 +3652,7 @@ var BitfabFunction = class {
3573
3652
  ReplayEnvironment,
3574
3653
  SUPPORTED_PROVIDERS,
3575
3654
  __version__,
3655
+ finalizers,
3576
3656
  flushTraces,
3577
3657
  getCurrentSpan,
3578
3658
  getCurrentTrace