coveo.analytics 2.28.17 → 2.28.19

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.
@@ -5,6 +5,8 @@ import {
5
5
  CustomEventsTypes,
6
6
  OmniboxSuggestionsMetadata,
7
7
  StaticFilterToggleValueMetadata,
8
+ GeneratedAnswerFeedbackReason,
9
+ GeneratedAnswerRephraseFormat,
8
10
  } from './searchPageEvents';
9
11
  import CoveoAnalyticsClient from '../client/analytics';
10
12
  import {NoopAnalytics} from '../client/noopAnalytics';
@@ -57,6 +59,7 @@ describe('SearchPageClient', () => {
57
59
 
58
60
  const provider: SearchPageClientProvider = {
59
61
  getBaseMetadata: () => ({foo: 'bar'}),
62
+ getGeneratedAnswerMetadata: () => ({genQaMetadata: 'bar'}),
60
63
  getSearchEventRequestPayload: () => ({
61
64
  queryText: 'queryText',
62
65
  responseTime: 123,
@@ -116,7 +119,7 @@ describe('SearchPageClient', () => {
116
119
 
117
120
  const expectMatchPayload = (actionCause: SearchPageEvents, meta = {}) => {
118
121
  const body: string = lastCallBody(fetchMock);
119
- const customData = {foo: 'bar', ...customDataFromMiddleware, ...meta};
122
+ const customData = {foo: 'bar', genQaMetadata: 'bar', ...customDataFromMiddleware, ...meta};
120
123
  expect(JSON.parse(body)).toEqual({
121
124
  queryText: 'queryText',
122
125
  responseTime: 123,
@@ -142,6 +145,14 @@ describe('SearchPageClient', () => {
142
145
  });
143
146
  };
144
147
 
148
+ const expectSearchEventToMatchDescription = (
149
+ description: EventDescription,
150
+ actionCause: SearchPageEvents,
151
+ meta = {}
152
+ ) => {
153
+ expectMatchDescription(description, actionCause, {...meta, genQaMetadata: 'bar'});
154
+ };
155
+
145
156
  const expectMatchDocumentPayload = (actionCause: SearchPageEvents, doc: PartialDocumentInformation, meta = {}) => {
146
157
  const body: string = lastCallBody(fetchMock);
147
158
  const customData = {foo: 'bar', ...customDataFromMiddleware, ...meta};
@@ -209,7 +220,7 @@ describe('SearchPageClient', () => {
209
220
  const built = await client.makeInterfaceLoad();
210
221
  await built.log({searchUID: provider.getSearchUID()});
211
222
  expectMatchPayload(SearchPageEvents.interfaceLoad);
212
- expectMatchDescription(built.description, SearchPageEvents.interfaceLoad);
223
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.interfaceLoad);
213
224
  });
214
225
 
215
226
  it('should send proper payload for #interfaceChange', async () => {
@@ -223,7 +234,9 @@ describe('SearchPageClient', () => {
223
234
  const built = await client.makeInterfaceChange({interfaceChangeTo: 'bob'});
224
235
  await built.log({searchUID: provider.getSearchUID()});
225
236
  expectMatchPayload(SearchPageEvents.interfaceChange, {interfaceChangeTo: 'bob'});
226
- expectMatchDescription(built.description, SearchPageEvents.interfaceChange, {interfaceChangeTo: 'bob'});
237
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.interfaceChange, {
238
+ interfaceChangeTo: 'bob',
239
+ });
227
240
  });
228
241
 
229
242
  it('should send proper payload for #didyoumeanAutomatic', async () => {
@@ -235,7 +248,7 @@ describe('SearchPageClient', () => {
235
248
  const built = await client.makeDidYouMeanAutomatic();
236
249
  await built.log({searchUID: provider.getSearchUID()});
237
250
  expectMatchPayload(SearchPageEvents.didyoumeanAutomatic);
238
- expectMatchDescription(built.description, SearchPageEvents.didyoumeanAutomatic);
251
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.didyoumeanAutomatic);
239
252
  });
240
253
 
241
254
  it('should send proper payload for #didyoumeanClick', async () => {
@@ -247,7 +260,7 @@ describe('SearchPageClient', () => {
247
260
  const built = await client.makeDidYouMeanClick();
248
261
  await built.log({searchUID: provider.getSearchUID()});
249
262
  expectMatchPayload(SearchPageEvents.didyoumeanClick);
250
- expectMatchDescription(built.description, SearchPageEvents.didyoumeanClick);
263
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.didyoumeanClick);
251
264
  });
252
265
 
253
266
  it('should send proper payload for #resultsSort', async () => {
@@ -259,7 +272,9 @@ describe('SearchPageClient', () => {
259
272
  const built = await client.makeResultsSort({resultsSortBy: 'date ascending'});
260
273
  await built.log({searchUID: provider.getSearchUID()});
261
274
  expectMatchPayload(SearchPageEvents.resultsSort, {resultsSortBy: 'date ascending'});
262
- expectMatchDescription(built.description, SearchPageEvents.resultsSort, {resultsSortBy: 'date ascending'});
275
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.resultsSort, {
276
+ resultsSortBy: 'date ascending',
277
+ });
263
278
  });
264
279
 
265
280
  it('should send proper payload for #searchboxSubmit', async () => {
@@ -271,7 +286,7 @@ describe('SearchPageClient', () => {
271
286
  const built = await client.makeSearchboxSubmit();
272
287
  await built.log({searchUID: provider.getSearchUID()});
273
288
  expectMatchPayload(SearchPageEvents.searchboxSubmit);
274
- expectMatchDescription(built.description, SearchPageEvents.searchboxSubmit);
289
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.searchboxSubmit);
275
290
  });
276
291
 
277
292
  it('should send proper payload for #searchboxClear', async () => {
@@ -283,7 +298,7 @@ describe('SearchPageClient', () => {
283
298
  const built = await client.makeSearchboxClear();
284
299
  await built.log({searchUID: provider.getSearchUID()});
285
300
  expectMatchPayload(SearchPageEvents.searchboxClear);
286
- expectMatchDescription(built.description, SearchPageEvents.searchboxClear);
301
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.searchboxClear);
287
302
  });
288
303
 
289
304
  it('should send proper payload for #searchboxAsYouType', async () => {
@@ -295,7 +310,7 @@ describe('SearchPageClient', () => {
295
310
  const built = await client.makeSearchboxAsYouType();
296
311
  await built.log({searchUID: provider.getSearchUID()});
297
312
  expectMatchPayload(SearchPageEvents.searchboxAsYouType);
298
- expectMatchDescription(built.description, SearchPageEvents.searchboxAsYouType);
313
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.searchboxAsYouType);
299
314
  });
300
315
 
301
316
  it('should send proper payload for #documentQuickview', async () => {
@@ -369,7 +384,7 @@ describe('SearchPageClient', () => {
369
384
  const built = await client.makeOmniboxAnalytics(meta);
370
385
  await built.log({searchUID: provider.getSearchUID()});
371
386
  expectMatchPayload(SearchPageEvents.omniboxAnalytics, meta);
372
- expectMatchDescription(built.description, SearchPageEvents.omniboxAnalytics, meta);
387
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.omniboxAnalytics, meta);
373
388
  });
374
389
 
375
390
  it('should send proper payload for #logOmniboxFromLink', async () => {
@@ -395,7 +410,7 @@ describe('SearchPageClient', () => {
395
410
  const built = await client.makeOmniboxFromLink(meta);
396
411
  await built.log({searchUID: provider.getSearchUID()});
397
412
  expectMatchPayload(SearchPageEvents.omniboxFromLink, meta);
398
- expectMatchDescription(built.description, SearchPageEvents.omniboxFromLink, meta);
413
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.omniboxFromLink, meta);
399
414
  });
400
415
 
401
416
  it('should send proper payload for #logSearchFromLink', async () => {
@@ -407,7 +422,7 @@ describe('SearchPageClient', () => {
407
422
  const built = await client.makeSearchFromLink();
408
423
  await built.log({searchUID: provider.getSearchUID()});
409
424
  expectMatchPayload(SearchPageEvents.searchFromLink);
410
- expectMatchDescription(built.description, SearchPageEvents.searchFromLink);
425
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.searchFromLink);
411
426
  });
412
427
 
413
428
  it('should send proper payload for #logTriggerNotify', async () => {
@@ -485,7 +500,7 @@ describe('SearchPageClient', () => {
485
500
  const built = await client.makeUndoTriggerQuery(meta);
486
501
  await built.log({searchUID: provider.getSearchUID()});
487
502
  expectMatchPayload(SearchPageEvents.undoTriggerQuery, meta);
488
- expectMatchDescription(built.description, SearchPageEvents.undoTriggerQuery, meta);
503
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.undoTriggerQuery, meta);
489
504
  });
490
505
 
491
506
  it('should send proper payload for #logTriggerRedirect', async () => {
@@ -592,7 +607,7 @@ describe('SearchPageClient', () => {
592
607
  const built = await client.makeStaticFilterClearAll({staticFilterId});
593
608
  await built.log({searchUID: provider.getSearchUID()});
594
609
  expectMatchPayload(SearchPageEvents.staticFilterClearAll, {staticFilterId});
595
- expectMatchDescription(built.description, SearchPageEvents.staticFilterClearAll, {staticFilterId});
610
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.staticFilterClearAll, {staticFilterId});
596
611
  });
597
612
 
598
613
  it('should send the proper payload for #logStaticFilterSelect', async () => {
@@ -620,7 +635,7 @@ describe('SearchPageClient', () => {
620
635
  await built.log({searchUID: provider.getSearchUID()});
621
636
 
622
637
  expectMatchPayload(SearchPageEvents.staticFilterSelect, meta);
623
- expectMatchDescription(built.description, SearchPageEvents.staticFilterSelect, meta);
638
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.staticFilterSelect, meta);
624
639
  });
625
640
 
626
641
  it('should send the proper payload for #logStaticFilterDeselect', async () => {
@@ -647,7 +662,7 @@ describe('SearchPageClient', () => {
647
662
  const built = await client.makeStaticFilterDeselect(meta);
648
663
  await built.log({searchUID: provider.getSearchUID()});
649
664
  expectMatchPayload(SearchPageEvents.staticFilterDeselect, meta);
650
- expectMatchDescription(built.description, SearchPageEvents.staticFilterDeselect, meta);
665
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.staticFilterDeselect, meta);
651
666
  });
652
667
 
653
668
  it('should send proper payload for #logFacetSearch', async () => {
@@ -669,7 +684,7 @@ describe('SearchPageClient', () => {
669
684
  const built = await client.makeFacetSearch(meta);
670
685
  await built.log({searchUID: provider.getSearchUID()});
671
686
  expectMatchPayload(SearchPageEvents.facetSearch, meta);
672
- expectMatchDescription(built.description, SearchPageEvents.facetSearch, meta);
687
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.facetSearch, meta);
673
688
  });
674
689
 
675
690
  it('should send proper payload for #logFacetSelect', async () => {
@@ -694,7 +709,7 @@ describe('SearchPageClient', () => {
694
709
  const built = await client.makeFacetSelect(meta);
695
710
  await built.log({searchUID: provider.getSearchUID()});
696
711
  expectMatchPayload(SearchPageEvents.facetSelect, meta);
697
- expectMatchDescription(built.description, SearchPageEvents.facetSelect, meta);
712
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.facetSelect, meta);
698
713
  });
699
714
 
700
715
  it('should send proper payload for #logFacetDeselect', async () => {
@@ -720,7 +735,7 @@ describe('SearchPageClient', () => {
720
735
  const built = await client.makeFacetDeselect(meta);
721
736
  await built.log({searchUID: provider.getSearchUID()});
722
737
  expectMatchPayload(SearchPageEvents.facetDeselect, meta);
723
- expectMatchDescription(built.description, SearchPageEvents.facetDeselect, meta);
738
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.facetDeselect, meta);
724
739
  });
725
740
 
726
741
  it('should send proper payload for #logFacetExclude', async () => {
@@ -744,7 +759,7 @@ describe('SearchPageClient', () => {
744
759
  const built = await client.makeFacetExclude(meta);
745
760
  await built.log({searchUID: provider.getSearchUID()});
746
761
  expectMatchPayload(SearchPageEvents.facetExclude, meta);
747
- expectMatchDescription(built.description, SearchPageEvents.facetExclude, meta);
762
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.facetExclude, meta);
748
763
  });
749
764
 
750
765
  it('should send proper payload for #logFacetUnexclude', async () => {
@@ -768,7 +783,7 @@ describe('SearchPageClient', () => {
768
783
  const built = await client.makeFacetUnexclude(meta);
769
784
  await built.log({searchUID: provider.getSearchUID()});
770
785
  expectMatchPayload(SearchPageEvents.facetUnexclude, meta);
771
- expectMatchDescription(built.description, SearchPageEvents.facetUnexclude, meta);
786
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.facetUnexclude, meta);
772
787
  });
773
788
 
774
789
  it('should send proper payload for #logFacetSelectAll', async () => {
@@ -790,7 +805,7 @@ describe('SearchPageClient', () => {
790
805
  const built = await client.makeFacetSelectAll(meta);
791
806
  await built.log({searchUID: provider.getSearchUID()});
792
807
  expectMatchPayload(SearchPageEvents.facetSelectAll, meta);
793
- expectMatchDescription(built.description, SearchPageEvents.facetSelectAll, meta);
808
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.facetSelectAll, meta);
794
809
  });
795
810
 
796
811
  it('should send proper payload for #logFacetUpdateSort', async () => {
@@ -814,7 +829,7 @@ describe('SearchPageClient', () => {
814
829
  const built = await client.makeFacetUpdateSort(meta);
815
830
  await built.log({searchUID: provider.getSearchUID()});
816
831
  expectMatchPayload(SearchPageEvents.facetUpdateSort, meta);
817
- expectMatchDescription(built.description, SearchPageEvents.facetUpdateSort, meta);
832
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.facetUpdateSort, meta);
818
833
  });
819
834
 
820
835
  it('should send proper payload for #logFacetShowMore', async () => {
@@ -935,7 +950,7 @@ describe('SearchPageClient', () => {
935
950
  const built = await client.makeRecommendationInterfaceLoad();
936
951
  await built.log({searchUID: provider.getSearchUID()});
937
952
  expectMatchPayload(SearchPageEvents.recommendationInterfaceLoad);
938
- expectMatchDescription(built.description, SearchPageEvents.recommendationInterfaceLoad);
953
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.recommendationInterfaceLoad);
939
954
  });
940
955
 
941
956
  it('should send proper payload for #logRecommendation', async () => {
@@ -1307,7 +1322,7 @@ describe('SearchPageClient', () => {
1307
1322
  await built.log({searchUID: provider.getSearchUID()});
1308
1323
 
1309
1324
  expectMatchPayload(SearchPageEvents.recentQueryClick);
1310
- expectMatchDescription(built.description, SearchPageEvents.recentQueryClick);
1325
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.recentQueryClick);
1311
1326
  });
1312
1327
 
1313
1328
  it('should send proper payload for #logClearRecentQueries', async () => {
@@ -1356,7 +1371,7 @@ describe('SearchPageClient', () => {
1356
1371
  await built.log({searchUID: provider.getSearchUID()});
1357
1372
 
1358
1373
  expectMatchPayload(SearchPageEvents.noResultsBack);
1359
- expectMatchDescription(built.description, SearchPageEvents.noResultsBack);
1374
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.noResultsBack);
1360
1375
  });
1361
1376
 
1362
1377
  it('should send proper payload for #logClearRecentResults', async () => {
@@ -1445,13 +1460,21 @@ describe('SearchPageClient', () => {
1445
1460
  });
1446
1461
 
1447
1462
  it('should send proper payload for #logOpenGeneratedAnswerSource', async () => {
1448
- const meta = {generativeQuestionAnsweringId: fakeStreamId, id: 'some-document-id', permanentId: 'perm-id'};
1463
+ const meta = {
1464
+ generativeQuestionAnsweringId: fakeStreamId,
1465
+ citationId: 'some-document-id',
1466
+ permanentId: 'perm-id',
1467
+ };
1449
1468
  await client.logOpenGeneratedAnswerSource(meta);
1450
1469
  expectMatchCustomEventPayload(SearchPageEvents.openGeneratedAnswerSource, meta);
1451
1470
  });
1452
1471
 
1453
1472
  it('should send proper payload for #makeOpenGeneratedAnswerSource', async () => {
1454
- const meta = {generativeQuestionAnsweringId: fakeStreamId, id: 'some-document-id', permanentId: 'perm-id'};
1473
+ const meta = {
1474
+ generativeQuestionAnsweringId: fakeStreamId,
1475
+ citationId: 'some-document-id',
1476
+ permanentId: 'perm-id',
1477
+ };
1455
1478
  const built = await client.makeOpenGeneratedAnswerSource(meta);
1456
1479
  await built.log({searchUID: provider.getSearchUID()});
1457
1480
  expectMatchCustomEventPayload(SearchPageEvents.openGeneratedAnswerSource, meta);
@@ -1471,4 +1494,112 @@ describe('SearchPageClient', () => {
1471
1494
  expectMatchCustomEventPayload(SearchPageEvents.generatedAnswerStreamEnd, meta);
1472
1495
  expectMatchDescription(built.description, SearchPageEvents.generatedAnswerStreamEnd, meta);
1473
1496
  });
1497
+
1498
+ it('should send proper payload for #logGeneratedAnswerSourceHover', async () => {
1499
+ const meta = {
1500
+ generativeQuestionAnsweringId: fakeStreamId,
1501
+ citationId: 'some-document-id',
1502
+ permanentId: 'perm-id',
1503
+ citationHoverTimeMs: 100,
1504
+ };
1505
+ await client.logGeneratedAnswerSourceHover(meta);
1506
+ expectMatchCustomEventPayload(SearchPageEvents.generatedAnswerSourceHover, meta);
1507
+ });
1508
+
1509
+ it('should send proper payload for #makeGeneratedAnswerSourceHover', async () => {
1510
+ const meta = {
1511
+ generativeQuestionAnsweringId: fakeStreamId,
1512
+ citationId: 'some-document-id',
1513
+ permanentId: 'perm-id',
1514
+ citationHoverTimeMs: 100,
1515
+ };
1516
+ const built = await client.makeGeneratedAnswerSourceHover(meta);
1517
+ await built.log({searchUID: provider.getSearchUID()});
1518
+ expectMatchCustomEventPayload(SearchPageEvents.generatedAnswerSourceHover, meta);
1519
+ expectMatchDescription(built.description, SearchPageEvents.generatedAnswerSourceHover, meta);
1520
+ });
1521
+
1522
+ it('should send proper payload for #logGeneratedAnswerCopyToClipboard', async () => {
1523
+ const meta = {generativeQuestionAnsweringId: fakeStreamId};
1524
+ await client.logGeneratedAnswerCopyToClipboard(meta);
1525
+ expectMatchCustomEventPayload(SearchPageEvents.generatedAnswerCopyToClipboard, meta);
1526
+ });
1527
+
1528
+ it('should send proper payload for #makeGeneratedAnswerCopyToClipboard', async () => {
1529
+ const meta = {generativeQuestionAnsweringId: fakeStreamId};
1530
+ const built = await client.makeGeneratedAnswerCopyToClipboard(meta);
1531
+ await built.log({searchUID: provider.getSearchUID()});
1532
+ expectMatchCustomEventPayload(SearchPageEvents.generatedAnswerCopyToClipboard, meta);
1533
+ expectMatchDescription(built.description, SearchPageEvents.generatedAnswerCopyToClipboard, meta);
1534
+ });
1535
+
1536
+ it('should send proper payload for #logGeneratedAnswerHideAnswers', async () => {
1537
+ const meta = {generativeQuestionAnsweringId: fakeStreamId};
1538
+ await client.logGeneratedAnswerHideAnswers(meta);
1539
+ expectMatchCustomEventPayload(SearchPageEvents.generatedAnswerHideAnswers, meta);
1540
+ });
1541
+
1542
+ it('should send proper payload for #makeGeneratedAnswerHideAnswers', async () => {
1543
+ const meta = {generativeQuestionAnsweringId: fakeStreamId};
1544
+ const built = await client.makeGeneratedAnswerHideAnswers(meta);
1545
+ await built.log({searchUID: provider.getSearchUID()});
1546
+ expectMatchCustomEventPayload(SearchPageEvents.generatedAnswerHideAnswers, meta);
1547
+ expectMatchDescription(built.description, SearchPageEvents.generatedAnswerHideAnswers, meta);
1548
+ });
1549
+
1550
+ it('should send proper payload for #logGeneratedAnswerShowAnswers', async () => {
1551
+ const meta = {generativeQuestionAnsweringId: fakeStreamId};
1552
+ await client.logGeneratedAnswerShowAnswers(meta);
1553
+ expectMatchCustomEventPayload(SearchPageEvents.generatedAnswerShowAnswers, meta);
1554
+ });
1555
+
1556
+ it('should send proper payload for #makeGeneratedAnswerShowAnswers', async () => {
1557
+ const meta = {generativeQuestionAnsweringId: fakeStreamId};
1558
+ const built = await client.makeGeneratedAnswerShowAnswers(meta);
1559
+ await built.log({searchUID: provider.getSearchUID()});
1560
+ expectMatchCustomEventPayload(SearchPageEvents.generatedAnswerShowAnswers, meta);
1561
+ expectMatchDescription(built.description, SearchPageEvents.generatedAnswerShowAnswers, meta);
1562
+ });
1563
+
1564
+ it('should send proper payload for #logGenerativeQuestionFeedbackSubmit', async () => {
1565
+ const meta = {
1566
+ generativeQuestionAnsweringId: fakeStreamId,
1567
+ reason: <GeneratedAnswerFeedbackReason>'other',
1568
+ details: 'a few additional details',
1569
+ };
1570
+ await client.logGenerativeQuestionFeedbackSubmit(meta);
1571
+ expectMatchCustomEventPayload(SearchPageEvents.generativeQuestionFeedbackSubmit, meta);
1572
+ });
1573
+
1574
+ it('should send proper payload for #makeGenerativeQuestionFeedbackSubmit', async () => {
1575
+ const meta = {
1576
+ generativeQuestionAnsweringId: fakeStreamId,
1577
+ reason: <GeneratedAnswerFeedbackReason>'other',
1578
+ details: 'a few additional details',
1579
+ };
1580
+ const built = await client.makeGenerativeQuestionFeedbackSubmit(meta);
1581
+ await built.log({searchUID: provider.getSearchUID()});
1582
+ expectMatchCustomEventPayload(SearchPageEvents.generativeQuestionFeedbackSubmit, meta);
1583
+ expectMatchDescription(built.description, SearchPageEvents.generativeQuestionFeedbackSubmit, meta);
1584
+ });
1585
+
1586
+ it('should send proper payload for #logRephraseGeneratedAnswer', async () => {
1587
+ const meta = {
1588
+ generativeQuestionAnsweringId: fakeStreamId,
1589
+ rephraseFormat: <GeneratedAnswerRephraseFormat>'step',
1590
+ };
1591
+ await client.logRephraseGeneratedAnswer(meta);
1592
+ expectMatchPayload(SearchPageEvents.rephraseGeneratedAnswer, meta);
1593
+ });
1594
+
1595
+ it('should send proper payload for #makeRephraseGeneratedAnswer', async () => {
1596
+ const meta = {
1597
+ generativeQuestionAnsweringId: fakeStreamId,
1598
+ rephraseFormat: <GeneratedAnswerRephraseFormat>'step',
1599
+ };
1600
+ const built = await client.makeRephraseGeneratedAnswer(meta);
1601
+ await built.log({searchUID: provider.getSearchUID()});
1602
+ expectMatchPayload(SearchPageEvents.rephraseGeneratedAnswer, meta);
1603
+ expectSearchEventToMatchDescription(built.description, SearchPageEvents.rephraseGeneratedAnswer, meta);
1604
+ });
1474
1605
  });
@@ -39,6 +39,9 @@ import {
39
39
  GeneratedAnswerFeedbackMeta,
40
40
  GeneratedAnswerCitationMeta,
41
41
  GeneratedAnswerStreamEndMeta,
42
+ GeneratedAnswerSourceHoverMeta,
43
+ GeneratedAnswerBaseMeta,
44
+ GeneratedAnswerRephraseMeta,
42
45
  } from './searchPageEvents';
43
46
  import {NoopAnalytics} from '../client/noopAnalytics';
44
47
  import {formatOmniboxMetadata} from '../formatting/format-omnibox-metadata';
@@ -58,6 +61,7 @@ export interface SearchPageClientProvider {
58
61
  getFacetState?: () => FacetStateMetadata[];
59
62
  getSplitTestRunName?: () => string | undefined;
60
63
  getSplitTestRunVersion?: () => string | undefined;
64
+ getGeneratedAnswerMetadata?: () => Record<string, any>;
61
65
  }
62
66
 
63
67
  export interface SearchPageClientOptions extends ClientOptions {
@@ -841,7 +845,7 @@ export class CoveoSearchPageClient {
841
845
  metadata?: Record<string, any>
842
846
  ): Promise<PreparedSearchEventRequest> {
843
847
  return {
844
- ...(await this.getBaseEventRequest(metadata)),
848
+ ...(await this.getBaseEventRequest({...metadata, ...this.provider.getGeneratedAnswerMetadata?.()})),
845
849
  ...this.provider.getSearchEventRequestPayload(),
846
850
  queryPipeline: this.provider.getPipeline(),
847
851
  actionCause: event,
@@ -885,19 +889,19 @@ export class CoveoSearchPageClient {
885
889
  };
886
890
  }
887
891
 
888
- public makeLikeGeneratedAnswer(metadata: GeneratedAnswerFeedbackMeta) {
892
+ public makeLikeGeneratedAnswer(metadata: GeneratedAnswerBaseMeta) {
889
893
  return this.makeCustomEvent(SearchPageEvents.likeGeneratedAnswer, metadata);
890
894
  }
891
895
 
892
- public async logLikeGeneratedAnswer(metadata: GeneratedAnswerFeedbackMeta) {
896
+ public async logLikeGeneratedAnswer(metadata: GeneratedAnswerBaseMeta) {
893
897
  return (await this.makeLikeGeneratedAnswer(metadata)).log({searchUID: this.provider.getSearchUID()});
894
898
  }
895
899
 
896
- public makeDislikeGeneratedAnswer(metadata: GeneratedAnswerFeedbackMeta) {
900
+ public makeDislikeGeneratedAnswer(metadata: GeneratedAnswerBaseMeta) {
897
901
  return this.makeCustomEvent(SearchPageEvents.dislikeGeneratedAnswer, metadata);
898
902
  }
899
903
 
900
- public async logDislikeGeneratedAnswer(metadata: GeneratedAnswerFeedbackMeta) {
904
+ public async logDislikeGeneratedAnswer(metadata: GeneratedAnswerBaseMeta) {
901
905
  return (await this.makeDislikeGeneratedAnswer(metadata)).log({searchUID: this.provider.getSearchUID()});
902
906
  }
903
907
 
@@ -911,6 +915,64 @@ export class CoveoSearchPageClient {
911
915
  });
912
916
  }
913
917
 
918
+ public makeGeneratedAnswerSourceHover(metadata: GeneratedAnswerSourceHoverMeta) {
919
+ return this.makeCustomEvent(SearchPageEvents.generatedAnswerSourceHover, metadata);
920
+ }
921
+
922
+ public async logGeneratedAnswerSourceHover(metadata: GeneratedAnswerSourceHoverMeta) {
923
+ return (await this.makeGeneratedAnswerSourceHover(metadata)).log({
924
+ searchUID: this.provider.getSearchUID(),
925
+ });
926
+ }
927
+
928
+ public makeGeneratedAnswerCopyToClipboard(metadata: GeneratedAnswerBaseMeta) {
929
+ return this.makeCustomEvent(SearchPageEvents.generatedAnswerCopyToClipboard, metadata);
930
+ }
931
+
932
+ public async logGeneratedAnswerCopyToClipboard(metadata: GeneratedAnswerBaseMeta) {
933
+ return (await this.makeGeneratedAnswerCopyToClipboard(metadata)).log({
934
+ searchUID: this.provider.getSearchUID(),
935
+ });
936
+ }
937
+
938
+ public makeGeneratedAnswerHideAnswers(metadata: GeneratedAnswerBaseMeta) {
939
+ return this.makeCustomEvent(SearchPageEvents.generatedAnswerHideAnswers, metadata);
940
+ }
941
+
942
+ public async logGeneratedAnswerHideAnswers(metadata: GeneratedAnswerBaseMeta) {
943
+ return (await this.makeGeneratedAnswerHideAnswers(metadata)).log({
944
+ searchUID: this.provider.getSearchUID(),
945
+ });
946
+ }
947
+
948
+ public makeGeneratedAnswerShowAnswers(metadata: GeneratedAnswerBaseMeta) {
949
+ return this.makeCustomEvent(SearchPageEvents.generatedAnswerShowAnswers, metadata);
950
+ }
951
+
952
+ public async logGeneratedAnswerShowAnswers(metadata: GeneratedAnswerBaseMeta) {
953
+ return (await this.makeGeneratedAnswerShowAnswers(metadata)).log({
954
+ searchUID: this.provider.getSearchUID(),
955
+ });
956
+ }
957
+
958
+ public makeGenerativeQuestionFeedbackSubmit(meta: GeneratedAnswerFeedbackMeta) {
959
+ return this.makeCustomEvent(SearchPageEvents.generativeQuestionFeedbackSubmit, meta);
960
+ }
961
+
962
+ public async logGenerativeQuestionFeedbackSubmit(meta: GeneratedAnswerFeedbackMeta) {
963
+ return (await this.makeGenerativeQuestionFeedbackSubmit(meta)).log({
964
+ searchUID: this.provider.getSearchUID(),
965
+ });
966
+ }
967
+
968
+ public makeRephraseGeneratedAnswer(meta: GeneratedAnswerRephraseMeta) {
969
+ return this.makeSearchEvent(SearchPageEvents.rephraseGeneratedAnswer, meta);
970
+ }
971
+
972
+ public async logRephraseGeneratedAnswer(meta: GeneratedAnswerRephraseMeta) {
973
+ return (await this.makeRephraseGeneratedAnswer(meta)).log({searchUID: this.provider.getSearchUID()});
974
+ }
975
+
914
976
  public makeRetryGeneratedAnswer() {
915
977
  return this.makeSearchEvent(SearchPageEvents.retryGeneratedAnswer);
916
978
  }
@@ -314,6 +314,30 @@ export enum SearchPageEvents {
314
314
  * Identified the custom event that gets logged when a generated answer stream is completed.
315
315
  */
316
316
  generatedAnswerStreamEnd = 'generatedAnswerStreamEnd',
317
+ /**
318
+ * Identifies the custom event that gets logged when a user hovers over a generated answer citation.
319
+ */
320
+ generatedAnswerSourceHover = 'generatedAnswerSourceHover',
321
+ /**
322
+ * Identifies the custom event that gets logged when a user clicks the copy to clip board button of a generated answer.
323
+ */
324
+ generatedAnswerCopyToClipboard = 'generatedAnswerCopyToClipboard',
325
+ /**
326
+ * Identifies the custom event that gets logged when a user deactivates the genQA feature.
327
+ */
328
+ generatedAnswerHideAnswers = 'generatedAnswerHideAnswers',
329
+ /**
330
+ * Identifies the custom event that gets logged when a user activates the genQA feature.
331
+ */
332
+ generatedAnswerShowAnswers = 'generatedAnswerShowAnswers',
333
+ /**
334
+ * Identifies the custom event that gets logged when a user submits a feedback of a generated answer.
335
+ */
336
+ generativeQuestionFeedbackSubmit = 'generativeQuestionFeedbackSubmit',
337
+ /**
338
+ * Identifies the search event that gets logged when a user clicks the rephrase button in a generated answer.
339
+ */
340
+ rephraseGeneratedAnswer = 'rephraseGeneratedAnswer',
317
341
  }
318
342
 
319
343
  export const CustomEventsTypes: Partial<Record<SearchPageEvents | InsightEvents, string>> = {
@@ -360,6 +384,11 @@ export const CustomEventsTypes: Partial<Record<SearchPageEvents | InsightEvents,
360
384
  [SearchPageEvents.dislikeGeneratedAnswer]: 'generatedAnswer',
361
385
  [SearchPageEvents.openGeneratedAnswerSource]: 'generatedAnswer',
362
386
  [SearchPageEvents.generatedAnswerStreamEnd]: 'generatedAnswer',
387
+ [SearchPageEvents.generatedAnswerSourceHover]: 'generatedAnswer',
388
+ [SearchPageEvents.generatedAnswerCopyToClipboard]: 'generatedAnswer',
389
+ [SearchPageEvents.generatedAnswerHideAnswers]: 'generatedAnswer',
390
+ [SearchPageEvents.generatedAnswerShowAnswers]: 'generatedAnswer',
391
+ [SearchPageEvents.generativeQuestionFeedbackSubmit]: 'generatedAnswer',
363
392
  };
364
393
 
365
394
  export interface StaticFilterMetadata {
@@ -494,12 +523,10 @@ export interface SmartSnippetDocumentIdentifier {
494
523
 
495
524
  export type PartialDocumentInformation = Omit<DocumentInformation, 'actionCause' | 'searchQueryUid'>;
496
525
 
497
- interface GeneratedAnswerBaseMeta {
526
+ export interface GeneratedAnswerBaseMeta {
498
527
  generativeQuestionAnsweringId: string;
499
528
  }
500
529
 
501
- export interface GeneratedAnswerFeedbackMeta extends GeneratedAnswerBaseMeta {}
502
-
503
530
  export interface GeneratedAnswerStreamEndMeta extends GeneratedAnswerBaseMeta {
504
531
  answerGenerated: boolean;
505
532
  }
@@ -507,5 +534,22 @@ export interface GeneratedAnswerStreamEndMeta extends GeneratedAnswerBaseMeta {
507
534
  export interface GeneratedAnswerCitationMeta {
508
535
  generativeQuestionAnsweringId: string;
509
536
  permanentId: string;
510
- id: string;
537
+ citationId: string;
538
+ }
539
+
540
+ export type GeneratedAnswerFeedbackReason = 'irrelevant' | 'notAccurate' | 'outOfDate' | 'harmful' | 'other';
541
+
542
+ export type GeneratedAnswerRephraseFormat = 'step' | 'bullet' | 'concise' | 'default';
543
+
544
+ export interface GeneratedAnswerSourceHoverMeta extends GeneratedAnswerCitationMeta {
545
+ citationHoverTimeMs: number;
546
+ }
547
+
548
+ export interface GeneratedAnswerRephraseMeta extends GeneratedAnswerBaseMeta {
549
+ rephraseFormat: GeneratedAnswerRephraseFormat;
550
+ }
551
+
552
+ export interface GeneratedAnswerFeedbackMeta extends GeneratedAnswerBaseMeta {
553
+ reason: GeneratedAnswerFeedbackReason;
554
+ details?: string;
511
555
  }