@agent-native/core 0.84.51 → 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.
Files changed (42) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +8 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/agent/run-store.ts +33 -6
  5. package/corpus/core/src/client/AssistantChat.tsx +84 -23
  6. package/corpus/core/src/client/agent-chat-adapter.ts +19 -0
  7. package/corpus/core/src/client/blocks/library/DiffBlock.tsx +7 -5
  8. package/corpus/core/src/client/session-replay.ts +170 -47
  9. package/corpus/core/src/client/sse-event-processor.ts +75 -14
  10. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +5 -0
  11. package/corpus/templates/analytics/changelog/2026-07-02-agent-chat-can-keep-working-through-longer-data-queries-inst.md +6 -0
  12. package/corpus/templates/analytics/changelog/2026-07-02-session-replay-playback-recovers-from-failed-snapshot-uploads.md +6 -0
  13. package/corpus/templates/analytics/netlify.toml +3 -0
  14. package/corpus/templates/analytics/server/lib/session-replay.ts +9 -5
  15. package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -0
  16. package/corpus/templates/plan/changelog/2026-07-02-agent-chat-can-keep-working-through-longer-visual-plan-updat.md +6 -0
  17. package/corpus/templates/plan/netlify.toml +3 -0
  18. package/corpus/templates/plan/server/plugins/agent-chat.ts +4 -0
  19. package/dist/agent/run-store.d.ts.map +1 -1
  20. package/dist/agent/run-store.js +30 -6
  21. package/dist/agent/run-store.js.map +1 -1
  22. package/dist/client/AssistantChat.d.ts.map +1 -1
  23. package/dist/client/AssistantChat.js +64 -13
  24. package/dist/client/AssistantChat.js.map +1 -1
  25. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  26. package/dist/client/agent-chat-adapter.js +14 -0
  27. package/dist/client/agent-chat-adapter.js.map +1 -1
  28. package/dist/client/blocks/library/DiffBlock.d.ts.map +1 -1
  29. package/dist/client/blocks/library/DiffBlock.js +6 -5
  30. package/dist/client/blocks/library/DiffBlock.js.map +1 -1
  31. package/dist/client/session-replay.d.ts.map +1 -1
  32. package/dist/client/session-replay.js +134 -39
  33. package/dist/client/session-replay.js.map +1 -1
  34. package/dist/client/sse-event-processor.d.ts +25 -0
  35. package/dist/client/sse-event-processor.d.ts.map +1 -1
  36. package/dist/client/sse-event-processor.js +50 -13
  37. package/dist/client/sse-event-processor.js.map +1 -1
  38. package/dist/collab/routes.d.ts +1 -1
  39. package/dist/notifications/routes.d.ts +1 -1
  40. package/dist/observability/routes.d.ts +5 -5
  41. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  42. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/client/session-replay.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,uBAAuB,GAC/B,MAAM,GACN,MAAM,GACN,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;AAoD/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;AAqRD,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;AAkaD,wBAAsB,kBAAkB,CAAC,MAAM,SAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBzE;AAkDD,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC,CA2DnC;AA2GD,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"}
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
- if (state.queue.length >= state.options.maxEventsPerBatch) {
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 `${envelopeJson.slice(0, -1)},"events":[${events
490
- .map((event) => event.json)
491
- .join(",")}]}`;
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
- async function sendReplayUpload(options, body) {
547
- if (isCrossOriginReplayEndpoint(options.endpoint)) {
548
- if (navigator.sendBeacon) {
549
- const sent = navigator.sendBeacon(options.endpoint, body);
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
- await fetch(options.endpoint, {
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: replayUploadByteLength(body) <= MAX_KEEPALIVE_REPLAY_UPLOAD_BYTES,
573
+ keepalive: canUseKeepalive,
557
574
  headers: { "Content-Type": "text/plain;charset=UTF-8" },
558
- }).catch(() => { });
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
- if (!upload.compressed && navigator.sendBeacon) {
563
- const sent = navigator.sendBeacon(options.endpoint, body);
564
- if (sent)
565
- return;
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: true,
588
+ keepalive: canUseKeepalive,
571
589
  headers: {
572
590
  ...upload.headers,
573
591
  "X-Agent-Native-Analytics-Key": options.publicKey,
574
592
  },
575
- }).catch(() => { });
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.queue.length === 0 || state.flushing)
663
+ if (!state.options || !hasPendingReplayBatch(state) || state.flushing)
590
664
  return;
591
- const events = state.queue.splice(0, state.queue.length);
592
- state.queuedBytes = 0;
593
- const body = buildReplayBody(state, reason, events);
594
- if (!body || !state.options) {
595
- state.queue = events.concat(state.queue);
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"]}
@@ -107,7 +107,32 @@ export interface SSEStreamOptions {
107
107
  * so one stuck action cannot pin the chat forever.
108
108
  */
109
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;
110
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
+ };
111
136
  interface ProcessEventState {
112
137
  completedToolsAfterLastAssistantText: Set<string>;
113
138
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sse-event-processor.d.ts","sourceRoot":"","sources":["../../src/client/sse-event-processor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sse-event-processor.d.ts","sourceRoot":"","sources":["../../src/client/sse-event-processor.ts"],"names":[],"mappings":"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"}