@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.
- package/dist/{chunk-XXKM4EL2.js → chunk-DP3QEGTV.js} +3 -2
- package/dist/chunk-DP3QEGTV.js.map +1 -0
- package/dist/{chunk-XLSKI7UA.js → chunk-LQ32JQNZ.js} +61 -11
- package/dist/chunk-LQ32JQNZ.js.map +1 -0
- package/dist/{chunk-36ARJJ6S.js → chunk-MM4A6UWJ.js} +48 -21
- package/dist/chunk-MM4A6UWJ.js.map +1 -0
- package/dist/{chunk-QWAWERYM.js → chunk-OF5GWNGU.js} +79 -28
- package/dist/chunk-OF5GWNGU.js.map +1 -0
- package/dist/chunk-P2AZ7RUM.js +747 -0
- package/dist/chunk-P2AZ7RUM.js.map +1 -0
- package/dist/{http-CVTQ3N5S.js → http-UA54C2J2.js} +2 -2
- package/dist/{http-V2WU4EN3.js → http-WBNDRQIV.js} +2 -2
- package/dist/index.cjs +134 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +36 -2
- package/dist/index.d.ts +36 -2
- package/dist/index.js +5 -3
- package/dist/node.cjs +134 -31
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.cts +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/node.js +5 -3
- package/dist/node.js.map +1 -1
- package/dist/{replay-5UAWEGXP.js → replay-RUONYMHD.js} +5 -3
- package/dist/replayCli.js +18 -687
- package/dist/replayCli.js.map +1 -1
- package/dist/seedCli.js +30 -0
- package/dist/seedCli.js.map +1 -0
- package/package.json +3 -2
- package/dist/chunk-36ARJJ6S.js.map +0 -1
- package/dist/chunk-QWAWERYM.js.map +0 -1
- package/dist/chunk-XLSKI7UA.js.map +0 -1
- package/dist/chunk-XXKM4EL2.js.map +0 -1
- /package/dist/{http-CVTQ3N5S.js.map → http-UA54C2J2.js.map} +0 -0
- /package/dist/{http-V2WU4EN3.js.map → http-WBNDRQIV.js.map} +0 -0
- /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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
552
|
-
|
|
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
|
|
555
|
-
|
|
556
|
-
|
|
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
|
|
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: {
|
|
622
|
+
externalTrace: {
|
|
623
|
+
...external,
|
|
624
|
+
metadata: { ...record.derived, ...record.caller }
|
|
625
|
+
}
|
|
588
626
|
};
|
|
589
627
|
}
|
|
590
|
-
var
|
|
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
|
-
|
|
596
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
});
|