@agent-native/core 0.84.49 → 0.84.52
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/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +20 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/run-store.ts +33 -6
- package/corpus/core/src/client/AssistantChat.tsx +84 -23
- package/corpus/core/src/client/agent-chat-adapter.ts +59 -9
- package/corpus/core/src/client/blocks/library/DiffBlock.tsx +7 -5
- package/corpus/core/src/client/session-replay.ts +170 -47
- package/corpus/core/src/client/sse-event-processor.ts +106 -29
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +5 -0
- package/corpus/templates/analytics/changelog/2026-07-02-agent-chat-can-keep-working-through-longer-data-queries-inst.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-02-session-replay-playback-recovers-from-failed-snapshot-uploads.md +6 -0
- package/corpus/templates/analytics/netlify.toml +3 -0
- package/corpus/templates/analytics/server/lib/session-replay.ts +9 -5
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -0
- package/corpus/templates/plan/changelog/2026-07-02-agent-chat-can-keep-working-through-longer-visual-plan-updat.md +6 -0
- package/corpus/templates/plan/netlify.toml +3 -0
- package/corpus/templates/plan/server/plugins/agent-chat.ts +4 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +30 -6
- package/dist/agent/run-store.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +64 -13
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +50 -9
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -1
- package/dist/client/blocks/library/DiffBlock.js +6 -5
- package/dist/client/blocks/library/DiffBlock.js.map +1 -1
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +134 -39
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +29 -3
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +72 -18
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +7 -7
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/client/session-replay.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/client/session-replay.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,uBAAuB,GAC/B,MAAM,GACN,MAAM,GACN,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;AAqD/B,iFAAiF;AACjF,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACtC,SAAS,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,eAAe,CAAC,EACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvB,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EACH,UAAU,GACV,aAAa,GACb,oBAAoB,GACpB,oBAAoB,GACpB,iBAAiB,GACjB,aAAa,GACb,aAAa,GACb,gBAAgB,GAChB,eAAe,GACf,eAAe,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAuRD,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,IAAI,SAAwB,GAC3B,MAAM,CAQR;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,UAAU,SAAI,EACd,IAAI,SAAwB,GAC3B,OAAO,CAKT;AA0gBD,wBAAsB,kBAAkB,CAAC,MAAM,SAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCzE;AAkDD,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC,CA2DnC;AA4GD,wBAAsB,iBAAiB,CAAC,MAAM,SAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBxE;AAED,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC,CAEnC;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C"}
|
|
@@ -40,6 +40,7 @@ const DEFAULT_MAX_DURATION_MS = 30 * 60 * 1000;
|
|
|
40
40
|
const DEFAULT_MAX_EVENTS_PER_BATCH = 50;
|
|
41
41
|
const DEFAULT_MAX_BATCH_BYTES = 256 * 1024;
|
|
42
42
|
const MAX_KEEPALIVE_REPLAY_UPLOAD_BYTES = 60 * 1024;
|
|
43
|
+
const RRWEB_FULL_SNAPSHOT_EVENT_TYPE = 2;
|
|
43
44
|
const URL_LIKE_KEYS = new Set([
|
|
44
45
|
"url",
|
|
45
46
|
"uri",
|
|
@@ -61,6 +62,7 @@ function getState() {
|
|
|
61
62
|
sequence: 0,
|
|
62
63
|
queue: [],
|
|
63
64
|
queuedBytes: 0,
|
|
65
|
+
retryBatches: [],
|
|
64
66
|
flushTimer: null,
|
|
65
67
|
maxDurationTimer: null,
|
|
66
68
|
flushing: false,
|
|
@@ -397,11 +399,10 @@ function enqueueReplayEvent(state, event) {
|
|
|
397
399
|
state.queue.push({
|
|
398
400
|
json: serialized,
|
|
399
401
|
timestampMs: replayEventTimestampMs(event),
|
|
402
|
+
type: typeof event.type === "number" ? event.type : null,
|
|
400
403
|
});
|
|
401
404
|
state.queuedBytes += estimatedBytes;
|
|
402
|
-
|
|
403
|
-
void flushSessionReplay("max-events");
|
|
404
|
-
}
|
|
405
|
+
flushQueuedReplayIfNeeded(state);
|
|
405
406
|
}
|
|
406
407
|
function replayExtraProperties(options) {
|
|
407
408
|
const source = options.extraProperties;
|
|
@@ -481,14 +482,17 @@ function buildReplayBody(state, reason, events) {
|
|
|
481
482
|
timestamp: new Date().toISOString(),
|
|
482
483
|
properties,
|
|
483
484
|
};
|
|
484
|
-
state.sequence += 1;
|
|
485
|
-
persistReplaySequence(sessionId, state.replayId, state.startedAtMs, state.sequence);
|
|
486
485
|
// Events are already serialized+scrubbed JSON strings; splice them into the
|
|
487
486
|
// envelope without re-serializing the (potentially large) events array.
|
|
488
487
|
const envelopeJson = JSON.stringify(envelope);
|
|
489
|
-
return
|
|
490
|
-
.
|
|
491
|
-
|
|
488
|
+
return {
|
|
489
|
+
body: `${envelopeJson.slice(0, -1)},"events":[${events
|
|
490
|
+
.map((event) => event.json)
|
|
491
|
+
.join(",")}]}`,
|
|
492
|
+
replayId: state.replayId,
|
|
493
|
+
sessionId,
|
|
494
|
+
sequence: state.sequence,
|
|
495
|
+
};
|
|
492
496
|
}
|
|
493
497
|
function isCrossOriginReplayEndpoint(endpoint) {
|
|
494
498
|
if (typeof window === "undefined")
|
|
@@ -500,12 +504,6 @@ function isCrossOriginReplayEndpoint(endpoint) {
|
|
|
500
504
|
return false;
|
|
501
505
|
}
|
|
502
506
|
}
|
|
503
|
-
function replayUploadByteLength(body) {
|
|
504
|
-
if (typeof TextEncoder !== "undefined") {
|
|
505
|
-
return new TextEncoder().encode(body).byteLength;
|
|
506
|
-
}
|
|
507
|
-
return body.length;
|
|
508
|
-
}
|
|
509
507
|
async function gzipReplayBody(body) {
|
|
510
508
|
if (typeof CompressionStream === "undefined" ||
|
|
511
509
|
typeof Blob === "undefined" ||
|
|
@@ -543,36 +541,59 @@ async function buildReplayUploadBody(body) {
|
|
|
543
541
|
},
|
|
544
542
|
};
|
|
545
543
|
}
|
|
546
|
-
|
|
547
|
-
if (
|
|
548
|
-
if (
|
|
549
|
-
|
|
550
|
-
if (sent)
|
|
551
|
-
return;
|
|
544
|
+
function replayUploadBodyBytes(body) {
|
|
545
|
+
if (typeof body === "string") {
|
|
546
|
+
if (typeof TextEncoder !== "undefined") {
|
|
547
|
+
return new TextEncoder().encode(body).byteLength;
|
|
552
548
|
}
|
|
553
|
-
|
|
549
|
+
return body.length;
|
|
550
|
+
}
|
|
551
|
+
if (typeof Blob !== "undefined" && body instanceof Blob) {
|
|
552
|
+
return body.size;
|
|
553
|
+
}
|
|
554
|
+
if (body instanceof ArrayBuffer) {
|
|
555
|
+
return body.byteLength;
|
|
556
|
+
}
|
|
557
|
+
if (ArrayBuffer.isView(body)) {
|
|
558
|
+
return body.byteLength;
|
|
559
|
+
}
|
|
560
|
+
return MAX_KEEPALIVE_REPLAY_UPLOAD_BYTES + 1;
|
|
561
|
+
}
|
|
562
|
+
function canUseReplayKeepalive(body) {
|
|
563
|
+
return replayUploadBodyBytes(body) <= MAX_KEEPALIVE_REPLAY_UPLOAD_BYTES;
|
|
564
|
+
}
|
|
565
|
+
async function sendReplayUpload(options, body, callbacks = {}) {
|
|
566
|
+
if (isCrossOriginReplayEndpoint(options.endpoint)) {
|
|
567
|
+
const canUseKeepalive = canUseReplayKeepalive(body);
|
|
568
|
+
if (canUseKeepalive)
|
|
569
|
+
callbacks.beforeKeepaliveUpload?.();
|
|
570
|
+
const response = await fetch(options.endpoint, {
|
|
554
571
|
method: "POST",
|
|
555
572
|
body,
|
|
556
|
-
keepalive:
|
|
573
|
+
keepalive: canUseKeepalive,
|
|
557
574
|
headers: { "Content-Type": "text/plain;charset=UTF-8" },
|
|
558
|
-
})
|
|
575
|
+
});
|
|
576
|
+
if (!response.ok) {
|
|
577
|
+
throw new Error(`Session replay upload failed with HTTP ${response.status}`);
|
|
578
|
+
}
|
|
559
579
|
return;
|
|
560
580
|
}
|
|
561
581
|
const upload = await buildReplayUploadBody(body);
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
}
|
|
567
|
-
await fetch(options.endpoint, {
|
|
582
|
+
const canUseKeepalive = canUseReplayKeepalive(upload.body);
|
|
583
|
+
if (canUseKeepalive)
|
|
584
|
+
callbacks.beforeKeepaliveUpload?.();
|
|
585
|
+
const response = await fetch(options.endpoint, {
|
|
568
586
|
method: "POST",
|
|
569
587
|
body: upload.body,
|
|
570
|
-
keepalive:
|
|
588
|
+
keepalive: canUseKeepalive,
|
|
571
589
|
headers: {
|
|
572
590
|
...upload.headers,
|
|
573
591
|
"X-Agent-Native-Analytics-Key": options.publicKey,
|
|
574
592
|
},
|
|
575
|
-
})
|
|
593
|
+
});
|
|
594
|
+
if (!response.ok) {
|
|
595
|
+
throw new Error(`Session replay upload failed with HTTP ${response.status}`);
|
|
596
|
+
}
|
|
576
597
|
}
|
|
577
598
|
function isFinalFlushReason(reason) {
|
|
578
599
|
return [
|
|
@@ -584,25 +605,98 @@ function isFinalFlushReason(reason) {
|
|
|
584
605
|
"max-duration",
|
|
585
606
|
].includes(reason);
|
|
586
607
|
}
|
|
608
|
+
function shouldReserveSequenceBeforeKeepalive(reason) {
|
|
609
|
+
return (reason === "pagehide" ||
|
|
610
|
+
reason === "beforeunload" ||
|
|
611
|
+
reason === "visibility-hidden");
|
|
612
|
+
}
|
|
613
|
+
function hasFullSnapshot(events) {
|
|
614
|
+
return events.some((event) => event.type === RRWEB_FULL_SNAPSHOT_EVENT_TYPE);
|
|
615
|
+
}
|
|
616
|
+
function hasPendingReplayBatch(state) {
|
|
617
|
+
return state.retryBatches.length > 0 || state.queue.length > 0;
|
|
618
|
+
}
|
|
619
|
+
function shouldFlushQueuedReplay(state) {
|
|
620
|
+
if (!state.options || state.queue.length === 0)
|
|
621
|
+
return false;
|
|
622
|
+
return (hasFullSnapshot(state.queue) ||
|
|
623
|
+
state.queue.length >= state.options.maxEventsPerBatch ||
|
|
624
|
+
state.queuedBytes >= state.options.maxBatchBytes);
|
|
625
|
+
}
|
|
626
|
+
function flushQueuedReplayIfNeeded(state) {
|
|
627
|
+
const options = state.options;
|
|
628
|
+
if (!options)
|
|
629
|
+
return;
|
|
630
|
+
if (state.retryBatches.length > 0)
|
|
631
|
+
return;
|
|
632
|
+
if (!shouldFlushQueuedReplay(state))
|
|
633
|
+
return;
|
|
634
|
+
const reason = hasFullSnapshot(state.queue)
|
|
635
|
+
? "full-snapshot"
|
|
636
|
+
: state.queue.length >= options.maxEventsPerBatch
|
|
637
|
+
? "max-events"
|
|
638
|
+
: "max-bytes";
|
|
639
|
+
void flushSessionReplay(reason);
|
|
640
|
+
}
|
|
641
|
+
function queuedReplayBytes(events) {
|
|
642
|
+
return events.reduce((total, event) => total + event.json.length, 0);
|
|
643
|
+
}
|
|
644
|
+
function restoreReplayEvents(state, events) {
|
|
645
|
+
state.retryBatches.unshift(events);
|
|
646
|
+
}
|
|
647
|
+
function advanceReplaySequence(state, payload) {
|
|
648
|
+
if (state.replayId !== payload.replayId)
|
|
649
|
+
return;
|
|
650
|
+
state.sequence = Math.max(state.sequence, payload.sequence + 1);
|
|
651
|
+
persistReplaySequence(payload.sessionId, payload.replayId, state.startedAtMs, state.sequence);
|
|
652
|
+
}
|
|
653
|
+
function rollbackReplaySequenceReservation(state, payload) {
|
|
654
|
+
if (state.replayId !== payload.replayId)
|
|
655
|
+
return;
|
|
656
|
+
if (state.sequence !== payload.sequence + 1)
|
|
657
|
+
return;
|
|
658
|
+
state.sequence = payload.sequence;
|
|
659
|
+
persistReplaySequence(payload.sessionId, payload.replayId, state.startedAtMs, state.sequence);
|
|
660
|
+
}
|
|
587
661
|
export async function flushSessionReplay(reason = "manual") {
|
|
588
662
|
const state = getState();
|
|
589
|
-
if (!state.options || state
|
|
663
|
+
if (!state.options || !hasPendingReplayBatch(state) || state.flushing)
|
|
590
664
|
return;
|
|
591
|
-
const events = state.
|
|
592
|
-
state.queuedBytes =
|
|
593
|
-
const
|
|
594
|
-
if (!
|
|
595
|
-
state
|
|
596
|
-
state.queuedBytes += events.reduce((total, event) => total + event.json.length, 0);
|
|
665
|
+
const events = state.retryBatches.shift() ?? state.queue.splice(0);
|
|
666
|
+
state.queuedBytes = queuedReplayBytes(state.queue);
|
|
667
|
+
const payload = buildReplayBody(state, reason, events);
|
|
668
|
+
if (!payload || !state.options) {
|
|
669
|
+
restoreReplayEvents(state, events);
|
|
597
670
|
return;
|
|
598
671
|
}
|
|
599
672
|
state.flushing = true;
|
|
673
|
+
let uploaded = false;
|
|
674
|
+
let reservedSequence = false;
|
|
600
675
|
try {
|
|
601
|
-
await sendReplayUpload(state.options, body
|
|
676
|
+
await sendReplayUpload(state.options, payload.body, {
|
|
677
|
+
beforeKeepaliveUpload: shouldReserveSequenceBeforeKeepalive(reason)
|
|
678
|
+
? () => {
|
|
679
|
+
advanceReplaySequence(state, payload);
|
|
680
|
+
reservedSequence = true;
|
|
681
|
+
}
|
|
682
|
+
: undefined,
|
|
683
|
+
});
|
|
684
|
+
if (!reservedSequence)
|
|
685
|
+
advanceReplaySequence(state, payload);
|
|
686
|
+
uploaded = true;
|
|
687
|
+
}
|
|
688
|
+
catch (error) {
|
|
689
|
+
if (reservedSequence)
|
|
690
|
+
rollbackReplaySequenceReservation(state, payload);
|
|
691
|
+
restoreReplayEvents(state, events);
|
|
692
|
+
console.warn("[session-replay] upload failed", error);
|
|
602
693
|
}
|
|
603
694
|
finally {
|
|
604
695
|
state.flushing = false;
|
|
605
696
|
}
|
|
697
|
+
if (uploaded && hasPendingReplayBatch(state)) {
|
|
698
|
+
flushQueuedReplayIfNeeded(state);
|
|
699
|
+
}
|
|
606
700
|
}
|
|
607
701
|
function installUrlMonitor(state) {
|
|
608
702
|
if (!state.options || state.restoreUrlMonitor)
|
|
@@ -727,6 +821,7 @@ async function startSessionReplayRecorder(state, normalized, sessionId, sampled,
|
|
|
727
821
|
state.sequence = replaySession.sequence;
|
|
728
822
|
state.queue = [];
|
|
729
823
|
state.queuedBytes = 0;
|
|
824
|
+
state.retryBatches = [];
|
|
730
825
|
state.stopRecorder = null;
|
|
731
826
|
state.lastAuthenticatedProperties = replayUserEmail(initialProperties)
|
|
732
827
|
? { ...initialProperties }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/client/session-replay.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getAnalyticsSessionId,\n getAnalyticsAnonymousId,\n scrubUrl,\n} from \"./analytics.js\";\n\ntype ReplayEvent = Record<string, unknown>;\ntype QueuedReplayEvent = {\n json: string;\n timestampMs: number;\n};\ntype ReplayStopFn = () => void;\nexport type SessionReplayUrlMatcher =\n | string\n | RegExp\n | ((url: string) => boolean);\n\ninterface RrwebRecordOptions {\n emit: (event: ReplayEvent) => void;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n inlineStylesheet?: boolean;\n blockClass?: string | RegExp;\n blockSelector?: string;\n ignoreClass?: string | RegExp;\n ignoreSelector?: string;\n maskTextClass?: string | RegExp;\n maskTextSelector?: string;\n maskAllInputs?: boolean;\n maskInputOptions?: Record<string, boolean>;\n recordCanvas?: boolean;\n recordCrossOriginIframes?: boolean;\n collectFonts?: boolean;\n inlineImages?: boolean;\n sampling?: Record<string, unknown>;\n}\n\ninterface RrwebRecordModule {\n record: (options: RrwebRecordOptions) => ReplayStopFn | undefined;\n}\n\ninterface SessionReplayState {\n active: boolean;\n startPromise: Promise<SessionReplayStartResult> | null;\n replayId: string | null;\n startedAtMs: number | null;\n sequence: number;\n /** Pre-serialized + scrubbed event JSON strings, ready to splice at flush. */\n queue: QueuedReplayEvent[];\n queuedBytes: number;\n flushTimer: number | null;\n maxDurationTimer: number | null;\n flushing: boolean;\n stopRecorder: ReplayStopFn | null;\n restoreUrlMonitor: (() => void) | null;\n removeLifecycleListeners: (() => void) | null;\n options: NormalizedSessionReplayOptions | null;\n lastAuthenticatedProperties: Record<string, unknown> | null;\n}\n\ninterface StoredReplaySession {\n sessionId?: string;\n replayId?: string;\n startedAtMs?: number;\n sequence?: number;\n}\n\n/** rrweb `sampling` shape (mousemove/scroll/media throttles, input strategy). */\nexport type ReplayEventSampling = Record<string, unknown>;\n\nexport interface SessionReplayOptions {\n enabled?: boolean;\n publicKey?: string;\n endpoint?: string;\n requireSignedInUser?: boolean;\n sampleRate?: number;\n samplingSalt?: string;\n allowUrls?: SessionReplayUrlMatcher[];\n blockUrls?: SessionReplayUrlMatcher[];\n flushIntervalMs?: number;\n maxDurationMs?: number;\n maxEventsPerBatch?: number;\n maxBatchBytes?: number;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n inlineStylesheet?: boolean;\n blockSelector?: string;\n ignoreSelector?: string;\n maskTextClass?: string | RegExp;\n maskTextSelector?: string;\n maskAllInputs?: boolean;\n recordCanvas?: boolean;\n recordCrossOriginIframes?: boolean;\n collectFonts?: boolean;\n inlineImages?: boolean;\n /**\n * rrweb per-event throttling (distinct from `sampleRate`, which decides\n * whether a whole session records). Throttles high-frequency event types\n * (mousemove/scroll/input) to keep the recorded page responsive and the\n * payloads small. Passed straight through to `rrweb.record({ sampling })`.\n */\n eventSampling?: ReplayEventSampling;\n extraProperties?:\n | Record<string, unknown>\n | (() => Record<string, unknown> | undefined);\n}\n\nexport interface SessionReplayStartResult {\n started: boolean;\n reason?:\n | \"disabled\"\n | \"not-browser\"\n | \"missing-public-key\"\n | \"missing-session-id\"\n | \"missing-user-id\"\n | \"sampled-out\"\n | \"url-blocked\"\n | \"already-active\"\n | \"import-failed\"\n | \"record-failed\";\n replayId?: string;\n sessionId?: string;\n sampled?: boolean;\n}\n\ninterface NormalizedSessionReplayOptions {\n publicKey: string;\n endpoint: string;\n requireSignedInUser: boolean;\n sampleRate: number;\n samplingSalt: string;\n allowUrls: SessionReplayUrlMatcher[];\n blockUrls: SessionReplayUrlMatcher[];\n flushIntervalMs: number;\n maxDurationMs: number;\n maxEventsPerBatch: number;\n maxBatchBytes: number;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n inlineStylesheet: boolean;\n blockSelector: string;\n ignoreSelector: string;\n maskTextClass: string | RegExp;\n maskTextSelector: string;\n maskAllInputs: boolean;\n recordCanvas: boolean;\n recordCrossOriginIframes: boolean;\n collectFonts: boolean;\n inlineImages: boolean;\n eventSampling: ReplayEventSampling;\n extraProperties?: SessionReplayOptions[\"extraProperties\"];\n}\n\nconst DEFAULT_REPLAY_PATH = \"/api/analytics/replay\";\nconst DEFAULT_SAMPLING_SALT = \"agent-native-session-replay\";\n\n/**\n * Default rrweb event throttling. Without this, rrweb captures every\n * mousemove/scroll which dominates event volume and main-thread cost on\n * interactive pages. These caps keep replays faithful while staying light.\n */\nconst DEFAULT_EVENT_SAMPLING: ReplayEventSampling = {\n mousemove: 50,\n mouseInteraction: true,\n scroll: 100,\n media: 800,\n input: \"last\",\n};\nconst SESSION_REPLAY_STATE_KEY = Symbol.for(\n \"agent-native.client.sessionReplay\",\n);\nconst SESSION_REPLAY_ID_STORAGE_KEY = \"agent-native.session_replay_id\";\nconst DEFAULT_BLOCK_SELECTOR = [\n \"[data-sensitive]\",\n \"[data-an-block]\",\n \"[data-an-private]\",\n \"[data-private]\",\n \".an-block\",\n \".an-replay-block\",\n \".an-private\",\n \".rr-block\",\n \"[autocomplete='cc-number']\",\n \"[autocomplete='cc-csc']\",\n \"[autocomplete='cc-exp']\",\n \"[name*='password' i]\",\n \"[name*='credit' i]\",\n \"[name*='card' i]\",\n \"[name*='ssn' i]\",\n].join(\", \");\nconst DEFAULT_IGNORE_SELECTOR = \".an-ignore, [data-an-ignore]\";\nconst DEFAULT_MASK_TEXT_CLASS = \"an-mask\";\nconst DEFAULT_MASK_TEXT_SELECTOR = \"[data-an-mask]\";\nconst DEFAULT_FLUSH_INTERVAL_MS = 5000;\nconst DEFAULT_MAX_DURATION_MS = 30 * 60 * 1000;\nconst DEFAULT_MAX_EVENTS_PER_BATCH = 50;\nconst DEFAULT_MAX_BATCH_BYTES = 256 * 1024;\nconst MAX_KEEPALIVE_REPLAY_UPLOAD_BYTES = 60 * 1024;\nconst URL_LIKE_KEYS = new Set([\n \"url\",\n \"uri\",\n \"href\",\n \"src\",\n \"currentUrl\",\n \"referrer\",\n \"from\",\n \"to\",\n]);\n\nfunction getState(): SessionReplayState {\n const g = globalThis as typeof globalThis & {\n [SESSION_REPLAY_STATE_KEY]?: SessionReplayState;\n };\n if (!g[SESSION_REPLAY_STATE_KEY]) {\n g[SESSION_REPLAY_STATE_KEY] = {\n active: false,\n startPromise: null,\n replayId: null,\n startedAtMs: null,\n sequence: 0,\n queue: [],\n queuedBytes: 0,\n flushTimer: null,\n maxDurationTimer: null,\n flushing: false,\n stopRecorder: null,\n restoreUrlMonitor: null,\n removeLifecycleListeners: null,\n options: null,\n lastAuthenticatedProperties: null,\n };\n }\n return g[SESSION_REPLAY_STATE_KEY]!;\n}\n\nfunction safeStorageGet(key: string): string | null {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeStorageSet(key: string, value: string): void {\n try {\n window.localStorage.setItem(key, value);\n } catch {\n // private browsing / storage disabled -- replay still works for this page\n }\n}\n\nfunction generateReplayId(): string {\n try {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n } catch {\n // fall through\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction readStoredReplaySession(): StoredReplaySession | null {\n const raw = safeStorageGet(SESSION_REPLAY_ID_STORAGE_KEY);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as StoredReplaySession;\n if (!parsed || typeof parsed !== \"object\") return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction writeStoredReplaySession(value: StoredReplaySession): void {\n safeStorageSet(SESSION_REPLAY_ID_STORAGE_KEY, JSON.stringify(value));\n}\n\nfunction getOrCreateReplaySession(sessionId: string): {\n replayId: string;\n startedAtMs: number;\n sequence: number;\n} {\n const parsed = readStoredReplaySession();\n if (parsed?.sessionId === sessionId && parsed.replayId) {\n const startedAtMs =\n typeof parsed.startedAtMs === \"number\" &&\n Number.isFinite(parsed.startedAtMs) &&\n parsed.startedAtMs > 0\n ? parsed.startedAtMs\n : Date.now();\n const sequence =\n typeof parsed.sequence === \"number\" &&\n Number.isFinite(parsed.sequence) &&\n parsed.sequence >= 0\n ? Math.floor(parsed.sequence)\n : 0;\n return { replayId: parsed.replayId, startedAtMs, sequence };\n }\n const replayId = generateReplayId();\n const startedAtMs = Date.now();\n writeStoredReplaySession({ sessionId, replayId, startedAtMs, sequence: 0 });\n return { replayId, startedAtMs, sequence: 0 };\n}\n\nfunction persistReplaySequence(\n sessionId: string,\n replayId: string,\n startedAtMs: number | null,\n sequence: number,\n): void {\n writeStoredReplaySession({\n sessionId,\n replayId,\n startedAtMs: startedAtMs ?? Date.now(),\n sequence,\n });\n}\n\nfunction clampSamplingRate(value: number | undefined): number {\n if (typeof value !== \"number\" || Number.isNaN(value)) return 1;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction readEnvString(key: string): string | undefined {\n return (import.meta.env as Record<string, string | undefined>)?.[key]?.trim();\n}\n\nfunction readEnvNumber(key: string): number | undefined {\n const raw = readEnvString(key);\n if (!raw) return undefined;\n const value = Number(raw);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction readEnvBoolean(key: string): boolean | undefined {\n const raw = readEnvString(key);\n if (!raw) return undefined;\n if (/^(1|true|yes|on)$/i.test(raw)) return true;\n if (/^(0|false|no|off)$/i.test(raw)) return false;\n return undefined;\n}\n\nfunction readFirstEnvString(keys: string[]): string | undefined {\n for (const key of keys) {\n const value = readEnvString(key);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction readFirstEnvNumber(keys: string[]): number | undefined {\n for (const key of keys) {\n const value = readEnvNumber(key);\n if (value !== undefined) return value;\n }\n return undefined;\n}\n\nfunction replayEndpointFromAnalyticsEndpoint(value: string): string | null {\n try {\n const url = new URL(value);\n if (url.pathname.endsWith(\"/api/analytics/track\")) {\n url.pathname = url.pathname.replace(\n /\\/api\\/analytics\\/track$/,\n \"/api/analytics/replay\",\n );\n return url.toString();\n }\n if (url.pathname.endsWith(\"/track\")) {\n url.pathname = url.pathname.replace(/\\/track$/, \"/api/analytics/replay\");\n return url.toString();\n }\n } catch {\n // Fall through to the relative path cases below.\n }\n if (value.endsWith(\"/api/analytics/track\")) {\n return value.replace(/\\/api\\/analytics\\/track$/, \"/api/analytics/replay\");\n }\n if (value.endsWith(\"/track\")) {\n return value.replace(/\\/track$/, \"/api/analytics/replay\");\n }\n return null;\n}\n\nfunction defaultReplayEndpoint(): string {\n const analyticsEndpoint = readEnvString(\n \"VITE_AGENT_NATIVE_ANALYTICS_ENDPOINT\",\n );\n const derived = analyticsEndpoint\n ? replayEndpointFromAnalyticsEndpoint(analyticsEndpoint)\n : null;\n if (derived) return derived;\n return typeof window !== \"undefined\"\n ? `${window.location.origin}${DEFAULT_REPLAY_PATH}`\n : DEFAULT_REPLAY_PATH;\n}\n\nexport function getSessionReplaySamplingScore(\n sessionId: string,\n salt = DEFAULT_SAMPLING_SALT,\n): number {\n let hash = 2166136261;\n const input = `${salt}:${sessionId}`;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0) / 4294967296;\n}\n\nexport function shouldSampleSessionReplay(\n sessionId: string,\n sampleRate = 1,\n salt = DEFAULT_SAMPLING_SALT,\n): boolean {\n const rate = clampSamplingRate(sampleRate);\n if (rate <= 0) return false;\n if (rate >= 1) return true;\n return getSessionReplaySamplingScore(sessionId, salt) < rate;\n}\n\nfunction matcherAllows(matcher: SessionReplayUrlMatcher, url: string): boolean {\n if (typeof matcher === \"string\") return url.includes(matcher);\n if (matcher instanceof RegExp) return matcher.test(url);\n return matcher(url);\n}\n\nfunction isUrlRecordable(\n url: string,\n options: Pick<NormalizedSessionReplayOptions, \"allowUrls\" | \"blockUrls\">,\n): boolean {\n if (options.allowUrls.length > 0) {\n const allowed = options.allowUrls.some((matcher) =>\n matcherAllows(matcher, url),\n );\n if (!allowed) return false;\n }\n return !options.blockUrls.some((matcher) => matcherAllows(matcher, url));\n}\n\nfunction normalizeOptions(\n options: SessionReplayOptions,\n): NormalizedSessionReplayOptions | null {\n const publicKey =\n options.publicKey ||\n readFirstEnvString([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_PUBLIC_KEY\",\n \"VITE_SESSION_REPLAY_PUBLIC_KEY\",\n ]) ||\n (import.meta.env as Record<string, string | undefined>)\n ?.VITE_AGENT_NATIVE_ANALYTICS_PUBLIC_KEY;\n if (!publicKey) return null;\n const endpoint =\n options.endpoint ||\n readFirstEnvString([\n \"VITE_AGENT_NATIVE_ANALYTICS_REPLAY_ENDPOINT\",\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_ENDPOINT\",\n \"VITE_SESSION_REPLAY_INGEST_URL\",\n ]) ||\n defaultReplayEndpoint();\n return {\n publicKey,\n endpoint,\n requireSignedInUser:\n options.requireSignedInUser ??\n readEnvBoolean(\"VITE_AGENT_NATIVE_SESSION_REPLAY_REQUIRE_AUTH\") ??\n readEnvBoolean(\"VITE_SESSION_REPLAY_REQUIRE_AUTH\") ??\n false,\n sampleRate: clampSamplingRate(\n options.sampleRate ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE\",\n \"VITE_SESSION_REPLAY_SAMPLE_RATE\",\n ]),\n ),\n samplingSalt: options.samplingSalt || DEFAULT_SAMPLING_SALT,\n allowUrls: options.allowUrls ?? [],\n blockUrls: options.blockUrls ?? [],\n flushIntervalMs: Math.max(\n 250,\n options.flushIntervalMs ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_CHUNK_INTERVAL_MS\",\n \"VITE_SESSION_REPLAY_CHUNK_INTERVAL_MS\",\n ]) ??\n DEFAULT_FLUSH_INTERVAL_MS,\n ),\n maxDurationMs: Math.max(\n 1000,\n options.maxDurationMs ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_MAX_DURATION_MS\",\n \"VITE_SESSION_REPLAY_MAX_DURATION_MS\",\n ]) ??\n DEFAULT_MAX_DURATION_MS,\n ),\n maxEventsPerBatch: Math.max(\n 1,\n options.maxEventsPerBatch ?? DEFAULT_MAX_EVENTS_PER_BATCH,\n ),\n maxBatchBytes: Math.max(\n 1024,\n options.maxBatchBytes ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_CHUNK_MAX_BYTES\",\n \"VITE_SESSION_REPLAY_CHUNK_MAX_BYTES\",\n ]) ??\n DEFAULT_MAX_BATCH_BYTES,\n ),\n checkoutEveryNth: options.checkoutEveryNth,\n checkoutEveryNms: options.checkoutEveryNms,\n inlineStylesheet: options.inlineStylesheet ?? true,\n blockSelector: options.blockSelector || DEFAULT_BLOCK_SELECTOR,\n ignoreSelector: options.ignoreSelector || DEFAULT_IGNORE_SELECTOR,\n maskTextClass: options.maskTextClass || DEFAULT_MASK_TEXT_CLASS,\n maskTextSelector: options.maskTextSelector || DEFAULT_MASK_TEXT_SELECTOR,\n maskAllInputs: options.maskAllInputs ?? true,\n recordCanvas: options.recordCanvas ?? false,\n recordCrossOriginIframes: options.recordCrossOriginIframes ?? false,\n collectFonts: options.collectFonts ?? false,\n inlineImages: options.inlineImages ?? false,\n eventSampling: options.eventSampling ?? DEFAULT_EVENT_SAMPLING,\n extraProperties: options.extraProperties,\n };\n}\n\nfunction scrubStringValue(key: string, value: string): string {\n const lowerKey = key.toLowerCase();\n const isUrlKey = URL_LIKE_KEYS.has(key) || URL_LIKE_KEYS.has(lowerKey);\n if (\n isUrlKey ||\n value.startsWith(\"http://\") ||\n value.startsWith(\"https://\") ||\n value.startsWith(\"/\")\n ) {\n return scrubUrl(value) ?? value;\n }\n return value;\n}\n\nfunction scrubReplayValue(\n value: unknown,\n key = \"\",\n depth = 0,\n seen = new WeakSet<object>(),\n): unknown {\n if (typeof value === \"string\") return scrubStringValue(key, value);\n if (!value || typeof value !== \"object\") return value;\n if (depth > 12) return value;\n if (seen.has(value)) return value;\n seen.add(value);\n if (Array.isArray(value)) {\n return value.map((item) => scrubReplayValue(item, key, depth + 1, seen));\n }\n const out: Record<string, unknown> = {};\n for (const [childKey, childValue] of Object.entries(value)) {\n out[childKey] = scrubReplayValue(childValue, childKey, depth + 1, seen);\n }\n return out;\n}\n\n/**\n * JSON.stringify replacer that scrubs URL-like string values inline. Folding\n * the scrub into the single serialization pass avoids a separate deep-clone of\n * every emitted event (FullSnapshots are large DOM trees) on the hot path.\n */\nfunction scrubReplayReplacer(key: string, value: unknown): unknown {\n return typeof value === \"string\" ? scrubStringValue(key, value) : value;\n}\n\n/**\n * Serialize + scrub one event in a single pass. The resulting string is stored\n * directly on the queue and reused verbatim at flush, so each event is\n * stringified exactly once (was: deep-clone + size-stringify + flush-stringify).\n */\nfunction serializeReplayEvent(event: ReplayEvent): string {\n try {\n return JSON.stringify(event, scrubReplayReplacer);\n } catch {\n return \"\";\n }\n}\n\nfunction replayEventTimestampMs(event: ReplayEvent): number {\n const timestamp = event.timestamp;\n if (typeof timestamp === \"number\" && Number.isFinite(timestamp)) {\n return timestamp;\n }\n if (typeof timestamp === \"string\" && timestamp.trim()) {\n const parsed = Date.parse(timestamp);\n if (Number.isFinite(parsed)) return parsed;\n }\n return Date.now();\n}\n\nfunction enqueueReplayEvent(\n state: SessionReplayState,\n event: ReplayEvent,\n): void {\n if (!state.options) return;\n const serialized = serializeReplayEvent(event);\n if (!serialized) return;\n const estimatedBytes = serialized.length;\n if (\n state.queue.length > 0 &&\n state.queuedBytes + estimatedBytes > state.options.maxBatchBytes\n ) {\n void flushSessionReplay(\"max-bytes\");\n }\n state.queue.push({\n json: serialized,\n timestampMs: replayEventTimestampMs(event),\n });\n state.queuedBytes += estimatedBytes;\n if (state.queue.length >= state.options.maxEventsPerBatch) {\n void flushSessionReplay(\"max-events\");\n }\n}\n\nfunction replayExtraProperties(\n options: NormalizedSessionReplayOptions,\n): Record<string, unknown> | undefined {\n const source = options.extraProperties;\n if (!source) return undefined;\n try {\n const props = typeof source === \"function\" ? source() : source;\n if (!props || typeof props !== \"object\") return undefined;\n return scrubReplayValue(props) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nfunction replayString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction replayEmail(value: unknown): string | undefined {\n const raw = replayString(value);\n return raw && raw.includes(\"@\") ? raw : undefined;\n}\n\nfunction replayUserEmail(\n properties: Record<string, unknown> | undefined,\n): string | undefined {\n return (\n replayEmail(properties?.userEmail ?? properties?.user_email) ||\n replayEmail(properties?.email) ||\n replayEmail(properties?.userId ?? properties?.user_id)\n );\n}\n\nfunction replayPropertiesForUpload(\n state: SessionReplayState,\n options: NormalizedSessionReplayOptions,\n): Record<string, unknown> | undefined {\n const properties = replayExtraProperties(options);\n if (replayUserEmail(properties)) {\n state.lastAuthenticatedProperties = properties ? { ...properties } : null;\n return properties;\n }\n if (options.requireSignedInUser && state.lastAuthenticatedProperties) {\n return state.lastAuthenticatedProperties;\n }\n return properties;\n}\n\nfunction buildReplayBody(\n state: SessionReplayState,\n reason: string,\n events: QueuedReplayEvent[],\n): string | null {\n const options = state.options;\n if (!options || !state.replayId) return null;\n const sessionId = getAnalyticsSessionId();\n if (!sessionId) return null;\n const properties = replayPropertiesForUpload(state, options);\n const userEmail = replayUserEmail(properties);\n if (options.requireSignedInUser && !userEmail) return null;\n const userId =\n userEmail || replayString(properties?.userId ?? properties?.user_id);\n const eventTimestamps = events.map((event) => event.timestampMs);\n const nowMs = Date.now();\n const startedAtMs =\n state.startedAtMs ??\n (eventTimestamps.length ? Math.min(...eventTimestamps) : nowMs);\n const endedAtMs = eventTimestamps.length\n ? Math.max(...eventTimestamps)\n : nowMs;\n const envelope = {\n publicKey: options.publicKey,\n type: \"session_replay\",\n replayId: state.replayId,\n sessionId,\n ...(userId ? { userId } : {}),\n ...(userEmail ? { userEmail } : {}),\n anonymousId: getAnalyticsAnonymousId(),\n sequence: state.sequence,\n reason,\n status: isFinalFlushReason(reason) ? \"completed\" : \"active\",\n eventCount: events.length,\n startedAt: new Date(startedAtMs).toISOString(),\n endedAt: new Date(endedAtMs).toISOString(),\n durationMs: Math.max(0, endedAtMs - startedAtMs),\n privacyMode: \"mask-inputs-and-selected-text\",\n url:\n typeof window !== \"undefined\"\n ? scrubUrl(window.location.href)\n : undefined,\n timestamp: new Date().toISOString(),\n properties,\n };\n state.sequence += 1;\n persistReplaySequence(\n sessionId,\n state.replayId,\n state.startedAtMs,\n state.sequence,\n );\n // Events are already serialized+scrubbed JSON strings; splice them into the\n // envelope without re-serializing the (potentially large) events array.\n const envelopeJson = JSON.stringify(envelope);\n return `${envelopeJson.slice(0, -1)},\"events\":[${events\n .map((event) => event.json)\n .join(\",\")}]}`;\n}\n\ninterface ReplayUploadBody {\n body: BodyInit;\n headers: Record<string, string>;\n compressed: boolean;\n}\n\nfunction isCrossOriginReplayEndpoint(endpoint: string): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n return (\n new URL(endpoint, window.location.href).origin !== window.location.origin\n );\n } catch {\n return false;\n }\n}\n\nfunction replayUploadByteLength(body: string): number {\n if (typeof TextEncoder !== \"undefined\") {\n return new TextEncoder().encode(body).byteLength;\n }\n return body.length;\n}\n\nasync function gzipReplayBody(body: string): Promise<Blob | null> {\n if (\n typeof CompressionStream === \"undefined\" ||\n typeof Blob === \"undefined\" ||\n typeof Response === \"undefined\"\n ) {\n return null;\n }\n try {\n const stream = new Blob([body], { type: \"application/json\" })\n .stream()\n .pipeThrough(new CompressionStream(\"gzip\"));\n const compressed = await new Response(stream).arrayBuffer();\n return new Blob([compressed], { type: \"application/octet-stream\" });\n } catch {\n return null;\n }\n}\n\nasync function buildReplayUploadBody(body: string): Promise<ReplayUploadBody> {\n const compressed = await gzipReplayBody(body);\n if (compressed) {\n return {\n body: compressed,\n compressed: true,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n \"Content-Encoding\": \"gzip\",\n },\n };\n }\n return {\n body,\n compressed: false,\n headers: {\n \"Content-Type\": \"text/plain;charset=UTF-8\",\n },\n };\n}\n\nasync function sendReplayUpload(\n options: NormalizedSessionReplayOptions,\n body: string,\n): Promise<void> {\n if (isCrossOriginReplayEndpoint(options.endpoint)) {\n if (navigator.sendBeacon) {\n const sent = navigator.sendBeacon(options.endpoint, body);\n if (sent) return;\n }\n await fetch(options.endpoint, {\n method: \"POST\",\n body,\n keepalive:\n replayUploadByteLength(body) <= MAX_KEEPALIVE_REPLAY_UPLOAD_BYTES,\n headers: { \"Content-Type\": \"text/plain;charset=UTF-8\" },\n }).catch(() => {});\n return;\n }\n\n const upload = await buildReplayUploadBody(body);\n if (!upload.compressed && navigator.sendBeacon) {\n const sent = navigator.sendBeacon(options.endpoint, body);\n if (sent) return;\n }\n await fetch(options.endpoint, {\n method: \"POST\",\n body: upload.body,\n keepalive: true,\n headers: {\n ...upload.headers,\n \"X-Agent-Native-Analytics-Key\": options.publicKey,\n },\n }).catch(() => {});\n}\n\nfunction isFinalFlushReason(reason: string): boolean {\n return [\n \"auth-cleared\",\n \"manual\",\n \"pagehide\",\n \"beforeunload\",\n \"url-blocked\",\n \"max-duration\",\n ].includes(reason);\n}\n\nexport async function flushSessionReplay(reason = \"manual\"): Promise<void> {\n const state = getState();\n if (!state.options || state.queue.length === 0 || state.flushing) return;\n const events = state.queue.splice(0, state.queue.length);\n state.queuedBytes = 0;\n const body = buildReplayBody(state, reason, events);\n if (!body || !state.options) {\n state.queue = events.concat(state.queue);\n state.queuedBytes += events.reduce(\n (total, event) => total + event.json.length,\n 0,\n );\n return;\n }\n state.flushing = true;\n try {\n await sendReplayUpload(state.options, body);\n } finally {\n state.flushing = false;\n }\n}\n\nfunction installUrlMonitor(state: SessionReplayState): void {\n if (!state.options || state.restoreUrlMonitor) return;\n const options = state.options;\n const check = () => {\n if (!isUrlRecordable(window.location.href, options)) {\n stopSessionReplay(\"url-blocked\");\n }\n };\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n window.history.pushState = function pushState(...args) {\n const result = originalPushState.apply(this, args);\n queueMicrotask(check);\n return result;\n };\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplaceState.apply(this, args);\n queueMicrotask(check);\n return result;\n };\n window.addEventListener(\"popstate\", check);\n state.restoreUrlMonitor = () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n window.removeEventListener(\"popstate\", check);\n state.restoreUrlMonitor = null;\n };\n}\n\nfunction installLifecycleListeners(state: SessionReplayState): void {\n if (state.removeLifecycleListeners) return;\n const flushOnHidden = () => {\n if (document.visibilityState === \"hidden\") {\n void flushSessionReplay(\"visibility-hidden\");\n }\n };\n const flushOnUnload = () => {\n void flushSessionReplay(\"pagehide\");\n };\n document.addEventListener(\"visibilitychange\", flushOnHidden);\n window.addEventListener(\"pagehide\", flushOnUnload);\n state.removeLifecycleListeners = () => {\n document.removeEventListener(\"visibilitychange\", flushOnHidden);\n window.removeEventListener(\"pagehide\", flushOnUnload);\n state.removeLifecycleListeners = null;\n };\n}\n\nexport async function startSessionReplay(\n options: SessionReplayOptions = {},\n): Promise<SessionReplayStartResult> {\n if (options.enabled === false) return { started: false, reason: \"disabled\" };\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return { started: false, reason: \"not-browser\" };\n }\n const normalized = normalizeOptions(options);\n if (!normalized) return { started: false, reason: \"missing-public-key\" };\n\n const sessionId = getAnalyticsSessionId();\n if (!sessionId) return { started: false, reason: \"missing-session-id\" };\n const sampled = shouldSampleSessionReplay(\n sessionId,\n normalized.sampleRate,\n normalized.samplingSalt,\n );\n if (!sampled) {\n return { started: false, reason: \"sampled-out\", sessionId, sampled };\n }\n const initialProperties = replayExtraProperties(normalized);\n if (normalized.requireSignedInUser) {\n if (!replayUserEmail(initialProperties)) {\n return {\n started: false,\n reason: \"missing-user-id\",\n sessionId,\n sampled,\n };\n }\n }\n if (!isUrlRecordable(window.location.href, normalized)) {\n return { started: false, reason: \"url-blocked\", sessionId, sampled };\n }\n\n const state = getState();\n if (state.active && state.replayId) {\n return {\n started: true,\n reason: \"already-active\",\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n }\n if (state.startPromise) return state.startPromise;\n\n let startPromise: Promise<SessionReplayStartResult>;\n startPromise = startSessionReplayRecorder(\n state,\n normalized,\n sessionId,\n sampled,\n initialProperties,\n ).finally(() => {\n if (state.startPromise === startPromise) {\n state.startPromise = null;\n }\n });\n state.startPromise = startPromise;\n return startPromise;\n}\n\nasync function startSessionReplayRecorder(\n state: SessionReplayState,\n normalized: NormalizedSessionReplayOptions,\n sessionId: string,\n sampled: boolean,\n initialProperties: Record<string, unknown> | undefined,\n): Promise<SessionReplayStartResult> {\n if (state.active && state.replayId) {\n return {\n started: true,\n reason: \"already-active\",\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n }\n\n let rrweb: RrwebRecordModule;\n try {\n rrweb = (await import(\"@rrweb/record\")) as RrwebRecordModule;\n } catch {\n return { started: false, reason: \"import-failed\", sessionId, sampled };\n }\n\n const replaySession = getOrCreateReplaySession(sessionId);\n state.options = normalized;\n state.replayId = replaySession.replayId;\n state.startedAtMs = replaySession.startedAtMs;\n state.sequence = replaySession.sequence;\n state.queue = [];\n state.queuedBytes = 0;\n state.stopRecorder = null;\n state.lastAuthenticatedProperties = replayUserEmail(initialProperties)\n ? { ...initialProperties }\n : null;\n state.active = true;\n\n try {\n const stopRecorder = rrweb.record({\n emit: (event) => enqueueReplayEvent(state, event),\n sampling: normalized.eventSampling,\n checkoutEveryNth: normalized.checkoutEveryNth,\n checkoutEveryNms: normalized.checkoutEveryNms,\n inlineStylesheet: normalized.inlineStylesheet,\n blockSelector: normalized.blockSelector,\n ignoreSelector: normalized.ignoreSelector,\n maskTextClass: normalized.maskTextClass,\n maskTextSelector: normalized.maskTextSelector,\n maskAllInputs: normalized.maskAllInputs,\n recordCanvas: normalized.recordCanvas,\n recordCrossOriginIframes: normalized.recordCrossOriginIframes,\n collectFonts: normalized.collectFonts,\n inlineImages: normalized.inlineImages,\n maskInputOptions: {\n color: true,\n date: true,\n \"datetime-local\": true,\n email: true,\n month: true,\n number: true,\n password: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n },\n });\n if (typeof stopRecorder !== \"function\") {\n state.active = false;\n state.options = null;\n state.replayId = null;\n state.startedAtMs = null;\n state.lastAuthenticatedProperties = null;\n return { started: false, reason: \"record-failed\", sessionId, sampled };\n }\n state.stopRecorder = stopRecorder;\n state.flushTimer = window.setInterval(\n () => void flushSessionReplay(\"interval\"),\n normalized.flushIntervalMs,\n );\n state.maxDurationTimer = window.setTimeout(\n () => stopSessionReplay(\"max-duration\"),\n normalized.maxDurationMs,\n );\n installUrlMonitor(state);\n installLifecycleListeners(state);\n return {\n started: true,\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n } catch {\n state.active = false;\n state.options = null;\n state.replayId = null;\n state.startedAtMs = null;\n state.lastAuthenticatedProperties = null;\n return { started: false, reason: \"record-failed\", sessionId, sampled };\n }\n}\n\nexport async function stopSessionReplay(reason = \"manual\"): Promise<void> {\n const state = getState();\n if (!state.active) return;\n state.active = false;\n try {\n state.stopRecorder?.();\n } catch {\n // best-effort recorder shutdown\n }\n state.stopRecorder = null;\n if (state.flushTimer) {\n window.clearInterval(state.flushTimer);\n state.flushTimer = null;\n }\n if (state.maxDurationTimer) {\n window.clearTimeout(state.maxDurationTimer);\n state.maxDurationTimer = null;\n }\n state.restoreUrlMonitor?.();\n state.removeLifecycleListeners?.();\n await flushSessionReplay(reason);\n}\n\nexport function maybeStartSessionReplay(\n options: SessionReplayOptions = {},\n): Promise<SessionReplayStartResult> {\n return startSessionReplay(options);\n}\n\nexport function isSessionReplayActive(): boolean {\n return getState().active;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/client/session-replay.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getAnalyticsSessionId,\n getAnalyticsAnonymousId,\n scrubUrl,\n} from \"./analytics.js\";\n\ntype ReplayEvent = Record<string, unknown>;\ntype QueuedReplayEvent = {\n json: string;\n timestampMs: number;\n type: number | null;\n};\ntype ReplayStopFn = () => void;\nexport type SessionReplayUrlMatcher =\n | string\n | RegExp\n | ((url: string) => boolean);\n\ninterface RrwebRecordOptions {\n emit: (event: ReplayEvent) => void;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n inlineStylesheet?: boolean;\n blockClass?: string | RegExp;\n blockSelector?: string;\n ignoreClass?: string | RegExp;\n ignoreSelector?: string;\n maskTextClass?: string | RegExp;\n maskTextSelector?: string;\n maskAllInputs?: boolean;\n maskInputOptions?: Record<string, boolean>;\n recordCanvas?: boolean;\n recordCrossOriginIframes?: boolean;\n collectFonts?: boolean;\n inlineImages?: boolean;\n sampling?: Record<string, unknown>;\n}\n\ninterface RrwebRecordModule {\n record: (options: RrwebRecordOptions) => ReplayStopFn | undefined;\n}\n\ninterface SessionReplayState {\n active: boolean;\n startPromise: Promise<SessionReplayStartResult> | null;\n replayId: string | null;\n startedAtMs: number | null;\n sequence: number;\n /** Pre-serialized + scrubbed event JSON strings, ready to splice at flush. */\n queue: QueuedReplayEvent[];\n queuedBytes: number;\n retryBatches: QueuedReplayEvent[][];\n flushTimer: number | null;\n maxDurationTimer: number | null;\n flushing: boolean;\n stopRecorder: ReplayStopFn | null;\n restoreUrlMonitor: (() => void) | null;\n removeLifecycleListeners: (() => void) | null;\n options: NormalizedSessionReplayOptions | null;\n lastAuthenticatedProperties: Record<string, unknown> | null;\n}\n\ninterface StoredReplaySession {\n sessionId?: string;\n replayId?: string;\n startedAtMs?: number;\n sequence?: number;\n}\n\n/** rrweb `sampling` shape (mousemove/scroll/media throttles, input strategy). */\nexport type ReplayEventSampling = Record<string, unknown>;\n\nexport interface SessionReplayOptions {\n enabled?: boolean;\n publicKey?: string;\n endpoint?: string;\n requireSignedInUser?: boolean;\n sampleRate?: number;\n samplingSalt?: string;\n allowUrls?: SessionReplayUrlMatcher[];\n blockUrls?: SessionReplayUrlMatcher[];\n flushIntervalMs?: number;\n maxDurationMs?: number;\n maxEventsPerBatch?: number;\n maxBatchBytes?: number;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n inlineStylesheet?: boolean;\n blockSelector?: string;\n ignoreSelector?: string;\n maskTextClass?: string | RegExp;\n maskTextSelector?: string;\n maskAllInputs?: boolean;\n recordCanvas?: boolean;\n recordCrossOriginIframes?: boolean;\n collectFonts?: boolean;\n inlineImages?: boolean;\n /**\n * rrweb per-event throttling (distinct from `sampleRate`, which decides\n * whether a whole session records). Throttles high-frequency event types\n * (mousemove/scroll/input) to keep the recorded page responsive and the\n * payloads small. Passed straight through to `rrweb.record({ sampling })`.\n */\n eventSampling?: ReplayEventSampling;\n extraProperties?:\n | Record<string, unknown>\n | (() => Record<string, unknown> | undefined);\n}\n\nexport interface SessionReplayStartResult {\n started: boolean;\n reason?:\n | \"disabled\"\n | \"not-browser\"\n | \"missing-public-key\"\n | \"missing-session-id\"\n | \"missing-user-id\"\n | \"sampled-out\"\n | \"url-blocked\"\n | \"already-active\"\n | \"import-failed\"\n | \"record-failed\";\n replayId?: string;\n sessionId?: string;\n sampled?: boolean;\n}\n\ninterface NormalizedSessionReplayOptions {\n publicKey: string;\n endpoint: string;\n requireSignedInUser: boolean;\n sampleRate: number;\n samplingSalt: string;\n allowUrls: SessionReplayUrlMatcher[];\n blockUrls: SessionReplayUrlMatcher[];\n flushIntervalMs: number;\n maxDurationMs: number;\n maxEventsPerBatch: number;\n maxBatchBytes: number;\n checkoutEveryNth?: number;\n checkoutEveryNms?: number;\n inlineStylesheet: boolean;\n blockSelector: string;\n ignoreSelector: string;\n maskTextClass: string | RegExp;\n maskTextSelector: string;\n maskAllInputs: boolean;\n recordCanvas: boolean;\n recordCrossOriginIframes: boolean;\n collectFonts: boolean;\n inlineImages: boolean;\n eventSampling: ReplayEventSampling;\n extraProperties?: SessionReplayOptions[\"extraProperties\"];\n}\n\nconst DEFAULT_REPLAY_PATH = \"/api/analytics/replay\";\nconst DEFAULT_SAMPLING_SALT = \"agent-native-session-replay\";\n\n/**\n * Default rrweb event throttling. Without this, rrweb captures every\n * mousemove/scroll which dominates event volume and main-thread cost on\n * interactive pages. These caps keep replays faithful while staying light.\n */\nconst DEFAULT_EVENT_SAMPLING: ReplayEventSampling = {\n mousemove: 50,\n mouseInteraction: true,\n scroll: 100,\n media: 800,\n input: \"last\",\n};\nconst SESSION_REPLAY_STATE_KEY = Symbol.for(\n \"agent-native.client.sessionReplay\",\n);\nconst SESSION_REPLAY_ID_STORAGE_KEY = \"agent-native.session_replay_id\";\nconst DEFAULT_BLOCK_SELECTOR = [\n \"[data-sensitive]\",\n \"[data-an-block]\",\n \"[data-an-private]\",\n \"[data-private]\",\n \".an-block\",\n \".an-replay-block\",\n \".an-private\",\n \".rr-block\",\n \"[autocomplete='cc-number']\",\n \"[autocomplete='cc-csc']\",\n \"[autocomplete='cc-exp']\",\n \"[name*='password' i]\",\n \"[name*='credit' i]\",\n \"[name*='card' i]\",\n \"[name*='ssn' i]\",\n].join(\", \");\nconst DEFAULT_IGNORE_SELECTOR = \".an-ignore, [data-an-ignore]\";\nconst DEFAULT_MASK_TEXT_CLASS = \"an-mask\";\nconst DEFAULT_MASK_TEXT_SELECTOR = \"[data-an-mask]\";\nconst DEFAULT_FLUSH_INTERVAL_MS = 5000;\nconst DEFAULT_MAX_DURATION_MS = 30 * 60 * 1000;\nconst DEFAULT_MAX_EVENTS_PER_BATCH = 50;\nconst DEFAULT_MAX_BATCH_BYTES = 256 * 1024;\nconst MAX_KEEPALIVE_REPLAY_UPLOAD_BYTES = 60 * 1024;\nconst RRWEB_FULL_SNAPSHOT_EVENT_TYPE = 2;\nconst URL_LIKE_KEYS = new Set([\n \"url\",\n \"uri\",\n \"href\",\n \"src\",\n \"currentUrl\",\n \"referrer\",\n \"from\",\n \"to\",\n]);\n\nfunction getState(): SessionReplayState {\n const g = globalThis as typeof globalThis & {\n [SESSION_REPLAY_STATE_KEY]?: SessionReplayState;\n };\n if (!g[SESSION_REPLAY_STATE_KEY]) {\n g[SESSION_REPLAY_STATE_KEY] = {\n active: false,\n startPromise: null,\n replayId: null,\n startedAtMs: null,\n sequence: 0,\n queue: [],\n queuedBytes: 0,\n retryBatches: [],\n flushTimer: null,\n maxDurationTimer: null,\n flushing: false,\n stopRecorder: null,\n restoreUrlMonitor: null,\n removeLifecycleListeners: null,\n options: null,\n lastAuthenticatedProperties: null,\n };\n }\n return g[SESSION_REPLAY_STATE_KEY]!;\n}\n\nfunction safeStorageGet(key: string): string | null {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeStorageSet(key: string, value: string): void {\n try {\n window.localStorage.setItem(key, value);\n } catch {\n // private browsing / storage disabled -- replay still works for this page\n }\n}\n\nfunction generateReplayId(): string {\n try {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n } catch {\n // fall through\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction readStoredReplaySession(): StoredReplaySession | null {\n const raw = safeStorageGet(SESSION_REPLAY_ID_STORAGE_KEY);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as StoredReplaySession;\n if (!parsed || typeof parsed !== \"object\") return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction writeStoredReplaySession(value: StoredReplaySession): void {\n safeStorageSet(SESSION_REPLAY_ID_STORAGE_KEY, JSON.stringify(value));\n}\n\nfunction getOrCreateReplaySession(sessionId: string): {\n replayId: string;\n startedAtMs: number;\n sequence: number;\n} {\n const parsed = readStoredReplaySession();\n if (parsed?.sessionId === sessionId && parsed.replayId) {\n const startedAtMs =\n typeof parsed.startedAtMs === \"number\" &&\n Number.isFinite(parsed.startedAtMs) &&\n parsed.startedAtMs > 0\n ? parsed.startedAtMs\n : Date.now();\n const sequence =\n typeof parsed.sequence === \"number\" &&\n Number.isFinite(parsed.sequence) &&\n parsed.sequence >= 0\n ? Math.floor(parsed.sequence)\n : 0;\n return { replayId: parsed.replayId, startedAtMs, sequence };\n }\n const replayId = generateReplayId();\n const startedAtMs = Date.now();\n writeStoredReplaySession({ sessionId, replayId, startedAtMs, sequence: 0 });\n return { replayId, startedAtMs, sequence: 0 };\n}\n\nfunction persistReplaySequence(\n sessionId: string,\n replayId: string,\n startedAtMs: number | null,\n sequence: number,\n): void {\n writeStoredReplaySession({\n sessionId,\n replayId,\n startedAtMs: startedAtMs ?? Date.now(),\n sequence,\n });\n}\n\nfunction clampSamplingRate(value: number | undefined): number {\n if (typeof value !== \"number\" || Number.isNaN(value)) return 1;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction readEnvString(key: string): string | undefined {\n return (import.meta.env as Record<string, string | undefined>)?.[key]?.trim();\n}\n\nfunction readEnvNumber(key: string): number | undefined {\n const raw = readEnvString(key);\n if (!raw) return undefined;\n const value = Number(raw);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction readEnvBoolean(key: string): boolean | undefined {\n const raw = readEnvString(key);\n if (!raw) return undefined;\n if (/^(1|true|yes|on)$/i.test(raw)) return true;\n if (/^(0|false|no|off)$/i.test(raw)) return false;\n return undefined;\n}\n\nfunction readFirstEnvString(keys: string[]): string | undefined {\n for (const key of keys) {\n const value = readEnvString(key);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction readFirstEnvNumber(keys: string[]): number | undefined {\n for (const key of keys) {\n const value = readEnvNumber(key);\n if (value !== undefined) return value;\n }\n return undefined;\n}\n\nfunction replayEndpointFromAnalyticsEndpoint(value: string): string | null {\n try {\n const url = new URL(value);\n if (url.pathname.endsWith(\"/api/analytics/track\")) {\n url.pathname = url.pathname.replace(\n /\\/api\\/analytics\\/track$/,\n \"/api/analytics/replay\",\n );\n return url.toString();\n }\n if (url.pathname.endsWith(\"/track\")) {\n url.pathname = url.pathname.replace(/\\/track$/, \"/api/analytics/replay\");\n return url.toString();\n }\n } catch {\n // Fall through to the relative path cases below.\n }\n if (value.endsWith(\"/api/analytics/track\")) {\n return value.replace(/\\/api\\/analytics\\/track$/, \"/api/analytics/replay\");\n }\n if (value.endsWith(\"/track\")) {\n return value.replace(/\\/track$/, \"/api/analytics/replay\");\n }\n return null;\n}\n\nfunction defaultReplayEndpoint(): string {\n const analyticsEndpoint = readEnvString(\n \"VITE_AGENT_NATIVE_ANALYTICS_ENDPOINT\",\n );\n const derived = analyticsEndpoint\n ? replayEndpointFromAnalyticsEndpoint(analyticsEndpoint)\n : null;\n if (derived) return derived;\n return typeof window !== \"undefined\"\n ? `${window.location.origin}${DEFAULT_REPLAY_PATH}`\n : DEFAULT_REPLAY_PATH;\n}\n\nexport function getSessionReplaySamplingScore(\n sessionId: string,\n salt = DEFAULT_SAMPLING_SALT,\n): number {\n let hash = 2166136261;\n const input = `${salt}:${sessionId}`;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0) / 4294967296;\n}\n\nexport function shouldSampleSessionReplay(\n sessionId: string,\n sampleRate = 1,\n salt = DEFAULT_SAMPLING_SALT,\n): boolean {\n const rate = clampSamplingRate(sampleRate);\n if (rate <= 0) return false;\n if (rate >= 1) return true;\n return getSessionReplaySamplingScore(sessionId, salt) < rate;\n}\n\nfunction matcherAllows(matcher: SessionReplayUrlMatcher, url: string): boolean {\n if (typeof matcher === \"string\") return url.includes(matcher);\n if (matcher instanceof RegExp) return matcher.test(url);\n return matcher(url);\n}\n\nfunction isUrlRecordable(\n url: string,\n options: Pick<NormalizedSessionReplayOptions, \"allowUrls\" | \"blockUrls\">,\n): boolean {\n if (options.allowUrls.length > 0) {\n const allowed = options.allowUrls.some((matcher) =>\n matcherAllows(matcher, url),\n );\n if (!allowed) return false;\n }\n return !options.blockUrls.some((matcher) => matcherAllows(matcher, url));\n}\n\nfunction normalizeOptions(\n options: SessionReplayOptions,\n): NormalizedSessionReplayOptions | null {\n const publicKey =\n options.publicKey ||\n readFirstEnvString([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_PUBLIC_KEY\",\n \"VITE_SESSION_REPLAY_PUBLIC_KEY\",\n ]) ||\n (import.meta.env as Record<string, string | undefined>)\n ?.VITE_AGENT_NATIVE_ANALYTICS_PUBLIC_KEY;\n if (!publicKey) return null;\n const endpoint =\n options.endpoint ||\n readFirstEnvString([\n \"VITE_AGENT_NATIVE_ANALYTICS_REPLAY_ENDPOINT\",\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_ENDPOINT\",\n \"VITE_SESSION_REPLAY_INGEST_URL\",\n ]) ||\n defaultReplayEndpoint();\n return {\n publicKey,\n endpoint,\n requireSignedInUser:\n options.requireSignedInUser ??\n readEnvBoolean(\"VITE_AGENT_NATIVE_SESSION_REPLAY_REQUIRE_AUTH\") ??\n readEnvBoolean(\"VITE_SESSION_REPLAY_REQUIRE_AUTH\") ??\n false,\n sampleRate: clampSamplingRate(\n options.sampleRate ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_SAMPLE_RATE\",\n \"VITE_SESSION_REPLAY_SAMPLE_RATE\",\n ]),\n ),\n samplingSalt: options.samplingSalt || DEFAULT_SAMPLING_SALT,\n allowUrls: options.allowUrls ?? [],\n blockUrls: options.blockUrls ?? [],\n flushIntervalMs: Math.max(\n 250,\n options.flushIntervalMs ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_CHUNK_INTERVAL_MS\",\n \"VITE_SESSION_REPLAY_CHUNK_INTERVAL_MS\",\n ]) ??\n DEFAULT_FLUSH_INTERVAL_MS,\n ),\n maxDurationMs: Math.max(\n 1000,\n options.maxDurationMs ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_MAX_DURATION_MS\",\n \"VITE_SESSION_REPLAY_MAX_DURATION_MS\",\n ]) ??\n DEFAULT_MAX_DURATION_MS,\n ),\n maxEventsPerBatch: Math.max(\n 1,\n options.maxEventsPerBatch ?? DEFAULT_MAX_EVENTS_PER_BATCH,\n ),\n maxBatchBytes: Math.max(\n 1024,\n options.maxBatchBytes ??\n readFirstEnvNumber([\n \"VITE_AGENT_NATIVE_SESSION_REPLAY_CHUNK_MAX_BYTES\",\n \"VITE_SESSION_REPLAY_CHUNK_MAX_BYTES\",\n ]) ??\n DEFAULT_MAX_BATCH_BYTES,\n ),\n checkoutEveryNth: options.checkoutEveryNth,\n checkoutEveryNms: options.checkoutEveryNms,\n inlineStylesheet: options.inlineStylesheet ?? true,\n blockSelector: options.blockSelector || DEFAULT_BLOCK_SELECTOR,\n ignoreSelector: options.ignoreSelector || DEFAULT_IGNORE_SELECTOR,\n maskTextClass: options.maskTextClass || DEFAULT_MASK_TEXT_CLASS,\n maskTextSelector: options.maskTextSelector || DEFAULT_MASK_TEXT_SELECTOR,\n maskAllInputs: options.maskAllInputs ?? true,\n recordCanvas: options.recordCanvas ?? false,\n recordCrossOriginIframes: options.recordCrossOriginIframes ?? false,\n collectFonts: options.collectFonts ?? false,\n inlineImages: options.inlineImages ?? false,\n eventSampling: options.eventSampling ?? DEFAULT_EVENT_SAMPLING,\n extraProperties: options.extraProperties,\n };\n}\n\nfunction scrubStringValue(key: string, value: string): string {\n const lowerKey = key.toLowerCase();\n const isUrlKey = URL_LIKE_KEYS.has(key) || URL_LIKE_KEYS.has(lowerKey);\n if (\n isUrlKey ||\n value.startsWith(\"http://\") ||\n value.startsWith(\"https://\") ||\n value.startsWith(\"/\")\n ) {\n return scrubUrl(value) ?? value;\n }\n return value;\n}\n\nfunction scrubReplayValue(\n value: unknown,\n key = \"\",\n depth = 0,\n seen = new WeakSet<object>(),\n): unknown {\n if (typeof value === \"string\") return scrubStringValue(key, value);\n if (!value || typeof value !== \"object\") return value;\n if (depth > 12) return value;\n if (seen.has(value)) return value;\n seen.add(value);\n if (Array.isArray(value)) {\n return value.map((item) => scrubReplayValue(item, key, depth + 1, seen));\n }\n const out: Record<string, unknown> = {};\n for (const [childKey, childValue] of Object.entries(value)) {\n out[childKey] = scrubReplayValue(childValue, childKey, depth + 1, seen);\n }\n return out;\n}\n\n/**\n * JSON.stringify replacer that scrubs URL-like string values inline. Folding\n * the scrub into the single serialization pass avoids a separate deep-clone of\n * every emitted event (FullSnapshots are large DOM trees) on the hot path.\n */\nfunction scrubReplayReplacer(key: string, value: unknown): unknown {\n return typeof value === \"string\" ? scrubStringValue(key, value) : value;\n}\n\n/**\n * Serialize + scrub one event in a single pass. The resulting string is stored\n * directly on the queue and reused verbatim at flush, so each event is\n * stringified exactly once (was: deep-clone + size-stringify + flush-stringify).\n */\nfunction serializeReplayEvent(event: ReplayEvent): string {\n try {\n return JSON.stringify(event, scrubReplayReplacer);\n } catch {\n return \"\";\n }\n}\n\nfunction replayEventTimestampMs(event: ReplayEvent): number {\n const timestamp = event.timestamp;\n if (typeof timestamp === \"number\" && Number.isFinite(timestamp)) {\n return timestamp;\n }\n if (typeof timestamp === \"string\" && timestamp.trim()) {\n const parsed = Date.parse(timestamp);\n if (Number.isFinite(parsed)) return parsed;\n }\n return Date.now();\n}\n\nfunction enqueueReplayEvent(\n state: SessionReplayState,\n event: ReplayEvent,\n): void {\n if (!state.options) return;\n const serialized = serializeReplayEvent(event);\n if (!serialized) return;\n const estimatedBytes = serialized.length;\n if (\n state.queue.length > 0 &&\n state.queuedBytes + estimatedBytes > state.options.maxBatchBytes\n ) {\n void flushSessionReplay(\"max-bytes\");\n }\n state.queue.push({\n json: serialized,\n timestampMs: replayEventTimestampMs(event),\n type: typeof event.type === \"number\" ? event.type : null,\n });\n state.queuedBytes += estimatedBytes;\n flushQueuedReplayIfNeeded(state);\n}\n\nfunction replayExtraProperties(\n options: NormalizedSessionReplayOptions,\n): Record<string, unknown> | undefined {\n const source = options.extraProperties;\n if (!source) return undefined;\n try {\n const props = typeof source === \"function\" ? source() : source;\n if (!props || typeof props !== \"object\") return undefined;\n return scrubReplayValue(props) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nfunction replayString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction replayEmail(value: unknown): string | undefined {\n const raw = replayString(value);\n return raw && raw.includes(\"@\") ? raw : undefined;\n}\n\nfunction replayUserEmail(\n properties: Record<string, unknown> | undefined,\n): string | undefined {\n return (\n replayEmail(properties?.userEmail ?? properties?.user_email) ||\n replayEmail(properties?.email) ||\n replayEmail(properties?.userId ?? properties?.user_id)\n );\n}\n\nfunction replayPropertiesForUpload(\n state: SessionReplayState,\n options: NormalizedSessionReplayOptions,\n): Record<string, unknown> | undefined {\n const properties = replayExtraProperties(options);\n if (replayUserEmail(properties)) {\n state.lastAuthenticatedProperties = properties ? { ...properties } : null;\n return properties;\n }\n if (options.requireSignedInUser && state.lastAuthenticatedProperties) {\n return state.lastAuthenticatedProperties;\n }\n return properties;\n}\n\ninterface ReplayUploadPayload {\n body: string;\n replayId: string;\n sessionId: string;\n sequence: number;\n}\n\nfunction buildReplayBody(\n state: SessionReplayState,\n reason: string,\n events: QueuedReplayEvent[],\n): ReplayUploadPayload | null {\n const options = state.options;\n if (!options || !state.replayId) return null;\n const sessionId = getAnalyticsSessionId();\n if (!sessionId) return null;\n const properties = replayPropertiesForUpload(state, options);\n const userEmail = replayUserEmail(properties);\n if (options.requireSignedInUser && !userEmail) return null;\n const userId =\n userEmail || replayString(properties?.userId ?? properties?.user_id);\n const eventTimestamps = events.map((event) => event.timestampMs);\n const nowMs = Date.now();\n const startedAtMs =\n state.startedAtMs ??\n (eventTimestamps.length ? Math.min(...eventTimestamps) : nowMs);\n const endedAtMs = eventTimestamps.length\n ? Math.max(...eventTimestamps)\n : nowMs;\n const envelope = {\n publicKey: options.publicKey,\n type: \"session_replay\",\n replayId: state.replayId,\n sessionId,\n ...(userId ? { userId } : {}),\n ...(userEmail ? { userEmail } : {}),\n anonymousId: getAnalyticsAnonymousId(),\n sequence: state.sequence,\n reason,\n status: isFinalFlushReason(reason) ? \"completed\" : \"active\",\n eventCount: events.length,\n startedAt: new Date(startedAtMs).toISOString(),\n endedAt: new Date(endedAtMs).toISOString(),\n durationMs: Math.max(0, endedAtMs - startedAtMs),\n privacyMode: \"mask-inputs-and-selected-text\",\n url:\n typeof window !== \"undefined\"\n ? scrubUrl(window.location.href)\n : undefined,\n timestamp: new Date().toISOString(),\n properties,\n };\n // Events are already serialized+scrubbed JSON strings; splice them into the\n // envelope without re-serializing the (potentially large) events array.\n const envelopeJson = JSON.stringify(envelope);\n return {\n body: `${envelopeJson.slice(0, -1)},\"events\":[${events\n .map((event) => event.json)\n .join(\",\")}]}`,\n replayId: state.replayId,\n sessionId,\n sequence: state.sequence,\n };\n}\n\ninterface ReplayUploadBody {\n body: BodyInit;\n headers: Record<string, string>;\n compressed: boolean;\n}\n\nfunction isCrossOriginReplayEndpoint(endpoint: string): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n return (\n new URL(endpoint, window.location.href).origin !== window.location.origin\n );\n } catch {\n return false;\n }\n}\n\nasync function gzipReplayBody(body: string): Promise<Blob | null> {\n if (\n typeof CompressionStream === \"undefined\" ||\n typeof Blob === \"undefined\" ||\n typeof Response === \"undefined\"\n ) {\n return null;\n }\n try {\n const stream = new Blob([body], { type: \"application/json\" })\n .stream()\n .pipeThrough(new CompressionStream(\"gzip\"));\n const compressed = await new Response(stream).arrayBuffer();\n return new Blob([compressed], { type: \"application/octet-stream\" });\n } catch {\n return null;\n }\n}\n\nasync function buildReplayUploadBody(body: string): Promise<ReplayUploadBody> {\n const compressed = await gzipReplayBody(body);\n if (compressed) {\n return {\n body: compressed,\n compressed: true,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n \"Content-Encoding\": \"gzip\",\n },\n };\n }\n return {\n body,\n compressed: false,\n headers: {\n \"Content-Type\": \"text/plain;charset=UTF-8\",\n },\n };\n}\n\nfunction replayUploadBodyBytes(body: BodyInit): number {\n if (typeof body === \"string\") {\n if (typeof TextEncoder !== \"undefined\") {\n return new TextEncoder().encode(body).byteLength;\n }\n return body.length;\n }\n if (typeof Blob !== \"undefined\" && body instanceof Blob) {\n return body.size;\n }\n if (body instanceof ArrayBuffer) {\n return body.byteLength;\n }\n if (ArrayBuffer.isView(body)) {\n return body.byteLength;\n }\n return MAX_KEEPALIVE_REPLAY_UPLOAD_BYTES + 1;\n}\n\nfunction canUseReplayKeepalive(body: BodyInit): boolean {\n return replayUploadBodyBytes(body) <= MAX_KEEPALIVE_REPLAY_UPLOAD_BYTES;\n}\n\nasync function sendReplayUpload(\n options: NormalizedSessionReplayOptions,\n body: string,\n callbacks: { beforeKeepaliveUpload?: () => void } = {},\n): Promise<void> {\n if (isCrossOriginReplayEndpoint(options.endpoint)) {\n const canUseKeepalive = canUseReplayKeepalive(body);\n if (canUseKeepalive) callbacks.beforeKeepaliveUpload?.();\n const response = await fetch(options.endpoint, {\n method: \"POST\",\n body,\n keepalive: canUseKeepalive,\n headers: { \"Content-Type\": \"text/plain;charset=UTF-8\" },\n });\n if (!response.ok) {\n throw new Error(\n `Session replay upload failed with HTTP ${response.status}`,\n );\n }\n return;\n }\n\n const upload = await buildReplayUploadBody(body);\n const canUseKeepalive = canUseReplayKeepalive(upload.body);\n if (canUseKeepalive) callbacks.beforeKeepaliveUpload?.();\n const response = await fetch(options.endpoint, {\n method: \"POST\",\n body: upload.body,\n keepalive: canUseKeepalive,\n headers: {\n ...upload.headers,\n \"X-Agent-Native-Analytics-Key\": options.publicKey,\n },\n });\n if (!response.ok) {\n throw new Error(\n `Session replay upload failed with HTTP ${response.status}`,\n );\n }\n}\n\nfunction isFinalFlushReason(reason: string): boolean {\n return [\n \"auth-cleared\",\n \"manual\",\n \"pagehide\",\n \"beforeunload\",\n \"url-blocked\",\n \"max-duration\",\n ].includes(reason);\n}\n\nfunction shouldReserveSequenceBeforeKeepalive(reason: string): boolean {\n return (\n reason === \"pagehide\" ||\n reason === \"beforeunload\" ||\n reason === \"visibility-hidden\"\n );\n}\n\nfunction hasFullSnapshot(events: QueuedReplayEvent[]): boolean {\n return events.some((event) => event.type === RRWEB_FULL_SNAPSHOT_EVENT_TYPE);\n}\n\nfunction hasPendingReplayBatch(state: SessionReplayState): boolean {\n return state.retryBatches.length > 0 || state.queue.length > 0;\n}\n\nfunction shouldFlushQueuedReplay(state: SessionReplayState): boolean {\n if (!state.options || state.queue.length === 0) return false;\n return (\n hasFullSnapshot(state.queue) ||\n state.queue.length >= state.options.maxEventsPerBatch ||\n state.queuedBytes >= state.options.maxBatchBytes\n );\n}\n\nfunction flushQueuedReplayIfNeeded(state: SessionReplayState): void {\n const options = state.options;\n if (!options) return;\n if (state.retryBatches.length > 0) return;\n if (!shouldFlushQueuedReplay(state)) return;\n const reason = hasFullSnapshot(state.queue)\n ? \"full-snapshot\"\n : state.queue.length >= options.maxEventsPerBatch\n ? \"max-events\"\n : \"max-bytes\";\n void flushSessionReplay(reason);\n}\n\nfunction queuedReplayBytes(events: QueuedReplayEvent[]): number {\n return events.reduce((total, event) => total + event.json.length, 0);\n}\n\nfunction restoreReplayEvents(\n state: SessionReplayState,\n events: QueuedReplayEvent[],\n): void {\n state.retryBatches.unshift(events);\n}\n\nfunction advanceReplaySequence(\n state: SessionReplayState,\n payload: ReplayUploadPayload,\n): void {\n if (state.replayId !== payload.replayId) return;\n state.sequence = Math.max(state.sequence, payload.sequence + 1);\n persistReplaySequence(\n payload.sessionId,\n payload.replayId,\n state.startedAtMs,\n state.sequence,\n );\n}\n\nfunction rollbackReplaySequenceReservation(\n state: SessionReplayState,\n payload: ReplayUploadPayload,\n): void {\n if (state.replayId !== payload.replayId) return;\n if (state.sequence !== payload.sequence + 1) return;\n state.sequence = payload.sequence;\n persistReplaySequence(\n payload.sessionId,\n payload.replayId,\n state.startedAtMs,\n state.sequence,\n );\n}\n\nexport async function flushSessionReplay(reason = \"manual\"): Promise<void> {\n const state = getState();\n if (!state.options || !hasPendingReplayBatch(state) || state.flushing) return;\n const events = state.retryBatches.shift() ?? state.queue.splice(0);\n state.queuedBytes = queuedReplayBytes(state.queue);\n const payload = buildReplayBody(state, reason, events);\n if (!payload || !state.options) {\n restoreReplayEvents(state, events);\n return;\n }\n state.flushing = true;\n let uploaded = false;\n let reservedSequence = false;\n try {\n await sendReplayUpload(state.options, payload.body, {\n beforeKeepaliveUpload: shouldReserveSequenceBeforeKeepalive(reason)\n ? () => {\n advanceReplaySequence(state, payload);\n reservedSequence = true;\n }\n : undefined,\n });\n if (!reservedSequence) advanceReplaySequence(state, payload);\n uploaded = true;\n } catch (error) {\n if (reservedSequence) rollbackReplaySequenceReservation(state, payload);\n restoreReplayEvents(state, events);\n console.warn(\"[session-replay] upload failed\", error);\n } finally {\n state.flushing = false;\n }\n if (uploaded && hasPendingReplayBatch(state)) {\n flushQueuedReplayIfNeeded(state);\n }\n}\n\nfunction installUrlMonitor(state: SessionReplayState): void {\n if (!state.options || state.restoreUrlMonitor) return;\n const options = state.options;\n const check = () => {\n if (!isUrlRecordable(window.location.href, options)) {\n stopSessionReplay(\"url-blocked\");\n }\n };\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n window.history.pushState = function pushState(...args) {\n const result = originalPushState.apply(this, args);\n queueMicrotask(check);\n return result;\n };\n window.history.replaceState = function replaceState(...args) {\n const result = originalReplaceState.apply(this, args);\n queueMicrotask(check);\n return result;\n };\n window.addEventListener(\"popstate\", check);\n state.restoreUrlMonitor = () => {\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n window.removeEventListener(\"popstate\", check);\n state.restoreUrlMonitor = null;\n };\n}\n\nfunction installLifecycleListeners(state: SessionReplayState): void {\n if (state.removeLifecycleListeners) return;\n const flushOnHidden = () => {\n if (document.visibilityState === \"hidden\") {\n void flushSessionReplay(\"visibility-hidden\");\n }\n };\n const flushOnUnload = () => {\n void flushSessionReplay(\"pagehide\");\n };\n document.addEventListener(\"visibilitychange\", flushOnHidden);\n window.addEventListener(\"pagehide\", flushOnUnload);\n state.removeLifecycleListeners = () => {\n document.removeEventListener(\"visibilitychange\", flushOnHidden);\n window.removeEventListener(\"pagehide\", flushOnUnload);\n state.removeLifecycleListeners = null;\n };\n}\n\nexport async function startSessionReplay(\n options: SessionReplayOptions = {},\n): Promise<SessionReplayStartResult> {\n if (options.enabled === false) return { started: false, reason: \"disabled\" };\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return { started: false, reason: \"not-browser\" };\n }\n const normalized = normalizeOptions(options);\n if (!normalized) return { started: false, reason: \"missing-public-key\" };\n\n const sessionId = getAnalyticsSessionId();\n if (!sessionId) return { started: false, reason: \"missing-session-id\" };\n const sampled = shouldSampleSessionReplay(\n sessionId,\n normalized.sampleRate,\n normalized.samplingSalt,\n );\n if (!sampled) {\n return { started: false, reason: \"sampled-out\", sessionId, sampled };\n }\n const initialProperties = replayExtraProperties(normalized);\n if (normalized.requireSignedInUser) {\n if (!replayUserEmail(initialProperties)) {\n return {\n started: false,\n reason: \"missing-user-id\",\n sessionId,\n sampled,\n };\n }\n }\n if (!isUrlRecordable(window.location.href, normalized)) {\n return { started: false, reason: \"url-blocked\", sessionId, sampled };\n }\n\n const state = getState();\n if (state.active && state.replayId) {\n return {\n started: true,\n reason: \"already-active\",\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n }\n if (state.startPromise) return state.startPromise;\n\n let startPromise: Promise<SessionReplayStartResult>;\n startPromise = startSessionReplayRecorder(\n state,\n normalized,\n sessionId,\n sampled,\n initialProperties,\n ).finally(() => {\n if (state.startPromise === startPromise) {\n state.startPromise = null;\n }\n });\n state.startPromise = startPromise;\n return startPromise;\n}\n\nasync function startSessionReplayRecorder(\n state: SessionReplayState,\n normalized: NormalizedSessionReplayOptions,\n sessionId: string,\n sampled: boolean,\n initialProperties: Record<string, unknown> | undefined,\n): Promise<SessionReplayStartResult> {\n if (state.active && state.replayId) {\n return {\n started: true,\n reason: \"already-active\",\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n }\n\n let rrweb: RrwebRecordModule;\n try {\n rrweb = (await import(\"@rrweb/record\")) as RrwebRecordModule;\n } catch {\n return { started: false, reason: \"import-failed\", sessionId, sampled };\n }\n\n const replaySession = getOrCreateReplaySession(sessionId);\n state.options = normalized;\n state.replayId = replaySession.replayId;\n state.startedAtMs = replaySession.startedAtMs;\n state.sequence = replaySession.sequence;\n state.queue = [];\n state.queuedBytes = 0;\n state.retryBatches = [];\n state.stopRecorder = null;\n state.lastAuthenticatedProperties = replayUserEmail(initialProperties)\n ? { ...initialProperties }\n : null;\n state.active = true;\n\n try {\n const stopRecorder = rrweb.record({\n emit: (event) => enqueueReplayEvent(state, event),\n sampling: normalized.eventSampling,\n checkoutEveryNth: normalized.checkoutEveryNth,\n checkoutEveryNms: normalized.checkoutEveryNms,\n inlineStylesheet: normalized.inlineStylesheet,\n blockSelector: normalized.blockSelector,\n ignoreSelector: normalized.ignoreSelector,\n maskTextClass: normalized.maskTextClass,\n maskTextSelector: normalized.maskTextSelector,\n maskAllInputs: normalized.maskAllInputs,\n recordCanvas: normalized.recordCanvas,\n recordCrossOriginIframes: normalized.recordCrossOriginIframes,\n collectFonts: normalized.collectFonts,\n inlineImages: normalized.inlineImages,\n maskInputOptions: {\n color: true,\n date: true,\n \"datetime-local\": true,\n email: true,\n month: true,\n number: true,\n password: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n },\n });\n if (typeof stopRecorder !== \"function\") {\n state.active = false;\n state.options = null;\n state.replayId = null;\n state.startedAtMs = null;\n state.lastAuthenticatedProperties = null;\n return { started: false, reason: \"record-failed\", sessionId, sampled };\n }\n state.stopRecorder = stopRecorder;\n state.flushTimer = window.setInterval(\n () => void flushSessionReplay(\"interval\"),\n normalized.flushIntervalMs,\n );\n state.maxDurationTimer = window.setTimeout(\n () => stopSessionReplay(\"max-duration\"),\n normalized.maxDurationMs,\n );\n installUrlMonitor(state);\n installLifecycleListeners(state);\n return {\n started: true,\n replayId: state.replayId,\n sessionId,\n sampled,\n };\n } catch {\n state.active = false;\n state.options = null;\n state.replayId = null;\n state.startedAtMs = null;\n state.lastAuthenticatedProperties = null;\n return { started: false, reason: \"record-failed\", sessionId, sampled };\n }\n}\n\nexport async function stopSessionReplay(reason = \"manual\"): Promise<void> {\n const state = getState();\n if (!state.active) return;\n state.active = false;\n try {\n state.stopRecorder?.();\n } catch {\n // best-effort recorder shutdown\n }\n state.stopRecorder = null;\n if (state.flushTimer) {\n window.clearInterval(state.flushTimer);\n state.flushTimer = null;\n }\n if (state.maxDurationTimer) {\n window.clearTimeout(state.maxDurationTimer);\n state.maxDurationTimer = null;\n }\n state.restoreUrlMonitor?.();\n state.removeLifecycleListeners?.();\n await flushSessionReplay(reason);\n}\n\nexport function maybeStartSessionReplay(\n options: SessionReplayOptions = {},\n): Promise<SessionReplayStartResult> {\n return startSessionReplay(options);\n}\n\nexport function isSessionReplayActive(): boolean {\n return getState().active;\n}\n"]}
|
|
@@ -101,12 +101,38 @@ export declare const SSE_ACTION_PREPARATION_STALL_TIMEOUT_MS = 90000;
|
|
|
101
101
|
export interface SSEStreamOptions {
|
|
102
102
|
/**
|
|
103
103
|
* Durable background runs have their own server-side liveness budget and
|
|
104
|
-
* heartbeat. While one is active, keepalive-only periods
|
|
105
|
-
*
|
|
106
|
-
*
|
|
104
|
+
* heartbeat. While one is active, generic keepalive-only periods keep the
|
|
105
|
+
* client attached. Tool-input preparation is stricter: real byte progress
|
|
106
|
+
* keeps long payloads alive, but zero-byte/silent preparation still recovers
|
|
107
|
+
* so one stuck action cannot pin the chat forever.
|
|
107
108
|
*/
|
|
108
109
|
durableBackgroundRun?: boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Optional caller-owned preparation watchdog state. Passing the same object
|
|
112
|
+
* across reconnect reads keeps a stuck action preparation from getting a
|
|
113
|
+
* fresh stall budget every time the browser reattaches to the same run.
|
|
114
|
+
*/
|
|
115
|
+
preparingActionState?: PreparingActionState;
|
|
109
116
|
}
|
|
117
|
+
type PreparingActionEntry = {
|
|
118
|
+
tool: string;
|
|
119
|
+
startedAt?: number;
|
|
120
|
+
lastProgressBytes?: number;
|
|
121
|
+
/**
|
|
122
|
+
* Timestamp of the last real streaming progress for the in-preparation tool
|
|
123
|
+
* input. The server emits a throttled `activity` heartbeat per
|
|
124
|
+
* `tool-input-delta`, so while the model is actively streaming a (possibly
|
|
125
|
+
* very large) tool argument this keeps advancing. The stall guard measures
|
|
126
|
+
* silence from HERE — not from `startedAt` — so a legitimately large, still-
|
|
127
|
+
* streaming input is never aborted; only genuine silence (keepalive-only, no
|
|
128
|
+
* further deltas) can trip it.
|
|
129
|
+
*/
|
|
130
|
+
lastProgressAt?: number;
|
|
131
|
+
};
|
|
132
|
+
export type PreparingActionState = {
|
|
133
|
+
entries?: Map<string, PreparingActionEntry>;
|
|
134
|
+
toolEntries?: Map<string, PreparingActionEntry>;
|
|
135
|
+
};
|
|
110
136
|
interface ProcessEventState {
|
|
111
137
|
completedToolsAfterLastAssistantText: Set<string>;
|
|
112
138
|
}
|