@webex/contact-center 3.9.0-next.10 → 3.9.0-next.12
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/dist/cc.js +1 -0
- package/dist/cc.js.map +1 -1
- package/dist/metrics/behavioral-events.js +37 -0
- package/dist/metrics/behavioral-events.js.map +1 -1
- package/dist/metrics/constants.js +14 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/services/config/types.js +22 -0
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/core/Utils.js +42 -1
- package/dist/services/core/Utils.js.map +1 -1
- package/dist/services/task/TaskManager.js +73 -2
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/constants.js +7 -1
- package/dist/services/task/constants.js.map +1 -1
- package/dist/services/task/contact.js +86 -0
- package/dist/services/task/contact.js.map +1 -1
- package/dist/services/task/index.js +239 -1
- package/dist/services/task/index.js.map +1 -1
- package/dist/services/task/types.js +14 -0
- package/dist/services/task/types.js.map +1 -1
- package/dist/types/metrics/constants.d.ts +13 -0
- package/dist/types/services/config/types.d.ts +44 -0
- package/dist/types/services/core/Utils.d.ts +14 -1
- package/dist/types/services/task/constants.d.ts +6 -0
- package/dist/types/services/task/contact.d.ts +10 -0
- package/dist/types/services/task/index.d.ts +43 -1
- package/dist/types/services/task/types.d.ts +123 -1
- package/dist/webex.js +1 -1
- package/package.json +2 -2
- package/src/cc.ts +1 -0
- package/src/metrics/behavioral-events.ts +38 -0
- package/src/metrics/constants.ts +15 -0
- package/src/services/config/types.ts +22 -0
- package/src/services/core/Utils.ts +44 -0
- package/src/services/task/TaskManager.ts +78 -3
- package/src/services/task/constants.ts +6 -0
- package/src/services/task/contact.ts +80 -0
- package/src/services/task/index.ts +285 -1
- package/src/services/task/types.ts +133 -0
- package/test/unit/spec/cc.ts +1 -0
- package/test/unit/spec/metrics/behavioral-events.ts +42 -0
- package/test/unit/spec/services/task/TaskManager.ts +137 -0
- package/test/unit/spec/services/task/contact.ts +31 -1
- package/test/unit/spec/services/task/index.ts +184 -1
- package/umd/contact-center.min.js +2 -2
- 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
|