@webex/contact-center 3.12.0-llmrefactor.12 → 3.12.0-llmrefactor.14

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 (107) hide show
  1. package/.sdd/manifest.json +6 -5
  2. package/ai-docs/CONTRACTS.md +8 -0
  3. package/ai-docs/SERVICE_STATE.md +4 -0
  4. package/ai-docs/contact-center-spec.md +26 -3
  5. package/ai-docs/features/contact-owner-change-refactor.md +78 -0
  6. package/dist/cc.js +202 -9
  7. package/dist/cc.js.map +1 -1
  8. package/dist/constants.js +5 -1
  9. package/dist/constants.js.map +1 -1
  10. package/dist/index.js +25 -10
  11. package/dist/index.js.map +1 -1
  12. package/dist/metrics/behavioral-events.js +6 -0
  13. package/dist/metrics/behavioral-events.js.map +1 -1
  14. package/dist/metrics/constants.js +6 -0
  15. package/dist/metrics/constants.js.map +1 -1
  16. package/dist/services/AnswerCallOnWebexService.js +4 -4
  17. package/dist/services/AnswerCallOnWebexService.js.map +1 -1
  18. package/dist/services/ApiAiAssistant.js +116 -1
  19. package/dist/services/ApiAiAssistant.js.map +1 -1
  20. package/dist/services/WebexCrossClientService.js +5 -2
  21. package/dist/services/WebexCrossClientService.js.map +1 -1
  22. package/dist/services/WxAppTelephonyMercurySync.js +6 -3
  23. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -1
  24. package/dist/services/config/Util.js +5 -1
  25. package/dist/services/config/Util.js.map +1 -1
  26. package/dist/services/config/constants.js +10 -1
  27. package/dist/services/config/constants.js.map +1 -1
  28. package/dist/services/config/index.js +51 -0
  29. package/dist/services/config/index.js.map +1 -1
  30. package/dist/services/config/types.js +4 -3
  31. package/dist/services/config/types.js.map +1 -1
  32. package/dist/services/core/Utils.js +5 -1
  33. package/dist/services/core/Utils.js.map +1 -1
  34. package/dist/services/task/TaskFactory.js +1 -0
  35. package/dist/services/task/TaskFactory.js.map +1 -1
  36. package/dist/services/task/TaskManager.js +50 -58
  37. package/dist/services/task/TaskManager.js.map +1 -1
  38. package/dist/services/task/types.js.map +1 -1
  39. package/dist/services/task/voice/Voice.js +63 -44
  40. package/dist/services/task/voice/Voice.js.map +1 -1
  41. package/dist/services/task/voice/wxAppOfferObservability.js +145 -0
  42. package/dist/services/task/voice/wxAppOfferObservability.js.map +1 -0
  43. package/dist/services/task/voice/wxAppVoiceMethods.js +52 -11
  44. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -1
  45. package/dist/services/wxAppDiagnosticLogging.js +50 -13
  46. package/dist/services/wxAppDiagnosticLogging.js.map +1 -1
  47. package/dist/types/cc.d.ts +21 -1
  48. package/dist/types/constants.d.ts +4 -0
  49. package/dist/types/index.d.ts +11 -1
  50. package/dist/types/metrics/constants.d.ts +6 -0
  51. package/dist/types/services/ApiAiAssistant.d.ts +35 -2
  52. package/dist/types/services/config/constants.d.ts +5 -0
  53. package/dist/types/services/config/types.d.ts +15 -2
  54. package/dist/types/services/core/Utils.d.ts +2 -0
  55. package/dist/types/services/task/types.d.ts +2 -0
  56. package/dist/types/services/task/voice/Voice.d.ts +15 -2
  57. package/dist/types/services/task/voice/wxAppOfferObservability.d.ts +39 -0
  58. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +19 -6
  59. package/dist/types/services/wxAppDiagnosticLogging.d.ts +12 -0
  60. package/dist/types/types.d.ts +56 -1
  61. package/dist/types.js +39 -2
  62. package/dist/types.js.map +1 -1
  63. package/dist/webex.js +9 -1
  64. package/dist/webex.js.map +1 -1
  65. package/package.json +9 -9
  66. package/src/cc.ts +294 -25
  67. package/src/constants.ts +4 -0
  68. package/src/index.ts +11 -0
  69. package/src/metrics/ai-docs/metrics-spec.md +61 -20
  70. package/src/metrics/behavioral-events.ts +6 -0
  71. package/src/metrics/constants.ts +6 -0
  72. package/src/services/AnswerCallOnWebexService.ts +4 -4
  73. package/src/services/ApiAiAssistant.ts +153 -1
  74. package/src/services/WebexCrossClientService.ts +7 -2
  75. package/src/services/WxAppTelephonyMercurySync.ts +3 -3
  76. package/src/services/ai-docs/services-spec.md +11 -3
  77. package/src/services/config/Util.ts +6 -0
  78. package/src/services/config/ai-docs/config-spec.md +14 -3
  79. package/src/services/config/constants.ts +12 -0
  80. package/src/services/config/index.ts +65 -0
  81. package/src/services/config/types.ts +13 -2
  82. package/src/services/core/Utils.ts +4 -0
  83. package/src/services/task/TaskFactory.ts +1 -0
  84. package/src/services/task/TaskManager.ts +85 -87
  85. package/src/services/task/ai-docs/task-spec.md +7 -3
  86. package/src/services/task/types.ts +16 -0
  87. package/src/services/task/voice/Voice.ts +74 -52
  88. package/src/services/task/voice/wxAppOfferObservability.ts +204 -0
  89. package/src/services/task/voice/wxAppVoiceMethods.ts +83 -24
  90. package/src/services/wxAppDiagnosticLogging.ts +135 -23
  91. package/src/types.ts +65 -0
  92. package/src/webex.js +8 -0
  93. package/test/unit/spec/cc.ts +469 -19
  94. package/test/unit/spec/services/ApiAiAssistant.ts +134 -2
  95. package/test/unit/spec/services/WebexCrossClientService.ts +45 -3
  96. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +1 -1
  97. package/test/unit/spec/services/config/Util.ts +44 -0
  98. package/test/unit/spec/services/config/index.ts +68 -0
  99. package/test/unit/spec/services/task/TaskManager.ts +214 -3
  100. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +33 -0
  101. package/test/unit/spec/services/task/voice/Voice.ts +10 -51
  102. package/test/unit/spec/services/task/voice/wxAppOfferObservability.ts +361 -0
  103. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +121 -5
  104. package/test/unit/spec/services/wxAppDiagnosticLogging.ts +44 -8
  105. package/test/unit/spec/wellnessSampleUtils.ts +288 -0
  106. package/umd/contact-center.min.js +2 -2
  107. package/umd/contact-center.min.js.map +1 -1
package/dist/cc.js CHANGED
@@ -240,6 +240,16 @@ class ContactCenter extends _webexCore.WebexPlugin {
240
240
  * @private
241
241
  */
242
242
 
243
+ /** Current login/relogin session used for agent-scoped wellness validation. */
244
+
245
+ /** Registered-session cache for the system WellbeingBreak idle code. */
246
+
247
+ /** Registration generation that owns the wellness idle-code cache and in-flight lookups. */
248
+ wellnessRegistrationGeneration = 0;
249
+ updateWellnessSession(agentSessionId) {
250
+ this.currentAgentSessionId = agentSessionId;
251
+ }
252
+
243
253
  /**
244
254
  * API instance for managing Webex Contact Center entry points
245
255
  * Provides functionality to fetch entry points with caching support
@@ -375,7 +385,11 @@ class ContactCenter extends _webexCore.WebexPlugin {
375
385
  this.answerCallOnWebexService = new _AnswerCallOnWebexService.default(this.$webex);
376
386
  this.webexCrossClientService = new _WebexCrossClientService.default(this.$webex);
377
387
  this.wxAppTelephonyMercurySync = new _WxAppTelephonyMercurySync.default(this.$webex);
378
- this.apiAIAssistant = new _ApiAiAssistant.ApiAIAssistant(this.$webex);
388
+ this.apiAIAssistant = new _ApiAiAssistant.ApiAIAssistant(this.$webex, () => ({
389
+ isWellnessBreakEnabled: this.agentConfig?.isWellnessBreakEnabled === true,
390
+ agentId: this.agentConfig?.agentId,
391
+ agentSessionId: this.currentAgentSessionId
392
+ }));
379
393
  this.metricsManager = _MetricsManager.default.getInstance({
380
394
  webex: this.$webex
381
395
  });
@@ -442,7 +456,82 @@ class ContactCenter extends _webexCore.WebexPlugin {
442
456
  // @ts-ignore
443
457
  this.trigger(_types4.TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION, task);
444
458
  };
459
+ trackInvalidWellnessEvent(reason) {
460
+ this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.AI_ASSISTANT_WELLNESS_EVENT_INVALID, {
461
+ reason
462
+ }, ['operational']);
463
+ }
464
+ normalizeWellnessBreakEvent(payload) {
465
+ if (this.agentConfig?.isWellnessBreakEnabled !== true) {
466
+ this.trackInvalidWellnessEvent('wellness_disabled');
467
+ return null;
468
+ }
469
+ const notificationData = (0, _Utils.isRecord)(payload.data) ? payload.data : null;
470
+ const notificationDetails = notificationData && (0, _Utils.isRecord)(notificationData.notifDetails) ? notificationData.notifDetails : null;
471
+ const sessionData = notificationData && (0, _Utils.isRecord)(notificationData.data) ? notificationData.data : null;
472
+ const actionEvent = notificationDetails?.actionEvent;
473
+ if (payload.type !== _constants.WELLNESS_BREAK_HANDLER || notificationData?.notifType !== _constants.WELLNESS_BREAK_HANDLER || typeof actionEvent !== 'string') {
474
+ this.trackInvalidWellnessEvent('malformed_wellness_event');
475
+ return null;
476
+ }
477
+ if (!Object.values(_types.WELLNESS_BREAK_NOTIFICATION_ACTIONS).includes(actionEvent)) {
478
+ this.trackInvalidWellnessEvent('unknown_wellness_action');
479
+ return null;
480
+ }
481
+ const agentId = notificationData.agentId;
482
+ const eventOrgId = notificationData.orgId;
483
+ const sessionOrgId = sessionData?.orgId;
484
+ const envelopeOrgId = payload.orgId;
485
+ const agentSessionId = sessionData?.agentSessionId;
486
+ const currentOrgId = this.$webex.credentials.getOrgId();
487
+ if (typeof agentId !== 'string' || typeof eventOrgId !== 'string' || typeof sessionOrgId !== 'string' || typeof envelopeOrgId !== 'string' || typeof agentSessionId !== 'string' || !agentId || !eventOrgId || !sessionOrgId || !envelopeOrgId || !agentSessionId) {
488
+ this.trackInvalidWellnessEvent('missing_wellness_identity');
489
+ return null;
490
+ }
491
+ if (agentId !== this.agentConfig?.agentId || eventOrgId !== currentOrgId || sessionOrgId !== currentOrgId || envelopeOrgId !== currentOrgId) {
492
+ this.trackInvalidWellnessEvent('mismatched_wellness_identity');
493
+ return null;
494
+ }
495
+ const interactionValue = sessionData.interactionId ?? sessionData.InteractionId;
496
+ const actionText = notificationDetails.actionText;
497
+ const trackingId = payload.trackingId;
498
+ return {
499
+ agentId,
500
+ orgId: currentOrgId,
501
+ agentSessionId,
502
+ actionEvent: actionEvent,
503
+ ...(typeof actionText === 'string' ? {
504
+ actionText
505
+ } : {}),
506
+ ...(typeof interactionValue === 'string' ? {
507
+ interactionId: interactionValue
508
+ } : {}),
509
+ ...(typeof trackingId === 'string' ? {
510
+ trackingId
511
+ } : {})
512
+ };
513
+ }
514
+ handleWellnessBreakWebsocketPayload(payload) {
515
+ if (payload.type !== _constants.WELLNESS_BREAK_HANDLER) {
516
+ return false;
517
+ }
518
+ const wellnessEvent = this.normalizeWellnessBreakEvent(payload);
519
+ if (wellnessEvent) {
520
+ // @ts-ignore - WebexPlugin emit is available at runtime but absent from its declaration.
521
+ this.emit(_types3.CC_EVENTS.WELLNESS_BREAK, wellnessEvent);
522
+ }
523
+ return true;
524
+ }
445
525
  handleRTDWebsocketMessage = event => {
526
+ let payload;
527
+ try {
528
+ payload = JSON.parse(event);
529
+ } catch {
530
+ // TaskManager retains its existing malformed RTD message handling.
531
+ }
532
+ if ((0, _Utils.isRecord)(payload) && this.handleWellnessBreakWebsocketPayload(payload)) {
533
+ return;
534
+ }
446
535
  this.taskManager.handleRealtimeWebsocketEvent(event);
447
536
  };
448
537
 
@@ -496,6 +585,8 @@ class ContactCenter extends _webexCore.WebexPlugin {
496
585
  * ```
497
586
  */
498
587
  async register() {
588
+ this.wellnessRegistrationGeneration += 1;
589
+ this.wellbeingBreakIdleCode = undefined;
499
590
  _loggerProxy.default.log('Starting CC SDK registration', {
500
591
  module: _constants.CC_FILE,
501
592
  method: _constants.METHODS.REGISTER
@@ -515,7 +606,14 @@ class ContactCenter extends _webexCore.WebexPlugin {
515
606
  module: _constants.CC_FILE,
516
607
  method: _constants.METHODS.REGISTER
517
608
  });
518
- return resp;
609
+
610
+ // Registration can silently restore a station session without emitting a
611
+ // relogin event. Project the active session for consumers that must
612
+ // recover session-scoped state after a page refresh.
613
+ return resp.isAgentLoggedIn && this.currentAgentSessionId ? {
614
+ ...resp,
615
+ agentSessionId: this.currentAgentSessionId
616
+ } : resp;
519
617
  } catch (error) {
520
618
  this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WEBSOCKET_REGISTER_FAILED, {
521
619
  orgId: error.orgId
@@ -562,6 +660,9 @@ class ContactCenter extends _webexCore.WebexPlugin {
562
660
  *
563
661
  */
564
662
  async deregister() {
663
+ this.wellnessRegistrationGeneration += 1;
664
+ this.wellbeingBreakIdleCode = undefined;
665
+ this.updateWellnessSession();
565
666
  try {
566
667
  this.metricsManager.timeEvent([_constants4.METRIC_EVENT_NAMES.WEBSOCKET_DEREGISTER_SUCCESS, _constants4.METRIC_EVENT_NAMES.WEBSOCKET_DEREGISTER_FAIL]);
567
668
  this.taskManager.off(_types4.TASK_EVENTS.TASK_INCOMING, this.handleIncomingTask);
@@ -601,7 +702,9 @@ class ContactCenter extends _webexCore.WebexPlugin {
601
702
  }
602
703
 
603
704
  // Clear any cached agent configuration
705
+ this.wellbeingBreakIdleCode = undefined;
604
706
  this.agentConfig = null;
707
+ this.updateWellnessSession();
605
708
  if (wxAppPublishError) {
606
709
  throw wxAppPublishError;
607
710
  }
@@ -740,7 +843,8 @@ class ContactCenter extends _webexCore.WebexPlugin {
740
843
  accessEntryPoint: this.agentConfig.accessEntryPoint,
741
844
  accessBuddyTeam: this.agentConfig.accessBuddyTeam
742
845
  },
743
- enableWxBetterTogether: this.isWxBetterTogetherEnabled()
846
+ enableWxBetterTogether: this.isWxBetterTogetherEnabled(),
847
+ getWxAppUsersubPublished: () => this.webexCrossClientService.isAnswerCallsStateActive()
744
848
  };
745
849
  this.taskManager.setConfigFlags(configFlags);
746
850
  // TODO: Make profile a singleton to make it available throughout app/sdk so we dont need to inject info everywhere
@@ -748,12 +852,15 @@ class ContactCenter extends _webexCore.WebexPlugin {
748
852
  this.taskManager.setAgentId(this.agentConfig.agentId);
749
853
  this.taskManager.setWebRtcEnabled(this.agentConfig.webRtcEnabled);
750
854
  this.apiAIAssistant.setAIFeatureFlags(this.agentConfig.aiFeature);
855
+ this.wellbeingBreakIdleCode = undefined;
856
+ this.updateWellnessSession();
751
857
 
752
858
  /**
753
859
  * RTD websocket currently supports realtime transcripts and suggested responses.
754
860
  * Extend this condition when additional AI RTD features are introduced.
861
+ * Wellness break notifications also arrive on this websocket.
755
862
  */
756
- if (this.agentConfig.aiFeature?.realtimeTranscripts?.enable || this.agentConfig.aiFeature?.suggestedResponses?.enable) {
863
+ if (this.agentConfig.aiFeature?.realtimeTranscripts?.enable || this.agentConfig.aiFeature?.suggestedResponses?.enable || this.agentConfig.isWellnessBreakEnabled) {
757
864
  _loggerProxy.default.info('Connecting to RTD websocket', {
758
865
  module: _constants.CC_FILE,
759
866
  method: _constants.METHODS.CONNECT_WEBSOCKET
@@ -803,6 +910,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
803
910
  }
804
911
  return this.agentConfig;
805
912
  } catch (error) {
913
+ this.updateWellnessSession();
806
914
  _loggerProxy.default.error(`Error during register: ${error}`, {
807
915
  module: _constants.CC_FILE,
808
916
  method: _constants.METHODS.CONNECT_WEBSOCKET
@@ -891,6 +999,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
891
999
  channelsMap,
892
1000
  ...loginData
893
1001
  } = resp.data;
1002
+ this.updateWellnessSession(resp.data.agentSessionId);
894
1003
  this.agentConfig.currentTeamId = resp.data.teamId;
895
1004
  const response = {
896
1005
  ...loginData,
@@ -978,6 +1087,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
978
1087
  this.webCallingService.deregisterWebCallingLine();
979
1088
  }
980
1089
  await this.teardownWxAppLocalState();
1090
+ this.updateWellnessSession();
981
1091
  _loggerProxy.default.log(`Agent station logout completed successfully`, {
982
1092
  module: _constants.CC_FILE,
983
1093
  method: _constants.METHODS.STATION_LOGOUT,
@@ -1098,6 +1208,63 @@ class ContactCenter extends _webexCore.WebexPlugin {
1098
1208
  }
1099
1209
  }
1100
1210
 
1211
+ /**
1212
+ * Returns the system-managed `WellbeingBreak` idle code for the current registration.
1213
+ * The value is fetched outside Desktop Profile filtering and cached until deregistration.
1214
+ * @returns The normalized system idle-code entity
1215
+ * @throws Structured Contact Center error when wellness is disabled or the code is unavailable
1216
+ * @example
1217
+ * const idleCode = await webex.cc.getWellbeingBreakIdleCode();
1218
+ * @public
1219
+ */
1220
+ async getWellbeingBreakIdleCode() {
1221
+ const method = _constants.METHODS.GET_WELLBEING_BREAK_IDLE_CODE;
1222
+ try {
1223
+ if (!this.agentConfig?.isWellnessBreakEnabled) {
1224
+ const validationError = new Error('WELLNESS_BREAK_NOT_ENABLED');
1225
+ validationError.details = {
1226
+ type: 'SDK_VALIDATION_ERROR',
1227
+ orgId: this.$webex.credentials.getOrgId(),
1228
+ trackingId: _constants.EMPTY_STRING,
1229
+ data: {
1230
+ reason: 'WELLNESS_BREAK_NOT_ENABLED'
1231
+ }
1232
+ };
1233
+ throw validationError;
1234
+ }
1235
+ if (this.wellbeingBreakIdleCode) {
1236
+ return this.wellbeingBreakIdleCode;
1237
+ }
1238
+ this.metricsManager.timeEvent([_constants4.METRIC_EVENT_NAMES.WELLBEING_BREAK_IDLE_CODE_FETCH_SUCCESS, _constants4.METRIC_EVENT_NAMES.WELLBEING_BREAK_IDLE_CODE_FETCH_FAILED]);
1239
+ const registrationGeneration = this.wellnessRegistrationGeneration;
1240
+ const orgId = this.$webex.credentials.getOrgId();
1241
+ const idleCode = await this.services.config.getWellbeingBreakIdleCode(orgId);
1242
+ if (registrationGeneration !== this.wellnessRegistrationGeneration || orgId !== this.$webex.credentials.getOrgId() || !this.agentConfig?.isWellnessBreakEnabled) {
1243
+ const staleRegistrationError = new Error('WELLNESS_BREAK_REGISTRATION_CHANGED');
1244
+ staleRegistrationError.details = {
1245
+ type: 'SDK_VALIDATION_ERROR',
1246
+ orgId,
1247
+ trackingId: _constants.EMPTY_STRING,
1248
+ data: {
1249
+ reason: 'WELLNESS_BREAK_REGISTRATION_CHANGED'
1250
+ }
1251
+ };
1252
+ throw staleRegistrationError;
1253
+ }
1254
+ this.wellbeingBreakIdleCode = idleCode;
1255
+ this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WELLBEING_BREAK_IDLE_CODE_FETCH_SUCCESS, {}, ['operational']);
1256
+ return idleCode;
1257
+ } catch (error) {
1258
+ this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WELLBEING_BREAK_IDLE_CODE_FETCH_FAILED, {
1259
+ reason: error instanceof Error ? error.message : _constants.UNKNOWN_ERROR
1260
+ }, ['operational']);
1261
+ const {
1262
+ error: detailedError
1263
+ } = (0, _Utils.getErrorDetails)(error, method, _constants.CC_FILE);
1264
+ throw detailedError;
1265
+ }
1266
+ }
1267
+
1101
1268
  /**
1102
1269
  * Processes incoming websocket messages and emits corresponding events
1103
1270
  * Handles various event types including agent state changes, login events,
@@ -1131,8 +1298,14 @@ class ContactCenter extends _webexCore.WebexPlugin {
1131
1298
  };
1132
1299
  this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WEBSOCKET_EVENT_RECEIVED, metricsPayload, ['operational']);
1133
1300
  }
1301
+ if (this.handleWellnessBreakWebsocketPayload(eventData)) {
1302
+ return;
1303
+ }
1134
1304
  switch (eventData.type) {
1135
1305
  case _types3.CC_EVENTS.AGENT_MULTI_LOGIN:
1306
+ if (eventData.data?.type === 'AgentMultiLoginCloseSession' && (!eventData.data.agentSessionId || eventData.data.agentSessionId === this.currentAgentSessionId)) {
1307
+ this.updateWellnessSession();
1308
+ }
1136
1309
  // @ts-ignore
1137
1310
  this.emit(_types2.AGENT_EVENTS.AGENT_MULTI_LOGIN, eventData.data);
1138
1311
  break;
@@ -1153,6 +1326,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
1153
1326
  channelsMap,
1154
1327
  ...loginData
1155
1328
  } = eventData.data;
1329
+ this.updateWellnessSession(loginData.agentSessionId);
1156
1330
  const stationLoginData = {
1157
1331
  ...loginData,
1158
1332
  mmProfile: {
@@ -1174,6 +1348,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
1174
1348
  channelsMap,
1175
1349
  ...loginData
1176
1350
  } = eventData.data;
1351
+ this.updateWellnessSession(loginData.agentSessionId);
1177
1352
  const stationReLoginData = {
1178
1353
  ...loginData,
1179
1354
  mmProfile: {
@@ -1186,8 +1361,8 @@ class ContactCenter extends _webexCore.WebexPlugin {
1186
1361
  };
1187
1362
  // @ts-ignore
1188
1363
  this.emit(_types2.AGENT_EVENTS.AGENT_RELOGIN_SUCCESS, stationReLoginData);
1364
+ break;
1189
1365
  }
1190
- break;
1191
1366
  case _types3.CC_EVENTS.AGENT_STATE_CHANGE_SUCCESS:
1192
1367
  // @ts-ignore
1193
1368
  this.emit(_types2.AGENT_EVENTS.AGENT_STATE_CHANGE_SUCCESS, eventData.data);
@@ -1201,6 +1376,9 @@ class ContactCenter extends _webexCore.WebexPlugin {
1201
1376
  this.emit(_types2.AGENT_EVENTS.AGENT_STATION_LOGIN_FAILED, eventData.data);
1202
1377
  break;
1203
1378
  case _types3.CC_EVENTS.AGENT_LOGOUT_SUCCESS:
1379
+ if (!eventData.data.agentSessionId || eventData.data.agentSessionId === this.currentAgentSessionId) {
1380
+ this.updateWellnessSession();
1381
+ }
1204
1382
  // @ts-ignore
1205
1383
  this.emit(_types2.AGENT_EVENTS.AGENT_LOGOUT_SUCCESS, eventData.data);
1206
1384
  break;
@@ -1321,6 +1499,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
1321
1499
  await this.publishAnswerOnWebexCrossClientState(true);
1322
1500
  publishedEnable = true;
1323
1501
  this.taskManager.syncWxAppMuteFromCallDetailsForAllTasks();
1502
+ this.taskManager.refreshWxAppOfferObservabilityForAllTasks();
1324
1503
  } else {
1325
1504
  await this.publishAnswerOnWebexCrossClientState(false);
1326
1505
  this.wxAppTelephonyMercurySync.unsubscribe();
@@ -1383,6 +1562,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
1383
1562
  await this.publishAnswerOnWebexCrossClientState(true);
1384
1563
  publishedEnable = true;
1385
1564
  this.taskManager.syncWxAppMuteFromCallDetailsForAllTasks();
1565
+ this.taskManager.refreshWxAppOfferObservabilityForAllTasks();
1386
1566
  const mercurySubscribed = this.wxAppTelephonyMercurySync.isSubscribed();
1387
1567
  const usersubPublished = this.webexCrossClientService.isAnswerCallsStateActive();
1388
1568
  (0, _wxAppDiagnosticLogging.logWxAppSessionReadiness)({
@@ -1397,12 +1577,18 @@ class ContactCenter extends _webexCore.WebexPlugin {
1397
1577
  if (sessionInitReady) {
1398
1578
  this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_SUCCESS, {
1399
1579
  loginOption,
1400
- enableWxBetterTogether: true
1580
+ enableWxBetterTogether: true,
1581
+ usersubPublished,
1582
+ mercurySubscribed,
1583
+ telephonyTaskType
1401
1584
  }, ['operational', 'behavioral']);
1402
1585
  } else {
1403
1586
  this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_FAILED, {
1404
1587
  loginOption,
1405
1588
  enableWxBetterTogether: true,
1589
+ usersubPublished,
1590
+ mercurySubscribed,
1591
+ telephonyTaskType,
1406
1592
  skipReason: !usersubPublished ? 'usersub_not_published' : 'mercury_not_subscribed'
1407
1593
  }, ['operational', 'behavioral']);
1408
1594
  }
@@ -1439,6 +1625,9 @@ class ContactCenter extends _webexCore.WebexPlugin {
1439
1625
  this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_SESSION_INIT_FAILED, {
1440
1626
  loginOption,
1441
1627
  enableWxBetterTogether: true,
1628
+ usersubPublished: this.webexCrossClientService.isAnswerCallsStateActive(),
1629
+ mercurySubscribed: this.wxAppTelephonyMercurySync.isSubscribed(),
1630
+ telephonyTaskType,
1442
1631
  skipReason: sessionInitFailureReason,
1443
1632
  error: error instanceof Error ? error.toString() : String(error)
1444
1633
  }, ['operational', 'behavioral']);
@@ -1446,7 +1635,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
1446
1635
  enableWxBetterTogether: true,
1447
1636
  loginOption,
1448
1637
  wxAppHooksApplied: false,
1449
- usersubPublished: publishedEnable && this.webexCrossClientService.isAnswerCallsStateActive(),
1638
+ usersubPublished: this.webexCrossClientService.isAnswerCallsStateActive(),
1450
1639
  mercurySubscribed: this.wxAppTelephonyMercurySync.isSubscribed(),
1451
1640
  telephonyTaskType,
1452
1641
  skipReason: sessionInitFailureReason
@@ -1652,7 +1841,8 @@ class ContactCenter extends _webexCore.WebexPlugin {
1652
1841
  method: _constants.METHODS.SYNC_WXAPP_MUTE_FROM_MERCURY
1653
1842
  });
1654
1843
  this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_MERCURY_SUBSCRIBE_FAILED, {
1655
- error: 'agentId unavailable'
1844
+ error: 'agentId unavailable',
1845
+ mercurySubscribed: false
1656
1846
  }, ['operational', 'behavioral']);
1657
1847
  return;
1658
1848
  }
@@ -1667,7 +1857,8 @@ class ContactCenter extends _webexCore.WebexPlugin {
1667
1857
  method: _constants.METHODS.SYNC_WXAPP_MUTE_FROM_MERCURY
1668
1858
  });
1669
1859
  this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_MERCURY_SUBSCRIBE_FAILED, {
1670
- error: error instanceof Error ? error.toString() : String(error)
1860
+ error: error instanceof Error ? error.toString() : String(error),
1861
+ mercurySubscribed: false
1671
1862
  }, ['operational', 'behavioral']);
1672
1863
  this.wxAppTelephonyMercurySync.unsubscribe();
1673
1864
  await this.releaseWxAppMercuryResources();
@@ -1686,6 +1877,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
1686
1877
  if (enable && this.isWxBetterTogetherEnabled()) {
1687
1878
  this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.WXAPP_USERSUB_PUBLISH_FAILED, {
1688
1879
  enableWxBetterTogether: true,
1880
+ usersubPublished: this.webexCrossClientService.isAnswerCallsStateActive(),
1689
1881
  skipReason: 'user_id_unavailable',
1690
1882
  error: 'User ID is unavailable for cross-client publish'
1691
1883
  }, ['operational', 'behavioral']);
@@ -1759,6 +1951,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
1759
1951
  });
1760
1952
  try {
1761
1953
  const reLoginResponse = await this.services.agent.reload();
1954
+ this.updateWellnessSession(reLoginResponse.data.agentSessionId);
1762
1955
  const {
1763
1956
  agentId,
1764
1957
  lastStateChangeReason,