@webex/contact-center 3.10.0-next.1 → 3.10.0-next.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/cc.js +11 -0
  2. package/dist/cc.js.map +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/services/config/types.js +2 -2
  5. package/dist/services/config/types.js.map +1 -1
  6. package/dist/services/core/Utils.js +90 -71
  7. package/dist/services/core/Utils.js.map +1 -1
  8. package/dist/services/core/constants.js +17 -1
  9. package/dist/services/core/constants.js.map +1 -1
  10. package/dist/services/task/TaskManager.js +62 -29
  11. package/dist/services/task/TaskManager.js.map +1 -1
  12. package/dist/services/task/TaskUtils.js +33 -5
  13. package/dist/services/task/TaskUtils.js.map +1 -1
  14. package/dist/services/task/index.js +45 -39
  15. package/dist/services/task/index.js.map +1 -1
  16. package/dist/services/task/types.js +2 -4
  17. package/dist/services/task/types.js.map +1 -1
  18. package/dist/types/cc.d.ts +6 -0
  19. package/dist/types/index.d.ts +1 -1
  20. package/dist/types/services/config/types.d.ts +4 -4
  21. package/dist/types/services/core/Utils.d.ts +32 -17
  22. package/dist/types/services/core/constants.d.ts +14 -0
  23. package/dist/types/services/task/TaskUtils.d.ts +17 -3
  24. package/dist/types/services/task/types.d.ts +25 -13
  25. package/dist/webex.js +1 -1
  26. package/package.json +8 -8
  27. package/src/cc.ts +11 -0
  28. package/src/index.ts +1 -0
  29. package/src/services/config/types.ts +2 -2
  30. package/src/services/core/Utils.ts +101 -85
  31. package/src/services/core/constants.ts +16 -0
  32. package/src/services/task/TaskManager.ts +77 -22
  33. package/src/services/task/TaskUtils.ts +37 -5
  34. package/src/services/task/index.ts +50 -63
  35. package/src/services/task/types.ts +26 -13
  36. package/test/unit/spec/services/core/Utils.ts +262 -31
  37. package/test/unit/spec/services/task/TaskManager.ts +370 -1
  38. package/test/unit/spec/services/task/TaskUtils.ts +6 -6
  39. package/test/unit/spec/services/task/index.ts +323 -68
  40. package/umd/contact-center.min.js +2 -2
  41. 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.emit(_types.TASK_EVENTS.TASK_END, 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?.emit(_types.TASK_EVENTS.TASK_CONFERENCE_ENDED, 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)(simulatedTaskForJoin)
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
- // Pre-calculate isConferenceInProgress with updated data to avoid double update
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)(simulatedTaskForLeft)
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":"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"}
@@ -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 task - The task to check for conference status
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 = task => {
61
- const mediaMainCall = task?.data?.interaction?.media?.[task?.data?.interactionId];
60
+ const getIsConferenceInProgress = data => {
61
+ const mediaMainCall = data.interaction.media?.[data?.interactionId];
62
62
  const participantsInMainCall = new Set(mediaMainCall?.participants);
63
- const participants = task?.data?.interaction?.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 task - The task 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 = (task: ITask): boolean => {\n const mediaMainCall = task?.data?.interaction?.media?.[task?.data?.interactionId];\n const participantsInMainCall = new Set(mediaMainCall?.participants);\n const participants = task?.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"],"mappings":";;;;;;AAAA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,SAAS,GAAGA,CAACC,IAAW,EAAEC,OAAe,KAAc;EAClE,IAAI,CAACD,IAAI,CAACE,IAAI,EAAEC,WAAW,EAAEC,KAAK,EAAE;IAClC;IACA,OAAOJ,IAAI,CAACE,IAAI,CAACD,OAAO,KAAKA,OAAO;EACtC;EAEA,OAAOD,IAAI,CAACE,IAAI,CAACC,WAAW,CAACC,KAAK,KAAKH,OAAO;AAChD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AALAI,OAAA,CAAAN,SAAA,GAAAA,SAAA;AAMO,MAAMO,8BAA8B,GAAGA,CAACN,IAAW,EAAEC,OAAe,KAAc;EACvF,IAAI,CAACD,IAAI,EAAEE,IAAI,EAAEC,WAAW,EAAEI,KAAK,EAAE;IACnC,OAAO,KAAK;EACd;EAEA,OAAOC,MAAM,CAACC,MAAM,CAACT,IAAI,CAACE,IAAI,CAACC,WAAW,CAACI,KAAK,CAAC,CAACG,IAAI,CACnDC,QAAQ,IACPA,QAAQ,IAAIA,QAAQ,CAACC,KAAK,KAAK,UAAU,IAAID,QAAQ,CAACE,YAAY,EAAEC,QAAQ,CAACb,OAAO,CACxF,CAAC;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AALAI,OAAA,CAAAC,8BAAA,GAAAA,8BAAA;AAMO,MAAMS,gCAAgC,GAAGA,CAACf,IAAW,EAAEC,OAAe,KAAc;EACzF,IAAI,CAACD,IAAI,EAAEE,IAAI,EAAEC,WAAW,EAAEU,YAAY,EAAE;IAC1C,OAAO,IAAI;EACb;EACA,MAAM;IAACX;EAAI,CAAC,GAAGF,IAAI;EAEnB,OACE,EAAEC,OAAO,IAAIC,IAAI,CAACC,WAAW,CAACU,YAAY,CAAC,IAC1CZ,OAAO,IAAIC,IAAI,CAACC,WAAW,CAACU,YAAY,IAAIX,IAAI,CAACC,WAAW,CAACU,YAAY,CAACZ,OAAO,CAAC,CAACe,OAAQ;AAEhG,CAAC;;AAED;AACA;AACA;AACA;AACA;AAJAX,OAAA,CAAAU,gCAAA,GAAAA,gCAAA;AAKO,MAAME,yBAAyB,GAAIjB,IAAW,IAAc;EACjE,MAAMkB,aAAa,GAAGlB,IAAI,EAAEE,IAAI,EAAEC,WAAW,EAAEI,KAAK,GAAGP,IAAI,EAAEE,IAAI,EAAEiB,aAAa,CAAC;EACjF,MAAMC,sBAAsB,GAAG,IAAIC,GAAG,CAACH,aAAa,EAAEL,YAAY,CAAC;EACnE,MAAMA,YAAY,GAAGb,IAAI,EAAEE,IAAI,EAAEC,WAAW,EAAEU,YAAY;EAE1D,MAAMS,iBAAiB,GAAG,IAAID,GAAG,CAAC,CAAC;EACnC,IAAID,sBAAsB,CAACG,IAAI,GAAG,CAAC,EAAE;IACnCH,sBAAsB,CAACI,OAAO,CAAEC,aAAqB,IAAK;MACxD,MAAMC,WAAW,GAAGb,YAAY,GAAGY,aAAa,CAAC;MACjD,IACEC,WAAW,IACXA,WAAW,CAACC,KAAK,KAAK,UAAU,IAChCD,WAAW,CAACC,KAAK,KAAK,YAAY,IAClC,CAACD,WAAW,CAACV,OAAO,IACpBU,WAAW,CAACC,KAAK,KAAK,KAAK,EAC3B;QACAL,iBAAiB,CAACM,GAAG,CAACH,aAAa,CAAC;MACtC;IACF,CAAC,CAAC;EACJ;EAEA,OAAOH,iBAAiB,CAACC,IAAI,IAAI,CAAC;AACpC,CAAC;AAAClB,OAAA,CAAAY,yBAAA,GAAAA,yBAAA"}
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
- try {
1227
- // Get the destination agent ID using custom logic from participants data
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
- // Resolve the target id (queue consult transfers go to the accepted agent)
1231
- if (!destAgentId) {
1232
- throw new Error('No agent has accepted this queue consult yet');
1233
- }
1234
- _loggerProxy.default.info(`Initiating consult transfer to ${consultTransferPayload?.to || destAgentId}`, {
1235
- module: _constants.TASK_FILE,
1236
- method: _constants2.METHODS.CONSULT_TRANSFER,
1237
- interactionId: this.data.interactionId
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
- // By default we always use the computed destAgentId as the target id
1243
- const consultTransferRequest = {
1244
- to: destAgentId,
1245
- destinationType: finalDestinationType
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: failedDestAgentId || '',
1279
- destinationType: failedDestinationType,
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
- destAgentId: this.data.destAgentId,
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 ${consultationData.destAgentId}`, {
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: paramsDataForConferenceV2.interactionId,
1325
- data: paramsDataForConferenceV2.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: paramsDataForConferenceV2.data.to,
1332
- destinationType: paramsDataForConferenceV2.data.destinationType,
1333
- agentId: paramsDataForConferenceV2.data.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: failedParamsData.data.to,
1358
- destinationType: failedParamsData.data.destinationType,
1359
- agentId: failedParamsData.data.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 || {})