@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.
- package/.sdd/manifest.json +6 -5
- package/ai-docs/CONTRACTS.md +8 -0
- package/ai-docs/SERVICE_STATE.md +4 -0
- package/ai-docs/contact-center-spec.md +26 -3
- package/ai-docs/features/contact-owner-change-refactor.md +78 -0
- package/dist/cc.js +202 -9
- package/dist/cc.js.map +1 -1
- package/dist/constants.js +5 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.js +25 -10
- package/dist/index.js.map +1 -1
- package/dist/metrics/behavioral-events.js +6 -0
- package/dist/metrics/behavioral-events.js.map +1 -1
- package/dist/metrics/constants.js +6 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/services/AnswerCallOnWebexService.js +4 -4
- package/dist/services/AnswerCallOnWebexService.js.map +1 -1
- package/dist/services/ApiAiAssistant.js +116 -1
- package/dist/services/ApiAiAssistant.js.map +1 -1
- package/dist/services/WebexCrossClientService.js +5 -2
- package/dist/services/WebexCrossClientService.js.map +1 -1
- package/dist/services/WxAppTelephonyMercurySync.js +6 -3
- package/dist/services/WxAppTelephonyMercurySync.js.map +1 -1
- package/dist/services/config/Util.js +5 -1
- package/dist/services/config/Util.js.map +1 -1
- package/dist/services/config/constants.js +10 -1
- package/dist/services/config/constants.js.map +1 -1
- package/dist/services/config/index.js +51 -0
- package/dist/services/config/index.js.map +1 -1
- package/dist/services/config/types.js +4 -3
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/core/Utils.js +5 -1
- package/dist/services/core/Utils.js.map +1 -1
- package/dist/services/task/TaskFactory.js +1 -0
- package/dist/services/task/TaskFactory.js.map +1 -1
- package/dist/services/task/TaskManager.js +50 -58
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/types.js.map +1 -1
- package/dist/services/task/voice/Voice.js +63 -44
- package/dist/services/task/voice/Voice.js.map +1 -1
- package/dist/services/task/voice/wxAppOfferObservability.js +145 -0
- package/dist/services/task/voice/wxAppOfferObservability.js.map +1 -0
- package/dist/services/task/voice/wxAppVoiceMethods.js +52 -11
- package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -1
- package/dist/services/wxAppDiagnosticLogging.js +50 -13
- package/dist/services/wxAppDiagnosticLogging.js.map +1 -1
- package/dist/types/cc.d.ts +21 -1
- package/dist/types/constants.d.ts +4 -0
- package/dist/types/index.d.ts +11 -1
- package/dist/types/metrics/constants.d.ts +6 -0
- package/dist/types/services/ApiAiAssistant.d.ts +35 -2
- package/dist/types/services/config/constants.d.ts +5 -0
- package/dist/types/services/config/types.d.ts +15 -2
- package/dist/types/services/core/Utils.d.ts +2 -0
- package/dist/types/services/task/types.d.ts +2 -0
- package/dist/types/services/task/voice/Voice.d.ts +15 -2
- package/dist/types/services/task/voice/wxAppOfferObservability.d.ts +39 -0
- package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +19 -6
- package/dist/types/services/wxAppDiagnosticLogging.d.ts +12 -0
- package/dist/types/types.d.ts +56 -1
- package/dist/types.js +39 -2
- package/dist/types.js.map +1 -1
- package/dist/webex.js +9 -1
- package/dist/webex.js.map +1 -1
- package/package.json +9 -9
- package/src/cc.ts +294 -25
- package/src/constants.ts +4 -0
- package/src/index.ts +11 -0
- package/src/metrics/ai-docs/metrics-spec.md +61 -20
- package/src/metrics/behavioral-events.ts +6 -0
- package/src/metrics/constants.ts +6 -0
- package/src/services/AnswerCallOnWebexService.ts +4 -4
- package/src/services/ApiAiAssistant.ts +153 -1
- package/src/services/WebexCrossClientService.ts +7 -2
- package/src/services/WxAppTelephonyMercurySync.ts +3 -3
- package/src/services/ai-docs/services-spec.md +11 -3
- package/src/services/config/Util.ts +6 -0
- package/src/services/config/ai-docs/config-spec.md +14 -3
- package/src/services/config/constants.ts +12 -0
- package/src/services/config/index.ts +65 -0
- package/src/services/config/types.ts +13 -2
- package/src/services/core/Utils.ts +4 -0
- package/src/services/task/TaskFactory.ts +1 -0
- package/src/services/task/TaskManager.ts +85 -87
- package/src/services/task/ai-docs/task-spec.md +7 -3
- package/src/services/task/types.ts +16 -0
- package/src/services/task/voice/Voice.ts +74 -52
- package/src/services/task/voice/wxAppOfferObservability.ts +204 -0
- package/src/services/task/voice/wxAppVoiceMethods.ts +83 -24
- package/src/services/wxAppDiagnosticLogging.ts +135 -23
- package/src/types.ts +65 -0
- package/src/webex.js +8 -0
- package/test/unit/spec/cc.ts +469 -19
- package/test/unit/spec/services/ApiAiAssistant.ts +134 -2
- package/test/unit/spec/services/WebexCrossClientService.ts +45 -3
- package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +1 -1
- package/test/unit/spec/services/config/Util.ts +44 -0
- package/test/unit/spec/services/config/index.ts +68 -0
- package/test/unit/spec/services/task/TaskManager.ts +214 -3
- package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +33 -0
- package/test/unit/spec/services/task/voice/Voice.ts +10 -51
- package/test/unit/spec/services/task/voice/wxAppOfferObservability.ts +361 -0
- package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +121 -5
- package/test/unit/spec/services/wxAppDiagnosticLogging.ts +44 -8
- package/test/unit/spec/wellnessSampleUtils.ts +288 -0
- package/umd/contact-center.min.js +2 -2
- 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
|
-
|
|
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:
|
|
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,
|