@webex/contact-center 3.9.0-next.10 → 3.9.0-next.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 (46) hide show
  1. package/dist/cc.js +1 -0
  2. package/dist/cc.js.map +1 -1
  3. package/dist/metrics/behavioral-events.js +37 -0
  4. package/dist/metrics/behavioral-events.js.map +1 -1
  5. package/dist/metrics/constants.js +14 -0
  6. package/dist/metrics/constants.js.map +1 -1
  7. package/dist/services/config/types.js +22 -0
  8. package/dist/services/config/types.js.map +1 -1
  9. package/dist/services/core/Utils.js +42 -1
  10. package/dist/services/core/Utils.js.map +1 -1
  11. package/dist/services/task/TaskManager.js +73 -2
  12. package/dist/services/task/TaskManager.js.map +1 -1
  13. package/dist/services/task/constants.js +7 -1
  14. package/dist/services/task/constants.js.map +1 -1
  15. package/dist/services/task/contact.js +86 -0
  16. package/dist/services/task/contact.js.map +1 -1
  17. package/dist/services/task/index.js +239 -1
  18. package/dist/services/task/index.js.map +1 -1
  19. package/dist/services/task/types.js +14 -0
  20. package/dist/services/task/types.js.map +1 -1
  21. package/dist/types/metrics/constants.d.ts +13 -0
  22. package/dist/types/services/config/types.d.ts +44 -0
  23. package/dist/types/services/core/Utils.d.ts +14 -1
  24. package/dist/types/services/task/constants.d.ts +6 -0
  25. package/dist/types/services/task/contact.d.ts +10 -0
  26. package/dist/types/services/task/index.d.ts +43 -1
  27. package/dist/types/services/task/types.d.ts +123 -1
  28. package/dist/webex.js +1 -1
  29. package/package.json +1 -1
  30. package/src/cc.ts +1 -0
  31. package/src/metrics/behavioral-events.ts +38 -0
  32. package/src/metrics/constants.ts +15 -0
  33. package/src/services/config/types.ts +22 -0
  34. package/src/services/core/Utils.ts +44 -0
  35. package/src/services/task/TaskManager.ts +78 -3
  36. package/src/services/task/constants.ts +6 -0
  37. package/src/services/task/contact.ts +80 -0
  38. package/src/services/task/index.ts +285 -1
  39. package/src/services/task/types.ts +133 -0
  40. package/test/unit/spec/cc.ts +1 -0
  41. package/test/unit/spec/metrics/behavioral-events.ts +42 -0
  42. package/test/unit/spec/services/task/TaskManager.ts +137 -0
  43. package/test/unit/spec/services/task/contact.ts +31 -1
  44. package/test/unit/spec/services/task/index.ts +184 -1
  45. package/umd/contact-center.min.js +2 -2
  46. package/umd/contact-center.min.js.map +1 -1
@@ -120,7 +120,7 @@ class Task extends _events.default {
120
120
  * @param data - Initial task data
121
121
  * @param wrapupData - Wrap-up configuration data
122
122
  */
123
- constructor(contact, webCallingService, data, wrapupData) {
123
+ constructor(contact, webCallingService, data, wrapupData, agentId) {
124
124
  super();
125
125
  this.contact = contact;
126
126
  this.data = data;
@@ -130,6 +130,7 @@ class Task extends _events.default {
130
130
  this.metricsManager = _MetricsManager.default.getInstance();
131
131
  this.registerWebCallListeners();
132
132
  this.setupAutoWrapupTimer();
133
+ this.agentId = agentId;
133
134
  }
134
135
 
135
136
  /**
@@ -1257,6 +1258,243 @@ class Task extends _events.default {
1257
1258
  throw err;
1258
1259
  }
1259
1260
  }
1261
+
1262
+ /**
1263
+ * Starts a consultation conference by merging the consultation call with the main call
1264
+ *
1265
+ * Creates a three-way conference between the agent, customer, and consulted party
1266
+ * Extracts required consultation data from the current task data
1267
+ * On success, emits a `task:conferenceStarted` event
1268
+ *
1269
+ * @returns Promise<TaskResponse> - Response from the consultation conference API
1270
+ * @throws Error if the operation fails or if consultation data is invalid
1271
+ *
1272
+ * @example
1273
+ * ```typescript
1274
+ * try {
1275
+ * await task.consultConference();
1276
+ * console.log('Conference started successfully');
1277
+ * } catch (error) {
1278
+ * console.error('Failed to start conference:', error);
1279
+ * }
1280
+ * ```
1281
+ */
1282
+ async consultConference() {
1283
+ // Extract consultation conference data from task data (used in both try and catch)
1284
+ const consultationData = {
1285
+ agentId: this.agentId,
1286
+ destAgentId: this.data.destAgentId,
1287
+ destinationType: this.data.destinationType || 'agent'
1288
+ };
1289
+ try {
1290
+ _loggerProxy.default.info(`Initiating consult conference to ${consultationData.destAgentId}`, {
1291
+ module: _constants.TASK_FILE,
1292
+ method: _constants2.METHODS.CONSULT_CONFERENCE,
1293
+ interactionId: this.data.interactionId
1294
+ });
1295
+ const paramsDataForConferenceV2 = (0, _Utils.buildConsultConferenceParamData)(consultationData, this.data.interactionId);
1296
+ const response = await this.contact.consultConference({
1297
+ interactionId: paramsDataForConferenceV2.interactionId,
1298
+ data: paramsDataForConferenceV2.data
1299
+ });
1300
+
1301
+ // Track success metrics (following consultTransfer pattern)
1302
+ this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.TASK_CONFERENCE_START_SUCCESS, {
1303
+ taskId: this.data.interactionId,
1304
+ destination: paramsDataForConferenceV2.data.to,
1305
+ destinationType: paramsDataForConferenceV2.data.destinationType,
1306
+ agentId: paramsDataForConferenceV2.data.agentId,
1307
+ ..._MetricsManager.default.getCommonTrackingFieldForAQMResponse(response)
1308
+ }, ['operational', 'behavioral', 'business']);
1309
+ _loggerProxy.default.log(`Consult conference started successfully`, {
1310
+ module: _constants.TASK_FILE,
1311
+ method: _constants2.METHODS.CONSULT_CONFERENCE,
1312
+ interactionId: this.data.interactionId
1313
+ });
1314
+ return response;
1315
+ } catch (error) {
1316
+ const err = (0, _Utils.generateTaskErrorObject)(error, _constants2.METHODS.CONSULT_CONFERENCE, _constants.TASK_FILE);
1317
+ const taskErrorProps = {
1318
+ trackingId: err.data?.trackingId,
1319
+ errorMessage: err.data?.message,
1320
+ errorType: err.data?.errorType,
1321
+ errorData: err.data?.errorData,
1322
+ reasonCode: err.data?.reasonCode
1323
+ };
1324
+
1325
+ // Track failure metrics (following consultTransfer pattern)
1326
+ // Build conference data for error tracking using extracted data
1327
+ const failedParamsData = (0, _Utils.buildConsultConferenceParamData)(consultationData, this.data.interactionId);
1328
+ this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.TASK_CONFERENCE_START_FAILED, {
1329
+ taskId: this.data.interactionId,
1330
+ destination: failedParamsData.data.to,
1331
+ destinationType: failedParamsData.data.destinationType,
1332
+ agentId: failedParamsData.data.agentId,
1333
+ error: error.toString(),
1334
+ ...taskErrorProps,
1335
+ ..._MetricsManager.default.getCommonTrackingFieldForAQMResponseFailed(error.details || {})
1336
+ }, ['operational', 'behavioral', 'business']);
1337
+ _loggerProxy.default.error(`Failed to start consult conference`, {
1338
+ module: _constants.TASK_FILE,
1339
+ method: _constants2.METHODS.CONSULT_CONFERENCE,
1340
+ interactionId: this.data.interactionId
1341
+ });
1342
+ throw err;
1343
+ }
1344
+ }
1345
+
1346
+ /**
1347
+ * Exits the current conference by removing the agent from the conference call
1348
+ *
1349
+ * Exits the agent from the conference, leaving the customer and consulted party connected
1350
+ * On success, emits a `task:conferenceEnded` event
1351
+ *
1352
+ * @returns Promise<TaskResponse> - Response from the conference exit API
1353
+ * @throws Error if the operation fails or if no active conference exists
1354
+ *
1355
+ * @example
1356
+ * ```typescript
1357
+ * try {
1358
+ * await task.exitConference();
1359
+ * console.log('Successfully exited conference');
1360
+ * } catch (error) {
1361
+ * console.error('Failed to exit conference:', error);
1362
+ * }
1363
+ * ```
1364
+ */
1365
+ async exitConference() {
1366
+ try {
1367
+ _loggerProxy.default.info(`Exiting consult conference`, {
1368
+ module: _constants.TASK_FILE,
1369
+ method: _constants2.METHODS.EXIT_CONFERENCE,
1370
+ interactionId: this.data.interactionId
1371
+ });
1372
+
1373
+ // Validate that interaction ID exists
1374
+ if (!this.data.interactionId) {
1375
+ throw new Error('Invalid interaction ID');
1376
+ }
1377
+ const response = await this.contact.exitConference({
1378
+ interactionId: this.data.interactionId
1379
+ });
1380
+
1381
+ // Track success metrics (following consultTransfer pattern)
1382
+ this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.TASK_CONFERENCE_END_SUCCESS, {
1383
+ taskId: this.data.interactionId,
1384
+ ..._MetricsManager.default.getCommonTrackingFieldForAQMResponse(response)
1385
+ }, ['operational', 'behavioral', 'business']);
1386
+ _loggerProxy.default.log(`Consult conference exited successfully`, {
1387
+ module: _constants.TASK_FILE,
1388
+ method: _constants2.METHODS.EXIT_CONFERENCE,
1389
+ interactionId: this.data.interactionId
1390
+ });
1391
+ return response;
1392
+ } catch (error) {
1393
+ const err = (0, _Utils.generateTaskErrorObject)(error, _constants2.METHODS.EXIT_CONFERENCE, _constants.TASK_FILE);
1394
+ const taskErrorProps = {
1395
+ trackingId: err.data?.trackingId,
1396
+ errorMessage: err.data?.message,
1397
+ errorType: err.data?.errorType,
1398
+ errorData: err.data?.errorData,
1399
+ reasonCode: err.data?.reasonCode
1400
+ };
1401
+
1402
+ // Track failure metrics (following consultTransfer pattern)
1403
+ this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.TASK_CONFERENCE_END_FAILED, {
1404
+ taskId: this.data.interactionId,
1405
+ error: error.toString(),
1406
+ ...taskErrorProps,
1407
+ ..._MetricsManager.default.getCommonTrackingFieldForAQMResponseFailed(error.details || {})
1408
+ }, ['operational', 'behavioral', 'business']);
1409
+ _loggerProxy.default.error(`Failed to exit consult conference`, {
1410
+ module: _constants.TASK_FILE,
1411
+ method: _constants2.METHODS.EXIT_CONFERENCE,
1412
+ interactionId: this.data.interactionId
1413
+ });
1414
+ throw err;
1415
+ }
1416
+ }
1417
+
1418
+ // TODO: Uncomment this method in future PR for Multi-Party Conference support (>3 participants)
1419
+ // Conference transfer will be supported when implementing enhanced multi-party conference functionality
1420
+ /*
1421
+ /**
1422
+ * Transfers the current conference to another agent
1423
+ *
1424
+ * Moves the entire conference (including all participants) to a new agent,
1425
+ * while the current agent exits and goes to wrapup
1426
+ * On success, the current agent receives `task:conferenceEnded` event
1427
+ *
1428
+ * @returns Promise<TaskResponse> - Response from the conference transfer API
1429
+ * @throws Error if the operation fails or if no active conference exists
1430
+ *
1431
+ * @example
1432
+ * ```typescript
1433
+ * try {
1434
+ * await task.transferConference();
1435
+ * console.log('Conference transferred successfully');
1436
+ * } catch (error) {
1437
+ * console.error('Failed to transfer conference:', error);
1438
+ * }
1439
+ * ```
1440
+ */
1441
+ /* public async transferConference(): Promise<TaskResponse> {
1442
+ try {
1443
+ LoggerProxy.info(`Transferring conference`, {
1444
+ module: TASK_FILE,
1445
+ method: METHODS.TRANSFER_CONFERENCE,
1446
+ interactionId: this.data.interactionId,
1447
+ });
1448
+ // Validate that interaction ID exists
1449
+ if (!this.data.interactionId) {
1450
+ throw new Error('Invalid interaction ID');
1451
+ }
1452
+ const response = await this.contact.conferenceTransfer({
1453
+ interactionId: this.data.interactionId,
1454
+ });
1455
+ // Track success metrics (following consultTransfer pattern)
1456
+ this.metricsManager.trackEvent(
1457
+ METRIC_EVENT_NAMES.TASK_CONFERENCE_TRANSFER_SUCCESS,
1458
+ {
1459
+ taskId: this.data.interactionId,
1460
+ ...MetricsManager.getCommonTrackingFieldForAQMResponse(response),
1461
+ },
1462
+ ['operational', 'behavioral', 'business']
1463
+ );
1464
+ LoggerProxy.log(`Conference transferred successfully`, {
1465
+ module: TASK_FILE,
1466
+ method: METHODS.TRANSFER_CONFERENCE,
1467
+ interactionId: this.data.interactionId,
1468
+ });
1469
+ return response;
1470
+ } catch (error) {
1471
+ const err = generateTaskErrorObject(error, METHODS.TRANSFER_CONFERENCE, TASK_FILE);
1472
+ const taskErrorProps = {
1473
+ trackingId: err.data?.trackingId,
1474
+ errorMessage: err.data?.message,
1475
+ errorType: err.data?.errorType,
1476
+ errorData: err.data?.errorData,
1477
+ reasonCode: err.data?.reasonCode,
1478
+ };
1479
+ // Track failure metrics (following consultTransfer pattern)
1480
+ this.metricsManager.trackEvent(
1481
+ METRIC_EVENT_NAMES.TASK_CONFERENCE_TRANSFER_FAILED,
1482
+ {
1483
+ taskId: this.data.interactionId,
1484
+ error: error.toString(),
1485
+ ...taskErrorProps,
1486
+ ...MetricsManager.getCommonTrackingFieldForAQMResponseFailed(error.details || {}),
1487
+ },
1488
+ ['operational', 'behavioral', 'business']
1489
+ );
1490
+ LoggerProxy.error(`Failed to transfer conference`, {
1491
+ module: TASK_FILE,
1492
+ method: METHODS.TRANSFER_CONFERENCE,
1493
+ interactionId: this.data.interactionId,
1494
+ });
1495
+ throw err;
1496
+ }
1497
+ } */
1260
1498
  }
1261
1499
  exports.default = Task;
1262
1500
  //# sourceMappingURL=index.js.map