@webex/plugin-meetings 3.9.0-webinar5k.1 → 3.10.0-multi-llms.1

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 (147) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/common/errors/webex-errors.js +21 -1
  4. package/dist/common/errors/webex-errors.js.map +1 -1
  5. package/dist/constants.js +25 -0
  6. package/dist/constants.js.map +1 -1
  7. package/dist/controls-options-manager/index.js +22 -5
  8. package/dist/controls-options-manager/index.js.map +1 -1
  9. package/dist/index.js +9 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/interceptors/index.js +7 -0
  12. package/dist/interceptors/index.js.map +1 -1
  13. package/dist/interceptors/locusRouteToken.js +116 -0
  14. package/dist/interceptors/locusRouteToken.js.map +1 -0
  15. package/dist/interpretation/index.js +1 -1
  16. package/dist/interpretation/siLanguage.js +1 -1
  17. package/dist/locus-info/controlsUtils.js +11 -2
  18. package/dist/locus-info/controlsUtils.js.map +1 -1
  19. package/dist/locus-info/index.js +76 -322
  20. package/dist/locus-info/index.js.map +1 -1
  21. package/dist/locus-info/parser.js +4 -1
  22. package/dist/locus-info/parser.js.map +1 -1
  23. package/dist/media/index.js +5 -0
  24. package/dist/media/index.js.map +1 -1
  25. package/dist/media/properties.js +53 -5
  26. package/dist/media/properties.js.map +1 -1
  27. package/dist/meeting/in-meeting-actions.js +14 -0
  28. package/dist/meeting/in-meeting-actions.js.map +1 -1
  29. package/dist/meeting/index.js +468 -278
  30. package/dist/meeting/index.js.map +1 -1
  31. package/dist/meeting/request.js +177 -14
  32. package/dist/meeting/request.js.map +1 -1
  33. package/dist/meeting/type.js +7 -0
  34. package/dist/meeting/type.js.map +1 -0
  35. package/dist/meeting/util.js +100 -3
  36. package/dist/meeting/util.js.map +1 -1
  37. package/dist/meeting-info/meeting-info-v2.js +29 -21
  38. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  39. package/dist/meetings/index.js +20 -16
  40. package/dist/meetings/index.js.map +1 -1
  41. package/dist/member/index.js +9 -0
  42. package/dist/member/index.js.map +1 -1
  43. package/dist/member/util.js +10 -0
  44. package/dist/member/util.js.map +1 -1
  45. package/dist/members/index.js +10 -7
  46. package/dist/members/index.js.map +1 -1
  47. package/dist/members/util.js +7 -2
  48. package/dist/members/util.js.map +1 -1
  49. package/dist/metrics/constants.js +2 -1
  50. package/dist/metrics/constants.js.map +1 -1
  51. package/dist/multistream/mediaRequestManager.js +1 -1
  52. package/dist/multistream/mediaRequestManager.js.map +1 -1
  53. package/dist/multistream/remoteMedia.js +34 -5
  54. package/dist/multistream/remoteMedia.js.map +1 -1
  55. package/dist/multistream/remoteMediaGroup.js +42 -2
  56. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  57. package/dist/reachability/index.js +3 -3
  58. package/dist/reachability/index.js.map +1 -1
  59. package/dist/types/common/errors/webex-errors.d.ts +12 -0
  60. package/dist/types/constants.d.ts +23 -0
  61. package/dist/types/controls-options-manager/index.d.ts +9 -1
  62. package/dist/types/index.d.ts +2 -1
  63. package/dist/types/interceptors/index.d.ts +2 -1
  64. package/dist/types/interceptors/locusRouteToken.d.ts +38 -0
  65. package/dist/types/locus-info/index.d.ts +9 -54
  66. package/dist/types/media/properties.d.ts +21 -0
  67. package/dist/types/meeting/in-meeting-actions.d.ts +14 -0
  68. package/dist/types/meeting/index.d.ts +64 -29
  69. package/dist/types/meeting/request.d.ts +42 -0
  70. package/dist/types/meeting/type.d.ts +9 -0
  71. package/dist/types/meeting/util.d.ts +13 -0
  72. package/dist/types/meeting-info/meeting-info-v2.d.ts +6 -3
  73. package/dist/types/meetings/index.d.ts +3 -1
  74. package/dist/types/member/index.d.ts +1 -0
  75. package/dist/types/member/util.d.ts +5 -0
  76. package/dist/types/members/index.d.ts +12 -11
  77. package/dist/types/members/util.d.ts +8 -4
  78. package/dist/types/metrics/constants.d.ts +1 -0
  79. package/dist/types/multistream/remoteMedia.d.ts +20 -1
  80. package/dist/types/multistream/remoteMediaGroup.d.ts +11 -0
  81. package/dist/webinar/index.js +1 -1
  82. package/package.json +26 -28
  83. package/src/common/errors/webex-errors.ts +19 -0
  84. package/src/constants.ts +26 -2
  85. package/src/controls-options-manager/index.ts +26 -5
  86. package/src/index.ts +4 -1
  87. package/src/interceptors/index.ts +2 -1
  88. package/src/interceptors/locusRouteToken.ts +80 -0
  89. package/src/locus-info/controlsUtils.ts +18 -0
  90. package/src/locus-info/index.ts +69 -357
  91. package/src/locus-info/parser.ts +5 -1
  92. package/src/media/index.ts +6 -0
  93. package/src/media/properties.ts +43 -0
  94. package/src/meeting/in-meeting-actions.ts +29 -0
  95. package/src/meeting/index.ts +299 -88
  96. package/src/meeting/request.ts +141 -0
  97. package/src/meeting/type.ts +9 -0
  98. package/src/meeting/util.ts +107 -3
  99. package/src/meeting-info/meeting-info-v2.ts +24 -5
  100. package/src/meetings/index.ts +15 -22
  101. package/src/member/index.ts +10 -0
  102. package/src/member/util.ts +14 -0
  103. package/src/members/index.ts +20 -10
  104. package/src/members/util.ts +20 -3
  105. package/src/metrics/constants.ts +1 -0
  106. package/src/multistream/mediaRequestManager.ts +7 -7
  107. package/src/multistream/remoteMedia.ts +34 -4
  108. package/src/multistream/remoteMediaGroup.ts +37 -2
  109. package/src/reachability/index.ts +3 -3
  110. package/test/unit/spec/common/browser-detection.js +0 -24
  111. package/test/unit/spec/controls-options-manager/index.js +47 -0
  112. package/test/unit/spec/fixture/locus.js +1 -0
  113. package/test/unit/spec/interceptors/locusRouteToken.ts +87 -0
  114. package/test/unit/spec/locus-info/index.js +80 -361
  115. package/test/unit/spec/locus-info/parser.js +3 -2
  116. package/test/unit/spec/media/index.ts +140 -9
  117. package/test/unit/spec/media/properties.ts +137 -0
  118. package/test/unit/spec/meeting/in-meeting-actions.ts +14 -0
  119. package/test/unit/spec/meeting/index.js +679 -82
  120. package/test/unit/spec/meeting/muteState.js +32 -6
  121. package/test/unit/spec/meeting/request.js +21 -0
  122. package/test/unit/spec/meeting/utils.js +170 -17
  123. package/test/unit/spec/meeting-info/meetinginfov2.js +8 -3
  124. package/test/unit/spec/meetings/index.js +12 -7
  125. package/test/unit/spec/member/util.js +24 -0
  126. package/test/unit/spec/members/collection.js +120 -0
  127. package/test/unit/spec/members/index.js +107 -2
  128. package/test/unit/spec/members/request.js +55 -0
  129. package/test/unit/spec/members/utils.js +116 -14
  130. package/test/unit/spec/multistream/mediaRequestManager.ts +19 -6
  131. package/test/unit/spec/multistream/remoteMedia.ts +66 -2
  132. package/test/unit/spec/reachability/index.ts +158 -3
  133. package/test/unit/spec/roap/turnDiscovery.ts +3 -3
  134. package/dist/hashTree/constants.js +0 -23
  135. package/dist/hashTree/constants.js.map +0 -1
  136. package/dist/hashTree/hashTree.js +0 -516
  137. package/dist/hashTree/hashTree.js.map +0 -1
  138. package/dist/hashTree/hashTreeParser.js +0 -521
  139. package/dist/hashTree/hashTreeParser.js.map +0 -1
  140. package/dist/types/hashTree/constants.d.ts +0 -8
  141. package/dist/types/hashTree/hashTree.d.ts +0 -128
  142. package/dist/types/hashTree/hashTreeParser.d.ts +0 -152
  143. package/src/hashTree/constants.ts +0 -12
  144. package/src/hashTree/hashTree.ts +0 -460
  145. package/src/hashTree/hashTreeParser.ts +0 -556
  146. package/test/unit/spec/hashTree/hashTree.ts +0 -394
  147. package/test/unit/spec/hashTree/hashTreeParser.ts +0 -156
@@ -141,12 +141,12 @@ describe('createMediaConnection', () => {
141
141
  const roapMediaConnectionConstructorStub = sinon
142
142
  .stub(InternalMediaCoreModule, 'RoapMediaConnection')
143
143
  .returns(fakeRoapMediaConnection);
144
-
144
+
145
145
  StaticConfig.set({bandwidth: {audio: 123, video: 456, startBitrate: 999}});
146
-
146
+
147
147
  const ENABLE_EXTMAP = false;
148
148
  const ENABLE_RTX = true;
149
-
149
+
150
150
  Media.createMediaConnection(false, 'sendonly-debug-id', 'meetingId', {
151
151
  mediaProperties: {
152
152
  mediaDirection: {
@@ -168,7 +168,7 @@ describe('createMediaConnection', () => {
168
168
  turnServerInfo: undefined,
169
169
  iceCandidatesTimeout: undefined,
170
170
  });
171
-
171
+
172
172
  assert.calledWith(
173
173
  roapMediaConnectionConstructorStub,
174
174
  sinon.match.any,
@@ -194,12 +194,12 @@ describe('createMediaConnection', () => {
194
194
  const roapMediaConnectionConstructorStub = sinon
195
195
  .stub(InternalMediaCoreModule, 'RoapMediaConnection')
196
196
  .returns(fakeRoapMediaConnection);
197
-
197
+
198
198
  StaticConfig.set({bandwidth: {audio: 123, video: 456, startBitrate: 999}});
199
-
199
+
200
200
  const ENABLE_EXTMAP = true;
201
201
  const ENABLE_RTX = false;
202
-
202
+
203
203
  Media.createMediaConnection(false, 'recvonly-debug-id', 'meetingId', {
204
204
  mediaProperties: {
205
205
  mediaDirection: {
@@ -221,7 +221,7 @@ describe('createMediaConnection', () => {
221
221
  turnServerInfo: undefined,
222
222
  iceCandidatesTimeout: undefined,
223
223
  });
224
-
224
+
225
225
  assert.calledWith(
226
226
  roapMediaConnectionConstructorStub,
227
227
  sinon.match.any,
@@ -242,7 +242,6 @@ describe('createMediaConnection', () => {
242
242
  'recvonly-debug-id'
243
243
  );
244
244
  });
245
-
246
245
 
247
246
  it('creates a MultistreamRoapMediaConnection when multistream is enabled', () => {
248
247
  const multistreamRoapMediaConnectionConstructorStub = sinon
@@ -511,6 +510,138 @@ describe('createMediaConnection', () => {
511
510
  );
512
511
  });
513
512
 
513
+ const testEnableInboundAudioLevelMonitoring = (
514
+ testName: string,
515
+ browserStubs: {isChrome?: boolean; isEdge?: boolean; isFirefox?: boolean},
516
+ isMultistream: boolean,
517
+ expectedConfig: object,
518
+ additionalOptions = {}
519
+ ) => {
520
+ it(testName, () => {
521
+ const connectionConstructorStub = isMultistream
522
+ ? sinon.stub(InternalMediaCoreModule, 'MultistreamRoapMediaConnection')
523
+ : sinon.stub(InternalMediaCoreModule, 'RoapMediaConnection');
524
+
525
+ connectionConstructorStub.returns(fakeRoapMediaConnection);
526
+
527
+ // Set up browser stubs
528
+ sinon.stub(BrowserInfo, 'isChrome').returns(browserStubs.isChrome || false);
529
+ sinon.stub(BrowserInfo, 'isEdge').returns(browserStubs.isEdge || false);
530
+ sinon.stub(BrowserInfo, 'isFirefox').returns(browserStubs.isFirefox || false);
531
+
532
+ const baseOptions = {
533
+ mediaProperties: {
534
+ mediaDirection: {
535
+ sendAudio: true,
536
+ sendVideo: true,
537
+ sendShare: false,
538
+ receiveAudio: true,
539
+ receiveVideo: true,
540
+ receiveShare: true,
541
+ },
542
+ ...(isMultistream
543
+ ? {}
544
+ : {
545
+ audioStream: fakeAudioStream,
546
+ videoStream: fakeVideoStream,
547
+ shareVideoTrack: null,
548
+ shareAudioTrack: null,
549
+ }),
550
+ },
551
+ ...(isMultistream
552
+ ? {}
553
+ : {
554
+ remoteQualityLevel: 'HIGH',
555
+ enableRtx: true,
556
+ enableExtmap: true,
557
+ }),
558
+ ...additionalOptions,
559
+ };
560
+
561
+ if (!isMultistream) {
562
+ StaticConfig.set({bandwidth: {audio: 123, video: 456, startBitrate: 999}});
563
+ }
564
+
565
+ Media.createMediaConnection(isMultistream, 'debug string', 'meeting id', baseOptions);
566
+
567
+ if (isMultistream) {
568
+ assert.calledOnceWithExactly(
569
+ connectionConstructorStub,
570
+ expectedConfig,
571
+ 'meeting id',
572
+ sinon.match.func,
573
+ sinon.match.func,
574
+ sinon.match.func
575
+ );
576
+ } else {
577
+ assert.calledOnceWithExactly(
578
+ connectionConstructorStub,
579
+ expectedConfig,
580
+ sinon.match.object,
581
+ 'debug string'
582
+ );
583
+ }
584
+ });
585
+ };
586
+
587
+ testEnableInboundAudioLevelMonitoring(
588
+ 'enables enableInboundAudioLevelMonitoring for multistream when browser is Chrome',
589
+ {isChrome: true},
590
+ true,
591
+ {
592
+ iceServers: [],
593
+ disableAudioTwcc: true,
594
+ enableInboundAudioLevelMonitoring: true,
595
+ }
596
+ );
597
+
598
+ testEnableInboundAudioLevelMonitoring(
599
+ 'enables enableInboundAudioLevelMonitoring for multistream when browser is Edge',
600
+ {isEdge: true},
601
+ true,
602
+ {
603
+ iceServers: [],
604
+ disableAudioTwcc: true,
605
+ enableInboundAudioLevelMonitoring: true,
606
+ }
607
+ );
608
+
609
+ testEnableInboundAudioLevelMonitoring(
610
+ 'does not enable enableInboundAudioLevelMonitoring for multistream when browser is Firefox',
611
+ {isFirefox: true},
612
+ true,
613
+ {
614
+ iceServers: [],
615
+ disableAudioTwcc: true,
616
+ doFullIce: true,
617
+ stopIceGatheringAfterFirstRelayCandidate: undefined,
618
+ }
619
+ );
620
+
621
+ testEnableInboundAudioLevelMonitoring(
622
+ 'does not enable enableInboundAudioLevelMonitoring for non-multistream connections even when browser is Chrome',
623
+ {isChrome: true},
624
+ false,
625
+ {
626
+ iceServers: [],
627
+ iceCandidatesTimeout: undefined,
628
+ skipInactiveTransceivers: false,
629
+ requireH264: true,
630
+ sdpMunging: {
631
+ convertPort9to0: false,
632
+ addContentSlides: true,
633
+ bandwidthLimits: {
634
+ audio: 123,
635
+ video: 456,
636
+ },
637
+ startBitrate: 999,
638
+ periodicKeyframes: 20,
639
+ disableExtmap: false,
640
+ disableRtx: false,
641
+ },
642
+ }
643
+ );
644
+
514
645
  [
515
646
  {testCase: 'turnServerInfo is undefined', turnServerInfo: undefined},
516
647
  {
@@ -6,6 +6,8 @@ import * as tsSdpModule from '@webex/ts-sdp';
6
6
  import MediaProperties from '@webex/plugin-meetings/src/media/properties';
7
7
  import {Defer} from '@webex/common';
8
8
  import MediaConnectionAwaiter from '../../../../src/media/MediaConnectionAwaiter';
9
+ import Metrics from '../../../../src/metrics';
10
+ import BEHAVIORAL_METRICS from '../../../../src/metrics/constants';
9
11
 
10
12
  describe('MediaProperties', () => {
11
13
  let mediaProperties;
@@ -389,4 +391,139 @@ describe('MediaProperties', () => {
389
391
  });
390
392
  });
391
393
  });
394
+
395
+ // issue types and subtypes used in these tests are just examples
396
+ // they don't reflect real issue types/subtypes used in production
397
+ describe('sendMediaIssueMetric', () => {
398
+ let sendBehavioralMetricStub;
399
+ let clock;
400
+
401
+ beforeEach(() => {
402
+ clock = sinon.useFakeTimers();
403
+ sendBehavioralMetricStub = sinon.stub(Metrics, 'sendBehavioralMetric');
404
+ });
405
+
406
+ afterEach(() => {
407
+ clock.restore();
408
+ });
409
+
410
+ it('should send a behavioral metric with correct parameters', () => {
411
+ const issueType = 'audio';
412
+ const issueSubType = 'packet-loss';
413
+ const correlationId = 'test-correlation-id-123';
414
+
415
+ mediaProperties.sendMediaIssueMetric(issueType, issueSubType, correlationId);
416
+
417
+ assert.calledOnce(sendBehavioralMetricStub);
418
+ assert.calledWith(sendBehavioralMetricStub, BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED, {
419
+ correlationId,
420
+ 'audio_packet-loss': 1,
421
+ });
422
+ });
423
+
424
+ it('should increment count while being throttled and reset it once metric goes out', () => {
425
+ const issueType = 'video';
426
+ const issueSubType = 'freeze';
427
+ const correlationId = 'test-correlation-id';
428
+
429
+ // Call multiple times with same issue type/subtype
430
+ mediaProperties.sendMediaIssueMetric(issueType, issueSubType, correlationId);
431
+ mediaProperties.sendMediaIssueMetric(issueType, issueSubType, correlationId);
432
+ mediaProperties.sendMediaIssueMetric(issueType, issueSubType, correlationId);
433
+
434
+ // First call should go through immediately, subsequent calls are throttled
435
+ assert.calledOnce(sendBehavioralMetricStub);
436
+ assert.calledWith(sendBehavioralMetricStub, BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED, {
437
+ correlationId,
438
+ video_freeze: 1, // Only the first call goes through due to throttling
439
+ });
440
+ sendBehavioralMetricStub.resetHistory();
441
+
442
+ assert.equal(mediaProperties.mediaIssueCounters['video_freeze'], 2); // counter should be reset after the first metric goes out, hence only 2 not 3 here
443
+
444
+ clock.tick(5 * 60 * 1000); // Advance time by 5 minutes to expire throttle
445
+
446
+ assert.calledOnceWithExactly(
447
+ sendBehavioralMetricStub,
448
+ BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED,
449
+ {
450
+ correlationId,
451
+ video_freeze: 2,
452
+ }
453
+ );
454
+ });
455
+
456
+ it('should track different issue types separately in counters', () => {
457
+ const correlationId = 'test-correlation-id';
458
+
459
+ // Send different issue types
460
+ mediaProperties.sendMediaIssueMetric('audio', 'packet-loss', correlationId);
461
+ mediaProperties.sendMediaIssueMetric('video', 'freeze', correlationId);
462
+ mediaProperties.sendMediaIssueMetric('audio', 'packet-loss', correlationId);
463
+ mediaProperties.sendMediaIssueMetric('audio', 'packet-loss', correlationId);
464
+ mediaProperties.sendMediaIssueMetric('audio', 'packet-loss', correlationId);
465
+ mediaProperties.sendMediaIssueMetric('video', 'freeze', correlationId);
466
+
467
+ // First call should go through immediately, subsequent calls are throttled
468
+ assert.calledOnceWithExactly(
469
+ sendBehavioralMetricStub,
470
+ BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED,
471
+ {
472
+ correlationId,
473
+ 'audio_packet-loss': 1,
474
+ }
475
+ );
476
+
477
+ // But the counters should be tracked separately
478
+ assert.equal(mediaProperties.mediaIssueCounters['audio_packet-loss'], 3);
479
+ assert.equal(mediaProperties.mediaIssueCounters['video_freeze'], 2);
480
+
481
+ sendBehavioralMetricStub.resetHistory();
482
+
483
+ clock.tick(5 * 60 * 1000); // Advance time by 5 minutes to expire throttle
484
+
485
+ assert.calledOnceWithExactly(
486
+ sendBehavioralMetricStub,
487
+ BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED,
488
+ {
489
+ correlationId,
490
+ video_freeze: 2,
491
+ 'audio_packet-loss': 3,
492
+ }
493
+ );
494
+ });
495
+
496
+ it('should flush throttled metrics when unsetPeerConnection is called', () => {
497
+ const issueType = 'share';
498
+ const issueSubType = 'connection-lost';
499
+ const correlationId = 'test-correlation-id';
500
+
501
+ // Send metrics multiple times
502
+ mediaProperties.sendMediaIssueMetric(issueType, issueSubType, correlationId);
503
+ mediaProperties.sendMediaIssueMetric(issueType, issueSubType, correlationId);
504
+
505
+ // First call should go through immediately
506
+ assert.calledOnceWithExactly(
507
+ sendBehavioralMetricStub,
508
+ BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED,
509
+ {
510
+ correlationId,
511
+ 'share_connection-lost': 1,
512
+ }
513
+ );
514
+ sendBehavioralMetricStub.resetHistory();
515
+
516
+ // Call unsetPeerConnection which should flush throttled metrics
517
+ mediaProperties.unsetPeerConnection();
518
+
519
+ assert.calledOnceWithExactly(
520
+ sendBehavioralMetricStub,
521
+ BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED,
522
+ {
523
+ correlationId,
524
+ 'share_connection-lost': 1,
525
+ }
526
+ );
527
+ });
528
+ });
392
529
  });
@@ -32,9 +32,15 @@ describe('plugin-meetings', () => {
32
32
  isClosedCaptionActive: null,
33
33
  canStartManualCaption: null,
34
34
  canStopManualCaption: null,
35
+ isLocalRecordingStarted: null,
36
+ isLocalRecordingStopped: null,
37
+ isLocalRecordingPaused: null,
38
+ isLocalStreamingStarted:null,
39
+ isLocalStreamingStopped:null,
35
40
  isManualCaptionActive: null,
36
41
  isPremiseRecordingEnabled: null,
37
42
  isSaveTranscriptsEnabled: null,
43
+ isSpokenLanguageAutoDetectionEnabled: null,
38
44
  isWebexAssistantActive: null,
39
45
  canViewCaptionPanel: null,
40
46
  isRealTimeTranslationEnabled: null,
@@ -82,6 +88,7 @@ describe('plugin-meetings', () => {
82
88
  canDoVideo: null,
83
89
  canAnnotate: null,
84
90
  canUseVoip: null,
91
+ showAutoEndMeetingWarning: null,
85
92
  supportHQV: null,
86
93
  supportHDV: null,
87
94
  canShareWhiteBoard: null,
@@ -129,6 +136,11 @@ describe('plugin-meetings', () => {
129
136
  'canPauseRecording',
130
137
  'canResumeRecording',
131
138
  'canStopRecording',
139
+ 'isLocalRecordingStarted',
140
+ 'isLocalRecordingStopped',
141
+ 'isLocalRecordingPaused',
142
+ 'isLocalStreamingStarted',
143
+ 'isLocalStreamingStopped',
132
144
  'canSetMuteOnEntry',
133
145
  'canUnsetMuteOnEntry',
134
146
  'canSetDisallowUnmute',
@@ -145,6 +157,7 @@ describe('plugin-meetings', () => {
145
157
  'isManualCaptionActive',
146
158
  'isPremiseRecordingEnabled',
147
159
  'isSaveTranscriptsEnabled',
160
+ 'isSpokenLanguageAutoDetectionEnabled',
148
161
  'isWebexAssistantActive',
149
162
  'canViewCaptionPanel',
150
163
  'isRealTimeTranslationEnabled',
@@ -189,6 +202,7 @@ describe('plugin-meetings', () => {
189
202
  'canRealtimeCloseCaption',
190
203
  'canRealtimeCloseCaptionManual',
191
204
  'canChat',
205
+ 'showAutoEndMeetingWarning',
192
206
  'canDoVideo',
193
207
  'canAnnotate',
194
208
  'canUseVoip',