@bitfab/sdk 0.52.2 → 0.52.4

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 (36) hide show
  1. package/dist/{chunk-XXKM4EL2.js → chunk-DP3QEGTV.js} +3 -2
  2. package/dist/chunk-DP3QEGTV.js.map +1 -0
  3. package/dist/{chunk-XLSKI7UA.js → chunk-LQ32JQNZ.js} +61 -11
  4. package/dist/chunk-LQ32JQNZ.js.map +1 -0
  5. package/dist/{chunk-36ARJJ6S.js → chunk-MM4A6UWJ.js} +48 -21
  6. package/dist/chunk-MM4A6UWJ.js.map +1 -0
  7. package/dist/{chunk-QWAWERYM.js → chunk-OF5GWNGU.js} +79 -28
  8. package/dist/chunk-OF5GWNGU.js.map +1 -0
  9. package/dist/chunk-P2AZ7RUM.js +747 -0
  10. package/dist/chunk-P2AZ7RUM.js.map +1 -0
  11. package/dist/{http-CVTQ3N5S.js → http-UA54C2J2.js} +2 -2
  12. package/dist/{http-V2WU4EN3.js → http-WBNDRQIV.js} +2 -2
  13. package/dist/index.cjs +134 -31
  14. package/dist/index.cjs.map +1 -1
  15. package/dist/index.d.cts +36 -2
  16. package/dist/index.d.ts +36 -2
  17. package/dist/index.js +5 -3
  18. package/dist/node.cjs +134 -31
  19. package/dist/node.cjs.map +1 -1
  20. package/dist/node.d.cts +1 -1
  21. package/dist/node.d.ts +1 -1
  22. package/dist/node.js +5 -3
  23. package/dist/node.js.map +1 -1
  24. package/dist/{replay-5UAWEGXP.js → replay-RUONYMHD.js} +5 -3
  25. package/dist/replayCli.js +18 -687
  26. package/dist/replayCli.js.map +1 -1
  27. package/dist/seedCli.js +30 -0
  28. package/dist/seedCli.js.map +1 -0
  29. package/package.json +3 -2
  30. package/dist/chunk-36ARJJ6S.js.map +0 -1
  31. package/dist/chunk-QWAWERYM.js.map +0 -1
  32. package/dist/chunk-XLSKI7UA.js.map +0 -1
  33. package/dist/chunk-XXKM4EL2.js.map +0 -1
  34. /package/dist/{http-CVTQ3N5S.js.map → http-UA54C2J2.js.map} +0 -0
  35. /package/dist/{http-V2WU4EN3.js.map → http-WBNDRQIV.js.map} +0 -0
  36. /package/dist/{replay-5UAWEGXP.js.map → replay-RUONYMHD.js.map} +0 -0
package/dist/index.cjs CHANGED
@@ -42,7 +42,7 @@ var __version__, __packageName__;
42
42
  var init_version_generated = __esm({
43
43
  "src/version.generated.ts"() {
44
44
  "use strict";
45
- __version__ = "0.52.2";
45
+ __version__ = "0.52.4";
46
46
  __packageName__ = "@bitfab/sdk";
47
47
  }
48
48
  });
@@ -385,15 +385,18 @@ var init_payloadBudget = __esm({
385
385
  });
386
386
 
387
387
  // src/warnOnce.ts
388
+ function warn(message) {
389
+ try {
390
+ console.warn(`[bitfab] ${message}`);
391
+ } catch {
392
+ }
393
+ }
388
394
  function warnOnce(key, message) {
389
395
  if (warned.has(key)) {
390
396
  return;
391
397
  }
392
398
  warned.add(key);
393
- try {
394
- console.warn(`[bitfab] ${message}`);
395
- } catch {
396
- }
399
+ warn(message);
397
400
  }
398
401
  var warned;
399
402
  var init_warnOnce = __esm({
@@ -535,6 +538,9 @@ var init_serializePayload = __esm({
535
538
  });
536
539
 
537
540
  // src/traceMetadata.ts
541
+ function findRecord(traceId) {
542
+ return activeRecords.get(traceId) ?? completedRecords.get(traceId);
543
+ }
538
544
  function recordCallerTraceMetadata(traceId, metadata) {
539
545
  if (typeof traceId !== "string" || traceId === "") {
540
546
  return;
@@ -545,15 +551,52 @@ function recordCallerTraceMetadata(traceId, metadata) {
545
551
  if (Object.keys(metadata).length === 0) {
546
552
  return;
547
553
  }
548
- callerMetadata.set(traceId, { ...callerMetadata.get(traceId), ...metadata });
554
+ const existing = findRecord(traceId);
555
+ if (existing) {
556
+ Object.assign(existing.caller, metadata);
557
+ return;
558
+ }
559
+ activeRecords.set(traceId, {
560
+ caller: { ...metadata },
561
+ derived: {},
562
+ warnedKeys: /* @__PURE__ */ new Set()
563
+ });
549
564
  }
550
565
  function callerTraceMetadata(traceId) {
551
- const recorded = callerMetadata.get(traceId);
552
- return recorded ? { ...recorded } : void 0;
566
+ const record = findRecord(traceId);
567
+ if (!record || Object.keys(record.caller).length === 0) {
568
+ return void 0;
569
+ }
570
+ return { ...record.caller };
553
571
  }
554
- function forgetTraceMetadata(traceId) {
555
- callerMetadata.delete(traceId);
556
- derivedMetadata.delete(traceId);
572
+ function retireTraceMetadata(traceId) {
573
+ const record = activeRecords.get(traceId);
574
+ if (!record) {
575
+ return;
576
+ }
577
+ activeRecords.delete(traceId);
578
+ completedRecords.set(traceId, record);
579
+ while (completedRecords.size > RETAINED_COMPLETED_TRACES) {
580
+ const oldest = completedRecords.keys().next();
581
+ if (oldest.done) {
582
+ return;
583
+ }
584
+ completedRecords.delete(oldest.value);
585
+ }
586
+ }
587
+ function warnAboutShadowedKeys(traceId, record) {
588
+ const shadowed = Object.keys(record.derived).filter(
589
+ (key) => key in record.caller && record.caller[key] !== record.derived[key] && !record.warnedKeys.has(key)
590
+ ).sort();
591
+ if (shadowed.length === 0) {
592
+ return;
593
+ }
594
+ for (const key of shadowed) {
595
+ record.warnedKeys.add(key);
596
+ }
597
+ warn(
598
+ `trace metadata key(s) ${shadowed.join(", ")} on trace ${traceId} were set both by the caller and by an integration's own trace export; the caller's value is the one kept on the trace.`
599
+ );
557
600
  }
558
601
  function mergeCallerMetadataIntoTracePayload(payload) {
559
602
  const externalTrace = payload.externalTrace;
@@ -565,35 +608,31 @@ function mergeCallerMetadataIntoTracePayload(payload) {
565
608
  if (typeof traceId !== "string" || traceId === "") {
566
609
  return payload;
567
610
  }
568
- const caller = callerMetadata.get(traceId);
569
- if (!caller) {
611
+ const record = findRecord(traceId);
612
+ if (!record || Object.keys(record.caller).length === 0) {
570
613
  return payload;
571
614
  }
572
- const derived = derivedMetadata.get(traceId) ?? {};
573
615
  const exported = external.metadata;
574
616
  if (typeof exported === "object" && exported !== null) {
575
- Object.assign(derived, exported);
576
- }
577
- derivedMetadata.set(traceId, derived);
578
- const shadowed = Object.keys(derived).filter((key) => key in caller && caller[key] !== derived[key]).sort();
579
- if (shadowed.length > 0) {
580
- warnOnce(
581
- `trace-metadata-shadowed:${shadowed.join(",")}`,
582
- `trace metadata key(s) ${shadowed.join(", ")} were set both by the caller and by an integration's own trace export; the caller's value is the one kept on the trace.`
583
- );
617
+ Object.assign(record.derived, exported);
584
618
  }
619
+ warnAboutShadowedKeys(traceId, record);
585
620
  return {
586
621
  ...payload,
587
- externalTrace: { ...external, metadata: { ...derived, ...caller } }
622
+ externalTrace: {
623
+ ...external,
624
+ metadata: { ...record.derived, ...record.caller }
625
+ }
588
626
  };
589
627
  }
590
- var callerMetadata, derivedMetadata;
628
+ var RETAINED_COMPLETED_TRACES, activeRecords, completedRecords;
591
629
  var init_traceMetadata = __esm({
592
630
  "src/traceMetadata.ts"() {
593
631
  "use strict";
594
632
  init_warnOnce();
595
- callerMetadata = /* @__PURE__ */ new Map();
596
- derivedMetadata = /* @__PURE__ */ new Map();
633
+ RETAINED_COMPLETED_TRACES = 128;
634
+ activeRecords = /* @__PURE__ */ new Map();
635
+ completedRecords = /* @__PURE__ */ new Map();
597
636
  }
598
637
  });
599
638
 
@@ -2076,6 +2115,18 @@ var init_http = __esm({
2076
2115
  { timeout: REPLAY_COMPLETE_REQUEST_TIMEOUT_MS }
2077
2116
  );
2078
2117
  }
2118
+ async getReseedSource(traceId) {
2119
+ return this.get(
2120
+ `/api/sdk/traces/${encodeURIComponent(traceId)}/reseedSource`
2121
+ );
2122
+ }
2123
+ async reseedTrace(traceId, runTraceId) {
2124
+ return this.request(
2125
+ `/api/sdk/traces/${encodeURIComponent(traceId)}/reseed`,
2126
+ { runTraceId },
2127
+ { timeout: 3e4 }
2128
+ );
2129
+ }
2079
2130
  /**
2080
2131
  * Ask the server to materialize a per-trace DB branch lease from a
2081
2132
  * captured `dbSnapshotRef`. Blocking - the resolver creates a Neon
@@ -2520,6 +2571,7 @@ __export(replay_exports, {
2520
2571
  BITFAB_PROGRESS_PREFIX: () => BITFAB_PROGRESS_PREFIX,
2521
2572
  DbBranchReplayError: () => DbBranchReplayError,
2522
2573
  ReplayError: () => ReplayError,
2574
+ deserializeInputs: () => deserializeInputs,
2523
2575
  replay: () => replay,
2524
2576
  reportReplayProgress: () => reportReplayProgress,
2525
2577
  serializeReplayResult: () => serializeReplayResult,
@@ -3370,6 +3422,7 @@ __export(index_exports, {
3370
3422
  getCurrentSpan: () => getCurrentSpan,
3371
3423
  getCurrentTrace: () => getCurrentTrace,
3372
3424
  reportReplayProgress: () => reportReplayProgress,
3425
+ reseedFromRegistry: () => reseedFromRegistry,
3373
3426
  seedFromRegistry: () => seedFromRegistry,
3374
3427
  serializeReplayResult: () => serializeReplayResult
3375
3428
  });
@@ -5679,6 +5732,7 @@ var BitfabOpenAIAgentHandler = class {
5679
5732
 
5680
5733
  // src/client.ts
5681
5734
  init_randomUuid();
5735
+ init_replay();
5682
5736
 
5683
5737
  // src/replayBranch.ts
5684
5738
  var _url, _context;
@@ -7458,7 +7512,7 @@ var Bitfab = class {
7458
7512
  }
7459
7513
  });
7460
7514
  activeTraceStates.delete(traceId);
7461
- forgetTraceMetadata(traceId);
7515
+ retireTraceMetadata(traceId);
7462
7516
  }
7463
7517
  } catch {
7464
7518
  }
@@ -7651,7 +7705,7 @@ var Bitfab = class {
7651
7705
  } catch (setupError) {
7652
7706
  if (registeredTraceId) {
7653
7707
  activeTraceStates.delete(registeredTraceId);
7654
- forgetTraceMetadata(registeredTraceId);
7708
+ retireTraceMetadata(registeredTraceId);
7655
7709
  }
7656
7710
  if (setupError instanceof MixedTracingError) {
7657
7711
  throw setupError;
@@ -8050,7 +8104,7 @@ var Bitfab = class {
8050
8104
  });
8051
8105
  } finally {
8052
8106
  activeTraceStates.delete(traceId);
8053
- forgetTraceMetadata(traceId);
8107
+ retireTraceMetadata(traceId);
8054
8108
  }
8055
8109
  return traceId;
8056
8110
  }
@@ -8096,7 +8150,7 @@ var Bitfab = class {
8096
8150
  await flushTraces2(3e4);
8097
8151
  } finally {
8098
8152
  unrecorded = activeTraceStates.delete(traceId);
8099
- forgetTraceMetadata(traceId);
8153
+ retireTraceMetadata(traceId);
8100
8154
  }
8101
8155
  }
8102
8156
  if (unrecorded) {
@@ -8106,6 +8160,36 @@ var Bitfab = class {
8106
8160
  }
8107
8161
  return traceId;
8108
8162
  }
8163
+ async reseedTrace(traceFunctionKey, fn, options) {
8164
+ const source = await this.httpClient.getReseedSource(options.traceId);
8165
+ if (source.traceFunctionKey !== traceFunctionKey) {
8166
+ throw new BitfabError(
8167
+ `Trace ${options.traceId} belongs to '${source.traceFunctionKey}', not '${traceFunctionKey}'.`
8168
+ );
8169
+ }
8170
+ const args = deserializeInputs({
8171
+ input: source.input,
8172
+ input_meta: source.inputMeta
8173
+ });
8174
+ const runTraceId = await this.seedTraceByRunning(
8175
+ traceFunctionKey,
8176
+ fn,
8177
+ {
8178
+ args,
8179
+ metadata: source.metadata,
8180
+ ...source.sessionId === null ? {} : { sessionId: source.sessionId },
8181
+ ...source.name === null ? {} : { name: source.name }
8182
+ }
8183
+ );
8184
+ const adopted = await this.httpClient.reseedTrace(
8185
+ options.traceId,
8186
+ runTraceId
8187
+ );
8188
+ return {
8189
+ traceId: adopted.traceId,
8190
+ previousRunTraceId: adopted.previousRunTraceId
8191
+ };
8192
+ }
8109
8193
  async replay(traceFunctionKey, fn, options) {
8110
8194
  const wrappedKey = fn._bitfabTraceFunctionKey;
8111
8195
  let replayFn = fn;
@@ -8367,6 +8451,24 @@ init_replay();
8367
8451
  function defineReplayRegistry(registry) {
8368
8452
  return registry;
8369
8453
  }
8454
+ async function reseedFromRegistry(registry, pipeline, traceIds) {
8455
+ const registration = registry[pipeline];
8456
+ if (registration === void 0) {
8457
+ throw new BitfabError(
8458
+ `Unknown pipeline '${pipeline}'. Registered: ${Object.keys(registry).join(", ")}`
8459
+ );
8460
+ }
8461
+ const traceFunctionKey = resolveTraceFunctionKey(registration);
8462
+ const reseeded = [];
8463
+ for (const traceId of traceIds) {
8464
+ reseeded.push(
8465
+ await registration.client.reseedTrace(traceFunctionKey, registration.fn, {
8466
+ traceId
8467
+ })
8468
+ );
8469
+ }
8470
+ return { pipeline, traceFunctionKey, reseeded };
8471
+ }
8370
8472
  async function seedFromRegistry(registry, pipeline, cases, options = {}) {
8371
8473
  const registration = registry[pipeline];
8372
8474
  if (registration === void 0) {
@@ -8443,6 +8545,7 @@ function resolveTraceFunctionKey(registration) {
8443
8545
  getCurrentSpan,
8444
8546
  getCurrentTrace,
8445
8547
  reportReplayProgress,
8548
+ reseedFromRegistry,
8446
8549
  seedFromRegistry,
8447
8550
  serializeReplayResult
8448
8551
  });