@webex/contact-center 3.11.0 → 3.12.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/cc.js +121 -28
  2. package/dist/cc.js.map +1 -1
  3. package/dist/constants.js +5 -1
  4. package/dist/constants.js.map +1 -1
  5. package/dist/index.js +7 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/metrics/behavioral-events.js +13 -0
  8. package/dist/metrics/behavioral-events.js.map +1 -1
  9. package/dist/metrics/constants.js +9 -1
  10. package/dist/metrics/constants.js.map +1 -1
  11. package/dist/services/ApiAiAssistant.js +173 -0
  12. package/dist/services/ApiAiAssistant.js.map +1 -0
  13. package/dist/services/agent/types.js.map +1 -1
  14. package/dist/services/config/Util.js +6 -2
  15. package/dist/services/config/Util.js.map +1 -1
  16. package/dist/services/config/constants.js +12 -0
  17. package/dist/services/config/constants.js.map +1 -1
  18. package/dist/services/config/index.js +41 -2
  19. package/dist/services/config/index.js.map +1 -1
  20. package/dist/services/config/types.js +19 -1
  21. package/dist/services/config/types.js.map +1 -1
  22. package/dist/services/constants.js +27 -1
  23. package/dist/services/constants.js.map +1 -1
  24. package/dist/services/core/Err.js.map +1 -1
  25. package/dist/services/core/Utils.js +28 -6
  26. package/dist/services/core/Utils.js.map +1 -1
  27. package/dist/services/core/aqm-reqs.js +92 -17
  28. package/dist/services/core/aqm-reqs.js.map +1 -1
  29. package/dist/services/core/websocket/WebSocketManager.js +20 -5
  30. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  31. package/dist/services/core/websocket/connection-service.js +3 -1
  32. package/dist/services/core/websocket/connection-service.js.map +1 -1
  33. package/dist/services/index.js +6 -0
  34. package/dist/services/index.js.map +1 -1
  35. package/dist/services/task/TaskManager.js +117 -24
  36. package/dist/services/task/TaskManager.js.map +1 -1
  37. package/dist/services/task/TaskUtils.js +16 -3
  38. package/dist/services/task/TaskUtils.js.map +1 -1
  39. package/dist/services/task/constants.js +15 -1
  40. package/dist/services/task/constants.js.map +1 -1
  41. package/dist/services/task/dialer.js +51 -0
  42. package/dist/services/task/dialer.js.map +1 -1
  43. package/dist/services/task/types.js +15 -0
  44. package/dist/services/task/types.js.map +1 -1
  45. package/dist/types/cc.d.ts +801 -0
  46. package/dist/types/config.d.ts +66 -0
  47. package/dist/types/constants.d.ts +50 -0
  48. package/dist/types/index.d.ts +184 -0
  49. package/dist/types/logger-proxy.d.ts +71 -0
  50. package/dist/types/metrics/MetricsManager.d.ts +223 -0
  51. package/dist/types/metrics/behavioral-events.d.ts +29 -0
  52. package/dist/types/metrics/constants.d.ts +161 -0
  53. package/dist/types/services/AddressBook.d.ts +74 -0
  54. package/dist/types/services/ApiAiAssistant.d.ts +31 -0
  55. package/dist/types/services/EntryPoint.d.ts +67 -0
  56. package/dist/types/services/Queue.d.ts +76 -0
  57. package/dist/types/services/WebCallingService.d.ts +1 -0
  58. package/dist/types/services/agent/index.d.ts +46 -0
  59. package/dist/types/services/agent/types.d.ts +413 -0
  60. package/dist/types/services/config/Util.d.ts +20 -0
  61. package/dist/types/services/config/constants.d.ts +249 -0
  62. package/dist/types/services/config/index.d.ts +177 -0
  63. package/dist/types/services/config/types.d.ts +1207 -0
  64. package/dist/types/services/constants.d.ts +110 -0
  65. package/dist/types/services/core/Err.d.ts +121 -0
  66. package/dist/types/services/core/GlobalTypes.d.ts +58 -0
  67. package/dist/types/services/core/Utils.d.ts +101 -0
  68. package/dist/types/services/core/WebexRequest.d.ts +22 -0
  69. package/dist/types/services/core/aqm-reqs.d.ts +65 -0
  70. package/dist/types/services/core/constants.d.ts +99 -0
  71. package/dist/types/services/core/types.d.ts +47 -0
  72. package/dist/types/services/core/websocket/WebSocketManager.d.ts +35 -0
  73. package/dist/types/services/core/websocket/connection-service.d.ts +27 -0
  74. package/dist/types/services/core/websocket/keepalive.worker.d.ts +2 -0
  75. package/dist/types/services/core/websocket/types.d.ts +37 -0
  76. package/dist/types/services/index.d.ts +54 -0
  77. package/dist/types/services/task/AutoWrapup.d.ts +40 -0
  78. package/dist/types/services/task/TaskManager.d.ts +1 -0
  79. package/dist/types/services/task/TaskUtils.d.ts +92 -0
  80. package/dist/types/services/task/constants.d.ts +84 -0
  81. package/dist/types/services/task/contact.d.ts +69 -0
  82. package/dist/types/services/task/dialer.d.ts +43 -0
  83. package/dist/types/services/task/index.d.ts +650 -0
  84. package/dist/types/services/task/types.d.ts +1319 -0
  85. package/dist/types/types.d.ts +643 -0
  86. package/dist/types/utils/PageCache.d.ts +173 -0
  87. package/dist/types/webex-config.d.ts +53 -0
  88. package/dist/types/webex.d.ts +7 -0
  89. package/dist/types.js +14 -1
  90. package/dist/types.js.map +1 -1
  91. package/dist/webex.js +1 -1
  92. package/package.json +9 -9
  93. package/src/cc.ts +157 -30
  94. package/src/constants.ts +4 -0
  95. package/src/index.ts +1 -0
  96. package/src/metrics/behavioral-events.ts +14 -0
  97. package/src/metrics/constants.ts +11 -0
  98. package/src/services/ApiAiAssistant.ts +217 -0
  99. package/src/services/agent/types.ts +1 -1
  100. package/src/services/config/Util.ts +8 -0
  101. package/src/services/config/constants.ts +12 -0
  102. package/src/services/config/index.ts +45 -1
  103. package/src/services/config/types.ts +67 -0
  104. package/src/services/constants.ts +29 -0
  105. package/src/services/core/Err.ts +1 -0
  106. package/src/services/core/Utils.ts +32 -5
  107. package/src/services/core/aqm-reqs.ts +100 -22
  108. package/src/services/core/websocket/WebSocketManager.ts +21 -6
  109. package/src/services/core/websocket/connection-service.ts +5 -1
  110. package/src/services/index.ts +4 -0
  111. package/src/services/task/TaskManager.ts +174 -27
  112. package/src/services/task/TaskUtils.ts +12 -0
  113. package/src/services/task/constants.ts +16 -0
  114. package/src/services/task/dialer.ts +56 -1
  115. package/src/services/task/types.ts +24 -0
  116. package/src/types.ts +40 -1
  117. package/test/unit/spec/cc.ts +163 -23
  118. package/test/unit/spec/services/ApiAiAssistant.ts +115 -0
  119. package/test/unit/spec/services/config/index.ts +56 -0
  120. package/test/unit/spec/services/core/Utils.ts +63 -1
  121. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +82 -12
  122. package/test/unit/spec/services/core/websocket/connection-service.ts +3 -1
  123. package/test/unit/spec/services/task/TaskManager.ts +1119 -251
  124. package/test/unit/spec/services/task/dialer.ts +198 -112
  125. package/umd/contact-center.min.js +2 -2
  126. package/umd/contact-center.min.js.map +1 -1
package/dist/cc.js CHANGED
@@ -22,9 +22,10 @@ var _WebCallingService = _interopRequireDefault(require("./services/WebCallingSe
22
22
  var _types4 = require("./services/task/types");
23
23
  var _MetricsManager = _interopRequireDefault(require("./metrics/MetricsManager"));
24
24
  var _constants4 = require("./metrics/constants");
25
- var _EntryPoint = _interopRequireDefault(require("./services/EntryPoint"));
26
- var _AddressBook = _interopRequireDefault(require("./services/AddressBook"));
27
- var _Queue = _interopRequireDefault(require("./services/Queue"));
25
+ var _EntryPoint = require("./services/EntryPoint");
26
+ var _AddressBook = require("./services/AddressBook");
27
+ var _Queue = require("./services/Queue");
28
+ var _ApiAiAssistant = require("./services/ApiAiAssistant");
28
29
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
29
30
  /**
30
31
  * @module CCPlugin
@@ -84,6 +85,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
84
85
  * - `task:established` - Task/call has been connected
85
86
  * - `task:ended` - Task/call has ended
86
87
  * - `task:error` - An error occurred during task handling
88
+ * - `task:campaignPreviewReservation` - Campaign preview contact offered to agent
87
89
  *
88
90
  * @public
89
91
  *
@@ -272,6 +274,12 @@ class ContactCenter extends _webexCore.WebexPlugin {
272
274
  * ```
273
275
  */
274
276
 
277
+ /**
278
+ * API instance for AI Assistant operations such as transcript controls.
279
+ * @type {ApiAIAssistant}
280
+ * @public
281
+ */
282
+
275
283
  /**
276
284
  * Logger utility for Contact Center plugin
277
285
  * Provides consistent logging across the plugin
@@ -306,19 +314,18 @@ class ContactCenter extends _webexCore.WebexPlugin {
306
314
  });
307
315
  this.services.webSocketManager.on('message', this.handleWebsocketMessage);
308
316
  this.webCallingService = new _WebCallingService.default(this.$webex);
317
+ this.apiAIAssistant = new _ApiAiAssistant.ApiAIAssistant(this.$webex);
309
318
  this.metricsManager = _MetricsManager.default.getInstance({
310
319
  webex: this.$webex
311
320
  });
312
- this.taskManager = _TaskManager.default.getTaskManager(this.services.contact, this.webCallingService, this.services.webSocketManager);
321
+ this.taskManager = _TaskManager.default.getTaskManager(this.apiAIAssistant, this.services.contact, this.webCallingService, this.services.webSocketManager);
313
322
  this.incomingTaskListener();
314
323
 
315
324
  // Initialize API instances
316
325
  // will have future function for indivdual fetch etc so better be in an object
317
- this.entryPoint = new _EntryPoint.default(this.$webex);
318
- this.addressBook = new _AddressBook.default(this.$webex, () => this.agentConfig?.addressBookId);
319
- this.queue = new _Queue.default(this.$webex);
320
-
321
- // Initialize logger
326
+ this.entryPoint = new _EntryPoint.EntryPoint(this.$webex);
327
+ this.addressBook = new _AddressBook.AddressBook(this.$webex, () => this.agentConfig?.addressBookId);
328
+ this.queue = new _Queue.Queue(this.$webex);
322
329
  _loggerProxy.default.initialize(this.$webex.logger);
323
330
  });
324
331
  }
@@ -353,6 +360,19 @@ class ContactCenter extends _webexCore.WebexPlugin {
353
360
  this.trigger(_types4.TASK_EVENTS.TASK_MERGED, task);
354
361
  };
355
362
 
363
+ /**
364
+ * Handles campaign preview reservation events when a contact is offered to the agent
365
+ * @private
366
+ * @param {ITask} task The campaign reservation task
367
+ */
368
+ handleCampaignPreviewReservation = task => {
369
+ // @ts-ignore
370
+ this.trigger(_types4.TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION, task);
371
+ };
372
+ handleRTDWebsocketMessage = payload => {
373
+ this.taskManager.handleRealtimeWebsocketEvent(payload);
374
+ };
375
+
356
376
  /**
357
377
  * Sets up event listeners for incoming tasks and task hydration
358
378
  * Subscribes to task events from the task manager
@@ -362,6 +382,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
362
382
  this.taskManager.on(_types4.TASK_EVENTS.TASK_INCOMING, this.handleIncomingTask);
363
383
  this.taskManager.on(_types4.TASK_EVENTS.TASK_HYDRATE, this.handleTaskHydrate);
364
384
  this.taskManager.on(_types4.TASK_EVENTS.TASK_MERGED, this.handleTaskMerged);
385
+ this.taskManager.on(_types4.TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION, this.handleCampaignPreviewReservation);
365
386
  }
366
387
 
367
388
  /**
@@ -470,8 +491,10 @@ class ContactCenter extends _webexCore.WebexPlugin {
470
491
  this.metricsManager.timeEvent([_constants4.METRIC_EVENT_NAMES.WEBSOCKET_DEREGISTER_SUCCESS, _constants4.METRIC_EVENT_NAMES.WEBSOCKET_DEREGISTER_FAIL]);
471
492
  this.taskManager.off(_types4.TASK_EVENTS.TASK_INCOMING, this.handleIncomingTask);
472
493
  this.taskManager.off(_types4.TASK_EVENTS.TASK_HYDRATE, this.handleTaskHydrate);
494
+ this.taskManager.off(_types4.TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION, this.handleCampaignPreviewReservation);
473
495
  this.taskManager.unregisterIncomingCallEvent();
474
496
  this.services.webSocketManager.off('message', this.handleWebsocketMessage);
497
+ this.services.rtdWebSocketManager.off('message', this.handleRTDWebsocketMessage);
475
498
  this.services.connectionService.off('connectionLost', this.handleConnectionLost);
476
499
  if (this.agentConfig.webRtcEnabled && this.agentConfig.loginVoiceOptions.includes(_types.LoginOption.BROWSER)) {
477
500
  if (this.$webex.internal.mercury.connected) {
@@ -489,6 +512,9 @@ class ContactCenter extends _webexCore.WebexPlugin {
489
512
  if (!this.services.webSocketManager.isSocketClosed) {
490
513
  this.services.webSocketManager.close(false, 'Unregistering the SDK');
491
514
  }
515
+ if (this.services.rtdWebSocketManager && !this.services.rtdWebSocketManager.isSocketClosed) {
516
+ this.services.rtdWebSocketManager.close(false, 'Unregistering the RTD websocket');
517
+ }
492
518
 
493
519
  // Clear any cached agent configuration
494
520
  this.agentConfig = null;
@@ -596,7 +622,8 @@ class ContactCenter extends _webexCore.WebexPlugin {
596
622
  });
597
623
  try {
598
624
  const data = await this.services.webSocketManager.initWebSocket({
599
- body: this.getConnectionConfig()
625
+ body: this.getConnectionConfig(),
626
+ resource: _constants3.SUBSCRIBE_API
600
627
  });
601
628
  const agentId = data.agentId;
602
629
  const orgId = this.$webex.credentials.getOrgId();
@@ -610,6 +637,28 @@ class ContactCenter extends _webexCore.WebexPlugin {
610
637
  this.taskManager.setWrapupData(this.agentConfig.wrapUpData);
611
638
  this.taskManager.setAgentId(this.agentConfig.agentId);
612
639
  this.taskManager.setWebRtcEnabled(this.agentConfig.webRtcEnabled);
640
+ this.apiAIAssistant.setAIFeatureFlags(this.agentConfig.aiFeature);
641
+ if (this.agentConfig.aiFeature?.realtimeTranscripts?.enable) {
642
+ _loggerProxy.default.info('Connecting to RTD websocket', {
643
+ module: _constants.CC_FILE,
644
+ method: _constants.METHODS.CONNECT_WEBSOCKET
645
+ });
646
+ await this.services.rtdWebSocketManager.initWebSocket({
647
+ body: this.getConnectionConfig(),
648
+ resource: _constants3.RTD_SUBSCRIBE_API
649
+ }).then(() => {
650
+ _loggerProxy.default.log('RTD websocket connected successfully', {
651
+ module: _constants.CC_FILE,
652
+ method: _constants.METHODS.CONNECT_WEBSOCKET
653
+ });
654
+ this.services.rtdWebSocketManager.on('message', this.handleRTDWebsocketMessage);
655
+ }).catch(error => {
656
+ _loggerProxy.default.error(`Error during RTD websocket setup: ${error}`, {
657
+ module: _constants.CC_FILE,
658
+ method: _constants.METHODS.CONNECT_WEBSOCKET
659
+ });
660
+ });
661
+ }
613
662
  if (this.agentConfig.webRtcEnabled && this.agentConfig.loginVoiceOptions.includes(_types.LoginOption.BROWSER)) {
614
663
  try {
615
664
  await this.$webex.internal.mercury.connect();
@@ -672,7 +721,8 @@ class ContactCenter extends _webexCore.WebexPlugin {
672
721
  });
673
722
  try {
674
723
  this.metricsManager.timeEvent([_constants4.METRIC_EVENT_NAMES.STATION_LOGIN_SUCCESS, _constants4.METRIC_EVENT_NAMES.STATION_LOGIN_FAILED]);
675
- if (data.loginOption === _types.LoginOption.AGENT_DN && !(0, _Utils.isValidDialNumber)(data.dialNumber)) {
724
+ const dialPlanEntries = this.agentConfig?.dialPlan?.dialPlanEntity ?? [];
725
+ if (data.loginOption === _types.LoginOption.AGENT_DN && !(0, _Utils.isValidDialNumber)(data.dialNumber, dialPlanEntries)) {
676
726
  const error = new Error('INVALID_DIAL_NUMBER');
677
727
  // @ts-ignore - adding custom key to the error object
678
728
  error.details = {
@@ -1336,6 +1386,64 @@ class ContactCenter extends _webexCore.WebexPlugin {
1336
1386
  }
1337
1387
  }
1338
1388
 
1389
+ /**
1390
+ * Accepts a campaign preview contact, initiating the outbound call.
1391
+ *
1392
+ * When a campaign manager reserves a contact for an agent, the agent receives an
1393
+ * `AgentOfferCampaignReservation` event. The agent can then accept the preview contact
1394
+ * to initiate the outbound call.
1395
+ *
1396
+ * @param {PreviewContactPayload} payload - The preview contact payload containing interactionId and campaignId (campaign name, not UUID).
1397
+ * @returns {Promise<TaskResponse>} Promise resolving with agent contact on success.
1398
+ * @throws {Error} If the operation fails (network error, customer unavailable, etc.)
1399
+ *
1400
+ * @example
1401
+ * ```typescript
1402
+ * webex.cc.on('task:campaignPreviewReservation', async (task) => {
1403
+ * const { interactionId } = task.data;
1404
+ * // campaignId is the campaign name (e.g. "MyCampaign"), not a UUID
1405
+ * const campaignId = task.data.interaction.callProcessingDetails.campaignId;
1406
+ *
1407
+ * const result = await webex.cc.acceptPreviewContact({ interactionId, campaignId });
1408
+ * });
1409
+ * ```
1410
+ */
1411
+ async acceptPreviewContact(payload) {
1412
+ _loggerProxy.default.info('Accepting campaign preview contact', {
1413
+ module: _constants.CC_FILE,
1414
+ method: _constants.METHODS.ACCEPT_PREVIEW_CONTACT
1415
+ });
1416
+ try {
1417
+ this.metricsManager.timeEvent([_constants4.METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_ACCEPT_SUCCESS, _constants4.METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_ACCEPT_FAILED]);
1418
+ const result = await this.services.dialer.acceptPreviewContact({
1419
+ data: payload
1420
+ });
1421
+ this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_ACCEPT_SUCCESS, {
1422
+ ..._MetricsManager.default.getCommonTrackingFieldForAQMResponse(result),
1423
+ interactionId: payload.interactionId,
1424
+ campaignId: payload.campaignId
1425
+ }, ['behavioral', 'business', 'operational']);
1426
+ _loggerProxy.default.log('Campaign preview contact accepted successfully', {
1427
+ module: _constants.CC_FILE,
1428
+ method: _constants.METHODS.ACCEPT_PREVIEW_CONTACT,
1429
+ trackingId: result.trackingId,
1430
+ interactionId: payload.interactionId
1431
+ });
1432
+ return result;
1433
+ } catch (error) {
1434
+ const failure = error.details;
1435
+ this.metricsManager.trackEvent(_constants4.METRIC_EVENT_NAMES.CAMPAIGN_PREVIEW_ACCEPT_FAILED, {
1436
+ ..._MetricsManager.default.getCommonTrackingFieldForAQMResponseFailed(failure),
1437
+ interactionId: payload.interactionId,
1438
+ campaignId: payload.campaignId
1439
+ }, ['behavioral', 'business', 'operational']);
1440
+ const {
1441
+ error: detailedError
1442
+ } = (0, _Utils.getErrorDetails)(error, _constants.METHODS.ACCEPT_PREVIEW_CONTACT, _constants.CC_FILE);
1443
+ throw detailedError;
1444
+ }
1445
+ }
1446
+
1339
1447
  /**
1340
1448
  * Fetches outdial ANI (Automatic Number Identification) entries for an outdial ANI ID.
1341
1449
  *
@@ -1467,6 +1575,7 @@ class ContactCenter extends _webexCore.WebexPlugin {
1467
1575
  /**
1468
1576
  * Updates the agent device type and login configuration.
1469
1577
  * Use this method to change how an agent connects to the contact center system (e.g., switching from browser-based calling to a desk phone extension).
1578
+ * Change to any field of the profile is allowed;
1470
1579
  *
1471
1580
  * @param {AgentDeviceUpdate} data Configuration containing:
1472
1581
  * - loginOption: New device type ('BROWSER', 'EXTENSION', 'AGENT_DN')
@@ -1500,24 +1609,8 @@ class ContactCenter extends _webexCore.WebexPlugin {
1500
1609
  trackingId
1501
1610
  });
1502
1611
  try {
1503
- // Only block if both loginOption AND teamId remain unchanged
1504
- if (this.webCallingService?.loginOption === data.loginOption && data.teamId === this.agentConfig.currentTeamId) {
1505
- const message = 'Will not proceed with device update as new Device type is same as current device type and teamId is same as current teamId';
1506
- const err = new Error(message);
1507
- err.details = {
1508
- type: 'Identical Device Change Failure',
1509
- orgId: this.$webex.credentials.getOrgId(),
1510
- trackingId,
1511
- data: {
1512
- agentId: this.agentConfig.agentId,
1513
- reasonCode: 'R002',
1514
- reason: message
1515
- }
1516
- };
1517
- throw err;
1518
- }
1519
1612
  await this.stationLogout({
1520
- logoutReason: 'User requested agent device change'
1613
+ logoutReason: 'User requested agent profile update'
1521
1614
  });
1522
1615
  const loginPayload = {
1523
1616
  teamId: data.teamId,