@webex/contact-center 3.10.0-next.1 → 3.10.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.
- package/dist/cc.js +11 -0
- package/dist/cc.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/services/config/types.js +2 -2
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/core/Utils.js +90 -71
- package/dist/services/core/Utils.js.map +1 -1
- package/dist/services/core/constants.js +17 -1
- package/dist/services/core/constants.js.map +1 -1
- package/dist/services/task/TaskManager.js +62 -29
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/TaskUtils.js +33 -5
- package/dist/services/task/TaskUtils.js.map +1 -1
- package/dist/services/task/index.js +45 -39
- package/dist/services/task/index.js.map +1 -1
- package/dist/services/task/types.js +2 -4
- package/dist/services/task/types.js.map +1 -1
- package/dist/types/cc.d.ts +6 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/services/config/types.d.ts +4 -4
- package/dist/types/services/core/Utils.d.ts +32 -17
- package/dist/types/services/core/constants.d.ts +14 -0
- package/dist/types/services/task/TaskUtils.d.ts +17 -3
- package/dist/types/services/task/types.d.ts +25 -13
- package/dist/webex.js +1 -1
- package/package.json +8 -8
- package/src/cc.ts +11 -0
- package/src/index.ts +1 -0
- package/src/services/config/types.ts +2 -2
- package/src/services/core/Utils.ts +101 -85
- package/src/services/core/constants.ts +16 -0
- package/src/services/task/TaskManager.ts +77 -22
- package/src/services/task/TaskUtils.ts +37 -5
- package/src/services/task/index.ts +50 -63
- package/src/services/task/types.ts +26 -13
- package/test/unit/spec/services/core/Utils.ts +262 -31
- package/test/unit/spec/services/task/TaskManager.ts +370 -1
- package/test/unit/spec/services/task/TaskUtils.ts +6 -6
- package/test/unit/spec/services/task/index.ts +323 -68
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
|
@@ -107,7 +107,8 @@ class TaskManager extends _events.default {
|
|
|
107
107
|
});
|
|
108
108
|
task = new _.default(this.contact, this.webCallingService, {
|
|
109
109
|
...payload.data,
|
|
110
|
-
wrapUpRequired: payload.data.interaction?.participants?.[this.agentId]?.isWrapUp || false
|
|
110
|
+
wrapUpRequired: payload.data.interaction?.participants?.[this.agentId]?.isWrapUp || false,
|
|
111
|
+
isConferenceInProgress: (0, _TaskUtils.getIsConferenceInProgress)(payload.data)
|
|
111
112
|
}, this.wrapupData, this.agentId);
|
|
112
113
|
this.taskCollection[payload.data.interactionId] = task;
|
|
113
114
|
// Condition 1: The state is=new i.e it is a incoming task
|
|
@@ -194,12 +195,18 @@ class TaskManager extends _events.default {
|
|
|
194
195
|
break;
|
|
195
196
|
}
|
|
196
197
|
case _types2.CC_EVENTS.CONTACT_ENDED:
|
|
198
|
+
// Update task data
|
|
197
199
|
task = this.updateTaskData(task, {
|
|
198
200
|
...payload.data,
|
|
199
|
-
wrapUpRequired: payload.data.interaction.state !== 'new'
|
|
201
|
+
wrapUpRequired: payload.data.interaction.state !== 'new' && !(0, _TaskUtils.isSecondaryEpDnAgent)(payload.data.interaction)
|
|
200
202
|
});
|
|
203
|
+
|
|
204
|
+
// Handle cleanup based on whether task should be deleted
|
|
201
205
|
this.handleTaskCleanup(task);
|
|
202
|
-
task
|
|
206
|
+
task?.emit(_types.TASK_EVENTS.TASK_END, task);
|
|
207
|
+
break;
|
|
208
|
+
case _types2.CC_EVENTS.CONTACT_MERGED:
|
|
209
|
+
task = this.handleContactMerged(task, payload.data);
|
|
203
210
|
break;
|
|
204
211
|
case _types2.CC_EVENTS.AGENT_CONTACT_HELD:
|
|
205
212
|
// As soon as the main interaction is held, we need to emit TASK_HOLD
|
|
@@ -322,22 +329,13 @@ class TaskManager extends _events.default {
|
|
|
322
329
|
} else {
|
|
323
330
|
this.removeTaskFromCollection(task);
|
|
324
331
|
}
|
|
325
|
-
task
|
|
332
|
+
task.emit(_types.TASK_EVENTS.TASK_CONFERENCE_ENDED, task);
|
|
326
333
|
break;
|
|
327
334
|
case _types2.CC_EVENTS.PARTICIPANT_JOINED_CONFERENCE:
|
|
328
335
|
{
|
|
329
|
-
// Participant joined conference - update task state with participant information and emit event
|
|
330
|
-
// Pre-calculate isConferenceInProgress with updated data to avoid double update
|
|
331
|
-
const simulatedTaskForJoin = {
|
|
332
|
-
...task,
|
|
333
|
-
data: {
|
|
334
|
-
...task.data,
|
|
335
|
-
...payload.data
|
|
336
|
-
}
|
|
337
|
-
};
|
|
338
336
|
task = this.updateTaskData(task, {
|
|
339
337
|
...payload.data,
|
|
340
|
-
isConferenceInProgress: (0, _TaskUtils.getIsConferenceInProgress)(
|
|
338
|
+
isConferenceInProgress: (0, _TaskUtils.getIsConferenceInProgress)(payload.data)
|
|
341
339
|
});
|
|
342
340
|
task.emit(_types.TASK_EVENTS.TASK_PARTICIPANT_JOINED, task);
|
|
343
341
|
break;
|
|
@@ -345,17 +343,10 @@ class TaskManager extends _events.default {
|
|
|
345
343
|
case _types2.CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE:
|
|
346
344
|
{
|
|
347
345
|
// Conference ended - update task state and emit event
|
|
348
|
-
|
|
349
|
-
const simulatedTaskForLeft = {
|
|
350
|
-
...task,
|
|
351
|
-
data: {
|
|
352
|
-
...task.data,
|
|
353
|
-
...payload.data
|
|
354
|
-
}
|
|
355
|
-
};
|
|
346
|
+
|
|
356
347
|
task = this.updateTaskData(task, {
|
|
357
348
|
...payload.data,
|
|
358
|
-
isConferenceInProgress: (0, _TaskUtils.getIsConferenceInProgress)(
|
|
349
|
+
isConferenceInProgress: (0, _TaskUtils.getIsConferenceInProgress)(payload.data)
|
|
359
350
|
});
|
|
360
351
|
if ((0, _TaskUtils.checkParticipantNotInInteraction)(task, this.agentId)) {
|
|
361
352
|
if ((0, _TaskUtils.isParticipantInMainInteraction)(task, this.agentId) || (0, _TaskUtils.isPrimary)(task, this.agentId)) {
|
|
@@ -388,13 +379,10 @@ class TaskManager extends _events.default {
|
|
|
388
379
|
task = this.updateTaskData(task, payload.data);
|
|
389
380
|
task.emit(_types.TASK_EVENTS.TASK_CONFERENCE_TRANSFER_FAILED, task);
|
|
390
381
|
break;
|
|
391
|
-
case _types2.CC_EVENTS.CONSULTED_PARTICIPANT_MOVING:
|
|
392
|
-
// Participant is being moved/transferred - update task state with movement info
|
|
393
|
-
task = this.updateTaskData(task, payload.data);
|
|
394
|
-
break;
|
|
395
382
|
case _types2.CC_EVENTS.PARTICIPANT_POST_CALL_ACTIVITY:
|
|
396
383
|
// Post-call activity for participant - update task state with activity details
|
|
397
384
|
task = this.updateTaskData(task, payload.data);
|
|
385
|
+
task.emit(_types.TASK_EVENTS.TASK_POST_CALL_ACTIVITY, task);
|
|
398
386
|
break;
|
|
399
387
|
default:
|
|
400
388
|
break;
|
|
@@ -428,6 +416,44 @@ class TaskManager extends _events.default {
|
|
|
428
416
|
return task;
|
|
429
417
|
}
|
|
430
418
|
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Handles CONTACT_MERGED event logic
|
|
422
|
+
* @param task - The task to process
|
|
423
|
+
* @param taskData - The task data from the event payload
|
|
424
|
+
* @returns Updated or newly created task
|
|
425
|
+
* @private
|
|
426
|
+
*/
|
|
427
|
+
handleContactMerged(task, taskData) {
|
|
428
|
+
if (taskData.childInteractionId) {
|
|
429
|
+
// remove the child task from collection
|
|
430
|
+
this.removeTaskFromCollection(this.taskCollection[taskData.childInteractionId]);
|
|
431
|
+
}
|
|
432
|
+
if (this.taskCollection[taskData.interactionId]) {
|
|
433
|
+
_loggerProxy.default.log(`Got CONTACT_MERGED: Task already exists in collection`, {
|
|
434
|
+
module: _constants.TASK_MANAGER_FILE,
|
|
435
|
+
method: _constants2.METHODS.REGISTER_TASK_LISTENERS,
|
|
436
|
+
interactionId: taskData.interactionId
|
|
437
|
+
});
|
|
438
|
+
// update the task data
|
|
439
|
+
task = this.updateTaskData(task, taskData);
|
|
440
|
+
} else {
|
|
441
|
+
// Case2 : Task is not present in taskCollection
|
|
442
|
+
_loggerProxy.default.log(`Got CONTACT_MERGED : Creating new task in taskManager`, {
|
|
443
|
+
module: _constants.TASK_MANAGER_FILE,
|
|
444
|
+
method: _constants2.METHODS.REGISTER_TASK_LISTENERS,
|
|
445
|
+
interactionId: taskData.interactionId
|
|
446
|
+
});
|
|
447
|
+
task = new _.default(this.contact, this.webCallingService, {
|
|
448
|
+
...taskData,
|
|
449
|
+
wrapUpRequired: taskData.interaction?.participants?.[this.agentId]?.isWrapUp || false,
|
|
450
|
+
isConferenceInProgress: (0, _TaskUtils.getIsConferenceInProgress)(taskData)
|
|
451
|
+
}, this.wrapupData, this.agentId);
|
|
452
|
+
this.taskCollection[taskData.interactionId] = task;
|
|
453
|
+
}
|
|
454
|
+
this.emit(_types.TASK_EVENTS.TASK_MERGED, task);
|
|
455
|
+
return task;
|
|
456
|
+
}
|
|
431
457
|
removeTaskFromCollection(task) {
|
|
432
458
|
if (task?.data?.interactionId) {
|
|
433
459
|
delete this.taskCollection[task.data.interactionId];
|
|
@@ -438,13 +464,20 @@ class TaskManager extends _events.default {
|
|
|
438
464
|
});
|
|
439
465
|
}
|
|
440
466
|
}
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* Handles cleanup of task resources including Desktop/WebRTC call cleanup and task removal
|
|
470
|
+
* @param task - The task to clean up
|
|
471
|
+
* @private
|
|
472
|
+
*/
|
|
441
473
|
handleTaskCleanup(task) {
|
|
474
|
+
// Clean up Desktop/WebRTC calling resources for browser-based telephony tasks
|
|
442
475
|
if (this.webCallingService.loginOption === _types3.LoginOption.BROWSER && task.data.interaction.mediaType === 'telephony') {
|
|
443
476
|
task.unregisterWebCallListeners();
|
|
444
477
|
this.webCallingService.cleanUpCall();
|
|
445
478
|
}
|
|
446
|
-
if (task.data.interaction.state === 'new') {
|
|
447
|
-
// Only remove tasks in 'new' state immediately. For other states,
|
|
479
|
+
if (task.data.interaction.state === 'new' || (0, _TaskUtils.isSecondaryEpDnAgent)(task.data.interaction)) {
|
|
480
|
+
// Only remove tasks in 'new' state or isSecondaryEpDnAgent immediately. For other states,
|
|
448
481
|
// retain tasks until they complete wrap-up, unless the task disconnected before being answered.
|
|
449
482
|
this.removeTaskFromCollection(task);
|
|
450
483
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_events","_interopRequireDefault","require","_calling","_types","_constants","_constants2","_types2","_types3","_loggerProxy","_","_MetricsManager","_constants3","_TaskUtils","obj","__esModule","default","TaskManager","EventEmitter","constructor","contact","webCallingService","webSocketManager","taskCollection","metricsManager","MetricsManager","getInstance","registerTaskListeners","registerIncomingCallEvent","setWrapupData","wrapupData","setAgentId","agentId","getAgentId","handleIncomingWebCall","call","currentTask","Object","values","find","task","data","interaction","mediaType","mapCallToTask","getCallId","interactionId","LoggerProxy","log","module","TASK_MANAGER_FILE","method","METHODS","HANDLE_INCOMING_WEB_CALL","emit","TASK_EVENTS","TASK_INCOMING","on","LINE_EVENTS","INCOMING_CALL","unregisterIncomingCallEvent","off","event","payload","JSON","parse","type","CC_TASK_EVENTS","includes","info","REGISTER_TASK_LISTENERS","CC_EVENTS","AGENT_CONTACT","Task","wrapUpRequired","participants","isWrapUp","state","TASK_HYDRATE","AGENT_CONTACT_RESERVED","isConsulted","loginOption","LoginOption","BROWSER","MEDIA_CHANNEL","TELEPHONY","AGENT_OFFER_CONTACT","updateTaskData","TASK_OFFER_CONTACT","AGENT_OUTBOUND_FAILED","removeTaskFromCollection","AGENT_CONTACT_ASSIGNED","TASK_ASSIGNED","AGENT_CONTACT_UNASSIGNED","TASK_END","AGENT_CONTACT_OFFER_RONA","AGENT_CONTACT_ASSIGN_FAILED","AGENT_INVITE_FAILED","eventTypeToMetricMap","metricEventName","trackEvent","METRIC_EVENT_NAMES","getCommonTrackingFieldForAQMResponse","taskId","reason","handleTaskCleanup","TASK_REJECT","CONTACT_ENDED","AGENT_CONTACT_HELD","TASK_HOLD","AGENT_CONTACT_UNHELD","TASK_RESUME","AGENT_VTEAM_TRANSFERRED","AGENT_CTQ_CANCEL_FAILED","TASK_CONSULT_QUEUE_FAILED","AGENT_CONSULT_CREATED","TASK_CONSULT_CREATED","AGENT_OFFER_CONSULT","TASK_OFFER_CONSULT","AGENT_CONSULTING","TASK_CONSULT_ACCEPTED","TASK_CONSULTING","AGENT_CONSULT_FAILED","AGENT_CONSULT_ENDED","TASK_CONSULT_END","AGENT_CTQ_CANCELLED","TASK_CONSULT_QUEUE_CANCELLED","AGENT_WRAPUP","AGENT_WRAPPEDUP","cancelAutoWrapupTimer","TASK_WRAPPEDUP","CONTACT_RECORDING_PAUSED","TASK_RECORDING_PAUSED","CONTACT_RECORDING_PAUSE_FAILED","TASK_RECORDING_PAUSE_FAILED","CONTACT_RECORDING_RESUMED","TASK_RECORDING_RESUMED","CONTACT_RECORDING_RESUME_FAILED","TASK_RECORDING_RESUME_FAILED","AGENT_CONSULT_CONFERENCING","TASK_CONFERENCE_ESTABLISHING","AGENT_CONSULT_CONFERENCED","TASK_CONFERENCE_STARTED","AGENT_CONSULT_CONFERENCE_FAILED","TASK_CONFERENCE_FAILED","AGENT_CONSULT_CONFERENCE_ENDED","isPrimary","isParticipantInMainInteraction","TASK_CONFERENCE_ENDED","PARTICIPANT_JOINED_CONFERENCE","simulatedTaskForJoin","isConferenceInProgress","getIsConferenceInProgress","TASK_PARTICIPANT_JOINED","PARTICIPANT_LEFT_CONFERENCE","simulatedTaskForLeft","checkParticipantNotInInteraction","TASK_PARTICIPANT_LEFT","PARTICIPANT_LEFT_CONFERENCE_FAILED","TASK_PARTICIPANT_LEFT_FAILED","AGENT_CONSULT_CONFERENCE_END_FAILED","TASK_CONFERENCE_END_FAILED","AGENT_CONFERENCE_TRANSFERRED","TASK_CONFERENCE_TRANSFERRED","AGENT_CONFERENCE_TRANSFER_FAILED","TASK_CONFERENCE_TRANSFER_FAILED","CONSULTED_PARTICIPANT_MOVING","PARTICIPANT_POST_CALL_ACTIVITY","taskData","undefined","warn","UPDATE_TASK_DATA","error","REMOVE_TASK_FROM_COLLECTION","unregisterWebCallListeners","cleanUpCall","getTask","getAllTasks","getTaskManager","taskManager","exports"],"sources":["TaskManager.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport {ICall, LINE_EVENTS} from '@webex/calling';\nimport {WebSocketManager} from '../core/websocket/WebSocketManager';\nimport routingContact from './contact';\nimport WebCallingService from '../WebCallingService';\nimport {ITask, MEDIA_CHANNEL, TASK_EVENTS, TaskData, TaskId} from './types';\nimport {TASK_MANAGER_FILE} from '../../constants';\nimport {METHODS} from './constants';\nimport {CC_EVENTS, CC_TASK_EVENTS, WrapupData} from '../config/types';\nimport {LoginOption} from '../../types';\nimport LoggerProxy from '../../logger-proxy';\nimport Task from '.';\nimport MetricsManager from '../../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../../metrics/constants';\nimport {\n checkParticipantNotInInteraction,\n getIsConferenceInProgress,\n isParticipantInMainInteraction,\n isPrimary,\n} from './TaskUtils';\n\n/** @internal */\nexport default class TaskManager extends EventEmitter {\n private call: ICall;\n private contact: ReturnType<typeof routingContact>;\n /**\n * Collection of tasks indexed by TaskId\n * @type {Record<TaskId, ITask>}\n * @private\n */\n private taskCollection: Record<TaskId, ITask>;\n private webCallingService: WebCallingService;\n private webSocketManager: WebSocketManager;\n private metricsManager: MetricsManager;\n private static taskManager;\n private wrapupData: WrapupData;\n private agentId: string;\n /**\n * @param contact - Routing Contact layer. Talks to AQMReq layer to convert events to promises\n * @param webCallingService - Webrtc Service Layer\n * @param webSocketManager - Websocket Manager to maintain websocket connection and keepalives\n */\n constructor(\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager\n ) {\n super();\n this.contact = contact;\n this.taskCollection = {};\n this.webCallingService = webCallingService;\n this.webSocketManager = webSocketManager;\n this.metricsManager = MetricsManager.getInstance();\n this.registerTaskListeners();\n this.registerIncomingCallEvent();\n }\n\n public setWrapupData(wrapupData: WrapupData) {\n this.wrapupData = wrapupData;\n }\n\n public setAgentId(agentId: string) {\n this.agentId = agentId;\n }\n\n /**\n * Gets the current agent ID\n * @returns {string} The agent ID set for this task manager instance\n * @public\n */\n public getAgentId(): string {\n return this.agentId;\n }\n\n private handleIncomingWebCall = (call: ICall) => {\n const currentTask = Object.values(this.taskCollection).find(\n (task) => task.data.interaction.mediaType === 'telephony'\n );\n\n if (currentTask) {\n this.webCallingService.mapCallToTask(call.getCallId(), currentTask.data.interactionId);\n LoggerProxy.log(`Call mapped to task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_INCOMING_WEB_CALL,\n interactionId: currentTask.data.interactionId,\n });\n this.emit(TASK_EVENTS.TASK_INCOMING, currentTask);\n }\n this.call = call;\n };\n\n public registerIncomingCallEvent() {\n this.webCallingService.on(LINE_EVENTS.INCOMING_CALL, this.handleIncomingWebCall);\n }\n\n public unregisterIncomingCallEvent() {\n this.webCallingService.off(LINE_EVENTS.INCOMING_CALL, this.handleIncomingWebCall);\n }\n\n private registerTaskListeners() {\n this.webSocketManager.on('message', (event) => {\n const payload = JSON.parse(event);\n // Re-emit the task events to the task object\n let task: ITask;\n if (payload.data?.type) {\n if (Object.values(CC_TASK_EVENTS).includes(payload.data.type)) {\n task = this.taskCollection[payload.data.interactionId];\n }\n LoggerProxy.info(`Handling task event ${payload.data?.type}`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data?.interactionId,\n });\n switch (payload.data.type) {\n case CC_EVENTS.AGENT_CONTACT:\n // Case1 : Task is already present in taskCollection\n if (this.taskCollection[payload.data.interactionId]) {\n LoggerProxy.log(`Got AGENT_CONTACT: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n });\n break;\n } else if (!this.taskCollection[payload.data.interactionId]) {\n // Case2 : Task is not present in taskCollection\n LoggerProxy.log(`Got AGENT_CONTACT : Creating new task in taskManager`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n });\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...payload.data,\n wrapUpRequired:\n payload.data.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.data.interactionId] = task;\n // Condition 1: The state is=new i.e it is a incoming task\n if (payload.data.interaction.state === 'new') {\n LoggerProxy.log(\n `Got AGENT_CONTACT for a task with state=new, sending TASK_INCOMING event`,\n {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n }\n );\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n } else {\n // Condition 2: The state is anything else i.e the task was connected\n LoggerProxy.log(\n `Got AGENT_CONTACT for a task with state=${payload.data.interaction.state}, sending TASK_HYDRATE event`,\n {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n }\n );\n this.emit(TASK_EVENTS.TASK_HYDRATE, task);\n }\n }\n break;\n case CC_EVENTS.AGENT_CONTACT_RESERVED:\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...payload.data,\n isConsulted: false,\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.data.interactionId] = task;\n if (\n this.webCallingService.loginOption !== LoginOption.BROWSER ||\n task.data.interaction.mediaType !== MEDIA_CHANNEL.TELEPHONY // for digital channels\n ) {\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n } else if (this.call) {\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n }\n break;\n case CC_EVENTS.AGENT_OFFER_CONTACT:\n // We don't have to emit any event here since this will be result of promise.\n task = this.updateTaskData(task, payload.data);\n LoggerProxy.log(`Agent offer contact received for task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data?.interactionId,\n });\n this.emit(TASK_EVENTS.TASK_OFFER_CONTACT, task);\n break;\n case CC_EVENTS.AGENT_OUTBOUND_FAILED:\n // We don't have to emit any event here since this will be result of promise.\n if (task.data) {\n this.removeTaskFromCollection(task);\n }\n LoggerProxy.log(`Agent outbound failed for task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data?.interactionId,\n });\n break;\n case CC_EVENTS.AGENT_CONTACT_ASSIGNED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_ASSIGNED, task);\n break;\n case CC_EVENTS.AGENT_CONTACT_UNASSIGNED:\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired: true,\n });\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_CONTACT_OFFER_RONA:\n case CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED:\n case CC_EVENTS.AGENT_INVITE_FAILED: {\n task = this.updateTaskData(task, payload.data);\n\n const eventTypeToMetricMap: Record<string, keyof typeof METRIC_EVENT_NAMES> = {\n [CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED]: 'AGENT_CONTACT_ASSIGN_FAILED',\n [CC_EVENTS.AGENT_INVITE_FAILED]: 'AGENT_INVITE_FAILED',\n };\n const metricEventName: keyof typeof METRIC_EVENT_NAMES =\n eventTypeToMetricMap[payload.data.type] || 'AGENT_RONA';\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES[metricEventName],\n {\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(payload.data),\n taskId: payload.data.interactionId,\n reason: payload.data.reason,\n },\n ['behavioral', 'operational']\n );\n this.handleTaskCleanup(task);\n task.emit(TASK_EVENTS.TASK_REJECT, payload.data.reason);\n break;\n }\n case CC_EVENTS.CONTACT_ENDED:\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired: payload.data.interaction.state !== 'new',\n });\n this.handleTaskCleanup(task);\n task.emit(TASK_EVENTS.TASK_END, task);\n\n break;\n case CC_EVENTS.AGENT_CONTACT_HELD:\n // As soon as the main interaction is held, we need to emit TASK_HOLD\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_HOLD, task);\n break;\n case CC_EVENTS.AGENT_CONTACT_UNHELD:\n // As soon as the main interaction is unheld, we need to emit TASK_RESUME\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RESUME, task);\n break;\n case CC_EVENTS.AGENT_VTEAM_TRANSFERRED:\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired: true,\n });\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_CTQ_CANCEL_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONSULT_QUEUE_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CREATED:\n // Received when self agent initiates a consult\n task = this.updateTaskData(task, {\n ...payload.data,\n isConsulted: false, // This ensures that the task consult status is always reset\n });\n task.emit(TASK_EVENTS.TASK_CONSULT_CREATED, task);\n break;\n case CC_EVENTS.AGENT_OFFER_CONSULT:\n // Received when other agent sends us a consult offer\n task = this.updateTaskData(task, {\n ...payload.data,\n isConsulted: true, // This ensures that the task is marked as us being requested for a consult\n });\n task.emit(TASK_EVENTS.TASK_OFFER_CONSULT, task);\n break;\n case CC_EVENTS.AGENT_CONSULTING:\n // Received when agent is in an active consult state\n // TODO: Check if we can use backend consult state instead of isConsulted\n task = this.updateTaskData(task, payload.data);\n if (task.data.isConsulted) {\n // Fire only if you are the agent who received the consult request\n task.emit(TASK_EVENTS.TASK_CONSULT_ACCEPTED, task);\n } else {\n // Fire only if you are the agent who initiated the consult\n task.emit(TASK_EVENTS.TASK_CONSULTING, task);\n }\n break;\n case CC_EVENTS.AGENT_CONSULT_FAILED:\n // This can only be received by the agent who initiated the consult.\n // We need not emit any event here since this will be result of promise\n task = this.updateTaskData(task, payload.data);\n break;\n case CC_EVENTS.AGENT_CONSULT_ENDED:\n task = this.updateTaskData(task, payload.data);\n if (task.data.isConsulted) {\n // This will be the end state of the task as soon as we end the consult in case of\n // us being offered a consult\n this.removeTaskFromCollection(task);\n }\n task.emit(TASK_EVENTS.TASK_CONSULT_END, task);\n break;\n case CC_EVENTS.AGENT_CTQ_CANCELLED:\n // This event is received when the consult using queue is cancelled using API\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONSULT_QUEUE_CANCELLED, task);\n break;\n case CC_EVENTS.AGENT_WRAPUP:\n task = this.updateTaskData(task, {...payload.data, wrapUpRequired: true});\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_WRAPPEDUP:\n task.cancelAutoWrapupTimer();\n this.removeTaskFromCollection(task);\n task.emit(TASK_EVENTS.TASK_WRAPPEDUP, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_PAUSED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_PAUSED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_PAUSE_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_PAUSE_FAILED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_RESUMED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_RESUMED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_RESUME_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_RESUME_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCING:\n // Conference is being established - update task state and emit establishing event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_ESTABLISHING, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCED:\n // Conference started successfully - update task state and emit event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_STARTED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_FAILED:\n // Conference failed - update task state and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_ENDED:\n // Conference ended - update task state and emit event\n task = this.updateTaskData(task, payload.data);\n if (\n !task ||\n isPrimary(task, this.agentId) ||\n isParticipantInMainInteraction(task, this.agentId)\n ) {\n LoggerProxy.log('Primary or main interaction participant leaving conference');\n } else {\n this.removeTaskFromCollection(task);\n }\n task?.emit(TASK_EVENTS.TASK_CONFERENCE_ENDED, task);\n break;\n case CC_EVENTS.PARTICIPANT_JOINED_CONFERENCE: {\n // Participant joined conference - update task state with participant information and emit event\n // Pre-calculate isConferenceInProgress with updated data to avoid double update\n const simulatedTaskForJoin = {\n ...task,\n data: {...task.data, ...payload.data},\n };\n task = this.updateTaskData(task, {\n ...payload.data,\n isConferenceInProgress: getIsConferenceInProgress(simulatedTaskForJoin),\n });\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_JOINED, task);\n break;\n }\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE: {\n // Conference ended - update task state and emit event\n // Pre-calculate isConferenceInProgress with updated data to avoid double update\n const simulatedTaskForLeft = {\n ...task,\n data: {...task.data, ...payload.data},\n };\n task = this.updateTaskData(task, {\n ...payload.data,\n isConferenceInProgress: getIsConferenceInProgress(simulatedTaskForLeft),\n });\n if (checkParticipantNotInInteraction(task, this.agentId)) {\n if (\n isParticipantInMainInteraction(task, this.agentId) ||\n isPrimary(task, this.agentId)\n ) {\n LoggerProxy.log('Primary or main interaction participant leaving conference');\n } else {\n this.removeTaskFromCollection(task);\n }\n }\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_LEFT, task);\n break;\n }\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE_FAILED:\n // Conference exit failed - update task state and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_LEFT_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_END_FAILED:\n // Conference end failed - update task state with error details and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_END_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFERRED:\n // Conference was transferred - update task state and emit transfer success event\n // Note: Backend should provide hasLeft and wrapUpRequired status\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_TRANSFERRED, task);\n break;\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFER_FAILED:\n // Conference transfer failed - update task state with error details and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_TRANSFER_FAILED, task);\n break;\n case CC_EVENTS.CONSULTED_PARTICIPANT_MOVING:\n // Participant is being moved/transferred - update task state with movement info\n task = this.updateTaskData(task, payload.data);\n break;\n case CC_EVENTS.PARTICIPANT_POST_CALL_ACTIVITY:\n // Post-call activity for participant - update task state with activity details\n task = this.updateTaskData(task, payload.data);\n break;\n default:\n break;\n }\n if (task) {\n task.emit(payload.data.type, payload.data);\n }\n }\n });\n }\n\n private updateTaskData(task: ITask, taskData: TaskData): ITask {\n if (!task) {\n return undefined;\n }\n\n if (!taskData?.interactionId) {\n LoggerProxy.warn('Received task update with missing interactionId', {\n module: TASK_MANAGER_FILE,\n method: METHODS.UPDATE_TASK_DATA,\n });\n }\n\n try {\n const currentTask = task.updateTaskData(taskData);\n this.taskCollection[taskData.interactionId] = currentTask;\n\n return currentTask;\n } catch (error) {\n LoggerProxy.error(`Failed to update task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.UPDATE_TASK_DATA,\n interactionId: taskData.interactionId,\n });\n\n return task;\n }\n }\n\n private removeTaskFromCollection(task: ITask) {\n if (task?.data?.interactionId) {\n delete this.taskCollection[task.data.interactionId];\n LoggerProxy.info(`Task removed from collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REMOVE_TASK_FROM_COLLECTION,\n interactionId: task.data.interactionId,\n });\n }\n }\n\n private handleTaskCleanup(task: ITask) {\n if (\n this.webCallingService.loginOption === LoginOption.BROWSER &&\n task.data.interaction.mediaType === 'telephony'\n ) {\n task.unregisterWebCallListeners();\n this.webCallingService.cleanUpCall();\n }\n if (task.data.interaction.state === 'new') {\n // Only remove tasks in 'new' state immediately. For other states,\n // retain tasks until they complete wrap-up, unless the task disconnected before being answered.\n this.removeTaskFromCollection(task);\n }\n }\n\n /**\n * @param taskId - Unique identifier for each task\n */\n public getTask = (taskId: string) => {\n return this.taskCollection[taskId];\n };\n\n /**\n * @param taskId - Unique identifier for each task\n */\n public getAllTasks = (): Record<TaskId, ITask> => {\n return this.taskCollection;\n };\n\n /**\n * @param contact - Routing Contact layer. Talks to AQMReq layer to convert events to promises\n * @param webCallingService - Webrtc Service Layer\n * @param webSocketManager - Websocket Manager to maintain websocket connection and keepalives\n */\n public static getTaskManager = (\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager\n ): TaskManager => {\n if (!this.taskManager) {\n this.taskManager = new TaskManager(contact, webCallingService, webSocketManager);\n }\n\n return this.taskManager;\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_events","_interopRequireDefault","require","_calling","_types","_constants","_constants2","_types2","_types3","_loggerProxy","_","_MetricsManager","_constants3","_TaskUtils","obj","__esModule","default","TaskManager","EventEmitter","constructor","contact","webCallingService","webSocketManager","taskCollection","metricsManager","MetricsManager","getInstance","registerTaskListeners","registerIncomingCallEvent","setWrapupData","wrapupData","setAgentId","agentId","getAgentId","handleIncomingWebCall","call","currentTask","Object","values","find","task","data","interaction","mediaType","mapCallToTask","getCallId","interactionId","LoggerProxy","log","module","TASK_MANAGER_FILE","method","METHODS","HANDLE_INCOMING_WEB_CALL","emit","TASK_EVENTS","TASK_INCOMING","on","LINE_EVENTS","INCOMING_CALL","unregisterIncomingCallEvent","off","event","payload","JSON","parse","type","CC_TASK_EVENTS","includes","info","REGISTER_TASK_LISTENERS","CC_EVENTS","AGENT_CONTACT","Task","wrapUpRequired","participants","isWrapUp","isConferenceInProgress","getIsConferenceInProgress","state","TASK_HYDRATE","AGENT_CONTACT_RESERVED","isConsulted","loginOption","LoginOption","BROWSER","MEDIA_CHANNEL","TELEPHONY","AGENT_OFFER_CONTACT","updateTaskData","TASK_OFFER_CONTACT","AGENT_OUTBOUND_FAILED","removeTaskFromCollection","AGENT_CONTACT_ASSIGNED","TASK_ASSIGNED","AGENT_CONTACT_UNASSIGNED","TASK_END","AGENT_CONTACT_OFFER_RONA","AGENT_CONTACT_ASSIGN_FAILED","AGENT_INVITE_FAILED","eventTypeToMetricMap","metricEventName","trackEvent","METRIC_EVENT_NAMES","getCommonTrackingFieldForAQMResponse","taskId","reason","handleTaskCleanup","TASK_REJECT","CONTACT_ENDED","isSecondaryEpDnAgent","CONTACT_MERGED","handleContactMerged","AGENT_CONTACT_HELD","TASK_HOLD","AGENT_CONTACT_UNHELD","TASK_RESUME","AGENT_VTEAM_TRANSFERRED","AGENT_CTQ_CANCEL_FAILED","TASK_CONSULT_QUEUE_FAILED","AGENT_CONSULT_CREATED","TASK_CONSULT_CREATED","AGENT_OFFER_CONSULT","TASK_OFFER_CONSULT","AGENT_CONSULTING","TASK_CONSULT_ACCEPTED","TASK_CONSULTING","AGENT_CONSULT_FAILED","AGENT_CONSULT_ENDED","TASK_CONSULT_END","AGENT_CTQ_CANCELLED","TASK_CONSULT_QUEUE_CANCELLED","AGENT_WRAPUP","AGENT_WRAPPEDUP","cancelAutoWrapupTimer","TASK_WRAPPEDUP","CONTACT_RECORDING_PAUSED","TASK_RECORDING_PAUSED","CONTACT_RECORDING_PAUSE_FAILED","TASK_RECORDING_PAUSE_FAILED","CONTACT_RECORDING_RESUMED","TASK_RECORDING_RESUMED","CONTACT_RECORDING_RESUME_FAILED","TASK_RECORDING_RESUME_FAILED","AGENT_CONSULT_CONFERENCING","TASK_CONFERENCE_ESTABLISHING","AGENT_CONSULT_CONFERENCED","TASK_CONFERENCE_STARTED","AGENT_CONSULT_CONFERENCE_FAILED","TASK_CONFERENCE_FAILED","AGENT_CONSULT_CONFERENCE_ENDED","isPrimary","isParticipantInMainInteraction","TASK_CONFERENCE_ENDED","PARTICIPANT_JOINED_CONFERENCE","TASK_PARTICIPANT_JOINED","PARTICIPANT_LEFT_CONFERENCE","checkParticipantNotInInteraction","TASK_PARTICIPANT_LEFT","PARTICIPANT_LEFT_CONFERENCE_FAILED","TASK_PARTICIPANT_LEFT_FAILED","AGENT_CONSULT_CONFERENCE_END_FAILED","TASK_CONFERENCE_END_FAILED","AGENT_CONFERENCE_TRANSFERRED","TASK_CONFERENCE_TRANSFERRED","AGENT_CONFERENCE_TRANSFER_FAILED","TASK_CONFERENCE_TRANSFER_FAILED","PARTICIPANT_POST_CALL_ACTIVITY","TASK_POST_CALL_ACTIVITY","taskData","undefined","warn","UPDATE_TASK_DATA","error","childInteractionId","TASK_MERGED","REMOVE_TASK_FROM_COLLECTION","unregisterWebCallListeners","cleanUpCall","getTask","getAllTasks","getTaskManager","taskManager","exports"],"sources":["TaskManager.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport {ICall, LINE_EVENTS} from '@webex/calling';\nimport {WebSocketManager} from '../core/websocket/WebSocketManager';\nimport routingContact from './contact';\nimport WebCallingService from '../WebCallingService';\nimport {ITask, MEDIA_CHANNEL, TASK_EVENTS, TaskData, TaskId} from './types';\nimport {TASK_MANAGER_FILE} from '../../constants';\nimport {METHODS} from './constants';\nimport {CC_EVENTS, CC_TASK_EVENTS, WrapupData} from '../config/types';\nimport {LoginOption} from '../../types';\nimport LoggerProxy from '../../logger-proxy';\nimport Task from '.';\nimport MetricsManager from '../../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../../metrics/constants';\nimport {\n checkParticipantNotInInteraction,\n getIsConferenceInProgress,\n isParticipantInMainInteraction,\n isPrimary,\n isSecondaryEpDnAgent,\n} from './TaskUtils';\n\n/** @internal */\nexport default class TaskManager extends EventEmitter {\n private call: ICall;\n private contact: ReturnType<typeof routingContact>;\n /**\n * Collection of tasks indexed by TaskId\n * @type {Record<TaskId, ITask>}\n * @private\n */\n private taskCollection: Record<TaskId, ITask>;\n private webCallingService: WebCallingService;\n private webSocketManager: WebSocketManager;\n private metricsManager: MetricsManager;\n private static taskManager;\n private wrapupData: WrapupData;\n private agentId: string;\n /**\n * @param contact - Routing Contact layer. Talks to AQMReq layer to convert events to promises\n * @param webCallingService - Webrtc Service Layer\n * @param webSocketManager - Websocket Manager to maintain websocket connection and keepalives\n */\n constructor(\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager\n ) {\n super();\n this.contact = contact;\n this.taskCollection = {};\n this.webCallingService = webCallingService;\n this.webSocketManager = webSocketManager;\n this.metricsManager = MetricsManager.getInstance();\n this.registerTaskListeners();\n this.registerIncomingCallEvent();\n }\n\n public setWrapupData(wrapupData: WrapupData) {\n this.wrapupData = wrapupData;\n }\n\n public setAgentId(agentId: string) {\n this.agentId = agentId;\n }\n\n /**\n * Gets the current agent ID\n * @returns {string} The agent ID set for this task manager instance\n * @public\n */\n public getAgentId(): string {\n return this.agentId;\n }\n\n private handleIncomingWebCall = (call: ICall) => {\n const currentTask = Object.values(this.taskCollection).find(\n (task) => task.data.interaction.mediaType === 'telephony'\n );\n\n if (currentTask) {\n this.webCallingService.mapCallToTask(call.getCallId(), currentTask.data.interactionId);\n LoggerProxy.log(`Call mapped to task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_INCOMING_WEB_CALL,\n interactionId: currentTask.data.interactionId,\n });\n this.emit(TASK_EVENTS.TASK_INCOMING, currentTask);\n }\n this.call = call;\n };\n\n public registerIncomingCallEvent() {\n this.webCallingService.on(LINE_EVENTS.INCOMING_CALL, this.handleIncomingWebCall);\n }\n\n public unregisterIncomingCallEvent() {\n this.webCallingService.off(LINE_EVENTS.INCOMING_CALL, this.handleIncomingWebCall);\n }\n\n private registerTaskListeners() {\n this.webSocketManager.on('message', (event) => {\n const payload = JSON.parse(event);\n // Re-emit the task events to the task object\n let task: ITask;\n if (payload.data?.type) {\n if (Object.values(CC_TASK_EVENTS).includes(payload.data.type)) {\n task = this.taskCollection[payload.data.interactionId];\n }\n LoggerProxy.info(`Handling task event ${payload.data?.type}`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data?.interactionId,\n });\n switch (payload.data.type) {\n case CC_EVENTS.AGENT_CONTACT:\n // Case1 : Task is already present in taskCollection\n if (this.taskCollection[payload.data.interactionId]) {\n LoggerProxy.log(`Got AGENT_CONTACT: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n });\n break;\n } else if (!this.taskCollection[payload.data.interactionId]) {\n // Case2 : Task is not present in taskCollection\n LoggerProxy.log(`Got AGENT_CONTACT : Creating new task in taskManager`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n });\n\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...payload.data,\n wrapUpRequired:\n payload.data.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(payload.data),\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.data.interactionId] = task;\n // Condition 1: The state is=new i.e it is a incoming task\n if (payload.data.interaction.state === 'new') {\n LoggerProxy.log(\n `Got AGENT_CONTACT for a task with state=new, sending TASK_INCOMING event`,\n {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n }\n );\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n } else {\n // Condition 2: The state is anything else i.e the task was connected\n LoggerProxy.log(\n `Got AGENT_CONTACT for a task with state=${payload.data.interaction.state}, sending TASK_HYDRATE event`,\n {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n }\n );\n this.emit(TASK_EVENTS.TASK_HYDRATE, task);\n }\n }\n break;\n\n case CC_EVENTS.AGENT_CONTACT_RESERVED:\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...payload.data,\n isConsulted: false,\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.data.interactionId] = task;\n if (\n this.webCallingService.loginOption !== LoginOption.BROWSER ||\n task.data.interaction.mediaType !== MEDIA_CHANNEL.TELEPHONY // for digital channels\n ) {\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n } else if (this.call) {\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n }\n break;\n case CC_EVENTS.AGENT_OFFER_CONTACT:\n // We don't have to emit any event here since this will be result of promise.\n task = this.updateTaskData(task, payload.data);\n LoggerProxy.log(`Agent offer contact received for task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data?.interactionId,\n });\n this.emit(TASK_EVENTS.TASK_OFFER_CONTACT, task);\n break;\n case CC_EVENTS.AGENT_OUTBOUND_FAILED:\n // We don't have to emit any event here since this will be result of promise.\n if (task.data) {\n this.removeTaskFromCollection(task);\n }\n LoggerProxy.log(`Agent outbound failed for task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data?.interactionId,\n });\n break;\n case CC_EVENTS.AGENT_CONTACT_ASSIGNED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_ASSIGNED, task);\n break;\n case CC_EVENTS.AGENT_CONTACT_UNASSIGNED:\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired: true,\n });\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_CONTACT_OFFER_RONA:\n case CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED:\n case CC_EVENTS.AGENT_INVITE_FAILED: {\n task = this.updateTaskData(task, payload.data);\n\n const eventTypeToMetricMap: Record<string, keyof typeof METRIC_EVENT_NAMES> = {\n [CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED]: 'AGENT_CONTACT_ASSIGN_FAILED',\n [CC_EVENTS.AGENT_INVITE_FAILED]: 'AGENT_INVITE_FAILED',\n };\n const metricEventName: keyof typeof METRIC_EVENT_NAMES =\n eventTypeToMetricMap[payload.data.type] || 'AGENT_RONA';\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES[metricEventName],\n {\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(payload.data),\n taskId: payload.data.interactionId,\n reason: payload.data.reason,\n },\n ['behavioral', 'operational']\n );\n this.handleTaskCleanup(task);\n task.emit(TASK_EVENTS.TASK_REJECT, payload.data.reason);\n break;\n }\n case CC_EVENTS.CONTACT_ENDED:\n // Update task data\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired:\n payload.data.interaction.state !== 'new' &&\n !isSecondaryEpDnAgent(payload.data.interaction),\n });\n\n // Handle cleanup based on whether task should be deleted\n this.handleTaskCleanup(task);\n\n task?.emit(TASK_EVENTS.TASK_END, task);\n\n break;\n case CC_EVENTS.CONTACT_MERGED:\n task = this.handleContactMerged(task, payload.data);\n break;\n case CC_EVENTS.AGENT_CONTACT_HELD:\n // As soon as the main interaction is held, we need to emit TASK_HOLD\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_HOLD, task);\n break;\n case CC_EVENTS.AGENT_CONTACT_UNHELD:\n // As soon as the main interaction is unheld, we need to emit TASK_RESUME\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RESUME, task);\n break;\n case CC_EVENTS.AGENT_VTEAM_TRANSFERRED:\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired: true,\n });\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_CTQ_CANCEL_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONSULT_QUEUE_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CREATED:\n // Received when self agent initiates a consult\n task = this.updateTaskData(task, {\n ...payload.data,\n isConsulted: false, // This ensures that the task consult status is always reset\n });\n task.emit(TASK_EVENTS.TASK_CONSULT_CREATED, task);\n break;\n case CC_EVENTS.AGENT_OFFER_CONSULT:\n // Received when other agent sends us a consult offer\n task = this.updateTaskData(task, {\n ...payload.data,\n isConsulted: true, // This ensures that the task is marked as us being requested for a consult\n });\n task.emit(TASK_EVENTS.TASK_OFFER_CONSULT, task);\n break;\n case CC_EVENTS.AGENT_CONSULTING:\n // Received when agent is in an active consult state\n // TODO: Check if we can use backend consult state instead of isConsulted\n task = this.updateTaskData(task, payload.data);\n if (task.data.isConsulted) {\n // Fire only if you are the agent who received the consult request\n task.emit(TASK_EVENTS.TASK_CONSULT_ACCEPTED, task);\n } else {\n // Fire only if you are the agent who initiated the consult\n task.emit(TASK_EVENTS.TASK_CONSULTING, task);\n }\n break;\n case CC_EVENTS.AGENT_CONSULT_FAILED:\n // This can only be received by the agent who initiated the consult.\n // We need not emit any event here since this will be result of promise\n task = this.updateTaskData(task, payload.data);\n break;\n case CC_EVENTS.AGENT_CONSULT_ENDED:\n task = this.updateTaskData(task, payload.data);\n if (task.data.isConsulted) {\n // This will be the end state of the task as soon as we end the consult in case of\n // us being offered a consult\n this.removeTaskFromCollection(task);\n }\n task.emit(TASK_EVENTS.TASK_CONSULT_END, task);\n break;\n case CC_EVENTS.AGENT_CTQ_CANCELLED:\n // This event is received when the consult using queue is cancelled using API\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONSULT_QUEUE_CANCELLED, task);\n break;\n case CC_EVENTS.AGENT_WRAPUP:\n task = this.updateTaskData(task, {...payload.data, wrapUpRequired: true});\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_WRAPPEDUP:\n task.cancelAutoWrapupTimer();\n this.removeTaskFromCollection(task);\n task.emit(TASK_EVENTS.TASK_WRAPPEDUP, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_PAUSED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_PAUSED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_PAUSE_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_PAUSE_FAILED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_RESUMED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_RESUMED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_RESUME_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_RESUME_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCING:\n // Conference is being established - update task state and emit establishing event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_ESTABLISHING, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCED:\n // Conference started successfully - update task state and emit event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_STARTED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_FAILED:\n // Conference failed - update task state and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_ENDED:\n // Conference ended - update task state and emit event\n task = this.updateTaskData(task, payload.data);\n if (\n !task ||\n isPrimary(task, this.agentId) ||\n isParticipantInMainInteraction(task, this.agentId)\n ) {\n LoggerProxy.log('Primary or main interaction participant leaving conference');\n } else {\n this.removeTaskFromCollection(task);\n }\n task.emit(TASK_EVENTS.TASK_CONFERENCE_ENDED, task);\n break;\n case CC_EVENTS.PARTICIPANT_JOINED_CONFERENCE: {\n task = this.updateTaskData(task, {\n ...payload.data,\n isConferenceInProgress: getIsConferenceInProgress(payload.data),\n });\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_JOINED, task);\n break;\n }\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE: {\n // Conference ended - update task state and emit event\n\n task = this.updateTaskData(task, {\n ...payload.data,\n isConferenceInProgress: getIsConferenceInProgress(payload.data),\n });\n if (checkParticipantNotInInteraction(task, this.agentId)) {\n if (\n isParticipantInMainInteraction(task, this.agentId) ||\n isPrimary(task, this.agentId)\n ) {\n LoggerProxy.log('Primary or main interaction participant leaving conference');\n } else {\n this.removeTaskFromCollection(task);\n }\n }\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_LEFT, task);\n break;\n }\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE_FAILED:\n // Conference exit failed - update task state and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_LEFT_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_END_FAILED:\n // Conference end failed - update task state with error details and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_END_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFERRED:\n // Conference was transferred - update task state and emit transfer success event\n // Note: Backend should provide hasLeft and wrapUpRequired status\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_TRANSFERRED, task);\n break;\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFER_FAILED:\n // Conference transfer failed - update task state with error details and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_TRANSFER_FAILED, task);\n break;\n case CC_EVENTS.PARTICIPANT_POST_CALL_ACTIVITY:\n // Post-call activity for participant - update task state with activity details\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_POST_CALL_ACTIVITY, task);\n break;\n default:\n break;\n }\n if (task) {\n task.emit(payload.data.type, payload.data);\n }\n }\n });\n }\n\n private updateTaskData(task: ITask, taskData: TaskData): ITask {\n if (!task) {\n return undefined;\n }\n\n if (!taskData?.interactionId) {\n LoggerProxy.warn('Received task update with missing interactionId', {\n module: TASK_MANAGER_FILE,\n method: METHODS.UPDATE_TASK_DATA,\n });\n }\n\n try {\n const currentTask = task.updateTaskData(taskData);\n this.taskCollection[taskData.interactionId] = currentTask;\n\n return currentTask;\n } catch (error) {\n LoggerProxy.error(`Failed to update task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.UPDATE_TASK_DATA,\n interactionId: taskData.interactionId,\n });\n\n return task;\n }\n }\n\n /**\n * Handles CONTACT_MERGED event logic\n * @param task - The task to process\n * @param taskData - The task data from the event payload\n * @returns Updated or newly created task\n * @private\n */\n private handleContactMerged(task: ITask, taskData: TaskData): ITask {\n if (taskData.childInteractionId) {\n // remove the child task from collection\n this.removeTaskFromCollection(this.taskCollection[taskData.childInteractionId]);\n }\n\n if (this.taskCollection[taskData.interactionId]) {\n LoggerProxy.log(`Got CONTACT_MERGED: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: taskData.interactionId,\n });\n // update the task data\n task = this.updateTaskData(task, taskData);\n } else {\n // Case2 : Task is not present in taskCollection\n LoggerProxy.log(`Got CONTACT_MERGED : Creating new task in taskManager`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: taskData.interactionId,\n });\n\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...taskData,\n wrapUpRequired: taskData.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(taskData),\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[taskData.interactionId] = task;\n }\n\n this.emit(TASK_EVENTS.TASK_MERGED, task);\n\n return task;\n }\n\n private removeTaskFromCollection(task: ITask) {\n if (task?.data?.interactionId) {\n delete this.taskCollection[task.data.interactionId];\n LoggerProxy.info(`Task removed from collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REMOVE_TASK_FROM_COLLECTION,\n interactionId: task.data.interactionId,\n });\n }\n }\n\n /**\n * Handles cleanup of task resources including Desktop/WebRTC call cleanup and task removal\n * @param task - The task to clean up\n * @private\n */\n private handleTaskCleanup(task: ITask) {\n // Clean up Desktop/WebRTC calling resources for browser-based telephony tasks\n if (\n this.webCallingService.loginOption === LoginOption.BROWSER &&\n task.data.interaction.mediaType === 'telephony'\n ) {\n task.unregisterWebCallListeners();\n this.webCallingService.cleanUpCall();\n }\n\n if (task.data.interaction.state === 'new' || isSecondaryEpDnAgent(task.data.interaction)) {\n // Only remove tasks in 'new' state or isSecondaryEpDnAgent immediately. For other states,\n // retain tasks until they complete wrap-up, unless the task disconnected before being answered.\n this.removeTaskFromCollection(task);\n }\n }\n\n /**\n * @param taskId - Unique identifier for each task\n */\n public getTask = (taskId: string) => {\n return this.taskCollection[taskId];\n };\n\n /**\n * @param taskId - Unique identifier for each task\n */\n public getAllTasks = (): Record<TaskId, ITask> => {\n return this.taskCollection;\n };\n\n /**\n * @param contact - Routing Contact layer. Talks to AQMReq layer to convert events to promises\n * @param webCallingService - Webrtc Service Layer\n * @param webSocketManager - Websocket Manager to maintain websocket connection and keepalives\n */\n public static getTaskManager = (\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager\n ): TaskManager => {\n if (!this.taskManager) {\n this.taskManager = new TaskManager(contact, webCallingService, webSocketManager);\n }\n\n return this.taskManager;\n };\n}\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAIA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,UAAA,GAAAH,OAAA;AACA,IAAAI,WAAA,GAAAJ,OAAA;AACA,IAAAK,OAAA,GAAAL,OAAA;AACA,IAAAM,OAAA,GAAAN,OAAA;AACA,IAAAO,YAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,CAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,eAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,WAAA,GAAAV,OAAA;AACA,IAAAW,UAAA,GAAAX,OAAA;AAMqB,SAAAD,uBAAAa,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAErB;AACe,MAAMG,WAAW,SAASC,eAAY,CAAC;EAGpD;AACF;AACA;AACA;AACA;;EAQE;AACF;AACA;AACA;AACA;EACEC,WAAWA,CACTC,OAA0C,EAC1CC,iBAAoC,EACpCC,gBAAkC,EAClC;IACA,KAAK,CAAC,CAAC;IACP,IAAI,CAACF,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACG,cAAc,GAAG,CAAC,CAAC;IACxB,IAAI,CAACF,iBAAiB,GAAGA,iBAAiB;IAC1C,IAAI,CAACC,gBAAgB,GAAGA,gBAAgB;IACxC,IAAI,CAACE,cAAc,GAAGC,uBAAc,CAACC,WAAW,CAAC,CAAC;IAClD,IAAI,CAACC,qBAAqB,CAAC,CAAC;IAC5B,IAAI,CAACC,yBAAyB,CAAC,CAAC;EAClC;EAEOC,aAAaA,CAACC,UAAsB,EAAE;IAC3C,IAAI,CAACA,UAAU,GAAGA,UAAU;EAC9B;EAEOC,UAAUA,CAACC,OAAe,EAAE;IACjC,IAAI,CAACA,OAAO,GAAGA,OAAO;EACxB;;EAEA;AACF;AACA;AACA;AACA;EACSC,UAAUA,CAAA,EAAW;IAC1B,OAAO,IAAI,CAACD,OAAO;EACrB;EAEQE,qBAAqB,GAAIC,IAAW,IAAK;IAC/C,MAAMC,WAAW,GAAGC,MAAM,CAACC,MAAM,CAAC,IAAI,CAACf,cAAc,CAAC,CAACgB,IAAI,CACxDC,IAAI,IAAKA,IAAI,CAACC,IAAI,CAACC,WAAW,CAACC,SAAS,KAAK,WAChD,CAAC;IAED,IAAIP,WAAW,EAAE;MACf,IAAI,CAACf,iBAAiB,CAACuB,aAAa,CAACT,IAAI,CAACU,SAAS,CAAC,CAAC,EAAET,WAAW,CAACK,IAAI,CAACK,aAAa,CAAC;MACtFC,oBAAW,CAACC,GAAG,CAAE,qBAAoB,EAAE;QACrCC,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAEC,mBAAO,CAACC,wBAAwB;QACxCP,aAAa,EAAEV,WAAW,CAACK,IAAI,CAACK;MAClC,CAAC,CAAC;MACF,IAAI,CAACQ,IAAI,CAACC,kBAAW,CAACC,aAAa,EAAEpB,WAAW,CAAC;IACnD;IACA,IAAI,CAACD,IAAI,GAAGA,IAAI;EAClB,CAAC;EAEMP,yBAAyBA,CAAA,EAAG;IACjC,IAAI,CAACP,iBAAiB,CAACoC,EAAE,CAACC,oBAAW,CAACC,aAAa,EAAE,IAAI,CAACzB,qBAAqB,CAAC;EAClF;EAEO0B,2BAA2BA,CAAA,EAAG;IACnC,IAAI,CAACvC,iBAAiB,CAACwC,GAAG,CAACH,oBAAW,CAACC,aAAa,EAAE,IAAI,CAACzB,qBAAqB,CAAC;EACnF;EAEQP,qBAAqBA,CAAA,EAAG;IAC9B,IAAI,CAACL,gBAAgB,CAACmC,EAAE,CAAC,SAAS,EAAGK,KAAK,IAAK;MAC7C,MAAMC,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACH,KAAK,CAAC;MACjC;MACA,IAAItB,IAAW;MACf,IAAIuB,OAAO,CAACtB,IAAI,EAAEyB,IAAI,EAAE;QACtB,IAAI7B,MAAM,CAACC,MAAM,CAAC6B,sBAAc,CAAC,CAACC,QAAQ,CAACL,OAAO,CAACtB,IAAI,CAACyB,IAAI,CAAC,EAAE;UAC7D1B,IAAI,GAAG,IAAI,CAACjB,cAAc,CAACwC,OAAO,CAACtB,IAAI,CAACK,aAAa,CAAC;QACxD;QACAC,oBAAW,CAACsB,IAAI,CAAE,uBAAsBN,OAAO,CAACtB,IAAI,EAAEyB,IAAK,EAAC,EAAE;UAC5DjB,MAAM,EAAEC,4BAAiB;UACzBC,MAAM,EAAEC,mBAAO,CAACkB,uBAAuB;UACvCxB,aAAa,EAAEiB,OAAO,CAACtB,IAAI,EAAEK;QAC/B,CAAC,CAAC;QACF,QAAQiB,OAAO,CAACtB,IAAI,CAACyB,IAAI;UACvB,KAAKK,iBAAS,CAACC,aAAa;YAC1B;YACA,IAAI,IAAI,CAACjD,cAAc,CAACwC,OAAO,CAACtB,IAAI,CAACK,aAAa,CAAC,EAAE;cACnDC,oBAAW,CAACC,GAAG,CAAE,sDAAqD,EAAE;gBACtEC,MAAM,EAAEC,4BAAiB;gBACzBC,MAAM,EAAEC,mBAAO,CAACkB,uBAAuB;gBACvCxB,aAAa,EAAEiB,OAAO,CAACtB,IAAI,CAACK;cAC9B,CAAC,CAAC;cACF;YACF,CAAC,MAAM,IAAI,CAAC,IAAI,CAACvB,cAAc,CAACwC,OAAO,CAACtB,IAAI,CAACK,aAAa,CAAC,EAAE;cAC3D;cACAC,oBAAW,CAACC,GAAG,CAAE,sDAAqD,EAAE;gBACtEC,MAAM,EAAEC,4BAAiB;gBACzBC,MAAM,EAAEC,mBAAO,CAACkB,uBAAuB;gBACvCxB,aAAa,EAAEiB,OAAO,CAACtB,IAAI,CAACK;cAC9B,CAAC,CAAC;cAEFN,IAAI,GAAG,IAAIiC,SAAI,CACb,IAAI,CAACrD,OAAO,EACZ,IAAI,CAACC,iBAAiB,EACtB;gBACE,GAAG0C,OAAO,CAACtB,IAAI;gBACfiC,cAAc,EACZX,OAAO,CAACtB,IAAI,CAACC,WAAW,EAAEiC,YAAY,GAAG,IAAI,CAAC3C,OAAO,CAAC,EAAE4C,QAAQ,IAAI,KAAK;gBAC3EC,sBAAsB,EAAE,IAAAC,oCAAyB,EAACf,OAAO,CAACtB,IAAI;cAChE,CAAC,EACD,IAAI,CAACX,UAAU,EACf,IAAI,CAACE,OACP,CAAC;cACD,IAAI,CAACT,cAAc,CAACwC,OAAO,CAACtB,IAAI,CAACK,aAAa,CAAC,GAAGN,IAAI;cACtD;cACA,IAAIuB,OAAO,CAACtB,IAAI,CAACC,WAAW,CAACqC,KAAK,KAAK,KAAK,EAAE;gBAC5ChC,oBAAW,CAACC,GAAG,CACZ,0EAAyE,EAC1E;kBACEC,MAAM,EAAEC,4BAAiB;kBACzBC,MAAM,EAAEC,mBAAO,CAACkB,uBAAuB;kBACvCxB,aAAa,EAAEiB,OAAO,CAACtB,IAAI,CAACK;gBAC9B,CACF,CAAC;gBACD,IAAI,CAACQ,IAAI,CAACC,kBAAW,CAACC,aAAa,EAAEhB,IAAI,CAAC;cAC5C,CAAC,MAAM;gBACL;gBACAO,oBAAW,CAACC,GAAG,CACZ,2CAA0Ce,OAAO,CAACtB,IAAI,CAACC,WAAW,CAACqC,KAAM,8BAA6B,EACvG;kBACE9B,MAAM,EAAEC,4BAAiB;kBACzBC,MAAM,EAAEC,mBAAO,CAACkB,uBAAuB;kBACvCxB,aAAa,EAAEiB,OAAO,CAACtB,IAAI,CAACK;gBAC9B,CACF,CAAC;gBACD,IAAI,CAACQ,IAAI,CAACC,kBAAW,CAACyB,YAAY,EAAExC,IAAI,CAAC;cAC3C;YACF;YACA;UAEF,KAAK+B,iBAAS,CAACU,sBAAsB;YACnCzC,IAAI,GAAG,IAAIiC,SAAI,CACb,IAAI,CAACrD,OAAO,EACZ,IAAI,CAACC,iBAAiB,EACtB;cACE,GAAG0C,OAAO,CAACtB,IAAI;cACfyC,WAAW,EAAE;YACf,CAAC,EACD,IAAI,CAACpD,UAAU,EACf,IAAI,CAACE,OACP,CAAC;YACD,IAAI,CAACT,cAAc,CAACwC,OAAO,CAACtB,IAAI,CAACK,aAAa,CAAC,GAAGN,IAAI;YACtD,IACE,IAAI,CAACnB,iBAAiB,CAAC8D,WAAW,KAAKC,mBAAW,CAACC,OAAO,IAC1D7C,IAAI,CAACC,IAAI,CAACC,WAAW,CAACC,SAAS,KAAK2C,oBAAa,CAACC,SAAS,CAAC;YAAA,EAC5D;cACA,IAAI,CAACjC,IAAI,CAACC,kBAAW,CAACC,aAAa,EAAEhB,IAAI,CAAC;YAC5C,CAAC,MAAM,IAAI,IAAI,CAACL,IAAI,EAAE;cACpB,IAAI,CAACmB,IAAI,CAACC,kBAAW,CAACC,aAAa,EAAEhB,IAAI,CAAC;YAC5C;YACA;UACF,KAAK+B,iBAAS,CAACiB,mBAAmB;YAChC;YACAhD,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CM,oBAAW,CAACC,GAAG,CAAE,uCAAsC,EAAE;cACvDC,MAAM,EAAEC,4BAAiB;cACzBC,MAAM,EAAEC,mBAAO,CAACkB,uBAAuB;cACvCxB,aAAa,EAAEiB,OAAO,CAACtB,IAAI,EAAEK;YAC/B,CAAC,CAAC;YACF,IAAI,CAACQ,IAAI,CAACC,kBAAW,CAACmC,kBAAkB,EAAElD,IAAI,CAAC;YAC/C;UACF,KAAK+B,iBAAS,CAACoB,qBAAqB;YAClC;YACA,IAAInD,IAAI,CAACC,IAAI,EAAE;cACb,IAAI,CAACmD,wBAAwB,CAACpD,IAAI,CAAC;YACrC;YACAO,oBAAW,CAACC,GAAG,CAAE,gCAA+B,EAAE;cAChDC,MAAM,EAAEC,4BAAiB;cACzBC,MAAM,EAAEC,mBAAO,CAACkB,uBAAuB;cACvCxB,aAAa,EAAEiB,OAAO,CAACtB,IAAI,EAAEK;YAC/B,CAAC,CAAC;YACF;UACF,KAAKyB,iBAAS,CAACsB,sBAAsB;YACnCrD,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACuC,aAAa,EAAEtD,IAAI,CAAC;YAC1C;UACF,KAAK+B,iBAAS,CAACwB,wBAAwB;YACrCvD,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAE;cAC/B,GAAGuB,OAAO,CAACtB,IAAI;cACfiC,cAAc,EAAE;YAClB,CAAC,CAAC;YACFlC,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACyC,QAAQ,EAAExD,IAAI,CAAC;YACrC;UACF,KAAK+B,iBAAS,CAAC0B,wBAAwB;UACvC,KAAK1B,iBAAS,CAAC2B,2BAA2B;UAC1C,KAAK3B,iBAAS,CAAC4B,mBAAmB;YAAE;cAClC3D,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;cAE9C,MAAM2D,oBAAqE,GAAG;gBAC5E,CAAC7B,iBAAS,CAAC2B,2BAA2B,GAAG,6BAA6B;gBACtE,CAAC3B,iBAAS,CAAC4B,mBAAmB,GAAG;cACnC,CAAC;cACD,MAAME,eAAgD,GACpDD,oBAAoB,CAACrC,OAAO,CAACtB,IAAI,CAACyB,IAAI,CAAC,IAAI,YAAY;cAEzD,IAAI,CAAC1C,cAAc,CAAC8E,UAAU,CAC5BC,8BAAkB,CAACF,eAAe,CAAC,EACnC;gBACE,GAAG5E,uBAAc,CAAC+E,oCAAoC,CAACzC,OAAO,CAACtB,IAAI,CAAC;gBACpEgE,MAAM,EAAE1C,OAAO,CAACtB,IAAI,CAACK,aAAa;gBAClC4D,MAAM,EAAE3C,OAAO,CAACtB,IAAI,CAACiE;cACvB,CAAC,EACD,CAAC,YAAY,EAAE,aAAa,CAC9B,CAAC;cACD,IAAI,CAACC,iBAAiB,CAACnE,IAAI,CAAC;cAC5BA,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACqD,WAAW,EAAE7C,OAAO,CAACtB,IAAI,CAACiE,MAAM,CAAC;cACvD;YACF;UACA,KAAKnC,iBAAS,CAACsC,aAAa;YAC1B;YACArE,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAE;cAC/B,GAAGuB,OAAO,CAACtB,IAAI;cACfiC,cAAc,EACZX,OAAO,CAACtB,IAAI,CAACC,WAAW,CAACqC,KAAK,KAAK,KAAK,IACxC,CAAC,IAAA+B,+BAAoB,EAAC/C,OAAO,CAACtB,IAAI,CAACC,WAAW;YAClD,CAAC,CAAC;;YAEF;YACA,IAAI,CAACiE,iBAAiB,CAACnE,IAAI,CAAC;YAE5BA,IAAI,EAAEc,IAAI,CAACC,kBAAW,CAACyC,QAAQ,EAAExD,IAAI,CAAC;YAEtC;UACF,KAAK+B,iBAAS,CAACwC,cAAc;YAC3BvE,IAAI,GAAG,IAAI,CAACwE,mBAAmB,CAACxE,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YACnD;UACF,KAAK8B,iBAAS,CAAC0C,kBAAkB;YAC/B;YACAzE,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAAC2D,SAAS,EAAE1E,IAAI,CAAC;YACtC;UACF,KAAK+B,iBAAS,CAAC4C,oBAAoB;YACjC;YACA3E,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAAC6D,WAAW,EAAE5E,IAAI,CAAC;YACxC;UACF,KAAK+B,iBAAS,CAAC8C,uBAAuB;YACpC7E,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAE;cAC/B,GAAGuB,OAAO,CAACtB,IAAI;cACfiC,cAAc,EAAE;YAClB,CAAC,CAAC;YACFlC,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACyC,QAAQ,EAAExD,IAAI,CAAC;YACrC;UACF,KAAK+B,iBAAS,CAAC+C,uBAAuB;YACpC9E,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACgE,yBAAyB,EAAE/E,IAAI,CAAC;YACtD;UACF,KAAK+B,iBAAS,CAACiD,qBAAqB;YAClC;YACAhF,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAE;cAC/B,GAAGuB,OAAO,CAACtB,IAAI;cACfyC,WAAW,EAAE,KAAK,CAAE;YACtB,CAAC,CAAC;;YACF1C,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACkE,oBAAoB,EAAEjF,IAAI,CAAC;YACjD;UACF,KAAK+B,iBAAS,CAACmD,mBAAmB;YAChC;YACAlF,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAE;cAC/B,GAAGuB,OAAO,CAACtB,IAAI;cACfyC,WAAW,EAAE,IAAI,CAAE;YACrB,CAAC,CAAC;;YACF1C,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACoE,kBAAkB,EAAEnF,IAAI,CAAC;YAC/C;UACF,KAAK+B,iBAAS,CAACqD,gBAAgB;YAC7B;YACA;YACApF,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9C,IAAID,IAAI,CAACC,IAAI,CAACyC,WAAW,EAAE;cACzB;cACA1C,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACsE,qBAAqB,EAAErF,IAAI,CAAC;YACpD,CAAC,MAAM;cACL;cACAA,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACuE,eAAe,EAAEtF,IAAI,CAAC;YAC9C;YACA;UACF,KAAK+B,iBAAS,CAACwD,oBAAoB;YACjC;YACA;YACAvF,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9C;UACF,KAAK8B,iBAAS,CAACyD,mBAAmB;YAChCxF,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9C,IAAID,IAAI,CAACC,IAAI,CAACyC,WAAW,EAAE;cACzB;cACA;cACA,IAAI,CAACU,wBAAwB,CAACpD,IAAI,CAAC;YACrC;YACAA,IAAI,CAACc,IAAI,CAACC,kBAAW,CAAC0E,gBAAgB,EAAEzF,IAAI,CAAC;YAC7C;UACF,KAAK+B,iBAAS,CAAC2D,mBAAmB;YAChC;YACA1F,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAAC4E,4BAA4B,EAAE3F,IAAI,CAAC;YACzD;UACF,KAAK+B,iBAAS,CAAC6D,YAAY;YACzB5F,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAE;cAAC,GAAGuB,OAAO,CAACtB,IAAI;cAAEiC,cAAc,EAAE;YAAI,CAAC,CAAC;YACzElC,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACyC,QAAQ,EAAExD,IAAI,CAAC;YACrC;UACF,KAAK+B,iBAAS,CAAC8D,eAAe;YAC5B7F,IAAI,CAAC8F,qBAAqB,CAAC,CAAC;YAC5B,IAAI,CAAC1C,wBAAwB,CAACpD,IAAI,CAAC;YACnCA,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACgF,cAAc,EAAE/F,IAAI,CAAC;YAC3C;UACF,KAAK+B,iBAAS,CAACiE,wBAAwB;YACrChG,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACkF,qBAAqB,EAAEjG,IAAI,CAAC;YAClD;UACF,KAAK+B,iBAAS,CAACmE,8BAA8B;YAC3ClG,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACoF,2BAA2B,EAAEnG,IAAI,CAAC;YACxD;UACF,KAAK+B,iBAAS,CAACqE,yBAAyB;YACtCpG,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACsF,sBAAsB,EAAErG,IAAI,CAAC;YACnD;UACF,KAAK+B,iBAAS,CAACuE,+BAA+B;YAC5CtG,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACwF,4BAA4B,EAAEvG,IAAI,CAAC;YACzD;UACF,KAAK+B,iBAAS,CAACyE,0BAA0B;YACvC;YACAxG,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAAC0F,4BAA4B,EAAEzG,IAAI,CAAC;YACzD;UACF,KAAK+B,iBAAS,CAAC2E,yBAAyB;YACtC;YACA1G,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAAC4F,uBAAuB,EAAE3G,IAAI,CAAC;YACpD;UACF,KAAK+B,iBAAS,CAAC6E,+BAA+B;YAC5C;YACA5G,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAAC8F,sBAAsB,EAAE7G,IAAI,CAAC;YACnD;UACF,KAAK+B,iBAAS,CAAC+E,8BAA8B;YAC3C;YACA9G,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9C,IACE,CAACD,IAAI,IACL,IAAA+G,oBAAS,EAAC/G,IAAI,EAAE,IAAI,CAACR,OAAO,CAAC,IAC7B,IAAAwH,yCAA8B,EAAChH,IAAI,EAAE,IAAI,CAACR,OAAO,CAAC,EAClD;cACAe,oBAAW,CAACC,GAAG,CAAC,4DAA4D,CAAC;YAC/E,CAAC,MAAM;cACL,IAAI,CAAC4C,wBAAwB,CAACpD,IAAI,CAAC;YACrC;YACAA,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACkG,qBAAqB,EAAEjH,IAAI,CAAC;YAClD;UACF,KAAK+B,iBAAS,CAACmF,6BAA6B;YAAE;cAC5ClH,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAE;gBAC/B,GAAGuB,OAAO,CAACtB,IAAI;gBACfoC,sBAAsB,EAAE,IAAAC,oCAAyB,EAACf,OAAO,CAACtB,IAAI;cAChE,CAAC,CAAC;cACFD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACoG,uBAAuB,EAAEnH,IAAI,CAAC;cACpD;YACF;UACA,KAAK+B,iBAAS,CAACqF,2BAA2B;YAAE;cAC1C;;cAEApH,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAE;gBAC/B,GAAGuB,OAAO,CAACtB,IAAI;gBACfoC,sBAAsB,EAAE,IAAAC,oCAAyB,EAACf,OAAO,CAACtB,IAAI;cAChE,CAAC,CAAC;cACF,IAAI,IAAAoH,2CAAgC,EAACrH,IAAI,EAAE,IAAI,CAACR,OAAO,CAAC,EAAE;gBACxD,IACE,IAAAwH,yCAA8B,EAAChH,IAAI,EAAE,IAAI,CAACR,OAAO,CAAC,IAClD,IAAAuH,oBAAS,EAAC/G,IAAI,EAAE,IAAI,CAACR,OAAO,CAAC,EAC7B;kBACAe,oBAAW,CAACC,GAAG,CAAC,4DAA4D,CAAC;gBAC/E,CAAC,MAAM;kBACL,IAAI,CAAC4C,wBAAwB,CAACpD,IAAI,CAAC;gBACrC;cACF;cACAA,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACuG,qBAAqB,EAAEtH,IAAI,CAAC;cAClD;YACF;UACA,KAAK+B,iBAAS,CAACwF,kCAAkC;YAC/C;YACAvH,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACyG,4BAA4B,EAAExH,IAAI,CAAC;YACzD;UACF,KAAK+B,iBAAS,CAAC0F,mCAAmC;YAChD;YACAzH,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAAC2G,0BAA0B,EAAE1H,IAAI,CAAC;YACvD;UACF,KAAK+B,iBAAS,CAAC4F,4BAA4B;YACzC;YACA;YACA3H,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAAC6G,2BAA2B,EAAE5H,IAAI,CAAC;YACxD;UACF,KAAK+B,iBAAS,CAAC8F,gCAAgC;YAC7C;YACA7H,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAAC+G,+BAA+B,EAAE9H,IAAI,CAAC;YAC5D;UACF,KAAK+B,iBAAS,CAACgG,8BAA8B;YAC3C;YACA/H,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEuB,OAAO,CAACtB,IAAI,CAAC;YAC9CD,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACiH,uBAAuB,EAAEhI,IAAI,CAAC;YACpD;UACF;YACE;QACJ;QACA,IAAIA,IAAI,EAAE;UACRA,IAAI,CAACc,IAAI,CAACS,OAAO,CAACtB,IAAI,CAACyB,IAAI,EAAEH,OAAO,CAACtB,IAAI,CAAC;QAC5C;MACF;IACF,CAAC,CAAC;EACJ;EAEQgD,cAAcA,CAACjD,IAAW,EAAEiI,QAAkB,EAAS;IAC7D,IAAI,CAACjI,IAAI,EAAE;MACT,OAAOkI,SAAS;IAClB;IAEA,IAAI,CAACD,QAAQ,EAAE3H,aAAa,EAAE;MAC5BC,oBAAW,CAAC4H,IAAI,CAAC,iDAAiD,EAAE;QAClE1H,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAEC,mBAAO,CAACwH;MAClB,CAAC,CAAC;IACJ;IAEA,IAAI;MACF,MAAMxI,WAAW,GAAGI,IAAI,CAACiD,cAAc,CAACgF,QAAQ,CAAC;MACjD,IAAI,CAAClJ,cAAc,CAACkJ,QAAQ,CAAC3H,aAAa,CAAC,GAAGV,WAAW;MAEzD,OAAOA,WAAW;IACpB,CAAC,CAAC,OAAOyI,KAAK,EAAE;MACd9H,oBAAW,CAAC8H,KAAK,CAAE,uBAAsB,EAAE;QACzC5H,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAEC,mBAAO,CAACwH,gBAAgB;QAChC9H,aAAa,EAAE2H,QAAQ,CAAC3H;MAC1B,CAAC,CAAC;MAEF,OAAON,IAAI;IACb;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACUwE,mBAAmBA,CAACxE,IAAW,EAAEiI,QAAkB,EAAS;IAClE,IAAIA,QAAQ,CAACK,kBAAkB,EAAE;MAC/B;MACA,IAAI,CAAClF,wBAAwB,CAAC,IAAI,CAACrE,cAAc,CAACkJ,QAAQ,CAACK,kBAAkB,CAAC,CAAC;IACjF;IAEA,IAAI,IAAI,CAACvJ,cAAc,CAACkJ,QAAQ,CAAC3H,aAAa,CAAC,EAAE;MAC/CC,oBAAW,CAACC,GAAG,CAAE,uDAAsD,EAAE;QACvEC,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAEC,mBAAO,CAACkB,uBAAuB;QACvCxB,aAAa,EAAE2H,QAAQ,CAAC3H;MAC1B,CAAC,CAAC;MACF;MACAN,IAAI,GAAG,IAAI,CAACiD,cAAc,CAACjD,IAAI,EAAEiI,QAAQ,CAAC;IAC5C,CAAC,MAAM;MACL;MACA1H,oBAAW,CAACC,GAAG,CAAE,uDAAsD,EAAE;QACvEC,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAEC,mBAAO,CAACkB,uBAAuB;QACvCxB,aAAa,EAAE2H,QAAQ,CAAC3H;MAC1B,CAAC,CAAC;MAEFN,IAAI,GAAG,IAAIiC,SAAI,CACb,IAAI,CAACrD,OAAO,EACZ,IAAI,CAACC,iBAAiB,EACtB;QACE,GAAGoJ,QAAQ;QACX/F,cAAc,EAAE+F,QAAQ,CAAC/H,WAAW,EAAEiC,YAAY,GAAG,IAAI,CAAC3C,OAAO,CAAC,EAAE4C,QAAQ,IAAI,KAAK;QACrFC,sBAAsB,EAAE,IAAAC,oCAAyB,EAAC2F,QAAQ;MAC5D,CAAC,EACD,IAAI,CAAC3I,UAAU,EACf,IAAI,CAACE,OACP,CAAC;MACD,IAAI,CAACT,cAAc,CAACkJ,QAAQ,CAAC3H,aAAa,CAAC,GAAGN,IAAI;IACpD;IAEA,IAAI,CAACc,IAAI,CAACC,kBAAW,CAACwH,WAAW,EAAEvI,IAAI,CAAC;IAExC,OAAOA,IAAI;EACb;EAEQoD,wBAAwBA,CAACpD,IAAW,EAAE;IAC5C,IAAIA,IAAI,EAAEC,IAAI,EAAEK,aAAa,EAAE;MAC7B,OAAO,IAAI,CAACvB,cAAc,CAACiB,IAAI,CAACC,IAAI,CAACK,aAAa,CAAC;MACnDC,oBAAW,CAACsB,IAAI,CAAE,8BAA6B,EAAE;QAC/CpB,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAEC,mBAAO,CAAC4H,2BAA2B;QAC3ClI,aAAa,EAAEN,IAAI,CAACC,IAAI,CAACK;MAC3B,CAAC,CAAC;IACJ;EACF;;EAEA;AACF;AACA;AACA;AACA;EACU6D,iBAAiBA,CAACnE,IAAW,EAAE;IACrC;IACA,IACE,IAAI,CAACnB,iBAAiB,CAAC8D,WAAW,KAAKC,mBAAW,CAACC,OAAO,IAC1D7C,IAAI,CAACC,IAAI,CAACC,WAAW,CAACC,SAAS,KAAK,WAAW,EAC/C;MACAH,IAAI,CAACyI,0BAA0B,CAAC,CAAC;MACjC,IAAI,CAAC5J,iBAAiB,CAAC6J,WAAW,CAAC,CAAC;IACtC;IAEA,IAAI1I,IAAI,CAACC,IAAI,CAACC,WAAW,CAACqC,KAAK,KAAK,KAAK,IAAI,IAAA+B,+BAAoB,EAACtE,IAAI,CAACC,IAAI,CAACC,WAAW,CAAC,EAAE;MACxF;MACA;MACA,IAAI,CAACkD,wBAAwB,CAACpD,IAAI,CAAC;IACrC;EACF;;EAEA;AACF;AACA;EACS2I,OAAO,GAAI1E,MAAc,IAAK;IACnC,OAAO,IAAI,CAAClF,cAAc,CAACkF,MAAM,CAAC;EACpC,CAAC;;EAED;AACF;AACA;EACS2E,WAAW,GAAGA,CAAA,KAA6B;IAChD,OAAO,IAAI,CAAC7J,cAAc;EAC5B,CAAC;;EAED;AACF;AACA;AACA;AACA;EACE,OAAc8J,cAAc,GAAGA,CAC7BjK,OAA0C,EAC1CC,iBAAoC,EACpCC,gBAAkC,KAClB;IAChB,IAAI,CAAC,IAAI,CAACgK,WAAW,EAAE;MACrB,IAAI,CAACA,WAAW,GAAG,IAAIrK,WAAW,CAACG,OAAO,EAAEC,iBAAiB,EAAEC,gBAAgB,CAAC;IAClF;IAEA,OAAO,IAAI,CAACgK,WAAW;EACzB,CAAC;AACH;AAACC,OAAA,CAAAvK,OAAA,GAAAC,WAAA"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.isPrimary = exports.isParticipantInMainInteraction = exports.getIsConferenceInProgress = exports.checkParticipantNotInInteraction = void 0;
|
|
6
|
+
exports.isSecondaryEpDnAgent = exports.isSecondaryAgent = exports.isPrimary = exports.isParticipantInMainInteraction = exports.getIsConferenceInProgress = exports.checkParticipantNotInInteraction = void 0;
|
|
7
7
|
/* eslint-disable import/prefer-default-export */
|
|
8
8
|
|
|
9
9
|
/**
|
|
@@ -53,14 +53,14 @@ const checkParticipantNotInInteraction = (task, agentId) => {
|
|
|
53
53
|
|
|
54
54
|
/**
|
|
55
55
|
* Determines if a conference is currently in progress based on the number of active agent participants
|
|
56
|
-
* @param
|
|
56
|
+
* @param TaskData - The payLoad data to check for conference status
|
|
57
57
|
* @returns true if there are 2 or more active agent participants in the main call, false otherwise
|
|
58
58
|
*/
|
|
59
59
|
exports.checkParticipantNotInInteraction = checkParticipantNotInInteraction;
|
|
60
|
-
const getIsConferenceInProgress =
|
|
61
|
-
const mediaMainCall =
|
|
60
|
+
const getIsConferenceInProgress = data => {
|
|
61
|
+
const mediaMainCall = data.interaction.media?.[data?.interactionId];
|
|
62
62
|
const participantsInMainCall = new Set(mediaMainCall?.participants);
|
|
63
|
-
const participants =
|
|
63
|
+
const participants = data.interaction.participants;
|
|
64
64
|
const agentParticipants = new Set();
|
|
65
65
|
if (participantsInMainCall.size > 0) {
|
|
66
66
|
participantsInMainCall.forEach(participantId => {
|
|
@@ -72,5 +72,33 @@ const getIsConferenceInProgress = task => {
|
|
|
72
72
|
}
|
|
73
73
|
return agentParticipants.size >= 2;
|
|
74
74
|
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Checks if the current agent is a secondary agent in a consultation scenario.
|
|
78
|
+
* Secondary agents are those who were consulted (not the original call owner).
|
|
79
|
+
* @param task - The task object containing interaction details
|
|
80
|
+
* @returns true if this is a secondary agent (consulted party), false otherwise
|
|
81
|
+
*/
|
|
75
82
|
exports.getIsConferenceInProgress = getIsConferenceInProgress;
|
|
83
|
+
const isSecondaryAgent = interaction => {
|
|
84
|
+
if (!interaction.callProcessingDetails) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
return interaction.callProcessingDetails.relationshipType === 'consult' && !!interaction.callProcessingDetails.parentInteractionId && interaction.callProcessingDetails.parentInteractionId !== interaction.interactionId;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Checks if the current agent is a secondary EP-DN (Entry Point Dial Number) agent.
|
|
92
|
+
* This is specifically for telephony consultations to external numbers/entry points.
|
|
93
|
+
* @param task - The task object containing interaction details
|
|
94
|
+
* @returns true if this is a secondary EP-DN agent in telephony consultation, false otherwise
|
|
95
|
+
*/
|
|
96
|
+
exports.isSecondaryAgent = isSecondaryAgent;
|
|
97
|
+
const isSecondaryEpDnAgent = interaction => {
|
|
98
|
+
if (!interaction) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
return interaction.mediaType === 'telephony' && isSecondaryAgent(interaction);
|
|
102
|
+
};
|
|
103
|
+
exports.isSecondaryEpDnAgent = isSecondaryEpDnAgent;
|
|
76
104
|
//# sourceMappingURL=TaskUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isPrimary","task","agentId","data","interaction","owner","exports","isParticipantInMainInteraction","media","Object","values","some","mediaObj","mType","participants","includes","checkParticipantNotInInteraction","hasLeft","getIsConferenceInProgress","mediaMainCall","interactionId","participantsInMainCall","Set","agentParticipants","size","forEach","participantId","participant","pType","add"],"sources":["TaskUtils.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\nimport {ITask} from './types';\n\n/**\n * Determines if the given agent is the primary agent (owner) of the task\n * @param task - The task to check\n * @param agentId - The agent ID to check for primary status\n * @returns true if the agent is the primary agent, false otherwise\n */\nexport const isPrimary = (task: ITask, agentId: string): boolean => {\n if (!task.data?.interaction?.owner) {\n // Fall back to checking data.agentId when owner is not set\n return task.data.agentId === agentId;\n }\n\n return task.data.interaction.owner === agentId;\n};\n\n/**\n * Checks if the given agent is a participant in the main interaction (mainCall)\n * @param task - The task to check\n * @param agentId - The agent ID to check for participation\n * @returns true if the agent is a participant in the main interaction, false otherwise\n */\nexport const isParticipantInMainInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.media) {\n return false;\n }\n\n return Object.values(task.data.interaction.media).some(\n (mediaObj) =>\n mediaObj && mediaObj.mType === 'mainCall' && mediaObj.participants?.includes(agentId)\n );\n};\n\n/**\n * Checks if the given agent is not in the interaction or has left the interaction\n * @param task - The task to check\n * @param agentId - The agent ID to check\n * @returns true if the agent is not in the interaction or has left, false otherwise\n */\nexport const checkParticipantNotInInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.participants) {\n return true;\n }\n const {data} = task;\n\n return (\n !(agentId in data.interaction.participants) ||\n (agentId in data.interaction.participants && data.interaction.participants[agentId].hasLeft)\n );\n};\n\n/**\n * Determines if a conference is currently in progress based on the number of active agent participants\n * @param
|
|
1
|
+
{"version":3,"names":["isPrimary","task","agentId","data","interaction","owner","exports","isParticipantInMainInteraction","media","Object","values","some","mediaObj","mType","participants","includes","checkParticipantNotInInteraction","hasLeft","getIsConferenceInProgress","mediaMainCall","interactionId","participantsInMainCall","Set","agentParticipants","size","forEach","participantId","participant","pType","add","isSecondaryAgent","callProcessingDetails","relationshipType","parentInteractionId","isSecondaryEpDnAgent","mediaType"],"sources":["TaskUtils.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\nimport {Interaction, ITask, TaskData} from './types';\n\n/**\n * Determines if the given agent is the primary agent (owner) of the task\n * @param task - The task to check\n * @param agentId - The agent ID to check for primary status\n * @returns true if the agent is the primary agent, false otherwise\n */\nexport const isPrimary = (task: ITask, agentId: string): boolean => {\n if (!task.data?.interaction?.owner) {\n // Fall back to checking data.agentId when owner is not set\n return task.data.agentId === agentId;\n }\n\n return task.data.interaction.owner === agentId;\n};\n\n/**\n * Checks if the given agent is a participant in the main interaction (mainCall)\n * @param task - The task to check\n * @param agentId - The agent ID to check for participation\n * @returns true if the agent is a participant in the main interaction, false otherwise\n */\nexport const isParticipantInMainInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.media) {\n return false;\n }\n\n return Object.values(task.data.interaction.media).some(\n (mediaObj) =>\n mediaObj && mediaObj.mType === 'mainCall' && mediaObj.participants?.includes(agentId)\n );\n};\n\n/**\n * Checks if the given agent is not in the interaction or has left the interaction\n * @param task - The task to check\n * @param agentId - The agent ID to check\n * @returns true if the agent is not in the interaction or has left, false otherwise\n */\nexport const checkParticipantNotInInteraction = (task: ITask, agentId: string): boolean => {\n if (!task?.data?.interaction?.participants) {\n return true;\n }\n const {data} = task;\n\n return (\n !(agentId in data.interaction.participants) ||\n (agentId in data.interaction.participants && data.interaction.participants[agentId].hasLeft)\n );\n};\n\n/**\n * Determines if a conference is currently in progress based on the number of active agent participants\n * @param TaskData - The payLoad data to check for conference status\n * @returns true if there are 2 or more active agent participants in the main call, false otherwise\n */\nexport const getIsConferenceInProgress = (data: TaskData): boolean => {\n const mediaMainCall = data.interaction.media?.[data?.interactionId];\n const participantsInMainCall = new Set(mediaMainCall?.participants);\n const participants = data.interaction.participants;\n\n const agentParticipants = new Set();\n if (participantsInMainCall.size > 0) {\n participantsInMainCall.forEach((participantId: string) => {\n const participant = participants?.[participantId];\n if (\n participant &&\n participant.pType !== 'Customer' &&\n participant.pType !== 'Supervisor' &&\n !participant.hasLeft &&\n participant.pType !== 'VVA'\n ) {\n agentParticipants.add(participantId);\n }\n });\n }\n\n return agentParticipants.size >= 2;\n};\n\n/**\n * Checks if the current agent is a secondary agent in a consultation scenario.\n * Secondary agents are those who were consulted (not the original call owner).\n * @param task - The task object containing interaction details\n * @returns true if this is a secondary agent (consulted party), false otherwise\n */\nexport const isSecondaryAgent = (interaction: Interaction): boolean => {\n if (!interaction.callProcessingDetails) {\n return false;\n }\n\n return (\n interaction.callProcessingDetails.relationshipType === 'consult' &&\n !!interaction.callProcessingDetails.parentInteractionId &&\n interaction.callProcessingDetails.parentInteractionId !== interaction.interactionId\n );\n};\n\n/**\n * Checks if the current agent is a secondary EP-DN (Entry Point Dial Number) agent.\n * This is specifically for telephony consultations to external numbers/entry points.\n * @param task - The task object containing interaction details\n * @returns true if this is a secondary EP-DN agent in telephony consultation, false otherwise\n */\nexport const isSecondaryEpDnAgent = (interaction: Interaction): boolean => {\n if (!interaction) {\n return false;\n }\n\n return interaction.mediaType === 'telephony' && isSecondaryAgent(interaction);\n};\n"],"mappings":"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"}
|
|
@@ -1223,27 +1223,27 @@ class Task extends _events.default {
|
|
|
1223
1223
|
* ```
|
|
1224
1224
|
*/
|
|
1225
1225
|
async consultTransfer(consultTransferPayload) {
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
const destAgentId = (0, _Utils.getDestinationAgentId)(this.data.interaction?.participants, this.data.agentId);
|
|
1226
|
+
// Get the destination agent ID using custom logic from participants data
|
|
1227
|
+
const destAgentId = (0, _Utils.calculateDestAgentId)(this.data.interaction, this.agentId);
|
|
1229
1228
|
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
// Obtain payload based on desktop logic using TaskData
|
|
1240
|
-
const finalDestinationType = (0, _Utils.deriveConsultTransferDestinationType)(this.data);
|
|
1229
|
+
// Resolve the target id (queue consult transfers go to the accepted agent)
|
|
1230
|
+
if (!destAgentId) {
|
|
1231
|
+
throw new Error('No agent has accepted this queue consult yet');
|
|
1232
|
+
}
|
|
1233
|
+
_loggerProxy.default.info(`Initiating consult transfer to ${consultTransferPayload?.to || destAgentId}`, {
|
|
1234
|
+
module: _constants.TASK_FILE,
|
|
1235
|
+
method: _constants2.METHODS.CONSULT_TRANSFER,
|
|
1236
|
+
interactionId: this.data.interactionId
|
|
1237
|
+
});
|
|
1241
1238
|
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1239
|
+
// Derive destination type from the participant's type property
|
|
1240
|
+
const destType = (0, _Utils.calculateDestType)(this.data.interaction, this.agentId);
|
|
1241
|
+
// By default we always use the computed destAgentId as the target id
|
|
1242
|
+
const consultTransferRequest = {
|
|
1243
|
+
to: destAgentId,
|
|
1244
|
+
destinationType: destType
|
|
1245
|
+
};
|
|
1246
|
+
try {
|
|
1247
1247
|
const result = await this.contact.consultTransfer({
|
|
1248
1248
|
interactionId: this.data.interactionId,
|
|
1249
1249
|
data: consultTransferRequest
|
|
@@ -1271,12 +1271,10 @@ class Task extends _events.default {
|
|
|
1271
1271
|
errorData: err.data?.errorData,
|
|
1272
1272
|
reasonCode: err.data?.reasonCode
|
|
1273
1273
|
};
|
|
1274
|
-
const failedDestinationType = (0, _Utils.deriveConsultTransferDestinationType)(this.data);
|
|
1275
|
-
const failedDestAgentId = (0, _Utils.getDestinationAgentId)(this.data.interaction?.participants, this.data.agentId);
|
|
1276
1274
|
this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.TASK_TRANSFER_FAILED, {
|
|
1277
1275
|
taskId: this.data.interactionId,
|
|
1278
|
-
destination:
|
|
1279
|
-
destinationType:
|
|
1276
|
+
destination: destAgentId || '',
|
|
1277
|
+
destinationType: destType,
|
|
1280
1278
|
isConsultTransfer: true,
|
|
1281
1279
|
error: error.toString(),
|
|
1282
1280
|
...taskErrorProps,
|
|
@@ -1307,30 +1305,42 @@ class Task extends _events.default {
|
|
|
1307
1305
|
* ```
|
|
1308
1306
|
*/
|
|
1309
1307
|
async consultConference() {
|
|
1308
|
+
// Get the destination agent ID dynamically from participants
|
|
1309
|
+
// This handles multi-party conference scenarios, CBT (Capacity Based Team), and EP-DN cases
|
|
1310
|
+
const destAgentId = (0, _Utils.calculateDestAgentId)(this.data.interaction, this.agentId);
|
|
1311
|
+
|
|
1312
|
+
// Validate that we have a destination agent (for queue consult scenarios)
|
|
1313
|
+
if (!destAgentId) {
|
|
1314
|
+
throw new Error('No agent has accepted this queue consult yet');
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
// Get the destination agent ID for fetching destination type
|
|
1318
|
+
// This helps determine the correct participant type for CBT (Capacity Based Team) and EP-DN scenarios
|
|
1319
|
+
const destAgentType = (0, _Utils.calculateDestType)(this.data.interaction, this.agentId);
|
|
1320
|
+
|
|
1310
1321
|
// Extract consultation conference data from task data (used in both try and catch)
|
|
1311
1322
|
const consultationData = {
|
|
1312
1323
|
agentId: this.agentId,
|
|
1313
|
-
|
|
1314
|
-
destinationType: this.data.destinationType || 'agent'
|
|
1324
|
+
to: destAgentId,
|
|
1325
|
+
destinationType: destAgentType || this.data.destinationType || 'agent'
|
|
1315
1326
|
};
|
|
1316
1327
|
try {
|
|
1317
|
-
_loggerProxy.default.info(`Initiating consult conference to ${
|
|
1328
|
+
_loggerProxy.default.info(`Initiating consult conference to ${destAgentId}`, {
|
|
1318
1329
|
module: _constants.TASK_FILE,
|
|
1319
1330
|
method: _constants2.METHODS.CONSULT_CONFERENCE,
|
|
1320
1331
|
interactionId: this.data.interactionId
|
|
1321
1332
|
});
|
|
1322
|
-
const paramsDataForConferenceV2 = (0, _Utils.buildConsultConferenceParamData)(consultationData, this.data.interactionId);
|
|
1323
1333
|
const response = await this.contact.consultConference({
|
|
1324
|
-
interactionId:
|
|
1325
|
-
data:
|
|
1334
|
+
interactionId: this.data.interactionId,
|
|
1335
|
+
data: consultationData
|
|
1326
1336
|
});
|
|
1327
1337
|
|
|
1328
1338
|
// Track success metrics (following consultTransfer pattern)
|
|
1329
1339
|
this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.TASK_CONFERENCE_START_SUCCESS, {
|
|
1330
1340
|
taskId: this.data.interactionId,
|
|
1331
|
-
destination:
|
|
1332
|
-
destinationType:
|
|
1333
|
-
agentId:
|
|
1341
|
+
destination: consultationData.to,
|
|
1342
|
+
destinationType: consultationData.destinationType,
|
|
1343
|
+
agentId: consultationData.agentId,
|
|
1334
1344
|
..._MetricsManager.default.getCommonTrackingFieldForAQMResponse(response)
|
|
1335
1345
|
}, ['operational', 'behavioral', 'business']);
|
|
1336
1346
|
_loggerProxy.default.log(`Consult conference started successfully`, {
|
|
@@ -1348,15 +1358,11 @@ class Task extends _events.default {
|
|
|
1348
1358
|
errorData: err.data?.errorData,
|
|
1349
1359
|
reasonCode: err.data?.reasonCode
|
|
1350
1360
|
};
|
|
1351
|
-
|
|
1352
|
-
// Track failure metrics (following consultTransfer pattern)
|
|
1353
|
-
// Build conference data for error tracking using extracted data
|
|
1354
|
-
const failedParamsData = (0, _Utils.buildConsultConferenceParamData)(consultationData, this.data.interactionId);
|
|
1355
1361
|
this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.TASK_CONFERENCE_START_FAILED, {
|
|
1356
1362
|
taskId: this.data.interactionId,
|
|
1357
|
-
destination:
|
|
1358
|
-
destinationType:
|
|
1359
|
-
agentId:
|
|
1363
|
+
destination: consultationData.to,
|
|
1364
|
+
destinationType: consultationData.destinationType,
|
|
1365
|
+
agentId: consultationData.agentId,
|
|
1360
1366
|
error: error.toString(),
|
|
1361
1367
|
...taskErrorProps,
|
|
1362
1368
|
..._MetricsManager.default.getCommonTrackingFieldForAQMResponseFailed(error.details || {})
|