@webex/contact-center 3.12.0-llmrefactor.1 → 3.12.0-llmrefactor.11

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 (198) hide show
  1. package/.sdd/manifest.json +7 -5
  2. package/ai-docs/ARCHITECTURE.md +1 -1
  3. package/ai-docs/CONTRACTS.md +8 -3
  4. package/ai-docs/SECURITY.md +1 -1
  5. package/ai-docs/contact-center-spec.md +22 -4
  6. package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
  7. package/dist/cc.js +544 -12
  8. package/dist/cc.js.map +1 -1
  9. package/dist/config.js +7 -0
  10. package/dist/config.js.map +1 -1
  11. package/dist/constants.js +10 -2
  12. package/dist/constants.js.map +1 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/metrics/MetricsManager.js +16 -0
  15. package/dist/metrics/MetricsManager.js.map +1 -1
  16. package/dist/metrics/behavioral-events.js +104 -0
  17. package/dist/metrics/behavioral-events.js.map +1 -1
  18. package/dist/metrics/constants.js +18 -0
  19. package/dist/metrics/constants.js.map +1 -1
  20. package/dist/services/AddressBook.js +18 -15
  21. package/dist/services/AddressBook.js.map +1 -1
  22. package/dist/services/AnswerCallOnWebexService.js +202 -0
  23. package/dist/services/AnswerCallOnWebexService.js.map +1 -0
  24. package/dist/services/EntryPoint.js +46 -68
  25. package/dist/services/EntryPoint.js.map +1 -1
  26. package/dist/services/Queue.js +27 -22
  27. package/dist/services/Queue.js.map +1 -1
  28. package/dist/services/WebexCrossClientService.js +222 -0
  29. package/dist/services/WebexCrossClientService.js.map +1 -0
  30. package/dist/services/WxAppTelephonyMercurySync.js +108 -0
  31. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
  32. package/dist/services/config/Util.js +3 -0
  33. package/dist/services/config/Util.js.map +1 -1
  34. package/dist/services/config/constants.js +10 -6
  35. package/dist/services/config/constants.js.map +1 -1
  36. package/dist/services/config/types.js +4 -0
  37. package/dist/services/config/types.js.map +1 -1
  38. package/dist/services/core/Err.js.map +1 -1
  39. package/dist/services/core/WebexRequest.js +6 -2
  40. package/dist/services/core/WebexRequest.js.map +1 -1
  41. package/dist/services/core/aqm-reqs.js +28 -14
  42. package/dist/services/core/aqm-reqs.js.map +1 -1
  43. package/dist/services/core/types.js.map +1 -1
  44. package/dist/services/task/Task.js +73 -7
  45. package/dist/services/task/Task.js.map +1 -1
  46. package/dist/services/task/TaskFactory.js +8 -4
  47. package/dist/services/task/TaskFactory.js.map +1 -1
  48. package/dist/services/task/TaskManager.js +490 -21
  49. package/dist/services/task/TaskManager.js.map +1 -1
  50. package/dist/services/task/WebexCallingUtils.js +70 -0
  51. package/dist/services/task/WebexCallingUtils.js.map +1 -0
  52. package/dist/services/task/constants.js +4 -1
  53. package/dist/services/task/constants.js.map +1 -1
  54. package/dist/services/task/contact.js +29 -0
  55. package/dist/services/task/contact.js.map +1 -1
  56. package/dist/services/task/digital/Digital.js +3 -2
  57. package/dist/services/task/digital/Digital.js.map +1 -1
  58. package/dist/services/task/state-machine/TaskStateMachine.js +162 -53
  59. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -1
  60. package/dist/services/task/state-machine/actions.js +6 -1
  61. package/dist/services/task/state-machine/actions.js.map +1 -1
  62. package/dist/services/task/state-machine/guards.js +7 -10
  63. package/dist/services/task/state-machine/guards.js.map +1 -1
  64. package/dist/services/task/state-machine/types.js.map +1 -1
  65. package/dist/services/task/state-machine/uiControlsComputer.js +118 -18
  66. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -1
  67. package/dist/services/task/types.js +16 -1
  68. package/dist/services/task/types.js.map +1 -1
  69. package/dist/services/task/voice/Voice.js +456 -15
  70. package/dist/services/task/voice/Voice.js.map +1 -1
  71. package/dist/services/task/voice/WebRTC.js +4 -1
  72. package/dist/services/task/voice/WebRTC.js.map +1 -1
  73. package/dist/services/task/voice/wxAppVoiceMethods.js +354 -0
  74. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
  75. package/dist/services/wxAppDiagnosticLogging.js +122 -0
  76. package/dist/services/wxAppDiagnosticLogging.js.map +1 -0
  77. package/dist/services/wxAppTelephonyUtils.js +19 -0
  78. package/dist/services/wxAppTelephonyUtils.js.map +1 -0
  79. package/dist/types/cc.d.ts +78 -4
  80. package/dist/types/config.d.ts +7 -0
  81. package/dist/types/constants.d.ts +8 -0
  82. package/dist/types/index.d.ts +3 -1
  83. package/dist/types/metrics/MetricsManager.d.ts +6 -0
  84. package/dist/types/metrics/constants.d.ts +17 -0
  85. package/dist/types/services/AddressBook.d.ts +2 -1
  86. package/dist/types/services/AnswerCallOnWebexService.d.ts +38 -0
  87. package/dist/types/services/EntryPoint.d.ts +7 -5
  88. package/dist/types/services/Queue.d.ts +5 -3
  89. package/dist/types/services/WebexCrossClientService.d.ts +32 -0
  90. package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
  91. package/dist/types/services/config/constants.d.ts +8 -5
  92. package/dist/types/services/config/types.d.ts +17 -4
  93. package/dist/types/services/core/Err.d.ts +2 -0
  94. package/dist/types/services/core/WebexRequest.d.ts +1 -0
  95. package/dist/types/services/core/types.d.ts +2 -0
  96. package/dist/types/services/task/Task.d.ts +20 -2
  97. package/dist/types/services/task/TaskFactory.d.ts +2 -1
  98. package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
  99. package/dist/types/services/task/constants.d.ts +3 -0
  100. package/dist/types/services/task/contact.d.ts +4 -0
  101. package/dist/types/services/task/digital/Digital.d.ts +2 -2
  102. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +304 -56
  103. package/dist/types/services/task/state-machine/guards.d.ts +6 -5
  104. package/dist/types/services/task/state-machine/types.d.ts +9 -1
  105. package/dist/types/services/task/types.d.ts +81 -4
  106. package/dist/types/services/task/voice/Voice.d.ts +52 -9
  107. package/dist/types/services/task/voice/WebRTC.d.ts +2 -2
  108. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +55 -0
  109. package/dist/types/services/wxAppDiagnosticLogging.d.ts +51 -0
  110. package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
  111. package/dist/types/types.d.ts +14 -8
  112. package/dist/types/utils/PageCache.d.ts +20 -3
  113. package/dist/types.js +7 -2
  114. package/dist/types.js.map +1 -1
  115. package/dist/utils/PageCache.js +19 -5
  116. package/dist/utils/PageCache.js.map +1 -1
  117. package/dist/webex.js +1 -1
  118. package/package.json +8 -8
  119. package/src/cc.ts +657 -12
  120. package/src/config.ts +7 -0
  121. package/src/constants.ts +8 -0
  122. package/src/index.ts +2 -0
  123. package/src/metrics/MetricsManager.ts +16 -0
  124. package/src/metrics/ai-docs/metrics-spec.md +78 -10
  125. package/src/metrics/behavioral-events.ts +106 -0
  126. package/src/metrics/constants.ts +20 -0
  127. package/src/services/AddressBook.ts +17 -6
  128. package/src/services/AnswerCallOnWebexService.ts +239 -0
  129. package/src/services/EntryPoint.ts +59 -60
  130. package/src/services/Queue.ts +29 -12
  131. package/src/services/WebexCrossClientService.ts +293 -0
  132. package/src/services/WxAppTelephonyMercurySync.ts +142 -0
  133. package/src/services/agent/ai-docs/agent-spec.md +1 -0
  134. package/src/services/ai-docs/AGENTS.md +10 -10
  135. package/src/services/ai-docs/services-spec.md +6 -1
  136. package/src/services/config/Util.ts +3 -0
  137. package/src/services/config/ai-docs/AGENTS.md +1 -1
  138. package/src/services/config/ai-docs/ARCHITECTURE.md +2 -2
  139. package/src/services/config/ai-docs/config-spec.md +6 -0
  140. package/src/services/config/constants.ts +10 -6
  141. package/src/services/config/types.ts +16 -4
  142. package/src/services/core/Err.ts +1 -0
  143. package/src/services/core/WebexRequest.ts +3 -1
  144. package/src/services/core/ai-docs/core-spec.md +5 -1
  145. package/src/services/core/aqm-reqs.ts +30 -15
  146. package/src/services/core/types.ts +2 -0
  147. package/src/services/task/Task.ts +79 -8
  148. package/src/services/task/TaskFactory.ts +8 -3
  149. package/src/services/task/TaskManager.ts +716 -17
  150. package/src/services/task/WebexCallingUtils.ts +136 -0
  151. package/src/services/task/ai-docs/ARCHITECTURE.md +1 -0
  152. package/src/services/task/ai-docs/task-spec.md +156 -3
  153. package/src/services/task/constants.ts +3 -0
  154. package/src/services/task/contact.ts +30 -0
  155. package/src/services/task/digital/Digital.ts +4 -2
  156. package/src/services/task/state-machine/TaskStateMachine.ts +235 -81
  157. package/src/services/task/state-machine/actions.ts +5 -2
  158. package/src/services/task/state-machine/ai-docs/AGENTS.md +6 -4
  159. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +35 -16
  160. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +103 -33
  161. package/src/services/task/state-machine/guards.ts +7 -10
  162. package/src/services/task/state-machine/types.ts +16 -1
  163. package/src/services/task/state-machine/uiControlsComputer.ts +206 -32
  164. package/src/services/task/types.ts +114 -4
  165. package/src/services/task/voice/Voice.ts +595 -14
  166. package/src/services/task/voice/WebRTC.ts +5 -1
  167. package/src/services/task/voice/wxAppVoiceMethods.ts +516 -0
  168. package/src/services/wxAppDiagnosticLogging.ts +174 -0
  169. package/src/services/wxAppTelephonyUtils.ts +14 -0
  170. package/src/types.ts +33 -9
  171. package/src/utils/AGENTS.md +21 -10
  172. package/src/utils/PageCache.ts +38 -5
  173. package/src/utils/ai-docs/utils-spec.md +21 -11
  174. package/test/unit/spec/cc.ts +1522 -19
  175. package/test/unit/spec/metrics/MetricsManager.ts +25 -0
  176. package/test/unit/spec/metrics/behavioral-events.ts +60 -0
  177. package/test/unit/spec/services/AddressBook.ts +37 -6
  178. package/test/unit/spec/services/AnswerCallOnWebexService.ts +264 -0
  179. package/test/unit/spec/services/EntryPoint.ts +87 -40
  180. package/test/unit/spec/services/Queue.ts +123 -12
  181. package/test/unit/spec/services/WebexCrossClientService.ts +467 -0
  182. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +136 -0
  183. package/test/unit/spec/services/config/Util.ts +85 -0
  184. package/test/unit/spec/services/core/WebexRequest.ts +3 -1
  185. package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
  186. package/test/unit/spec/services/task/Task.ts +274 -6
  187. package/test/unit/spec/services/task/TaskFactory.ts +39 -2
  188. package/test/unit/spec/services/task/TaskManager.ts +1717 -9
  189. package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
  190. package/test/unit/spec/services/task/contact.ts +33 -0
  191. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +1485 -109
  192. package/test/unit/spec/services/task/state-machine/guards.ts +210 -8
  193. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +445 -7
  194. package/test/unit/spec/services/task/voice/Voice.ts +1412 -0
  195. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +603 -0
  196. package/test/unit/spec/services/wxAppDiagnosticLogging.ts +143 -0
  197. package/umd/contact-center.min.js +2 -2
  198. package/umd/contact-center.min.js.map +1 -1
package/dist/cc.js CHANGED
@@ -19,6 +19,10 @@ var _Utils = require("./services/core/Utils");
19
19
  var _types3 = require("./services/config/types");
20
20
  var _TaskManager = _interopRequireDefault(require("./services/task/TaskManager"));
21
21
  var _WebCallingService = _interopRequireDefault(require("./services/WebCallingService"));
22
+ var _AnswerCallOnWebexService = _interopRequireDefault(require("./services/AnswerCallOnWebexService"));
23
+ var _WebexCrossClientService = _interopRequireDefault(require("./services/WebexCrossClientService"));
24
+ var _WxAppTelephonyMercurySync = _interopRequireDefault(require("./services/WxAppTelephonyMercurySync"));
25
+ var _wxAppDiagnosticLogging = require("./services/wxAppDiagnosticLogging");
22
26
  var _types4 = require("./services/task/types");
23
27
  var _MetricsManager = _interopRequireDefault(require("./metrics/MetricsManager"));
24
28
  var _constants4 = require("./metrics/constants");
@@ -185,6 +189,29 @@ class ContactCenter extends _webexCore.WebexPlugin {
185
189
  * @private
186
190
  */
187
191
 
192
+ /**
193
+ * REST telephony for wxApp thick-client answer (WXCC-6026)
194
+ * @private
195
+ */
196
+
197
+ /**
198
+ * usersub cross-client state for Webex App toast suppression
199
+ * @private
200
+ */
201
+
202
+ /**
203
+ * Mercury telephony mute sync for wxApp thick-client answer
204
+ * @private
205
+ */
206
+
207
+ /** True when wxApp mute sync opened Mercury (Extension/DN-only profiles). */
208
+ wxAppMercuryConnectedByCc = false;
209
+
210
+ /** True when wxApp mute sync registered the Webex device. */
211
+ wxAppDeviceRegisteredByCc = false;
212
+ static WXAPP_FALSE_PUBLISH_RETRY_DELAY_MS = 30_000;
213
+ static WXAPP_FALSE_PUBLISH_MAX_RETRIES = 3;
214
+
188
215
  /**
189
216
  * Core service managers for Contact Center operations
190
217
  * Includes agent, connection, and configuration services
@@ -345,11 +372,15 @@ class ContactCenter extends _webexCore.WebexPlugin {
345
372
  connectionConfig: this.getConnectionConfig()
346
373
  });
347
374
  this.webCallingService = new _WebCallingService.default(this.$webex);
375
+ this.answerCallOnWebexService = new _AnswerCallOnWebexService.default(this.$webex);
376
+ this.webexCrossClientService = new _WebexCrossClientService.default(this.$webex);
377
+ this.wxAppTelephonyMercurySync = new _WxAppTelephonyMercurySync.default(this.$webex);
348
378
  this.apiAIAssistant = new _ApiAiAssistant.ApiAIAssistant(this.$webex);
349
379
  this.metricsManager = _MetricsManager.default.getInstance({
350
380
  webex: this.$webex
351
381
  });
352
382
  this.taskManager = _TaskManager.default.getTaskManager(this.apiAIAssistant, this.services.contact, this.webCallingService, this.services.webSocketManager, this.services.rtdWebSocketManager);
383
+ this.taskManager.setAnswerCallOnWebexService(this.answerCallOnWebexService);
353
384
  this.incomingTaskListener();
354
385
 
355
386
  // Initialize API instances
@@ -541,6 +572,11 @@ class ContactCenter extends _webexCore.WebexPlugin {
541
572
  this.services.webSocketManager.off('message', this.handleWebsocketMessage);
542
573
  this.services.rtdWebSocketManager.off('message', this.handleRTDWebsocketMessage);
543
574
  this.services.connectionService.off('connectionLost', this.handleConnectionLost);
575
+ const {
576
+ publishError: wxAppPublishError
577
+ } = await this.teardownWxAppLocalState({
578
+ clearInitFlag: true
579
+ });
544
580
  if (this.agentConfig.webRtcEnabled && this.agentConfig.loginVoiceOptions.includes(_types.LoginOption.BROWSER)) {
545
581
  if (this.$webex.internal.mercury.connected) {
546
582
  this.$webex.internal.mercury.off('online');
@@ -566,6 +602,9 @@ class ContactCenter extends _webexCore.WebexPlugin {
566
602
 
567
603
  // Clear any cached agent configuration
568
604
  this.agentConfig = null;
605
+ if (wxAppPublishError) {
606
+ throw wxAppPublishError;
607
+ }
569
608
  _loggerProxy.default.log('Deregistered successfully', {
570
609
  module: _constants.CC_FILE,
571
610
  method: _constants.METHODS.DEREGISTER
@@ -619,6 +658,12 @@ class ContactCenter extends _webexCore.WebexPlugin {
619
658
  * ```
620
659
  */
621
660
  async getBuddyAgents(data) {
661
+ const {
662
+ action,
663
+ state,
664
+ mediaType = 'telephony'
665
+ } = data;
666
+ const buddyAgentState = state ?? (action === 'Transfer' ? _constants2.AGENT_STATE_AVAILABLE : undefined);
622
667
  _loggerProxy.default.info('Fetching buddy agents', {
623
668
  module: _constants.CC_FILE,
624
669
  method: _constants.METHODS.GET_BUDDY_AGENTS
@@ -628,13 +673,16 @@ class ContactCenter extends _webexCore.WebexPlugin {
628
673
  const resp = await this.services.agent.buddyAgents({
629
674
  data: {
630
675
  agentProfileId: this.agentConfig.agentProfileID,
631
- ...data
676
+ mediaType,
677
+ ...(buddyAgentState ? {
678
+ state: buddyAgentState
679
+ } : {})
632
680
  }
633
681
  });
634
682
  this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.FETCH_BUDDY_AGENTS_SUCCESS, {
635
683
  ..._MetricsManager.default.getCommonTrackingFieldForAQMResponse(resp),
636
- mediaType: data.mediaType,
637
- buddyAgentState: data.state,
684
+ mediaType,
685
+ buddyAgentState,
638
686
  buddyAgentCount: resp.data.agentList.length
639
687
  }, ['operational']);
640
688
  _loggerProxy.default.log(`Successfully retrieved ${resp.data.agentList.length} buddy agents`, {
@@ -647,8 +695,8 @@ class ContactCenter extends _webexCore.WebexPlugin {
647
695
  const failureResp = error.details;
648
696
  this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.FETCH_BUDDY_AGENTS_FAILED, {
649
697
  ..._MetricsManager.default.getCommonTrackingFieldForAQMResponseFailed(failureResp),
650
- mediaType: data.mediaType,
651
- buddyAgentState: data.state
698
+ mediaType,
699
+ buddyAgentState
652
700
  }, ['operational']);
653
701
  const {
654
702
  error: detailedError
@@ -685,7 +733,14 @@ class ContactCenter extends _webexCore.WebexPlugin {
685
733
  isEndConsultEnabled: this.agentConfig.isEndConsultEnabled,
686
734
  webRtcEnabled: this.agentConfig.webRtcEnabled,
687
735
  autoWrapup: this.agentConfig.wrapUpData?.wrapUpProps?.autoWrapup ?? false,
688
- aiFeature: this.agentConfig.aiFeature
736
+ aiFeature: this.agentConfig.aiFeature,
737
+ consultTransfer: {
738
+ allowConsultToQueue: this.agentConfig.allowConsultToQueue,
739
+ accessQueue: this.agentConfig.accessQueue,
740
+ accessEntryPoint: this.agentConfig.accessEntryPoint,
741
+ accessBuddyTeam: this.agentConfig.accessBuddyTeam
742
+ },
743
+ enableWxBetterTogether: this.isWxBetterTogetherEnabled()
689
744
  };
690
745
  this.taskManager.setConfigFlags(configFlags);
691
746
  // TODO: Make profile a singleton to make it available throughout app/sdk so we dont need to inject info everywhere
@@ -807,13 +862,15 @@ class ContactCenter extends _webexCore.WebexPlugin {
807
862
  throw error;
808
863
  }
809
864
  }
865
+ const deviceId = this.getDeviceId(data.loginOption, data.dialNumber);
810
866
  const loginResponse = await this.services.agent.stationLogin({
811
867
  data: {
812
- dialNumber: data.loginOption === _types.LoginOption.BROWSER ? this.agentConfig.agentId : data.dialNumber,
868
+ // BROWSER DN must be webrtc-{agentId} so VPOP/RTMS do not treat a bare UUID as PSTN.
869
+ dialNumber: data.loginOption === _types.LoginOption.BROWSER ? deviceId : data.dialNumber,
813
870
  teamId: data.teamId,
814
871
  deviceType: data.loginOption,
815
872
  isExtension: data.loginOption === _types.LoginOption.EXTENSION,
816
- deviceId: this.getDeviceId(data.loginOption, data.dialNumber),
873
+ deviceId,
817
874
  roles: [_constants3.AGENT],
818
875
  teamName: _constants.EMPTY_STRING,
819
876
  siteId: _constants.EMPTY_STRING,
@@ -846,6 +903,13 @@ class ContactCenter extends _webexCore.WebexPlugin {
846
903
  notifsTrackingId: resp.trackingId
847
904
  };
848
905
  this.webCallingService.setLoginOption(data.loginOption);
906
+ if (this.agentConfig) {
907
+ this.agentConfig.deviceType = data.loginOption;
908
+ if (data.loginOption === _types.LoginOption.AGENT_DN || data.loginOption === _types.LoginOption.EXTENSION) {
909
+ this.agentConfig.defaultDn = data.dialNumber;
910
+ this.agentConfig.dn = data.dialNumber;
911
+ }
912
+ }
849
913
  this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.STATION_LOGIN_SUCCESS, {
850
914
  ..._MetricsManager.default.getCommonTrackingFieldForAQMResponse(resp),
851
915
  loginType: data.loginOption,
@@ -858,6 +922,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
858
922
  method: _constants.METHODS.STATION_LOGIN,
859
923
  trackingId: resp.trackingId
860
924
  });
925
+ await this.ensureWxAppPostStationLogin();
861
926
  return response;
862
927
  } catch (error) {
863
928
  const failure = error.details;
@@ -912,6 +977,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
912
977
  if (this.webCallingService) {
913
978
  this.webCallingService.deregisterWebCallingLine();
914
979
  }
980
+ await this.teardownWxAppLocalState();
915
981
  _loggerProxy.default.log(`Agent station logout completed successfully`, {
916
982
  module: _constants.CC_FILE,
917
983
  method: _constants.METHODS.STATION_LOGOUT,
@@ -1170,6 +1236,471 @@ class ContactCenter extends _webexCore.WebexPlugin {
1170
1236
  }
1171
1237
  }
1172
1238
 
1239
+ /**
1240
+ * Whether wxApp thick-client answer is enabled for this SDK instance.
1241
+ * @public
1242
+ */
1243
+ isWxBetterTogetherEnabled() {
1244
+ return this.$config?.enableWxBetterTogether === true;
1245
+ }
1246
+
1247
+ /**
1248
+ * Current station login option (Extension, Dial Number, or Browser/Desktop).
1249
+ * Prefer webCallingService — updated on every stationLogin before wxApp hooks run.
1250
+ * @private
1251
+ */
1252
+ getCurrentStationLoginOption() {
1253
+ return this.webCallingService?.loginOption ?? this.agentConfig?.deviceType;
1254
+ }
1255
+
1256
+ /**
1257
+ * wxApp thick-client answer is supported for Extension and Dial Number station login only —
1258
+ * not Browser/Desktop (WebRTC) login.
1259
+ * @private
1260
+ */
1261
+ assertWxAppStationLoginSupportedForEnable() {
1262
+ const loginOption = this.getCurrentStationLoginOption();
1263
+ if (loginOption !== _types.LoginOption.EXTENSION && loginOption !== _types.LoginOption.AGENT_DN) {
1264
+ throw new Error('setManageWebexCallingInWxcc requires EXTENSION or AGENT_DN station login. Complete station login before enabling.');
1265
+ }
1266
+ }
1267
+
1268
+ /**
1269
+ * Clears runtime wxApp config after logout/deregister so stale flags do not apply on relogin.
1270
+ * @private
1271
+ */
1272
+ resetEnableWxBetterTogetherConfig() {
1273
+ if (this.$config) {
1274
+ this.$config.enableWxBetterTogether = false;
1275
+ }
1276
+ this.taskManager.applyEnableWxBetterTogether(false);
1277
+ }
1278
+
1279
+ /**
1280
+ * Runtime enable/disable for wxApp Better Together (toast suppression + Mercury mute sync).
1281
+ *
1282
+ * **Phase 1 (WXCC-6026 / MMT): NOT part of the public host contract.**
1283
+ * Hosts must set `webexConfig.cc.enableWxBetterTogether` before `webex.init()` / `cc.register()`.
1284
+ * To change the flag after the SDK is initialized, re-init the SDK with the updated config.
1285
+ *
1286
+ * **Supported public read API:** {@link isWxBetterTogetherEnabled}.
1287
+ * **Supported telephony API:** unified `task.accept()`, `task.decline()`, `task.toggleMute()`,
1288
+ * `task.transmitDtmf()` — SDK routes wxApp calls internally when the init flag is active.
1289
+ *
1290
+ * **Production lifecycle does not call this method.** Station login, silent relogin, logout,
1291
+ * and deregister use {@link ensureWxAppPostStationLogin} and {@link teardownWxAppLocalState}
1292
+ * (usersub publish + Mercury subscribe/unsubscribe based on the init flag).
1293
+ *
1294
+ * This setter remains as a **private implementation** for Phase 2 runtime toggle and unit tests.
1295
+ * It updates `$config.enableWxBetterTogether`, TaskManager flags, cross-client usersub
1296
+ * (`answer-calls-on-wxcc`), and Mercury mute sync; rolls back config on publish/connect failure.
1297
+ *
1298
+ * @param enabled - `true` to enable wxApp answer + usersub suppression; `false` to disable and tear down.
1299
+ * @throws When enabling without login, on unsupported BROWSER station login, or when usersub/Mercury init fails.
1300
+ * @internal
1301
+ * @see enableWxBetterTogether (CCPluginConfig init flag)
1302
+ * @see ensureWxAppPostStationLogin
1303
+ * @see teardownWxAppLocalState
1304
+ */
1305
+ async setManageWebexCallingInWxcc(enabled) {
1306
+ if (enabled && !this.$webex.internal.device?.userId) {
1307
+ throw new Error('Cannot publish answer-calls-on-wxcc: user is not logged in');
1308
+ }
1309
+ if (enabled) {
1310
+ this.assertWxAppStationLoginSupportedForEnable();
1311
+ }
1312
+ const previousEnabled = this.isWxBetterTogetherEnabled();
1313
+ if (this.$config) {
1314
+ this.$config.enableWxBetterTogether = enabled;
1315
+ }
1316
+ this.taskManager.applyEnableWxBetterTogether(enabled);
1317
+ let publishedEnable = false;
1318
+ try {
1319
+ if (enabled) {
1320
+ await this.ensureWxAppMercuryAndSubscribe();
1321
+ await this.publishAnswerOnWebexCrossClientState(true);
1322
+ publishedEnable = true;
1323
+ this.taskManager.syncWxAppMuteFromCallDetailsForAllTasks();
1324
+ } else {
1325
+ await this.publishAnswerOnWebexCrossClientState(false);
1326
+ this.wxAppTelephonyMercurySync.unsubscribe();
1327
+ await this.releaseWxAppMercuryResources();
1328
+ }
1329
+ } catch (error) {
1330
+ if (publishedEnable) {
1331
+ await this.revertWxAppCrossClientPublish();
1332
+ } else if (enabled) {
1333
+ this.wxAppTelephonyMercurySync.unsubscribe();
1334
+ await this.releaseWxAppMercuryResources();
1335
+ }
1336
+ if (this.$config) {
1337
+ this.$config.enableWxBetterTogether = previousEnabled;
1338
+ }
1339
+ this.taskManager.applyEnableWxBetterTogether(previousEnabled);
1340
+ throw error;
1341
+ }
1342
+ }
1343
+ getWxAppTelephonyTaskType() {
1344
+ const loginOption = this.getCurrentStationLoginOption();
1345
+ if (loginOption === _types.LoginOption.BROWSER) {
1346
+ return 'WebRTC';
1347
+ }
1348
+ if (loginOption === _types.LoginOption.EXTENSION || loginOption === _types.LoginOption.AGENT_DN) {
1349
+ return 'Voice';
1350
+ }
1351
+ return 'unknown';
1352
+ }
1353
+ async ensureWxAppPostStationLogin() {
1354
+ const loginOption = this.getCurrentStationLoginOption();
1355
+ const flagEnabled = this.isWxBetterTogetherEnabled();
1356
+ const telephonyTaskType = this.getWxAppTelephonyTaskType();
1357
+ if (loginOption === _types.LoginOption.BROWSER) {
1358
+ if (flagEnabled) {
1359
+ (0, _wxAppDiagnosticLogging.logWxAppSessionReadiness)({
1360
+ enableWxBetterTogether: true,
1361
+ loginOption,
1362
+ wxAppHooksApplied: false,
1363
+ usersubPublished: false,
1364
+ mercurySubscribed: false,
1365
+ telephonyTaskType,
1366
+ skipReason: 'unsupported_browser_login'
1367
+ });
1368
+ this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_SKIPPED, {
1369
+ loginOption,
1370
+ enableWxBetterTogether: true,
1371
+ skipReason: 'unsupported_browser_login'
1372
+ }, ['operational', 'behavioral']);
1373
+ }
1374
+ return;
1375
+ }
1376
+ let publishedEnable = false;
1377
+ let wxAppInitStage = 'mercury';
1378
+ try {
1379
+ if (flagEnabled) {
1380
+ this.metricsManager.timeEvent([_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_SUCCESS, _constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_FAILED]);
1381
+ await this.ensureWxAppMercuryAndSubscribe();
1382
+ wxAppInitStage = 'publish';
1383
+ await this.publishAnswerOnWebexCrossClientState(true);
1384
+ publishedEnable = true;
1385
+ this.taskManager.syncWxAppMuteFromCallDetailsForAllTasks();
1386
+ const mercurySubscribed = this.wxAppTelephonyMercurySync.isSubscribed();
1387
+ const usersubPublished = this.webexCrossClientService.isAnswerCallsStateActive();
1388
+ (0, _wxAppDiagnosticLogging.logWxAppSessionReadiness)({
1389
+ enableWxBetterTogether: true,
1390
+ loginOption,
1391
+ wxAppHooksApplied: true,
1392
+ usersubPublished,
1393
+ mercurySubscribed,
1394
+ telephonyTaskType
1395
+ });
1396
+ const sessionInitReady = mercurySubscribed && usersubPublished;
1397
+ if (sessionInitReady) {
1398
+ this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_SUCCESS, {
1399
+ loginOption,
1400
+ enableWxBetterTogether: true
1401
+ }, ['operational', 'behavioral']);
1402
+ } else {
1403
+ this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_FAILED, {
1404
+ loginOption,
1405
+ enableWxBetterTogether: true,
1406
+ skipReason: !usersubPublished ? 'usersub_not_published' : 'mercury_not_subscribed'
1407
+ }, ['operational', 'behavioral']);
1408
+ }
1409
+ } else {
1410
+ await this.ensureWxAppDeviceRegistered();
1411
+ await this.publishAnswerOnWebexCrossClientState(false, {
1412
+ force: true
1413
+ });
1414
+ this.webexCrossClientService.teardown();
1415
+ this.wxAppTelephonyMercurySync.unsubscribe();
1416
+ await this.releaseWxAppMercuryResources();
1417
+ (0, _wxAppDiagnosticLogging.logWxAppSessionReadiness)({
1418
+ enableWxBetterTogether: false,
1419
+ loginOption,
1420
+ wxAppHooksApplied: true,
1421
+ usersubPublished: false,
1422
+ mercurySubscribed: false,
1423
+ telephonyTaskType,
1424
+ skipReason: 'flag_disabled'
1425
+ });
1426
+ this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_SKIPPED, {
1427
+ loginOption,
1428
+ enableWxBetterTogether: false,
1429
+ skipReason: 'flag_disabled'
1430
+ }, ['operational', 'behavioral']);
1431
+ }
1432
+ } catch (error) {
1433
+ _loggerProxy.default.error(`Failed to initialize wxApp post-station-login: ${error}`, {
1434
+ module: _constants.CC_FILE,
1435
+ method: _constants.METHODS.STATION_LOGIN
1436
+ });
1437
+ if (flagEnabled) {
1438
+ const sessionInitFailureReason = wxAppInitStage === 'mercury' ? 'mercury_subscribe_failed' : 'publish_failed';
1439
+ this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_FAILED, {
1440
+ loginOption,
1441
+ enableWxBetterTogether: true,
1442
+ skipReason: sessionInitFailureReason,
1443
+ error: error instanceof Error ? error.toString() : String(error)
1444
+ }, ['operational', 'behavioral']);
1445
+ (0, _wxAppDiagnosticLogging.logWxAppSessionReadiness)({
1446
+ enableWxBetterTogether: true,
1447
+ loginOption,
1448
+ wxAppHooksApplied: false,
1449
+ usersubPublished: publishedEnable && this.webexCrossClientService.isAnswerCallsStateActive(),
1450
+ mercurySubscribed: this.wxAppTelephonyMercurySync.isSubscribed(),
1451
+ telephonyTaskType,
1452
+ skipReason: sessionInitFailureReason
1453
+ });
1454
+ if (publishedEnable) {
1455
+ await this.revertWxAppCrossClientPublish();
1456
+ } else {
1457
+ this.wxAppTelephonyMercurySync.unsubscribe();
1458
+ await this.releaseWxAppMercuryResources();
1459
+ }
1460
+ this.resetEnableWxBetterTogetherConfig();
1461
+ } else {
1462
+ this.scheduleForcedFalsePublishRetry();
1463
+ }
1464
+ }
1465
+ }
1466
+ clearWxAppFalsePublishRetryTimer() {
1467
+ if (this.wxAppFalsePublishRetryTimer) {
1468
+ clearTimeout(this.wxAppFalsePublishRetryTimer);
1469
+ this.wxAppFalsePublishRetryTimer = undefined;
1470
+ }
1471
+ }
1472
+ scheduleForcedFalsePublishRetry(retryAttempt = 0) {
1473
+ this.scheduleFalsePublishRetry(retryAttempt, {
1474
+ requireDisabled: true
1475
+ });
1476
+ }
1477
+
1478
+ /**
1479
+ * Retries compensating false publish after rollback failure, regardless of enabled flag.
1480
+ * @private
1481
+ */
1482
+ scheduleCompensatingFalsePublishRetry(retryAttempt = 0) {
1483
+ this.scheduleFalsePublishRetry(retryAttempt);
1484
+ }
1485
+ scheduleFalsePublishRetry(retryAttempt = 0, options = {}) {
1486
+ if (retryAttempt >= ContactCenter.WXAPP_FALSE_PUBLISH_MAX_RETRIES) {
1487
+ return;
1488
+ }
1489
+ if (options?.requireDisabled && this.isWxBetterTogetherEnabled()) {
1490
+ return;
1491
+ }
1492
+ this.clearWxAppFalsePublishRetryTimer();
1493
+ this.wxAppFalsePublishRetryTimer = setTimeout(async () => {
1494
+ this.wxAppFalsePublishRetryTimer = undefined;
1495
+ if (options?.requireDisabled && this.isWxBetterTogetherEnabled()) {
1496
+ return;
1497
+ }
1498
+ if (!options?.requireDisabled && this.isWxBetterTogetherEnabled() && this.webexCrossClientService.isAnswerCallsStateActive()) {
1499
+ return;
1500
+ }
1501
+ try {
1502
+ await this.ensureWxAppDeviceRegistered();
1503
+ await this.publishAnswerOnWebexCrossClientState(false, {
1504
+ force: true
1505
+ });
1506
+ this.webexCrossClientService.teardown();
1507
+ this.wxAppTelephonyMercurySync.unsubscribe();
1508
+ await this.releaseWxAppMercuryResources();
1509
+ } catch (retryError) {
1510
+ _loggerProxy.default.error(`Failed to retry forced answer-calls-on-wxcc false publish: ${retryError}`, {
1511
+ module: _constants.CC_FILE,
1512
+ method: _constants.METHODS.SET_MANAGE_WEBEX_CALLING_IN_WXCC
1513
+ });
1514
+ this.scheduleFalsePublishRetry(retryAttempt + 1, options);
1515
+ }
1516
+ }, ContactCenter.WXAPP_FALSE_PUBLISH_RETRY_DELAY_MS);
1517
+ }
1518
+
1519
+ /**
1520
+ * Best-effort rollback when usersub true was published but wxApp setup did not complete.
1521
+ * @private
1522
+ */
1523
+ async revertWxAppCrossClientPublish() {
1524
+ try {
1525
+ await this.publishAnswerOnWebexCrossClientState(false, {
1526
+ force: true
1527
+ });
1528
+ } catch (error) {
1529
+ _loggerProxy.default.error(`Failed to publish compensating answer-calls-on-wxcc false during wxApp rollback: ${error}`, {
1530
+ module: _constants.CC_FILE,
1531
+ method: _constants.METHODS.SET_MANAGE_WEBEX_CALLING_IN_WXCC
1532
+ });
1533
+ this.scheduleCompensatingFalsePublishRetry();
1534
+ }
1535
+ this.webexCrossClientService.teardown();
1536
+ this.wxAppTelephonyMercurySync.unsubscribe();
1537
+ await this.releaseWxAppMercuryResources();
1538
+ }
1539
+ async ensureWxAppDeviceRegistered() {
1540
+ const device = this.$webex.internal.device;
1541
+ if (device && !device.registered && device.register) {
1542
+ await device.register();
1543
+ this.wxAppDeviceRegisteredByCc = true;
1544
+ _loggerProxy.default.log('WxApp: device registered for cross-client publish', {
1545
+ module: _constants.CC_FILE,
1546
+ method: _constants.METHODS.ENSURE_WXAPP_MERCURY_CONNECTED
1547
+ });
1548
+ }
1549
+ }
1550
+ async ensureWxAppMercuryConnected() {
1551
+ const mercury = this.$webex.internal.mercury;
1552
+ await this.ensureWxAppDeviceRegistered();
1553
+ if (mercury && !mercury.connected) {
1554
+ await mercury.connect();
1555
+ this.wxAppMercuryConnectedByCc = true;
1556
+ _loggerProxy.default.log('WxApp mute sync: mercury connected', {
1557
+ module: _constants.CC_FILE,
1558
+ method: _constants.METHODS.ENSURE_WXAPP_MERCURY_CONNECTED
1559
+ });
1560
+ }
1561
+ }
1562
+
1563
+ /**
1564
+ * Disconnects Mercury and unregisters the device when wxApp mute sync opened them.
1565
+ * @private
1566
+ */
1567
+ async releaseWxAppMercuryResources() {
1568
+ const mercury = this.$webex.internal.mercury;
1569
+ const device = this.$webex.internal.device;
1570
+ if (this.wxAppMercuryConnectedByCc && mercury?.connected) {
1571
+ try {
1572
+ await mercury.disconnect();
1573
+ this.wxAppMercuryConnectedByCc = false;
1574
+ _loggerProxy.default.log('WxApp mute sync: mercury disconnected', {
1575
+ module: _constants.CC_FILE,
1576
+ method: _constants.METHODS.ENSURE_WXAPP_MERCURY_CONNECTED
1577
+ });
1578
+ } catch (error) {
1579
+ _loggerProxy.default.error(`Failed to disconnect wxApp Mercury: ${error}`, {
1580
+ module: _constants.CC_FILE,
1581
+ method: _constants.METHODS.ENSURE_WXAPP_MERCURY_CONNECTED
1582
+ });
1583
+ }
1584
+ }
1585
+ if (this.wxAppDeviceRegisteredByCc && device?.registered && device.unregister) {
1586
+ try {
1587
+ // @ts-ignore
1588
+ await device.unregister();
1589
+ this.wxAppDeviceRegisteredByCc = false;
1590
+ _loggerProxy.default.log('WxApp mute sync: device unregistered', {
1591
+ module: _constants.CC_FILE,
1592
+ method: _constants.METHODS.ENSURE_WXAPP_MERCURY_CONNECTED
1593
+ });
1594
+ } catch (error) {
1595
+ _loggerProxy.default.error(`Failed to unregister wxApp device: ${error}`, {
1596
+ module: _constants.CC_FILE,
1597
+ method: _constants.METHODS.ENSURE_WXAPP_MERCURY_CONNECTED
1598
+ });
1599
+ }
1600
+ } else if (this.wxAppDeviceRegisteredByCc) {
1601
+ this.wxAppDeviceRegisteredByCc = false;
1602
+ }
1603
+ }
1604
+
1605
+ /**
1606
+ * Clears wxApp runtime state and feature-owned resources. Publish failures are logged;
1607
+ * optional rethrow for deregister when callers need to surface usersub errors.
1608
+ * @private
1609
+ */
1610
+ async teardownWxAppLocalState(options) {
1611
+ this.clearWxAppFalsePublishRetryTimer();
1612
+ let publishError;
1613
+ try {
1614
+ const shouldForceFalsePublish = this.isWxBetterTogetherEnabled() || this.webexCrossClientService.isAnswerCallsStateActive();
1615
+ await this.publishAnswerOnWebexCrossClientState(false, {
1616
+ force: shouldForceFalsePublish
1617
+ });
1618
+ } catch (error) {
1619
+ publishError = error;
1620
+ _loggerProxy.default.error(`Failed to publish answer-calls-on-wxcc false during wxApp teardown: ${error}`, {
1621
+ module: _constants.CC_FILE,
1622
+ method: _constants.METHODS.SET_MANAGE_WEBEX_CALLING_IN_WXCC
1623
+ });
1624
+ }
1625
+ this.webexCrossClientService.teardown();
1626
+ this.wxAppTelephonyMercurySync.unsubscribe();
1627
+ await this.releaseWxAppMercuryResources();
1628
+ if (options?.clearInitFlag) {
1629
+ this.resetEnableWxBetterTogetherConfig();
1630
+ }
1631
+ if (publishError) {
1632
+ this.scheduleCompensatingFalsePublishRetry();
1633
+ }
1634
+ if (options?.rethrowPublishError && publishError) {
1635
+ throw publishError;
1636
+ }
1637
+ return {
1638
+ publishError: publishError ?? undefined
1639
+ };
1640
+ }
1641
+ async ensureWxAppMercuryAndSubscribe() {
1642
+ if (!this.isWxBetterTogetherEnabled()) {
1643
+ return;
1644
+ }
1645
+ if (this.getCurrentStationLoginOption() === _types.LoginOption.BROWSER) {
1646
+ return;
1647
+ }
1648
+ const agentId = this.agentConfig?.agentId;
1649
+ if (!agentId) {
1650
+ _loggerProxy.default.error('Cannot subscribe wxApp mute sync: agentId unavailable', {
1651
+ module: _constants.CC_FILE,
1652
+ method: _constants.METHODS.SYNC_WXAPP_MUTE_FROM_MERCURY
1653
+ });
1654
+ this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_MERCURY_SUBSCRIBE_FAILED, {
1655
+ error: 'agentId unavailable'
1656
+ }, ['operational', 'behavioral']);
1657
+ return;
1658
+ }
1659
+ try {
1660
+ await this.ensureWxAppMercuryConnected();
1661
+ this.wxAppTelephonyMercurySync.subscribe(agentId, (callId, muted) => {
1662
+ this.taskManager.applyWxAppMuteStateFromSync(callId, muted);
1663
+ });
1664
+ } catch (error) {
1665
+ _loggerProxy.default.error(`Failed to ensure wxApp Mercury mute sync: ${error}`, {
1666
+ module: _constants.CC_FILE,
1667
+ method: _constants.METHODS.SYNC_WXAPP_MUTE_FROM_MERCURY
1668
+ });
1669
+ this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_MERCURY_SUBSCRIBE_FAILED, {
1670
+ error: error instanceof Error ? error.toString() : String(error)
1671
+ }, ['operational', 'behavioral']);
1672
+ this.wxAppTelephonyMercurySync.unsubscribe();
1673
+ await this.releaseWxAppMercuryResources();
1674
+ throw error;
1675
+ }
1676
+ }
1677
+ async publishAnswerOnWebexCrossClientState(enable, options) {
1678
+ if (enable && !this.isWxBetterTogetherEnabled()) {
1679
+ return;
1680
+ }
1681
+ if (!enable && !options?.force && !this.webexCrossClientService.isAnswerCallsStateActive()) {
1682
+ return;
1683
+ }
1684
+ const userId = this.$webex.internal.device?.userId;
1685
+ if (!userId) {
1686
+ if (enable && this.isWxBetterTogetherEnabled()) {
1687
+ this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_FAILED, {
1688
+ enableWxBetterTogether: true,
1689
+ skipReason: 'user_id_unavailable',
1690
+ error: 'User ID is unavailable for cross-client publish'
1691
+ }, ['operational', 'behavioral']);
1692
+ }
1693
+ return;
1694
+ }
1695
+ await this.webexCrossClientService.setManageWebexCallingInWxcc(enable, {
1696
+ userId,
1697
+ trackPublishMetrics: true
1698
+ });
1699
+ if (enable) {
1700
+ this.clearWxAppFalsePublishRetryTimer();
1701
+ }
1702
+ }
1703
+
1173
1704
  /**
1174
1705
  * Initializes event listeners for the Contact Center service
1175
1706
  * Sets up handlers for connection state changes and other core events
@@ -1268,6 +1799,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
1268
1799
  }
1269
1800
  this.agentConfig.lastStateAuxCodeId = auxCodeId;
1270
1801
  this.agentConfig.isAgentLoggedIn = true;
1802
+ await this.ensureWxAppPostStationLogin();
1271
1803
  _loggerProxy.default.log(`Silent relogin process completed successfully with login Option: ${reLoginResponse.data.deviceType} teamId: ${reLoginResponse.data.teamId}`, {
1272
1804
  module: _constants.CC_FILE,
1273
1805
  method: _constants.METHODS.SILENT_RELOGIN,
@@ -1884,8 +2416,8 @@ class ContactCenter extends _webexCore.WebexPlugin {
1884
2416
  }
1885
2417
 
1886
2418
  /**
1887
- * Returns paginated entry points for the organization.
1888
- * Thin wrapper around internal EntryPoint instance.
2419
+ * Returns paginated entry points using the EntryPoint service defaults.
2420
+ * Existing request parameters can override those defaults.
1889
2421
  * @public
1890
2422
  */
1891
2423
  async getEntryPoints(params = {}) {
@@ -1893,8 +2425,8 @@ class ContactCenter extends _webexCore.WebexPlugin {
1893
2425
  }
1894
2426
 
1895
2427
  /**
1896
- * Returns paginated contact service queues for the organization.
1897
- * Thin wrapper around internal Queue instance.
2428
+ * Returns paginated contact service queues using the Queue service defaults.
2429
+ * Existing request parameters can override those defaults.
1898
2430
  * @public
1899
2431
  */
1900
2432
  async getQueues(params = {}) {