@pendo/agent 2.297.0 → 2.298.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/dom.esm.js CHANGED
@@ -7314,7 +7314,7 @@ function getScreenPosition(element) {
7314
7314
  };
7315
7315
  }
7316
7316
 
7317
- var VERSION = '2.297.0_';
7317
+ var VERSION = '2.298.0_';
7318
7318
 
7319
7319
  var decodeURIComponent = _.isFunction(window.decodeURIComponent) ? window.decodeURIComponent : _.identity;
7320
7320
 
@@ -7334,7 +7334,7 @@ function allowKey(storageKey) {
7334
7334
  // Handles cases where localStorage is either not defined or inaccessible
7335
7335
  // by providing a do-nothing implementation
7336
7336
  // NOTE: Recently added a LocalStorage preference over cookies that is implemented
7337
- // `agentStorage` in `browserStorage.js`. These two should be reconciled but for
7337
+ // `agentStorage` in `browser-storage.js`. These two should be reconciled but for
7338
7338
  // now this shim was only used from Designer related parts of the Agent so the
7339
7339
  // separation was an easy thing to maintain.
7340
7340
  function wrapStorageMethod(storage, storageMethod, errorReturnValue) {
@@ -3904,8 +3904,8 @@ let SERVER = '';
3904
3904
  let ASSET_HOST = '';
3905
3905
  let ASSET_PATH = '';
3906
3906
  let DESIGNER_SERVER = '';
3907
- let VERSION = '2.297.0_';
3908
- let PACKAGE_VERSION = '2.297.0';
3907
+ let VERSION = '2.298.0_';
3908
+ let PACKAGE_VERSION = '2.298.0';
3909
3909
  let LOADER = 'xhr';
3910
3910
  /* eslint-enable agent-eslint-rules/no-gulp-env-references */
3911
3911
  /**
@@ -4336,7 +4336,7 @@ function allowKey(storageKey) {
4336
4336
  // Handles cases where localStorage is either not defined or inaccessible
4337
4337
  // by providing a do-nothing implementation
4338
4338
  // NOTE: Recently added a LocalStorage preference over cookies that is implemented
4339
- // `agentStorage` in `browserStorage.js`. These two should be reconciled but for
4339
+ // `agentStorage` in `browser-storage.js`. These two should be reconciled but for
4340
4340
  // now this shim was only used from Designer related parts of the Agent so the
4341
4341
  // separation was an easy thing to maintain.
4342
4342
  function wrapStorageMethod(storage, storageMethod, errorReturnValue) {
@@ -12841,7 +12841,7 @@ function createSendQueue(options, send, guaranteedSend) {
12841
12841
  }
12842
12842
  });
12843
12843
  queue.onTimeout = function () {
12844
- _PerformanceMonitor.track(`${options.beacon}-gif-failure`);
12844
+ _PerformanceMonitor.count(`${options.beacon}-gif-failure`);
12845
12845
  };
12846
12846
  queue.retryPending = true;
12847
12847
  return queue;
@@ -15351,6 +15351,8 @@ function addInlineStyles(config, id, styles, element = document.head) {
15351
15351
  }
15352
15352
 
15353
15353
  var BuildingBlockTemplates = (function () {
15354
+ var textElementTypes = ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'span', 'div',
15355
+ 'li', 'ul', 'ol', 'strong', 'em', 'b', 'i', 'small', 'label'];
15354
15356
  return {
15355
15357
  buildNodesFromTemplate,
15356
15358
  generateUnreadAnnouncementMiniBubble,
@@ -15482,6 +15484,21 @@ var BuildingBlockTemplates = (function () {
15482
15484
  var notificationBubbleConfig = _.get(homeView, 'attributes.notificationBubble');
15483
15485
  var notificationsObj = _.get(homeView, 'attributes.notifications');
15484
15486
  if (notificationBubbleConfig && notificationsObj) {
15487
+ // Check for dark mode and use dark mode colors if available
15488
+ if (homeView.steps && homeView.steps[0] && homeView.steps[0].isDarkMode) {
15489
+ var darkModeBackgroundColor = _.get(homeView, 'attributes.darkMode.notificationBubble.background-color');
15490
+ var darkModeTextColor = _.get(homeView, 'attributes.darkMode.notificationBubble.color');
15491
+ if (darkModeBackgroundColor || darkModeTextColor) {
15492
+ // Create a copy of the config with dark mode colors
15493
+ notificationBubbleConfig = _.clone(notificationBubbleConfig);
15494
+ if (darkModeBackgroundColor) {
15495
+ notificationBubbleConfig['background-color'] = darkModeBackgroundColor;
15496
+ }
15497
+ if (darkModeTextColor) {
15498
+ notificationBubbleConfig.color = darkModeTextColor;
15499
+ }
15500
+ }
15501
+ }
15485
15502
  var notificationId;
15486
15503
  if (_.get(guide, 'attributes.resourceCenter.moduleId') === 'AnnouncementsModule') {
15487
15504
  notificationId = guide.id;
@@ -15720,6 +15737,7 @@ var BuildingBlockTemplates = (function () {
15720
15737
  bubbleConfig.dir = 'rtl';
15721
15738
  }
15722
15739
  }
15740
+ var announcementsModule = step.getGuide();
15723
15741
  return _.map(announcementGuides, function (guide, index) {
15724
15742
  var isP1WhatsNewGuide = _.get(guide, 'attributes.type') === 'whatsnew';
15725
15743
  var listItem = JSON.parse(JSON.stringify(templateJson)); // underscore doesn't have deep clone
@@ -15729,15 +15747,54 @@ var BuildingBlockTemplates = (function () {
15729
15747
  if (isP1WhatsNewGuide) {
15730
15748
  return renderWhatsNew(guide, listItem, bubbleConfig, buildNodeFromJSON);
15731
15749
  }
15732
- return renderAnnouncement(guide, listItem, bubbleConfig, buildNodeFromJSON);
15750
+ return renderAnnouncement(guide, listItem, bubbleConfig, buildNodeFromJSON, announcementsModule);
15733
15751
  });
15734
15752
  }
15735
- function renderAnnouncement(guide, listItem, bubbleConfig, buildNodeFromJSON) {
15753
+ function renderAnnouncement(guide, listItem, bubbleConfig, buildNodeFromJSON, announcementsModule) {
15736
15754
  var miniBubble;
15737
15755
  var processedGuide = GuideFactory(guide);
15738
15756
  var announcementStep = guide.steps[0];
15739
15757
  GuideRuntime.runCustomScripts(announcementStep, processedGuide);
15740
15758
  var announcementDomJson = JSON.parse(JSON.stringify(announcementStep.domJson)); // underscore doesn't have deep clone
15759
+ // Apply dark mode color overrides if enabled
15760
+ var darkModeOverrides = _.get(announcementsModule, 'attributes.darkModeColorOverrides');
15761
+ if (darkModeOverrides && darkModeOverrides.enabled) {
15762
+ // Cache frequently accessed objects
15763
+ var announcementStepAttrs = announcementStep.attributes;
15764
+ var announcementStepDarkMode = _.get(announcementStepAttrs, 'darkMode');
15765
+ var announcementsModuleDarkMode = _.get(announcementsModule, 'attributes.darkMode');
15766
+ var darkModeSelector = _.get(announcementsModuleDarkMode, 'selector', '');
15767
+ // Cascade dark mode selector from announcements module to announcement guide
15768
+ if (darkModeSelector && announcementStepAttrs) {
15769
+ if (!announcementStepDarkMode) {
15770
+ announcementStepAttrs.darkMode = { selector: '' };
15771
+ announcementStepDarkMode = announcementStepAttrs.darkMode;
15772
+ }
15773
+ announcementStepDarkMode.selector = darkModeSelector;
15774
+ }
15775
+ // Determine if dark mode is active
15776
+ var isDarkModeActive = false;
15777
+ var effectiveSelector = _.get(announcementStepDarkMode, 'selector', '') || darkModeSelector;
15778
+ if (pendo$1.designerEnabled) {
15779
+ // In designer mode, check override values
15780
+ isDarkModeActive = _.get(announcementStepDarkMode, 'override') ||
15781
+ _.get(announcementsModule, 'steps.0.attributes.darkMode.override', false);
15782
+ }
15783
+ else if (effectiveSelector) {
15784
+ // In client mode, detect based on selector
15785
+ isDarkModeActive = pendo$1.Sizzle(effectiveSelector).length > 0;
15786
+ }
15787
+ if (isDarkModeActive) {
15788
+ // Only apply overrides if we have actual color values to apply
15789
+ var hasValidOverrides = darkModeOverrides.guideBackground ||
15790
+ darkModeOverrides.textColor ||
15791
+ darkModeOverrides.linkColor ||
15792
+ darkModeOverrides.borderColor;
15793
+ if (hasValidOverrides) {
15794
+ applyDarkModeColorOverrides(announcementDomJson, darkModeOverrides);
15795
+ }
15796
+ }
15797
+ }
15741
15798
  listItem.children = [announcementDomJson];
15742
15799
  if (bubbleConfig) {
15743
15800
  miniBubble = generateUnreadAnnouncementMiniBubble(bubbleConfig);
@@ -15874,6 +15931,41 @@ var BuildingBlockTemplates = (function () {
15874
15931
  };
15875
15932
  listItemRow.children.splice(textContainerIndex + 1, 0, notificationBubble);
15876
15933
  }
15934
+ function applyDarkModeColorOverrides(domJson, overrides) {
15935
+ var props = _.get(domJson, 'props');
15936
+ if (!domJson || !props)
15937
+ return;
15938
+ if (!props.style)
15939
+ props.style = {};
15940
+ var style = props.style;
15941
+ var elementId = _.get(props, 'id', '');
15942
+ if (elementId.indexOf('pendo-guide-container') !== -1) {
15943
+ if (overrides.guideBackground) {
15944
+ style['background-color'] = overrides.guideBackground;
15945
+ }
15946
+ if (overrides.borderColor) {
15947
+ style['border-color'] = overrides.borderColor;
15948
+ }
15949
+ }
15950
+ var isLink = domJson.type === 'a';
15951
+ if (isLink && overrides.linkColor) {
15952
+ style.color = overrides.linkColor;
15953
+ }
15954
+ var textColor = overrides.textColor;
15955
+ if (!isLink && textColor) {
15956
+ var content = _.get(domJson, 'content', '');
15957
+ var hasTextContent = content && typeof content === 'string' && content.trim().length > 0;
15958
+ if (textElementTypes.indexOf(domJson.type) !== -1 || hasTextContent) {
15959
+ style.color = textColor;
15960
+ }
15961
+ }
15962
+ var children = _.get(domJson, 'children', []);
15963
+ if (_.isArray(children)) {
15964
+ _.each(children, function (child) {
15965
+ applyDarkModeColorOverrides(child, overrides);
15966
+ });
15967
+ }
15968
+ }
15877
15969
  })();
15878
15970
 
15879
15971
  var BuildingBlockSvgs = (function () {
@@ -15881,18 +15973,18 @@ var BuildingBlockSvgs = (function () {
15881
15973
  buildSvgNode,
15882
15974
  createProgressCircleSvg
15883
15975
  };
15884
- function buildSvgNode(widgetId, json) {
15976
+ function buildSvgNode(widgetId, json, isDarkMode) {
15885
15977
  // eslint-disable-next-line default-case
15886
15978
  switch (widgetId) {
15887
15979
  case 'onboardingProgressCircle':
15888
15980
  case 'taskListProgressCircle':
15889
- return createProgressCircleSvg(json);
15981
+ return createProgressCircleSvg(json, isDarkMode);
15890
15982
  }
15891
15983
  }
15892
- function createProgressCircleSvg(bbJson) {
15984
+ function createProgressCircleSvg(bbJson, isDarkMode) {
15893
15985
  if (isOldIE(9))
15894
- return createProgressCircleIEFallback(bbJson);
15895
- var svgAttributes = bbJson.svgAttributes;
15986
+ return createProgressCircleIEFallback(bbJson, isDarkMode);
15987
+ var svgAttributes = getSvgAttributes(bbJson, isDarkMode);
15896
15988
  var percentComplete = svgAttributes.fillCircle.percentComplete || 0;
15897
15989
  var isComplete = percentComplete >= 100;
15898
15990
  if (isComplete) {
@@ -15936,8 +16028,8 @@ var BuildingBlockSvgs = (function () {
15936
16028
  }
15937
16029
  return svgElement;
15938
16030
  }
15939
- function createProgressCircleIEFallback(bbJson) {
15940
- var svgAttributes = bbJson.svgAttributes;
16031
+ function createProgressCircleIEFallback(bbJson, isDarkMode) {
16032
+ var svgAttributes = getSvgAttributes(bbJson, isDarkMode);
15941
16033
  var fillColor = svgAttributes.fillCircle.stroke;
15942
16034
  var backgroundColor = svgAttributes.backgroundCircle.stroke;
15943
16035
  var percentComplete = svgAttributes.fillCircle.percentComplete || 0;
@@ -15963,6 +16055,22 @@ var BuildingBlockSvgs = (function () {
15963
16055
  }
15964
16056
  return fallbackSquare;
15965
16057
  }
16058
+ function getSvgAttributes(bbJson, isDarkMode) {
16059
+ // Always start with the regular SVG attributes
16060
+ var svgAttributes = _.clone(bbJson.svgAttributes);
16061
+ // If dark mode is active and dark mode attributes exist, override only the stroke colors
16062
+ if (isDarkMode && bbJson.darkModeSvgAttributes) {
16063
+ var backgroundCircleStroke = _.get(bbJson.darkModeSvgAttributes, 'backgroundCircle.stroke');
16064
+ if (backgroundCircleStroke) {
16065
+ svgAttributes.backgroundCircle.stroke = backgroundCircleStroke;
16066
+ }
16067
+ var fillCircleStroke = _.get(bbJson.darkModeSvgAttributes, 'fillCircle.stroke');
16068
+ if (fillCircleStroke) {
16069
+ svgAttributes.fillCircle.stroke = fillCircleStroke;
16070
+ }
16071
+ }
16072
+ return svgAttributes;
16073
+ }
15966
16074
  })();
15967
16075
 
15968
16076
  var isLessThan = function (x, y) { return x < y; };
@@ -16187,7 +16295,11 @@ function addStylesToBackdrops(backdrops, step) {
16187
16295
  _.each(originalBackdrop.props, function (propValue, propKey) {
16188
16296
  _.each(backdrops, function (backdrop, index) {
16189
16297
  if (propKey === 'style') {
16190
- backdrop.css(originalBackdrop.props.style);
16298
+ let nodeStyle = originalBackdrop.props.style;
16299
+ if (step.isDarkMode && originalBackdrop.darkModeProps) {
16300
+ nodeStyle = Object.assign(Object.assign({}, originalBackdrop.props.style), originalBackdrop.darkModeProps.style);
16301
+ }
16302
+ backdrop.css(nodeStyle);
16191
16303
  }
16192
16304
  else if (propKey === 'class') {
16193
16305
  backdrop.addClass(propValue);
@@ -18021,7 +18133,7 @@ function buildNodeFromJSON(json, step, guides) {
18021
18133
  }
18022
18134
  }
18023
18135
  if (json.svgWidgetId) {
18024
- var svg = BuildingBlockSvgs.buildSvgNode(json.svgWidgetId, json);
18136
+ var svg = BuildingBlockSvgs.buildSvgNode(json.svgWidgetId, json, step.isDarkMode);
18025
18137
  svg.appendTo(curNode);
18026
18138
  }
18027
18139
  if (json.actions && json.actions.length) {
@@ -20719,10 +20831,19 @@ function syncColorMode(step, rerender = false) {
20719
20831
  const darkModeSelector = _.get(step, 'attributes.darkMode.selector', '');
20720
20832
  if (!darkModeSelector)
20721
20833
  return;
20722
- const isDarkMode = pendo$1.Sizzle(darkModeSelector).length > 0;
20723
- const darkModeChanged = step.isDarkMode !== isDarkMode;
20724
- if (darkModeChanged) {
20725
- step.isDarkMode = isDarkMode;
20834
+ // Determine the target dark mode state
20835
+ let targetDarkMode;
20836
+ if (pendo$1.designerEnabled && _.has(step, 'attributes.darkMode.override')) {
20837
+ // In designer mode, use the override value
20838
+ targetDarkMode = step.attributes.darkMode.override;
20839
+ }
20840
+ else {
20841
+ // In client mode, detect based on selector
20842
+ targetDarkMode = pendo$1.Sizzle(darkModeSelector).length > 0;
20843
+ }
20844
+ // Update and rerender if the state changed
20845
+ if (step.isDarkMode !== targetDarkMode) {
20846
+ step.isDarkMode = targetDarkMode;
20726
20847
  if (rerender) {
20727
20848
  step.hide();
20728
20849
  step.show(step.seenReason);
@@ -26474,15 +26595,15 @@ class NetworkRequestIntercept {
26474
26595
  const $stringLength = 8;
26475
26596
  return 'req_' + Date.now() + '_' + pendo$1.randomString($stringLength);
26476
26597
  }
26477
- safelyReadResponse(response) {
26598
+ safelyReadBody(config, type) {
26478
26599
  return __awaiter(this, void 0, void 0, function* () {
26479
26600
  try {
26480
- const contentType = response.headers.get('content-type') || '';
26601
+ const contentType = config.headers.get('content-type') || '';
26481
26602
  if (contentType.indexOf('application/json') !== -1) {
26482
- return yield response.json();
26603
+ return yield config.json();
26483
26604
  }
26484
26605
  else if (contentType.indexOf('text/') !== -1) {
26485
- return yield response.text();
26606
+ return yield config.text();
26486
26607
  }
26487
26608
  else {
26488
26609
  // For binary or unknown content types, just capture metadata
@@ -26490,14 +26611,14 @@ class NetworkRequestIntercept {
26490
26611
  }
26491
26612
  }
26492
26613
  catch (e) {
26493
- return '[Unable to read response body]';
26614
+ return `[Unable to read ${type} body]`;
26494
26615
  }
26495
26616
  });
26496
26617
  }
26497
- extractResponseHeaders(response) {
26618
+ extractConfigHeaders(config) {
26498
26619
  let headers = {};
26499
- if (response.headers) {
26500
- const headerEntries = Array.from(response.headers.entries());
26620
+ if (config.headers) {
26621
+ const headerEntries = Array.from(config.headers.entries());
26501
26622
  headers = this.entriesToObject(headerEntries);
26502
26623
  }
26503
26624
  return headers;
@@ -26515,19 +26636,44 @@ class NetworkRequestIntercept {
26515
26636
  });
26516
26637
  return headers;
26517
26638
  }
26639
+ safelyReadRequestBody(request, isRequestObject) {
26640
+ return __awaiter(this, void 0, void 0, function* () {
26641
+ if (!request)
26642
+ return '';
26643
+ const networkInterceptor = this;
26644
+ if (isRequestObject) {
26645
+ return networkInterceptor.safelyReadBody(request, 'request');
26646
+ }
26647
+ return networkInterceptor.safelySerializeBody(request.body);
26648
+ });
26649
+ }
26650
+ extractRequestHeaders(request, isRequestObject) {
26651
+ const networkInterceptor = this;
26652
+ if (isRequestObject) {
26653
+ return networkInterceptor.extractConfigHeaders(request);
26654
+ }
26655
+ return networkInterceptor.extractHeaders(request.headers);
26656
+ }
26518
26657
  patchFetch() {
26519
26658
  const networkInterceptor = this;
26520
26659
  networkInterceptor._originalFetch = window.fetch;
26521
26660
  window.fetch = function (...args) {
26522
26661
  return __awaiter(this, void 0, void 0, function* () {
26523
- const [url, config = {}] = args;
26662
+ let [url, config = {}] = args;
26663
+ let isRequestObject = false;
26664
+ if (_.isObject(args[0])) {
26665
+ isRequestObject = true;
26666
+ url = args[0].url;
26667
+ // Clone the Request object to avoid consuming the body
26668
+ config = args[0].clone();
26669
+ }
26524
26670
  const transformedUrl = getTransformedUrl(url);
26525
26671
  const method = config.method || 'GET';
26526
26672
  const requestId = networkInterceptor.generateRequestId();
26527
26673
  // Capture request data
26528
26674
  try {
26529
- const headers = networkInterceptor.extractHeaders(config.headers);
26530
- const body = networkInterceptor.safelySerializeBody(config.body);
26675
+ const headers = networkInterceptor.extractRequestHeaders(config, isRequestObject);
26676
+ const body = yield networkInterceptor.safelyReadRequestBody(config, isRequestObject);
26531
26677
  _.each(networkInterceptor.callbackFns, ({ request }) => {
26532
26678
  if (_.isFunction(request))
26533
26679
  request({ requestId, method, url: transformedUrl, body, headers });
@@ -26546,9 +26692,9 @@ class NetworkRequestIntercept {
26546
26692
  const responseClone = res.clone();
26547
26693
  try {
26548
26694
  // Capture response data
26549
- const responseBody = yield networkInterceptor.safelyReadResponse(responseClone);
26695
+ const responseBody = yield networkInterceptor.safelyReadBody(responseClone, 'response');
26550
26696
  const { status, statusText } = res;
26551
- const headers = networkInterceptor.extractResponseHeaders(res);
26697
+ const headers = networkInterceptor.extractConfigHeaders(res);
26552
26698
  _.each(networkInterceptor.callbackFns, ({ response }) => {
26553
26699
  if (_.isFunction(response)) {
26554
26700
  response({
@@ -39200,6 +39346,8 @@ class DOMPrompt {
39200
39346
  constructor(pendo, PluginAPI, id, privacyFilters, inputCssSelectors, submitCssSelectors) {
39201
39347
  this.listeners = [];
39202
39348
  this.latestPromptValue = '';
39349
+ this.isActive = true;
39350
+ this.lastSubmitTime = 0;
39203
39351
  this.dom = pendo.dom;
39204
39352
  this._ = pendo._;
39205
39353
  this.api = PluginAPI;
@@ -39290,9 +39438,15 @@ class DOMPrompt {
39290
39438
  return candidateValue.replace(filtersToUse, 'redacted');
39291
39439
  }
39292
39440
  submit(origVal) {
39293
- if (!origVal) {
39441
+ if (!origVal || !this.isActive) {
39442
+ return;
39443
+ }
39444
+ // Prevent duplicate submissions within 2ms
39445
+ const now = Date.now();
39446
+ if (now - this.lastSubmitTime < 2) {
39294
39447
  return;
39295
39448
  }
39449
+ this.lastSubmitTime = now;
39296
39450
  const val = this.applyPrivacyFilter(origVal);
39297
39451
  const payload = {
39298
39452
  agentId: this.id,
@@ -39338,6 +39492,22 @@ class DOMPrompt {
39338
39492
  onSubmit(callback) {
39339
39493
  this.listeners.push(callback);
39340
39494
  }
39495
+ suspend() {
39496
+ this.isActive = false;
39497
+ }
39498
+ resume() {
39499
+ this.isActive = true;
39500
+ this._.each(this.inputEls, (inputEl) => {
39501
+ if (inputEl) {
39502
+ inputEl.get();
39503
+ }
39504
+ });
39505
+ this._.each(this.submitEls, (submitEl) => {
39506
+ if (submitEl) {
39507
+ submitEl.get();
39508
+ }
39509
+ });
39510
+ }
39341
39511
  teardown() {
39342
39512
  if (this.promptContainer) {
39343
39513
  this.promptContainer.teardown();
@@ -39426,13 +39596,17 @@ class PromptPlugin {
39426
39596
  reEvaluatePageRules() {
39427
39597
  const currentUrl = getNormalizedUrl();
39428
39598
  const allAgents = this.api.ConfigReader.get(this.configName) || [];
39429
- const currentlyActiveIds = this._.map(this.prompts, prompt => prompt.id);
39430
- // Remove agents that no longer match from active tracking
39431
- this.prompts = this._.filter(this.prompts, prompt => {
39599
+ this._.each(this.prompts, prompt => {
39432
39600
  const agent = this.findAgentById(prompt.id);
39433
- return agent && this.testPageRule(agent.pageRule, currentUrl, agent.id);
39601
+ const shouldBeActive = agent && this.testPageRule(agent.pageRule, currentUrl, agent.id);
39602
+ if (shouldBeActive) {
39603
+ prompt.resume();
39604
+ }
39605
+ else {
39606
+ prompt.suspend();
39607
+ }
39434
39608
  });
39435
- // Set up new agents that should now match
39609
+ const currentlyActiveIds = this._.map(this._.filter(this.prompts, prompt => prompt.isActive), prompt => prompt.id);
39436
39610
  this._.each(allAgents, aiAgent => {
39437
39611
  const isCurrentlyActive = this._.contains(currentlyActiveIds, aiAgent.id);
39438
39612
  const shouldBeActive = this.testPageRule(aiAgent.pageRule, currentUrl, aiAgent.id);
@@ -39531,14 +39705,14 @@ class PromptPlugin {
39531
39705
  return selectors;
39532
39706
  }
39533
39707
  sendEvent(promptEvent) {
39534
- const currentUrl = getNormalizedUrl();
39535
- const agent = this.findAgentById(promptEvent.agentId);
39536
- // Block event if page rule doesn't match
39537
- if (agent && !this.testPageRule(agent.pageRule, currentUrl, agent.id)) {
39708
+ // Block event if the prompt is suspended
39709
+ const prompt = this._.find(this.prompts, p => p.id === promptEvent.agentId);
39710
+ if (prompt && !prompt.isActive) {
39538
39711
  return;
39539
39712
  }
39540
39713
  const event = this._.extend({
39541
- promptType: 'request'
39714
+ promptType: 'request',
39715
+ agentType: 'prompt'
39542
39716
  }, promptEvent);
39543
39717
  this.api.analytics.collectEvent('prompt', event);
39544
39718
  }