@bitfab/sdk 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
@@ -482,6 +482,7 @@ __export(index_exports, {
482
482
  ReplayEnvironment: () => ReplayEnvironment,
483
483
  SUPPORTED_PROVIDERS: () => SUPPORTED_PROVIDERS,
484
484
  __version__: () => __version__,
485
+ finalizers: () => finalizers,
485
486
  flushTraces: () => flushTraces,
486
487
  getCurrentSpan: () => getCurrentSpan,
487
488
  getCurrentTrace: () => getCurrentTrace
@@ -489,7 +490,7 @@ __export(index_exports, {
489
490
  module.exports = __toCommonJS(index_exports);
490
491
 
491
492
  // src/version.generated.ts
492
- var __version__ = "0.20.0";
493
+ var __version__ = "0.21.0";
493
494
 
494
495
  // src/constants.ts
495
496
  var DEFAULT_SERVICE_URL = "https://bitfab.ai";
@@ -3147,11 +3148,11 @@ var Bitfab = class {
3147
3148
  startedAt,
3148
3149
  spanType: options.type ?? "custom"
3149
3150
  };
3150
- const sendSpan = async (params) => {
3151
+ const sendSpan = async (params, spanOpts) => {
3151
3152
  const replayCtx = getReplayContext();
3152
3153
  const persistenceCollector = isRootSpan ? replayCtx?.pendingPersistence : void 0;
3153
3154
  let resolvePersistence;
3154
- if (persistenceCollector) {
3155
+ if (persistenceCollector && !spanOpts?.skipPersistenceRegistration) {
3155
3156
  persistenceCollector.push(
3156
3157
  new Promise((resolve) => {
3157
3158
  resolvePersistence = resolve;
@@ -3251,11 +3252,41 @@ var Bitfab = class {
3251
3252
  }
3252
3253
  }
3253
3254
  }
3255
+ const recordSpan = (result) => {
3256
+ if (options.finalize) {
3257
+ const replayCtx = getReplayContext();
3258
+ const persistenceCollector = isRootSpan ? replayCtx?.pendingPersistence : void 0;
3259
+ let resolvePersistence;
3260
+ if (persistenceCollector) {
3261
+ persistenceCollector.push(
3262
+ new Promise((resolve) => {
3263
+ resolvePersistence = resolve;
3264
+ })
3265
+ );
3266
+ }
3267
+ void Promise.resolve().then(() => options.finalize(result)).then(
3268
+ (output) => sendSpan(
3269
+ { result: output },
3270
+ { skipPersistenceRegistration: true }
3271
+ )
3272
+ ).catch(
3273
+ (error) => sendSpan(
3274
+ {
3275
+ result: void 0,
3276
+ error: error instanceof Error ? `finalize failed: ${error.message}` : `finalize failed: ${String(error)}`
3277
+ },
3278
+ { skipPersistenceRegistration: true }
3279
+ )
3280
+ ).finally(() => resolvePersistence?.());
3281
+ } else {
3282
+ void sendSpan({ result });
3283
+ }
3284
+ };
3254
3285
  const executeWithContext = () => {
3255
3286
  const result = fn(...args);
3256
3287
  if (result instanceof Promise) {
3257
3288
  return result.then((resolvedResult) => {
3258
- void sendSpan({ result: resolvedResult });
3289
+ recordSpan(resolvedResult);
3259
3290
  return resolvedResult;
3260
3291
  }).catch((error) => {
3261
3292
  void sendSpan({
@@ -3268,7 +3299,7 @@ var Bitfab = class {
3268
3299
  if (isAsyncGenerator(result)) {
3269
3300
  return wrapAsyncGenerator(result, newStack, sendSpan);
3270
3301
  }
3271
- void sendSpan({ result });
3302
+ recordSpan(result);
3272
3303
  return result;
3273
3304
  };
3274
3305
  return runWithSpanStack(newStack, executeWithContext);
@@ -3551,6 +3582,54 @@ var BitfabFunction = class {
3551
3582
  );
3552
3583
  }
3553
3584
  };
3585
+
3586
+ // src/finalizers.ts
3587
+ async function settle(value) {
3588
+ try {
3589
+ return await value;
3590
+ } catch {
3591
+ return void 0;
3592
+ }
3593
+ }
3594
+ async function aiSdk(result) {
3595
+ const r = result ?? {};
3596
+ const [text, usage, totalUsage, finishReason, toolCalls, toolResults] = await Promise.all([
3597
+ settle(r.text),
3598
+ settle(r.usage),
3599
+ settle(r.totalUsage),
3600
+ settle(r.finishReason),
3601
+ settle(r.toolCalls),
3602
+ settle(r.toolResults)
3603
+ ]);
3604
+ return {
3605
+ text,
3606
+ usage: totalUsage ?? usage,
3607
+ finishReason,
3608
+ toolCalls,
3609
+ toolResults
3610
+ };
3611
+ }
3612
+ async function readableStream(stream, onLive) {
3613
+ const [live, copy] = stream.tee();
3614
+ onLive(live);
3615
+ const chunks = [];
3616
+ const reader = copy.getReader();
3617
+ try {
3618
+ for (; ; ) {
3619
+ const { done, value } = await reader.read();
3620
+ if (done) {
3621
+ break;
3622
+ }
3623
+ chunks.push(value);
3624
+ }
3625
+ } catch {
3626
+ }
3627
+ return { chunks };
3628
+ }
3629
+ var finalizers = {
3630
+ aiSdk,
3631
+ readableStream
3632
+ };
3554
3633
  // Annotate the CommonJS export names for ESM import in node:
3555
3634
  0 && (module.exports = {
3556
3635
  Bitfab,
@@ -3564,6 +3643,7 @@ var BitfabFunction = class {
3564
3643
  ReplayEnvironment,
3565
3644
  SUPPORTED_PROVIDERS,
3566
3645
  __version__,
3646
+ finalizers,
3567
3647
  flushTraces,
3568
3648
  getCurrentSpan,
3569
3649
  getCurrentTrace