@webex/contact-center 3.12.0-llmrefactor.2 → 3.12.0-llmrefactor.4

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 (187) hide show
  1. package/.sdd/manifest.json +5 -4
  2. package/ai-docs/ARCHITECTURE.md +1 -1
  3. package/ai-docs/CONTRACTS.md +6 -2
  4. package/ai-docs/SECURITY.md +1 -1
  5. package/ai-docs/contact-center-spec.md +22 -4
  6. package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
  7. package/dist/cc.js +440 -10
  8. package/dist/cc.js.map +1 -1
  9. package/dist/config.js +7 -0
  10. package/dist/config.js.map +1 -1
  11. package/dist/constants.js +10 -2
  12. package/dist/constants.js.map +1 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/metrics/behavioral-events.js +13 -0
  15. package/dist/metrics/behavioral-events.js.map +1 -1
  16. package/dist/metrics/constants.js +2 -0
  17. package/dist/metrics/constants.js.map +1 -1
  18. package/dist/services/AddressBook.js +18 -15
  19. package/dist/services/AddressBook.js.map +1 -1
  20. package/dist/services/AnswerCallOnWebexService.js +174 -0
  21. package/dist/services/AnswerCallOnWebexService.js.map +1 -0
  22. package/dist/services/EntryPoint.js +46 -68
  23. package/dist/services/EntryPoint.js.map +1 -1
  24. package/dist/services/Queue.js +27 -22
  25. package/dist/services/Queue.js.map +1 -1
  26. package/dist/services/WebexCrossClientService.js +171 -0
  27. package/dist/services/WebexCrossClientService.js.map +1 -0
  28. package/dist/services/WxAppTelephonyMercurySync.js +93 -0
  29. package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
  30. package/dist/services/config/Util.js +3 -0
  31. package/dist/services/config/Util.js.map +1 -1
  32. package/dist/services/config/constants.js +10 -6
  33. package/dist/services/config/constants.js.map +1 -1
  34. package/dist/services/config/types.js +4 -0
  35. package/dist/services/config/types.js.map +1 -1
  36. package/dist/services/core/Err.js.map +1 -1
  37. package/dist/services/core/WebexRequest.js +6 -2
  38. package/dist/services/core/WebexRequest.js.map +1 -1
  39. package/dist/services/core/aqm-reqs.js +28 -14
  40. package/dist/services/core/aqm-reqs.js.map +1 -1
  41. package/dist/services/core/types.js.map +1 -1
  42. package/dist/services/task/Task.js +73 -7
  43. package/dist/services/task/Task.js.map +1 -1
  44. package/dist/services/task/TaskFactory.js +8 -4
  45. package/dist/services/task/TaskFactory.js.map +1 -1
  46. package/dist/services/task/TaskManager.js +353 -21
  47. package/dist/services/task/TaskManager.js.map +1 -1
  48. package/dist/services/task/WebexCallingUtils.js +70 -0
  49. package/dist/services/task/WebexCallingUtils.js.map +1 -0
  50. package/dist/services/task/constants.js +4 -1
  51. package/dist/services/task/constants.js.map +1 -1
  52. package/dist/services/task/contact.js +29 -0
  53. package/dist/services/task/contact.js.map +1 -1
  54. package/dist/services/task/digital/Digital.js +3 -2
  55. package/dist/services/task/digital/Digital.js.map +1 -1
  56. package/dist/services/task/state-machine/TaskStateMachine.js +135 -37
  57. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -1
  58. package/dist/services/task/state-machine/actions.js +6 -1
  59. package/dist/services/task/state-machine/actions.js.map +1 -1
  60. package/dist/services/task/state-machine/guards.js +38 -11
  61. package/dist/services/task/state-machine/guards.js.map +1 -1
  62. package/dist/services/task/state-machine/types.js.map +1 -1
  63. package/dist/services/task/state-machine/uiControlsComputer.js +118 -18
  64. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -1
  65. package/dist/services/task/types.js +16 -1
  66. package/dist/services/task/types.js.map +1 -1
  67. package/dist/services/task/voice/Voice.js +350 -14
  68. package/dist/services/task/voice/Voice.js.map +1 -1
  69. package/dist/services/task/voice/WebRTC.js +4 -1
  70. package/dist/services/task/voice/WebRTC.js.map +1 -1
  71. package/dist/services/task/voice/wxAppVoiceMethods.js +201 -0
  72. package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
  73. package/dist/services/wxAppTelephonyUtils.js +19 -0
  74. package/dist/services/wxAppTelephonyUtils.js.map +1 -0
  75. package/dist/types/cc.d.ts +77 -4
  76. package/dist/types/config.d.ts +7 -0
  77. package/dist/types/constants.d.ts +8 -0
  78. package/dist/types/index.d.ts +3 -1
  79. package/dist/types/metrics/constants.d.ts +2 -0
  80. package/dist/types/services/AddressBook.d.ts +2 -1
  81. package/dist/types/services/AnswerCallOnWebexService.d.ts +37 -0
  82. package/dist/types/services/EntryPoint.d.ts +7 -5
  83. package/dist/types/services/Queue.d.ts +5 -3
  84. package/dist/types/services/WebexCrossClientService.d.ts +28 -0
  85. package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
  86. package/dist/types/services/config/constants.d.ts +8 -5
  87. package/dist/types/services/config/types.d.ts +17 -4
  88. package/dist/types/services/core/Err.d.ts +2 -0
  89. package/dist/types/services/core/WebexRequest.d.ts +1 -0
  90. package/dist/types/services/core/types.d.ts +2 -0
  91. package/dist/types/services/task/Task.d.ts +20 -2
  92. package/dist/types/services/task/TaskFactory.d.ts +2 -1
  93. package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
  94. package/dist/types/services/task/constants.d.ts +3 -0
  95. package/dist/types/services/task/contact.d.ts +4 -0
  96. package/dist/types/services/task/digital/Digital.d.ts +2 -2
  97. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +260 -56
  98. package/dist/types/services/task/state-machine/guards.d.ts +6 -5
  99. package/dist/types/services/task/state-machine/types.d.ts +9 -1
  100. package/dist/types/services/task/types.d.ts +81 -4
  101. package/dist/types/services/task/voice/Voice.d.ts +48 -9
  102. package/dist/types/services/task/voice/WebRTC.d.ts +2 -2
  103. package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +52 -0
  104. package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
  105. package/dist/types/types.d.ts +14 -8
  106. package/dist/types/utils/PageCache.d.ts +20 -3
  107. package/dist/types.js +7 -2
  108. package/dist/types.js.map +1 -1
  109. package/dist/utils/PageCache.js +19 -5
  110. package/dist/utils/PageCache.js.map +1 -1
  111. package/dist/webex.js +1 -1
  112. package/package.json +9 -9
  113. package/src/cc.ts +506 -9
  114. package/src/config.ts +7 -0
  115. package/src/constants.ts +8 -0
  116. package/src/index.ts +2 -0
  117. package/src/metrics/ai-docs/metrics-spec.md +9 -3
  118. package/src/metrics/behavioral-events.ts +14 -0
  119. package/src/metrics/constants.ts +2 -0
  120. package/src/services/AddressBook.ts +17 -6
  121. package/src/services/AnswerCallOnWebexService.ts +206 -0
  122. package/src/services/EntryPoint.ts +59 -60
  123. package/src/services/Queue.ts +29 -12
  124. package/src/services/WebexCrossClientService.ts +212 -0
  125. package/src/services/WxAppTelephonyMercurySync.ts +115 -0
  126. package/src/services/ai-docs/AGENTS.md +10 -10
  127. package/src/services/ai-docs/services-spec.md +6 -1
  128. package/src/services/config/Util.ts +3 -0
  129. package/src/services/config/ai-docs/AGENTS.md +1 -1
  130. package/src/services/config/ai-docs/ARCHITECTURE.md +2 -2
  131. package/src/services/config/ai-docs/config-spec.md +6 -0
  132. package/src/services/config/constants.ts +10 -6
  133. package/src/services/config/types.ts +16 -4
  134. package/src/services/core/Err.ts +1 -0
  135. package/src/services/core/WebexRequest.ts +3 -1
  136. package/src/services/core/ai-docs/core-spec.md +5 -1
  137. package/src/services/core/aqm-reqs.ts +30 -15
  138. package/src/services/core/types.ts +2 -0
  139. package/src/services/task/Task.ts +79 -8
  140. package/src/services/task/TaskFactory.ts +8 -3
  141. package/src/services/task/TaskManager.ts +522 -16
  142. package/src/services/task/WebexCallingUtils.ts +136 -0
  143. package/src/services/task/ai-docs/ARCHITECTURE.md +1 -0
  144. package/src/services/task/ai-docs/task-spec.md +152 -2
  145. package/src/services/task/constants.ts +3 -0
  146. package/src/services/task/contact.ts +30 -0
  147. package/src/services/task/digital/Digital.ts +4 -2
  148. package/src/services/task/state-machine/TaskStateMachine.ts +210 -63
  149. package/src/services/task/state-machine/actions.ts +5 -2
  150. package/src/services/task/state-machine/ai-docs/AGENTS.md +8 -4
  151. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +17 -8
  152. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +56 -24
  153. package/src/services/task/state-machine/guards.ts +64 -11
  154. package/src/services/task/state-machine/types.ts +16 -1
  155. package/src/services/task/state-machine/uiControlsComputer.ts +206 -32
  156. package/src/services/task/types.ts +114 -4
  157. package/src/services/task/voice/Voice.ts +462 -12
  158. package/src/services/task/voice/WebRTC.ts +5 -1
  159. package/src/services/task/voice/wxAppVoiceMethods.ts +307 -0
  160. package/src/services/wxAppTelephonyUtils.ts +14 -0
  161. package/src/types.ts +33 -9
  162. package/src/utils/AGENTS.md +21 -10
  163. package/src/utils/PageCache.ts +38 -5
  164. package/src/utils/ai-docs/utils-spec.md +21 -11
  165. package/test/unit/spec/cc.ts +1274 -0
  166. package/test/unit/spec/metrics/behavioral-events.ts +18 -0
  167. package/test/unit/spec/services/AddressBook.ts +37 -6
  168. package/test/unit/spec/services/AnswerCallOnWebexService.ts +223 -0
  169. package/test/unit/spec/services/EntryPoint.ts +87 -40
  170. package/test/unit/spec/services/Queue.ts +123 -12
  171. package/test/unit/spec/services/WebexCrossClientService.ts +261 -0
  172. package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +113 -0
  173. package/test/unit/spec/services/config/Util.ts +85 -0
  174. package/test/unit/spec/services/core/WebexRequest.ts +3 -1
  175. package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
  176. package/test/unit/spec/services/task/Task.ts +200 -0
  177. package/test/unit/spec/services/task/TaskFactory.ts +39 -2
  178. package/test/unit/spec/services/task/TaskManager.ts +1294 -1
  179. package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
  180. package/test/unit/spec/services/task/contact.ts +33 -0
  181. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +854 -72
  182. package/test/unit/spec/services/task/state-machine/guards.ts +210 -8
  183. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +445 -7
  184. package/test/unit/spec/services/task/voice/Voice.ts +874 -0
  185. package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +459 -0
  186. package/umd/contact-center.min.js +2 -2
  187. package/umd/contact-center.min.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"names":["_events","_interopRequireDefault","require","_calling","_types","_constants","_constants2","_types2","_types3","_loggerProxy","_TaskUtils","_TaskFactory","_WebRTC","_stateMachine","_taskDataNormalizer","e","__esModule","default","CC_EVENT_SET","Set","Object","values","CC_EVENTS","isCcEvent","value","has","TaskManager","EventEmitter","constructor","apiAIAssistant","contact","webCallingService","webSocketManager","rtdWebSocketManager","taskCollection","webRtcEnabled","registerTaskListeners","registerIncomingCallEvent","handleRealtimeWebsocketEvent","event","payload","JSON","parse","interactionId","data","conversationId","task","LoggerProxy","info","module","TASK_MANAGER_FILE","method","METHODS","HANDLE_REAL_TIME_WEBSOCKET_EVENT","type","REAL_TIME_TRANSCRIPTION","SUGGESTED_RESPONSE","emit","error","setConfigFlags","configFlags","setWrapupData","wrapupData","setAgentId","agentId","getAgentId","setWebRtcEnabled","handleIncomingWebCall","call","currentTask","find","interaction","mediaType","isCampaignPreviewReservation","mapCallToTask","getCallId","log","HANDLE_INCOMING_WEB_CALL","eventPayload","mapEventToTaskStateMachineEvent","AGENT_CONTACT_RESERVED","sendStateMachineEvent","on","LINE_EVENTS","INCOMING_CALL","unregisterIncomingCallEvent","off","ccEvent","mediaResourceId","media","isCampaignPreviewTask","TaskEvent","TASK_INCOMING","taskData","isCampaignReservationAccept","AGENT_OFFER_CAMPAIGN_RESERVATION","AGENT_OFFER_CONTACT","TASK_OFFERED","AGENT_CONTACT","HYDRATE","CONTACT_UPDATED","CONTACT_OWNER_CHANGED","AGENT_OFFER_CONSULT","OFFER_CONSULT","isConsulted","AGENT_CONTACT_ASSIGNED","ASSIGN","AGENT_CONTACT_HELD","HOLD_SUCCESS","AGENT_CONTACT_UNHELD","UNHOLD_SUCCESS","AGENT_CONSULT_CREATED","CONSULT_CREATED","AGENT_CONSULTING","CONSULTING_ACTIVE","consultDestinationAgentJoined","AGENT_CONSULT_ENDED","CONSULT_END","AGENT_CONSULT_FAILED","AGENT_CTQ_FAILED","CONSULT_FAILED","reason","AGENT_CTQ_CANCELLED","CTQ_CANCEL","AGENT_CTQ_CANCEL_FAILED","CTQ_CANCEL_FAILED","AGENT_BLIND_TRANSFERRED","AGENT_CONSULT_TRANSFERRED","AGENT_VTEAM_TRANSFERRED","TRANSFER_SUCCESS","AGENT_WRAPUP","TASK_WRAPUP","wrapUpRequired","AGENT_CONTACT_UNASSIGNED","AGENT_BLIND_TRANSFER_FAILED","AGENT_VTEAM_TRANSFER_FAILED","AGENT_CONSULT_TRANSFER_FAILED","AGENT_CONFERENCE_TRANSFER_FAILED","TRANSFER_FAILED","CONTACT_ENDED","agentsPendingWrapUp","includes","AGENT_INVITE_FAILED","INVITE_FAILED","AGENT_CONTACT_ASSIGN_FAILED","ASSIGN_FAILED","AGENT_CONTACT_OFFER_RONA","RONA","AGENT_OUTBOUND_FAILED","OUTBOUND_FAILED","CAMPAIGN_PREVIEW_ACCEPT_FAILED","CAMPAIGN_PREVIEW_SKIP_FAILED","CAMPAIGN_PREVIEW_REMOVE_FAILED","CONTACT_RECORDING_STARTED","RECORDING_STARTED","CONTACT_RECORDING_PAUSED","PAUSE_RECORDING","CONTACT_RECORDING_RESUMED","RESUME_RECORDING","AGENT_WRAPPEDUP","WRAPUP_COMPLETE","AGENT_CONSULT_CONFERENCED","AGENT_CONSULT_CONFERENCING","PARTICIPANT_JOINED_CONFERENCE","CONFERENCE_START","AGENT_CONSULT_CONFERENCE_FAILED","CONFERENCE_FAILED","AGENT_CONSULT_CONFERENCE_ENDED","CONFERENCE_END","PARTICIPANT_LEFT_CONFERENCE","PARTICIPANT_LEAVE","participantId","AGENT_CONFERENCE_TRANSFERRED","TRANSFER_CONFERENCE_SUCCESS","message","parseWebSocketMessage","eventContext","prepareEventContext","actions","handleTaskLifecycleEvent","stateMachineEvent","updateTaskData","eventType","PARTICIPANT_POST_CALL_ACTIVITY","TASK_EVENTS","TASK_POST_CALL_ACTIVITY","requestRealTimeTranscripts","keepalive","normalizeTaskData","reservationInteractionId","wasConsultedTask","Boolean","computeWrapUpRequired","undefined","adjustedPayload","context","handleContactReserved","handleAgentContact","CONTACT_MERGED","handleContactMergedEvent","handleCampaignPreviewReservation","CAMPAIGN_CONTACT_UPDATED","handleCampaignContactUpdated","existingCpd","callProcessingDetails","updatedData","campaignFields","campaignPreviewAutoAction","campaignPreviewOfferTimeout","campaignPreviewSkipDisabled","campaignPreviewRemoveDisabled","REGISTER_TASK_LISTENERS","hasCpd","autoAction","skipDisabled","removeDisabled","TASK_CAMPAIGN_CONTACT_UPDATED","TaskFactory","createTask","isConferenceInProgress","isAutoAnswering","setupTaskListeners","isConsultedTask","isSecondaryEpDnAgent","shouldAutoAnswer","shouldAutoAnswerTask","loginOption","participants","isWrapUp","getIsConferenceInProgress","Error","snapshot","stateMachineService","getSnapshot","isConsultingFlow","state","destAgentId","consultDestinationAgentId","destinationType","consultDestinationType","t","TASK_CAMPAIGN_PREVIEW_RESERVATION","TASK_HYDRATE","TASK_MULTI_LOGIN_HYDRATE","TASK_CLEANUP","options","handleTaskCleanup","removeFromCollection","removeTaskFromCollection","cancelAutoWrapupTimer","REMOVE_TASK_FROM_COLLECTION","childInteractionId","TASK_MERGED","LoginOption","BROWSER","MEDIA_CHANNEL","TELEPHONY","WebRTC","unregisterWebCallListeners","cleanUpCall","isOutdial","outboundType","isNew","needsWrapUp","action","TRANSCRIPT_EVENT_MAP","aiFeature","realtimeTranscripts","enable","sendEvent","AIAssistantEventType","CUSTOM_EVENT","AIAssistantEventName","GET_TRANSCRIPTS","catch","REQUEST_REAL_TIME_TRANSCRIPTS","getTask","taskId","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 {\n MEDIA_CHANNEL,\n TASK_EVENTS,\n TaskData,\n TaskId,\n ITask,\n WebSocketPayload,\n WebSocketMessage,\n TaskEventActions,\n EventContext,\n} from './types';\nimport {TASK_MANAGER_FILE} from '../../constants';\nimport {METHODS, TRANSCRIPT_EVENT_MAP} from './constants';\nimport {CC_EVENTS, WrapupData} from '../config/types';\nimport {ConfigFlags, LoginOption, AIAssistantEventType, AIAssistantEventName} from '../../types';\nimport LoggerProxy from '../../logger-proxy';\nimport {\n getIsConferenceInProgress,\n isCampaignPreviewTask,\n isCampaignPreviewReservation,\n isSecondaryEpDnAgent,\n shouldAutoAnswerTask,\n} from './TaskUtils';\nimport TaskFactory from './TaskFactory';\nimport WebRTC from './voice/WebRTC';\nimport {TaskEvent, type TaskEventPayload} from './state-machine';\nimport {normalizeTaskData} from './taskDataNormalizer';\nimport {ApiAIAssistant} from '../ApiAiAssistant';\n\nconst CC_EVENT_SET = new Set<CC_EVENTS>(Object.values(CC_EVENTS) as CC_EVENTS[]);\n\nconst isCcEvent = (value: string): value is CC_EVENTS => CC_EVENT_SET.has(value as CC_EVENTS);\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 rtdWebSocketManager: WebSocketManager;\n // eslint-disable-next-line no-use-before-define\n private static taskManager: TaskManager;\n private configFlags?: ConfigFlags;\n private wrapupData: WrapupData;\n private agentId: string;\n private webRtcEnabled: boolean;\n private apiAIAssistant?: ApiAIAssistant;\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 apiAIAssistant: ApiAIAssistant,\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager,\n rtdWebSocketManager: WebSocketManager\n ) {\n super();\n this.apiAIAssistant = apiAIAssistant;\n this.contact = contact;\n this.webCallingService = webCallingService;\n this.webSocketManager = webSocketManager;\n this.rtdWebSocketManager = rtdWebSocketManager;\n this.taskCollection = {};\n this.webRtcEnabled = false;\n\n this.registerTaskListeners();\n this.registerIncomingCallEvent();\n }\n\n public handleRealtimeWebsocketEvent(event: string) {\n try {\n const payload = JSON.parse(event);\n\n const interactionId = payload?.data?.data?.conversationId;\n if (!interactionId) return;\n\n const task = this.taskCollection[interactionId];\n if (!task) {\n LoggerProxy.info(`Realtime transcription task not found`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_REAL_TIME_WEBSOCKET_EVENT,\n interactionId,\n });\n\n return;\n }\n\n switch (payload.type) {\n case CC_EVENTS.REAL_TIME_TRANSCRIPTION:\n case CC_EVENTS.SUGGESTED_RESPONSE:\n task.emit(payload.type, payload.data);\n break;\n }\n } catch (error) {\n LoggerProxy.error('Failed to parse RTD WebSocket message', {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_REAL_TIME_WEBSOCKET_EVENT,\n error,\n });\n }\n }\n\n /**\n * Set config flags for task creation\n */\n public setConfigFlags(configFlags: ConfigFlags) {\n this.configFlags = configFlags;\n }\n\n /**\n * Set wrapup configuration data\n */\n public setWrapupData(wrapupData: WrapupData) {\n this.wrapupData = wrapupData;\n }\n\n /**\n * Set agent ID for task operations\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 public setWebRtcEnabled(webRtcEnabled: boolean) {\n this.webRtcEnabled = webRtcEnabled;\n }\n\n private handleIncomingWebCall = (call: ICall) => {\n const currentTask = Object.values(this.taskCollection).find(\n (task) =>\n task.data.interaction.mediaType === 'telephony' && !isCampaignPreviewReservation(task)\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\n // Send TASK_INCOMING to state machine - it will emit on the task object\n const eventPayload = TaskManager.mapEventToTaskStateMachineEvent(\n CC_EVENTS.AGENT_CONTACT_RESERVED,\n currentTask.data\n );\n if (eventPayload && currentTask) {\n currentTask.sendStateMachineEvent(eventPayload);\n }\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 /**\n * Map WebSocket CC_EVENTS to state machine TaskEvent\n * @param ccEvent - The CC_EVENT type from WebSocket\n * @param payload - The event payload\n * @param agentId - Optional agent ID for state detection (needed for HYDRATE)\n * @returns TaskEventPayload for state machine or null if no mapping\n */\n private static mapEventToTaskStateMachineEvent(\n ccEvent: CC_EVENTS,\n payload: WebSocketPayload,\n agentId?: string\n ): TaskEventPayload | null {\n const mediaResourceId =\n payload.mediaResourceId ||\n payload.interaction?.media?.[payload.interactionId]?.mediaResourceId;\n\n switch (ccEvent) {\n // CC -> TaskEvent mappings (see TaskStateMachine comment for quick reference)\n case CC_EVENTS.AGENT_CONTACT_RESERVED: // AgentContactReserved -> TASK_INCOMING\n if (isCampaignPreviewTask(payload)) {\n return {\n type: TaskEvent.TASK_INCOMING,\n taskData: payload,\n isCampaignReservationAccept: true,\n };\n }\n\n return {type: TaskEvent.TASK_INCOMING, taskData: payload};\n\n case CC_EVENTS.AGENT_OFFER_CAMPAIGN_RESERVATION: // -> TASK_INCOMING (campaign branch via guard)\n return {\n type: TaskEvent.TASK_INCOMING,\n taskData: payload,\n isCampaignReservationAccept: true,\n };\n\n case CC_EVENTS.AGENT_OFFER_CONTACT: // AgentOfferContact -> TASK_OFFERED\n return {type: TaskEvent.TASK_OFFERED, taskData: payload};\n\n case CC_EVENTS.AGENT_CONTACT: // AgentContact -> HYDRATE\n // Include agentId for state detection (e.g., checking isWrapUp in participant data)\n return {type: TaskEvent.HYDRATE, taskData: payload, agentId};\n\n case CC_EVENTS.CONTACT_UPDATED:\n return {type: TaskEvent.CONTACT_UPDATED, taskData: payload};\n case CC_EVENTS.CONTACT_OWNER_CHANGED:\n return {type: TaskEvent.CONTACT_OWNER_CHANGED, taskData: payload};\n\n case CC_EVENTS.AGENT_OFFER_CONSULT: // AgentOfferConsult -> OFFER_CONSULT\n return {\n type: TaskEvent.OFFER_CONSULT,\n taskData: {...payload, isConsulted: true},\n };\n\n case CC_EVENTS.AGENT_CONTACT_ASSIGNED: // AgentContactAssigned -> ASSIGN\n return {type: TaskEvent.ASSIGN, taskData: payload};\n\n case CC_EVENTS.AGENT_CONTACT_HELD:\n return {\n type: TaskEvent.HOLD_SUCCESS,\n mediaResourceId: mediaResourceId || '',\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_CONTACT_UNHELD:\n return {\n type: TaskEvent.UNHOLD_SUCCESS,\n mediaResourceId: mediaResourceId || '',\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_CONSULT_CREATED:\n return {\n type: TaskEvent.CONSULT_CREATED,\n taskData: {...payload, isConsulted: false},\n };\n\n case CC_EVENTS.AGENT_CONSULTING: // AgentConsulting -> CONSULTING_ACTIVE\n // use context to figure out if it's the initiator or receiver using consultInitiator from context\n return {\n type: TaskEvent.CONSULTING_ACTIVE,\n consultDestinationAgentJoined: true,\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_CONSULT_ENDED: // AgentConsultEnded -> CONSULT_END\n return {type: TaskEvent.CONSULT_END, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_FAILED:\n case CC_EVENTS.AGENT_CTQ_FAILED:\n return {type: TaskEvent.CONSULT_FAILED, reason: payload.reason, taskData: payload};\n\n case CC_EVENTS.AGENT_CTQ_CANCELLED:\n return {type: TaskEvent.CTQ_CANCEL, taskData: payload};\n\n case CC_EVENTS.AGENT_CTQ_CANCEL_FAILED:\n return {type: TaskEvent.CTQ_CANCEL_FAILED, taskData: payload};\n\n case CC_EVENTS.AGENT_BLIND_TRANSFERRED: // AgentBlindTransferred -> TRANSFER_SUCCESS\n case CC_EVENTS.AGENT_CONSULT_TRANSFERRED: // AgentConsultTransferred -> TRANSFER_SUCCESS\n case CC_EVENTS.AGENT_VTEAM_TRANSFERRED: // AgentVTeamTransferred -> TRANSFER_SUCCESS\n return {\n type: TaskEvent.TRANSFER_SUCCESS,\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_WRAPUP:\n return {type: TaskEvent.TASK_WRAPUP, taskData: {...payload, wrapUpRequired: true}};\n case CC_EVENTS.AGENT_CONTACT_UNASSIGNED:\n return null; // Add WRAPUP if needed\n\n case CC_EVENTS.AGENT_BLIND_TRANSFER_FAILED:\n case CC_EVENTS.AGENT_VTEAM_TRANSFER_FAILED:\n case CC_EVENTS.AGENT_CONSULT_TRANSFER_FAILED:\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFER_FAILED:\n return {type: TaskEvent.TRANSFER_FAILED, taskData: payload};\n\n case CC_EVENTS.CONTACT_ENDED:\n return {\n type: TaskEvent.CONTACT_ENDED,\n taskData: {\n ...payload,\n wrapUpRequired: isCampaignPreviewTask(payload)\n ? false\n : payload.agentsPendingWrapUp?.includes(agentId || '') || false,\n },\n };\n\n case CC_EVENTS.AGENT_INVITE_FAILED:\n return {type: TaskEvent.INVITE_FAILED, reason: payload.reason};\n\n case CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED:\n return {type: TaskEvent.ASSIGN_FAILED, reason: payload.reason};\n\n case CC_EVENTS.AGENT_CONTACT_OFFER_RONA:\n return {type: TaskEvent.RONA, taskData: payload, reason: payload.reason};\n\n case CC_EVENTS.AGENT_OUTBOUND_FAILED:\n return {type: TaskEvent.OUTBOUND_FAILED, taskData: payload, reason: payload.reason};\n\n case CC_EVENTS.CAMPAIGN_PREVIEW_ACCEPT_FAILED:\n return {type: TaskEvent.CAMPAIGN_PREVIEW_ACCEPT_FAILED, taskData: payload};\n\n case CC_EVENTS.CAMPAIGN_PREVIEW_SKIP_FAILED:\n return {type: TaskEvent.CAMPAIGN_PREVIEW_SKIP_FAILED, taskData: payload};\n\n case CC_EVENTS.CAMPAIGN_PREVIEW_REMOVE_FAILED:\n return {type: TaskEvent.CAMPAIGN_PREVIEW_REMOVE_FAILED, taskData: payload};\n\n case CC_EVENTS.CONTACT_RECORDING_STARTED:\n return {type: TaskEvent.RECORDING_STARTED, taskData: payload};\n\n case CC_EVENTS.CONTACT_RECORDING_PAUSED:\n return {type: TaskEvent.PAUSE_RECORDING, taskData: payload};\n\n case CC_EVENTS.CONTACT_RECORDING_RESUMED:\n return {type: TaskEvent.RESUME_RECORDING, taskData: payload};\n\n case CC_EVENTS.AGENT_WRAPPEDUP:\n return {type: TaskEvent.WRAPUP_COMPLETE, taskData: payload};\n\n // Conference events - these trigger state machine transition to CONFERENCING\n case CC_EVENTS.AGENT_CONSULT_CONFERENCED:\n case CC_EVENTS.AGENT_CONSULT_CONFERENCING:\n case CC_EVENTS.PARTICIPANT_JOINED_CONFERENCE:\n return {type: TaskEvent.CONFERENCE_START, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_FAILED:\n return {type: TaskEvent.CONFERENCE_FAILED, reason: payload.reason, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_ENDED:\n return {type: TaskEvent.CONFERENCE_END, taskData: payload};\n\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE:\n return {\n type: TaskEvent.PARTICIPANT_LEAVE,\n taskData: payload,\n participantId: payload?.participantId,\n };\n\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFERRED:\n return {type: TaskEvent.TRANSFER_CONFERENCE_SUCCESS, taskData: payload};\n\n default:\n // Not all events need state machine mapping\n return null;\n }\n }\n\n /**\n * Register WebSocket message listeners for task events\n *\n * Main entry point that orchestrates event processing through a clear pipeline:\n * 1. Parse and validate incoming WebSocket messages\n * 2. Prepare event context with task and state machine mappings\n * 3. Handle task lifecycle (creation, updates, collection management)\n * 4. Send events to state machine (task-level transitions/emissions)\n * 5. Cleanup is triggered via task events emitted by the state machine\n *\n * This architecture separates concerns:\n * - TaskManager: Manages task collection lifecycle and operational concerns\n * - State Machine: Manages individual task state and event emissions\n */\n private registerTaskListeners() {\n this.webSocketManager.on('message', (event) => {\n // Step 1: Parse and validate the message\n const message = TaskManager.parseWebSocketMessage(event);\n if (!message) return;\n\n // Step 2: Prepare event context\n const eventContext = this.prepareEventContext(message);\n if (!eventContext) return;\n\n const actions = this.handleTaskLifecycleEvent(eventContext);\n\n const {task} = actions;\n if (!task) return;\n\n const {payload, stateMachineEvent} = eventContext;\n\n // Always keep task.data updated (even for mapped events) so consumers relying\n // on TaskManager-managed task instances see the latest payload.\n if (payload) {\n this.updateTaskData(task, payload);\n }\n\n // Send event to state machine - this will trigger all TASK_EVENTS emissions\n // including TASK_INCOMING which is now handled via the state machine callbacks\n if (stateMachineEvent) {\n task.sendStateMachineEvent(stateMachineEvent);\n }\n\n // Emit TASK_POST_CALL_ACTIVITY for ParticipantPostCallActivity events so\n // consumers (Widgets) can detect the interaction state change to post_call.\n if (eventContext.eventType === CC_EVENTS.PARTICIPANT_POST_CALL_ACTIVITY) {\n task.emit(TASK_EVENTS.TASK_POST_CALL_ACTIVITY, task);\n }\n\n // Send transcript start/stop events for relevant CC events\n this.requestRealTimeTranscripts(eventContext.eventType, payload.interactionId);\n });\n }\n\n /**\n * Parse and validate WebSocket message\n * @returns Parsed message or null if invalid/keepalive\n */\n private static parseWebSocketMessage(event: string): WebSocketMessage | null {\n try {\n const payload = JSON.parse(event) as WebSocketMessage;\n\n // Filter out keepalive messages\n if (payload?.keepalive === 'true' || payload?.keepalive === true) {\n return null;\n }\n\n // Normalize task data if present\n if (payload?.data?.interaction) {\n payload.data = normalizeTaskData(payload.data);\n }\n\n return payload;\n } catch (error) {\n LoggerProxy.error('Failed to parse WebSocket message', {\n module: TASK_MANAGER_FILE,\n method: 'parseWebSocketMessage',\n error,\n });\n\n return null;\n }\n }\n\n /**\n * Prepare context for event processing\n * @returns Event context or null if event type is invalid\n */\n private prepareEventContext(message: WebSocketMessage): EventContext | null {\n const eventType = message.data?.type || message.type;\n\n if (!eventType || !isCcEvent(eventType)) {\n return null;\n }\n\n const interactionId = message.data.interactionId;\n const reservationInteractionId = message.data.reservationInteractionId;\n let task = this.taskCollection[interactionId];\n\n // When a campaign preview contact is accepted, the assigned event may arrive\n // with a new interactionId while the task is stored under the original\n // reservationInteractionId. Fall back to that key so the task is found.\n if (!task && reservationInteractionId) {\n task = this.taskCollection[reservationInteractionId];\n if (task) {\n // Re-key the task under the new interaction ID and remove the old entry\n delete this.taskCollection[reservationInteractionId];\n this.taskCollection[interactionId] = task;\n }\n }\n\n const wasConsultedTask = Boolean(task?.data?.isConsulted);\n const computeWrapUpRequired = () => {\n if (message.data.wrapUpRequired !== undefined) {\n return message.data.wrapUpRequired;\n }\n if (message.data.isConsulted !== undefined) {\n return !message.data.isConsulted;\n }\n\n return !wasConsultedTask;\n };\n\n const adjustedPayload =\n eventType === CC_EVENTS.AGENT_CONSULT_TRANSFERRED ||\n eventType === CC_EVENTS.AGENT_BLIND_TRANSFERRED ||\n eventType === CC_EVENTS.AGENT_VTEAM_TRANSFERRED\n ? {\n ...message.data,\n wrapUpRequired: computeWrapUpRequired(),\n }\n : message.data;\n\n const stateMachineEvent = TaskManager.mapEventToTaskStateMachineEvent(\n eventType,\n adjustedPayload,\n this.agentId\n );\n\n LoggerProxy.info(`Handling task event ${eventType}`, {\n module: TASK_MANAGER_FILE,\n method: 'prepareEventContext',\n interactionId,\n });\n\n return {\n eventType,\n payload: adjustedPayload,\n task,\n stateMachineEvent,\n };\n }\n\n /**\n * Handle task lifecycle events and determine required actions\n *\n * Delegates to specific event handlers based on event type. Each handler\n * is responsible for TaskManager-level concerns:\n * - Task creation and collection management\n * - Metrics tracking\n * - Resource cleanup decisions\n *\n * Note: Task-level state transitions and event emissions are handled by\n * the task state machine via sendStateMachineEvent()\n */\n private handleTaskLifecycleEvent(context: EventContext): TaskEventActions {\n const {eventType} = context;\n\n switch (eventType) {\n case CC_EVENTS.AGENT_CONTACT_RESERVED:\n return this.handleContactReserved(context);\n\n case CC_EVENTS.AGENT_CONTACT:\n return this.handleAgentContact(context);\n\n case CC_EVENTS.CONTACT_MERGED:\n return this.handleContactMergedEvent(context);\n\n case CC_EVENTS.AGENT_OFFER_CAMPAIGN_RESERVATION:\n return this.handleCampaignPreviewReservation(context);\n\n case CC_EVENTS.CAMPAIGN_CONTACT_UPDATED:\n return this.handleCampaignContactUpdated(context);\n\n default:\n return {task: context.task};\n }\n }\n\n private handleCampaignContactUpdated(context: EventContext) {\n const {payload} = context;\n let {task} = context;\n // CampaignContactUpdated is a non-terminal event (e.g., next contact after skip/remove).\n // Update the task data and emit an event so consumers can react to the updated contact.\n // Do NOT remove the task or emit TASK_END — cleanup is handled by CONTACT_ENDED.\n if (task) {\n // Carry forward campaign preview fields from existing task data since the updated\n // contact payload may not include them, and reconcileData would delete them.\n const existingCpd = task.data?.interaction?.callProcessingDetails;\n const updatedData: TaskData = {...payload};\n\n if (existingCpd) {\n const campaignFields = {\n ...(existingCpd.campaignPreviewAutoAction && {\n campaignPreviewAutoAction: existingCpd.campaignPreviewAutoAction,\n }),\n ...(existingCpd.campaignPreviewOfferTimeout && {\n campaignPreviewOfferTimeout: existingCpd.campaignPreviewOfferTimeout,\n }),\n ...(existingCpd.campaignPreviewSkipDisabled && {\n campaignPreviewSkipDisabled: existingCpd.campaignPreviewSkipDisabled,\n }),\n ...(existingCpd.campaignPreviewRemoveDisabled && {\n campaignPreviewRemoveDisabled: existingCpd.campaignPreviewRemoveDisabled,\n }),\n };\n\n if (!updatedData.interaction) {\n updatedData.interaction = {} as typeof updatedData.interaction;\n }\n\n updatedData.interaction = {\n ...updatedData.interaction,\n callProcessingDetails: {\n ...campaignFields,\n ...(updatedData.interaction.callProcessingDetails || {}),\n } as typeof existingCpd,\n };\n }\n\n LoggerProxy.log('Campaign contact updated - carrying forward preview fields', {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.interactionId,\n data: {\n hasCpd: !!updatedData.interaction?.callProcessingDetails,\n autoAction: updatedData.interaction?.callProcessingDetails?.campaignPreviewAutoAction,\n skipDisabled: updatedData.interaction?.callProcessingDetails?.campaignPreviewSkipDisabled,\n removeDisabled:\n updatedData.interaction?.callProcessingDetails?.campaignPreviewRemoveDisabled,\n },\n });\n\n task = this.updateTaskData(task, updatedData);\n task.emit(TASK_EVENTS.TASK_CAMPAIGN_CONTACT_UPDATED, task);\n }\n\n return {task};\n }\n\n /**\n * Creates or updates a task for campaign preview reservation.\n * TASK_CAMPAIGN_PREVIEW_RESERVATION is emitted by the state machine (campaign TASK_INCOMING branch).\n */\n private handleCampaignPreviewReservation(context: EventContext): TaskEventActions {\n const {payload} = context;\n let {task} = context;\n\n LoggerProxy.log('Campaign preview reservation received', {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.interactionId,\n });\n\n if (!task) {\n task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n {\n ...payload,\n wrapUpRequired: false,\n isConferenceInProgress: false,\n isAutoAnswering: false,\n },\n this.configFlags,\n this.wrapupData,\n this.agentId\n );\n this.setupTaskListeners(task);\n this.taskCollection[payload.interactionId] = task;\n } else {\n task = this.updateTaskData(task, payload);\n }\n\n return {task};\n }\n\n /**\n * Handle AGENT_CONTACT_RESERVED event\n * Creates a new task; state machine event is sent during processing\n */\n private handleContactReserved(context: EventContext): TaskEventActions {\n const {payload} = context;\n const isConsultedTask =\n payload.isConsulted === true || isSecondaryEpDnAgent(payload.interaction);\n const shouldAutoAnswer = shouldAutoAnswerTask(\n payload,\n this.agentId,\n this.webCallingService.loginOption,\n this.webRtcEnabled\n );\n\n const taskData: TaskData = {\n ...payload,\n isConsulted: isConsultedTask,\n isAutoAnswering: shouldAutoAnswer,\n };\n\n const task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId\n );\n\n this.setupTaskListeners(task);\n this.taskCollection[payload.interactionId] = task;\n\n return {task};\n }\n\n /**\n * Handle AGENT_CONTACT event\n * Re-creates task if missing (multi-session scenario)\n */\n private handleAgentContact(context: EventContext): TaskEventActions {\n let {task} = context;\n const {payload} = context;\n\n if (!task) {\n const isConsultedTask =\n payload.isConsulted === true || isSecondaryEpDnAgent(payload.interaction);\n const shouldAutoAnswer = shouldAutoAnswerTask(\n payload,\n this.agentId,\n this.webCallingService.loginOption,\n this.webRtcEnabled\n );\n const taskData: TaskData = {\n ...payload,\n isConsulted: isConsultedTask,\n wrapUpRequired: payload.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(payload),\n isAutoAnswering: shouldAutoAnswer,\n };\n\n task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId\n );\n this.setupTaskListeners(task);\n this.taskCollection[payload.interactionId] = task;\n }\n\n return {task};\n }\n\n private updateTaskData(task: ITask, taskData: TaskData): ITask {\n if (!task) {\n throw new Error('Task not found for update');\n }\n\n const snapshot = task.stateMachineService?.getSnapshot?.();\n const isConsultingFlow =\n snapshot?.value === 'CONSULTING' || taskData.interaction?.state === 'consulting';\n\n const updateTaskData = isConsultingFlow\n ? {\n ...taskData,\n destAgentId: taskData.destAgentId ?? snapshot?.context?.consultDestinationAgentId ?? null,\n destinationType:\n taskData.destinationType ?? snapshot?.context?.consultDestinationType ?? null,\n }\n : taskData;\n\n task.updateTaskData(updateTaskData);\n this.taskCollection[taskData.interactionId] = task;\n\n return task;\n }\n\n /**\n * Setup listeners for task events that need to be bubbled up to TaskManager\n * This replaces the previous callback injection pattern\n */\n private setupTaskListeners(task: ITask): void {\n // Listen for TASK_INCOMING and re-emit so webex.cc can notify consumers\n task.on(TASK_EVENTS.TASK_INCOMING, (t: ITask) => {\n LoggerProxy.log(`Task incoming event received`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: t.data?.interactionId,\n });\n\n this.emit(TASK_EVENTS.TASK_INCOMING, t);\n });\n\n task.on(TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION, (t: ITask) => {\n LoggerProxy.log(`Campaign preview reservation event received`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: t.data?.interactionId,\n });\n\n this.emit(TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION, t);\n });\n\n // Listen for TASK_HYDRATE on the task and re-emit on TaskManager\n task.on(TASK_EVENTS.TASK_HYDRATE, (t: ITask) => {\n // Task data is already updated by the task itself before emitting\n this.emit(TASK_EVENTS.TASK_HYDRATE, t);\n });\n\n task.on(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, (t: ITask) => {\n this.emit(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, t);\n });\n\n // Listen for internal cleanup signal emitted by the state machine\n task.on(TASK_EVENTS.TASK_CLEANUP, (t: ITask, options?: {removeFromCollection?: boolean}) => {\n this.handleTaskCleanup(t);\n if (options?.removeFromCollection) {\n const interactionId = t?.data?.interactionId;\n if (interactionId && this.taskCollection[interactionId]) {\n this.removeTaskFromCollection(t);\n }\n }\n });\n }\n\n private removeTaskFromCollection(task: ITask) {\n if (typeof task.cancelAutoWrapupTimer === 'function') {\n task.cancelAutoWrapupTimer();\n }\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 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 handleContactMergedEvent(context: EventContext): TaskEventActions {\n const {payload} = context;\n let task = context.task;\n\n if (payload.childInteractionId && this.taskCollection[payload.childInteractionId]) {\n this.removeTaskFromCollection(this.taskCollection[payload.childInteractionId]);\n }\n\n if (task) {\n LoggerProxy.log(`Got CONTACT_MERGED: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.interactionId,\n });\n // update the task data\n this.updateTaskData(task, payload);\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: payload.interactionId,\n });\n\n const taskData: TaskData = {\n ...payload,\n wrapUpRequired: payload.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(payload),\n isConsulted: false,\n };\n\n task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.interactionId] = task;\n\n // Transition the new task out of IDLE immediately so UI controls are\n // computed before TASK_MERGED is emitted. This handles the race where\n // AgentContactAssigned arrives before ContactMerged and gets dropped.\n // Send HYDRATE before setupTaskListeners so the emitTaskHydrate action\n // doesn't bubble up to the Widget (avoids duplicate listener registration).\n task.sendStateMachineEvent({\n type: TaskEvent.HYDRATE,\n taskData,\n agentId: this.agentId,\n } as TaskEventPayload);\n\n this.setupTaskListeners(task);\n }\n\n if (task) {\n this.emit(TASK_EVENTS.TASK_MERGED, task);\n }\n\n return {task};\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 === MEDIA_CHANNEL.TELEPHONY &&\n task instanceof WebRTC\n ) {\n task.unregisterWebCallListeners();\n this.webCallingService.cleanUpCall();\n }\n\n const isOutdial = task.data.interaction.outboundType === 'OUTDIAL';\n const isNew = task.data.interaction.state === 'new';\n const needsWrapUp = task.data.agentsPendingWrapUp?.includes(this.agentId) ?? false;\n\n // For OUTDIAL: only remove if NOT terminated (user-declined, no wrap-up follows)\n // For non-OUTDIAL: remove if state is 'new'\n // Always remove if secondary EpDn agent\n if (\n (isNew && !(isOutdial && needsWrapUp)) ||\n isSecondaryEpDnAgent(task.data.interaction) ||\n (!needsWrapUp && isOutdial) // For outdial tasks, needs wrap-up is false and state is \"WRAPUP\". We need to just remove the task.\n ) {\n this.removeTaskFromCollection(task);\n }\n }\n\n /**\n * Sends transcript start/stop event based on the CC event type.\n * Fire-and-forget; errors are logged but do not interrupt event processing.\n */\n private requestRealTimeTranscripts(eventType: string, interactionId: string): void {\n const action = TRANSCRIPT_EVENT_MAP[eventType];\n if (!action || !this.apiAIAssistant) return;\n if (this.configFlags?.aiFeature?.realtimeTranscripts?.enable !== true) return;\n\n this.apiAIAssistant\n .sendEvent(\n this.agentId,\n interactionId,\n AIAssistantEventType.CUSTOM_EVENT,\n AIAssistantEventName.GET_TRANSCRIPTS,\n {action}\n )\n .catch((error) => {\n LoggerProxy.error(`Failed to send transcript ${action} event`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REQUEST_REAL_TIME_TRANSCRIPTS,\n interactionId,\n error,\n });\n });\n }\n\n public getTask(taskId: TaskId): ITask {\n return this.taskCollection[taskId];\n }\n\n public getAllTasks(): Record<TaskId, ITask> {\n return {...this.taskCollection};\n }\n\n public static getTaskManager(\n apiAIAssistant: ApiAIAssistant,\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager,\n rtdWebSocketManager?: WebSocketManager\n ): TaskManager {\n if (!TaskManager.taskManager) {\n TaskManager.taskManager = new TaskManager(\n apiAIAssistant,\n contact,\n webCallingService,\n webSocketManager,\n rtdWebSocketManager\n );\n }\n\n return TaskManager.taskManager;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_events","_interopRequireDefault","require","_calling","_types","_constants","_constants2","_types2","_types3","_loggerProxy","_TaskUtils","_TaskFactory","_WebexCallingUtils","_WebRTC","_stateMachine","_constants3","_taskDataNormalizer","e","__esModule","default","CC_EVENT_SET","Set","Object","values","CC_EVENTS","MAIN_INTERACTION_CORRELATED_EVENTS","AGENT_CONSULT_ENDED","PARTICIPANT_LEFT_CONFERENCE","isCcEvent","value","has","TaskManager","EventEmitter","constructor","apiAIAssistant","contact","webCallingService","webSocketManager","rtdWebSocketManager","taskCollection","webRtcEnabled","registerTaskListeners","registerIncomingCallEvent","handleRealtimeWebsocketEvent","event","payload","JSON","parse","interactionId","data","conversationId","task","LoggerProxy","info","module","TASK_MANAGER_FILE","method","METHODS","HANDLE_REAL_TIME_WEBSOCKET_EVENT","type","REAL_TIME_TRANSCRIPTION","SUGGESTED_RESPONSE","emit","error","setConfigFlags","configFlags","setWrapupData","wrapupData","setAgentId","agentId","getAgentId","setWebRtcEnabled","setAnswerCallOnWebexService","answerCallOnWebexService","handleIncomingWebCall","call","currentTask","find","interaction","mediaType","isCampaignPreviewReservation","mapCallToTask","getCallId","log","HANDLE_INCOMING_WEB_CALL","eventPayload","mapEventToTaskStateMachineEvent","AGENT_CONTACT_RESERVED","sendStateMachineEvent","on","LINE_EVENTS","INCOMING_CALL","unregisterIncomingCallEvent","off","ccEvent","enableWxBetterTogether","mediaResourceId","media","isCampaignPreviewTask","TaskEvent","TASK_INCOMING","taskData","isCampaignReservationAccept","AGENT_OFFER_CAMPAIGN_RESERVATION","AGENT_OFFER_CONTACT","TASK_OFFERED","AGENT_CONTACT","HYDRATE","CONTACT_UPDATED","owner","trim","length","CONTACT_OWNER_CHANGED","AGENT_OFFER_CONSULT","OFFER_CONSULT","isConsulted","AGENT_CONTACT_ASSIGNED","ASSIGN","AGENT_CONTACT_HELD","HOLD_SUCCESS","AGENT_CONTACT_UNHELD","UNHOLD_SUCCESS","AGENT_CONSULT_CREATED","CONSULT_CREATED","AGENT_CONSULTING","CONSULTING_ACTIVE","consultDestinationAgentJoined","CONSULT_END","AGENT_CONSULT_FAILED","AGENT_CTQ_FAILED","CONSULT_FAILED","reason","AGENT_CTQ_CANCELLED","CTQ_CANCEL","AGENT_CTQ_CANCEL_FAILED","CTQ_CANCEL_FAILED","AGENT_BLIND_TRANSFERRED","AGENT_CONSULT_TRANSFERRED","AGENT_VTEAM_TRANSFERRED","TRANSFER_SUCCESS","AGENT_WRAPUP","TASK_WRAPUP","wrapUpRequired","AGENT_CONTACT_UNASSIGNED","AGENT_BLIND_TRANSFER_FAILED","AGENT_VTEAM_TRANSFER_FAILED","AGENT_CONSULT_TRANSFER_FAILED","AGENT_CONFERENCE_TRANSFER_FAILED","TRANSFER_FAILED","CONTACT_ENDED","agentsPendingWrapUp","includes","isAgentTerminatedOutdialWrapup","OUTBOUND_FAILED","AGENT_INVITE_FAILED","INVITE_FAILED","AGENT_CONTACT_ASSIGN_FAILED","ASSIGN_FAILED","AGENT_CONTACT_OFFER_RONA","RONA","AGENT_OUTBOUND_FAILED","isAgentTerminatedOutdial","outboundType","terminatingParty","suppressOutdialFailedPopup","isWxAppManagedOutdialTask","CAMPAIGN_PREVIEW_ACCEPT_FAILED","CAMPAIGN_PREVIEW_SKIP_FAILED","CAMPAIGN_PREVIEW_REMOVE_FAILED","CONTACT_RECORDING_STARTED","RECORDING_STARTED","CONTACT_RECORDING_PAUSED","PAUSE_RECORDING","CONTACT_RECORDING_RESUMED","RESUME_RECORDING","AGENT_WRAPPEDUP","WRAPUP_COMPLETE","AGENT_CONSULT_CONFERENCED","AGENT_CONSULT_CONFERENCING","PARTICIPANT_JOINED_CONFERENCE","CONFERENCE_START","AGENT_CONSULT_CONFERENCE_FAILED","CONFERENCE_FAILED","AGENT_CONSULT_CONFERENCE_ENDED","CONFERENCE_END","PARTICIPANT_LEAVE","participantId","AGENT_CONFERENCE_TRANSFERRED","TRANSFER_CONFERENCE_SUCCESS","wxAppEnabled","uiControlConfig","effectiveAgentId","participants","details","getWebexCallingDeviceDetailsForAgent","deviceType","isOutdial","agentTerminated","wxAppAnswerPending","interactionWrapUp","state","message","parseWebSocketMessage","eventContext","prepareEventContext","actions","handleTaskLifecycleEvent","stateMachineEvent","updateTaskData","eventType","PARTICIPANT_POST_CALL_ACTIVITY","TASK_EVENTS","TASK_POST_CALL_ACTIVITY","requestRealTimeTranscripts","keepalive","normalizeTaskData","reservationInteractionId","findTaskForContactOwnerChange","findUniqueTaskByRelatedInteraction","wasConsultedTask","Boolean","computeWrapUpRequired","undefined","adjustedPayload","preserveMainTaskIdentity","preserveConfirmedOwner","relatedCandidates","findRelatedTasks","includeCollectionKeys","includeMainCallMediaKeys","incomingShowsCurrentAgentPromotion","isCurrentAgentPromotedOnIncomingMainCall","eligibleCandidates","filter","candidate","isCurrentAgentActiveOnMainInteraction","warn","mainInteractionId","parentInteractionId","callProcessingDetails","currentAgentId","isParticipantActiveOnMainInteraction","participant","hasLeft","some","mType","MEDIA_TYPE_MAIN_CALL","getMainCallMediaId","entries","getStableMainInteractionId","canRecoverTaskFromContactOwnerChanged","stableInteractionId","MEDIA_CHANNEL","TELEPHONY","isTerminated","currentMainInteractionId","payloadMainInteractionId","currentMainMediaId","payloadMainMediaId","confirmedOwner","incomingOwner","confirmedOwnerIsActive","incomingOwnerIsExplicitlyDeparted","candidateFilter","candidates","options","payloadInteractionIds","size","taskId","taskInteraction","candidateInteractionIds","map","context","handleContactReserved","handleAgentContact","CONTACT_MERGED","handleContactMergedEvent","handleContactOwnerChanged","handleCampaignPreviewReservation","CAMPAIGN_CONTACT_UPDATED","handleCampaignContactUpdated","normalizedPayload","isWrapUp","isConferenceInProgress","getIsConferenceInProgress","isAutoAnswering","TaskFactory","createTask","setupTaskListeners","existingCpd","updatedData","campaignFields","campaignPreviewAutoAction","campaignPreviewOfferTimeout","campaignPreviewSkipDisabled","campaignPreviewRemoveDisabled","REGISTER_TASK_LISTENERS","hasCpd","autoAction","skipDisabled","removeDisabled","TASK_CAMPAIGN_CONTACT_UPDATED","isConsultedTask","isSecondaryEpDnAgent","shouldAutoAnswer","shouldAutoAnswerTask","loginOption","Error","snapshot","stateMachineService","getSnapshot","isConsultingFlow","destAgentId","consultDestinationAgentId","destinationType","consultDestinationType","forEach","t","TASK_CAMPAIGN_PREVIEW_RESERVATION","TASK_HYDRATE","TASK_MULTI_LOGIN_HYDRATE","TASK_CLEANUP","handleTaskCleanup","removeFromCollection","taskIsStillCollected","removeTaskFromCollection","cancelAutoWrapupTimer","REMOVE_TASK_FROM_COLLECTION","childInteractionId","TASK_MERGED","LoginOption","BROWSER","WebRTC","unregisterWebCallListeners","cleanUpCall","isNew","needsWrapUp","action","TRANSCRIPT_EVENT_MAP","aiFeature","realtimeTranscripts","enable","sendEvent","AIAssistantEventType","CUSTOM_EVENT","AIAssistantEventName","GET_TRANSCRIPTS","catch","REQUEST_REAL_TIME_TRANSCRIPTS","getTask","getAllTasks","applyEnableWxBetterTogether","enabled","setEnableWxBetterTogether","syncWxAppMuteFromCallDetailsForTask","applyWxAppMuteStateFromSync","callId","muted","sync","syncWxAppMuteFromCallDetails","bind","syncWxAppMuteFromCallDetailsForAllTasks","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 {\n MEDIA_CHANNEL,\n TASK_EVENTS,\n TaskData,\n TaskId,\n ITask,\n WebSocketPayload,\n WebSocketMessage,\n TaskEventActions,\n EventContext,\n} from './types';\nimport {TASK_MANAGER_FILE} from '../../constants';\nimport {METHODS, TRANSCRIPT_EVENT_MAP} from './constants';\nimport {CC_EVENTS, WrapupData} from '../config/types';\nimport {ConfigFlags, LoginOption, AIAssistantEventType, AIAssistantEventName} from '../../types';\nimport LoggerProxy from '../../logger-proxy';\nimport {\n getIsConferenceInProgress,\n isCampaignPreviewTask,\n isCampaignPreviewReservation,\n isSecondaryEpDnAgent,\n shouldAutoAnswerTask,\n} from './TaskUtils';\nimport TaskFactory from './TaskFactory';\nimport AnswerCallOnWebexService from '../AnswerCallOnWebexService';\nimport {getWebexCallingDeviceDetailsForAgent} from './WebexCallingUtils';\nimport WebRTC from './voice/WebRTC';\nimport {TaskEvent, type TaskEventPayload} from './state-machine';\nimport {MEDIA_TYPE_MAIN_CALL} from './state-machine/constants';\nimport {normalizeTaskData} from './taskDataNormalizer';\nimport {ApiAIAssistant} from '../ApiAiAssistant';\n\nconst CC_EVENT_SET = new Set<CC_EVENTS>(Object.values(CC_EVENTS) as CC_EVENTS[]);\n\nconst MAIN_INTERACTION_CORRELATED_EVENTS = new Set<CC_EVENTS>([\n CC_EVENTS.AGENT_CONSULT_ENDED,\n CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE,\n]);\n\nconst isCcEvent = (value: string): value is CC_EVENTS => CC_EVENT_SET.has(value as CC_EVENTS);\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 rtdWebSocketManager: WebSocketManager;\n // eslint-disable-next-line no-use-before-define\n private static taskManager: TaskManager;\n private configFlags?: ConfigFlags;\n private wrapupData: WrapupData;\n private agentId: string;\n private webRtcEnabled: boolean;\n private answerCallOnWebexService?: AnswerCallOnWebexService;\n private apiAIAssistant?: ApiAIAssistant;\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 apiAIAssistant: ApiAIAssistant,\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager,\n rtdWebSocketManager: WebSocketManager\n ) {\n super();\n this.apiAIAssistant = apiAIAssistant;\n this.contact = contact;\n this.webCallingService = webCallingService;\n this.webSocketManager = webSocketManager;\n this.rtdWebSocketManager = rtdWebSocketManager;\n this.taskCollection = {};\n this.webRtcEnabled = false;\n\n this.registerTaskListeners();\n this.registerIncomingCallEvent();\n }\n\n public handleRealtimeWebsocketEvent(event: string) {\n try {\n const payload = JSON.parse(event);\n\n const interactionId = payload?.data?.data?.conversationId;\n if (!interactionId) return;\n\n const task = this.taskCollection[interactionId];\n if (!task) {\n LoggerProxy.info(`Realtime transcription task not found`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_REAL_TIME_WEBSOCKET_EVENT,\n interactionId,\n });\n\n return;\n }\n\n switch (payload.type) {\n case CC_EVENTS.REAL_TIME_TRANSCRIPTION:\n case CC_EVENTS.SUGGESTED_RESPONSE:\n task.emit(payload.type, payload.data);\n break;\n }\n } catch (error) {\n LoggerProxy.error('Failed to parse RTD WebSocket message', {\n module: TASK_MANAGER_FILE,\n method: METHODS.HANDLE_REAL_TIME_WEBSOCKET_EVENT,\n error,\n });\n }\n }\n\n /**\n * Set config flags for task creation\n */\n public setConfigFlags(configFlags: ConfigFlags) {\n this.configFlags = configFlags;\n }\n\n /**\n * Set wrapup configuration data\n */\n public setWrapupData(wrapupData: WrapupData) {\n this.wrapupData = wrapupData;\n }\n\n /**\n * Set agent ID for task operations\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 public setWebRtcEnabled(webRtcEnabled: boolean) {\n this.webRtcEnabled = webRtcEnabled;\n }\n\n public setAnswerCallOnWebexService(answerCallOnWebexService: AnswerCallOnWebexService) {\n this.answerCallOnWebexService = answerCallOnWebexService;\n }\n\n private handleIncomingWebCall = (call: ICall) => {\n const currentTask = Object.values(this.taskCollection).find(\n (task) =>\n task.data.interaction.mediaType === 'telephony' && !isCampaignPreviewReservation(task)\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\n // Send TASK_INCOMING to state machine - it will emit on the task object\n const eventPayload = TaskManager.mapEventToTaskStateMachineEvent(\n CC_EVENTS.AGENT_CONTACT_RESERVED,\n currentTask.data\n );\n if (eventPayload && currentTask) {\n currentTask.sendStateMachineEvent(eventPayload);\n }\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 /**\n * Map WebSocket CC_EVENTS to state machine TaskEvent\n * @param ccEvent - The CC_EVENT type from WebSocket\n * @param payload - The event payload\n * @param agentId - Optional agent ID for state detection (needed for HYDRATE)\n * @param task - Optional task instance for state-aware CONTACT_ENDED mapping\n * @returns TaskEventPayload for state machine or null if no mapping\n */\n private static mapEventToTaskStateMachineEvent(\n ccEvent: CC_EVENTS,\n payload: WebSocketPayload,\n agentId?: string,\n task?: ITask,\n enableWxBetterTogether?: boolean\n ): TaskEventPayload | null {\n const mediaResourceId =\n payload.mediaResourceId ||\n payload.interaction?.media?.[payload.interactionId]?.mediaResourceId;\n\n switch (ccEvent) {\n // CC -> TaskEvent mappings (see TaskStateMachine comment for quick reference)\n case CC_EVENTS.AGENT_CONTACT_RESERVED: // AgentContactReserved -> TASK_INCOMING\n if (isCampaignPreviewTask(payload)) {\n return {\n type: TaskEvent.TASK_INCOMING,\n taskData: payload,\n isCampaignReservationAccept: true,\n };\n }\n\n return {type: TaskEvent.TASK_INCOMING, taskData: payload};\n\n case CC_EVENTS.AGENT_OFFER_CAMPAIGN_RESERVATION: // -> TASK_INCOMING (campaign branch via guard)\n return {\n type: TaskEvent.TASK_INCOMING,\n taskData: payload,\n isCampaignReservationAccept: true,\n };\n\n case CC_EVENTS.AGENT_OFFER_CONTACT: // AgentOfferContact -> TASK_OFFERED\n return {type: TaskEvent.TASK_OFFERED, taskData: payload};\n\n case CC_EVENTS.AGENT_CONTACT: // AgentContact -> HYDRATE\n // Include agentId for state detection (e.g., checking isWrapUp in participant data)\n return {type: TaskEvent.HYDRATE, taskData: payload, agentId};\n\n case CC_EVENTS.CONTACT_UPDATED:\n if (\n task &&\n typeof payload.interaction?.owner === 'string' &&\n payload.interaction.owner.trim().length > 0 &&\n payload.interaction.owner !== task.data?.interaction?.owner\n ) {\n return {type: TaskEvent.CONTACT_OWNER_CHANGED, taskData: payload};\n }\n\n return {type: TaskEvent.CONTACT_UPDATED, taskData: payload};\n case CC_EVENTS.CONTACT_OWNER_CHANGED:\n return {type: TaskEvent.CONTACT_OWNER_CHANGED, taskData: payload};\n\n case CC_EVENTS.AGENT_OFFER_CONSULT: // AgentOfferConsult -> OFFER_CONSULT\n return {\n type: TaskEvent.OFFER_CONSULT,\n taskData: {...payload, isConsulted: true},\n };\n\n case CC_EVENTS.AGENT_CONTACT_ASSIGNED: // AgentContactAssigned -> ASSIGN\n return {type: TaskEvent.ASSIGN, taskData: payload};\n\n case CC_EVENTS.AGENT_CONTACT_HELD:\n return {\n type: TaskEvent.HOLD_SUCCESS,\n mediaResourceId: mediaResourceId || '',\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_CONTACT_UNHELD:\n return {\n type: TaskEvent.UNHOLD_SUCCESS,\n mediaResourceId: mediaResourceId || '',\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_CONSULT_CREATED:\n return {\n type: TaskEvent.CONSULT_CREATED,\n taskData: {...payload, isConsulted: false},\n };\n\n case CC_EVENTS.AGENT_CONSULTING: // AgentConsulting -> CONSULTING_ACTIVE\n // use context to figure out if it's the initiator or receiver using consultInitiator from context\n return {\n type: TaskEvent.CONSULTING_ACTIVE,\n consultDestinationAgentJoined: true,\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_CONSULT_ENDED: // AgentConsultEnded -> CONSULT_END\n return {type: TaskEvent.CONSULT_END, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_FAILED:\n case CC_EVENTS.AGENT_CTQ_FAILED:\n return {type: TaskEvent.CONSULT_FAILED, reason: payload.reason, taskData: payload};\n\n case CC_EVENTS.AGENT_CTQ_CANCELLED:\n return {type: TaskEvent.CTQ_CANCEL, taskData: payload};\n\n case CC_EVENTS.AGENT_CTQ_CANCEL_FAILED:\n return {type: TaskEvent.CTQ_CANCEL_FAILED, taskData: payload};\n\n case CC_EVENTS.AGENT_BLIND_TRANSFERRED: // AgentBlindTransferred -> TRANSFER_SUCCESS\n case CC_EVENTS.AGENT_CONSULT_TRANSFERRED: // AgentConsultTransferred -> TRANSFER_SUCCESS\n case CC_EVENTS.AGENT_VTEAM_TRANSFERRED: // AgentVTeamTransferred -> TRANSFER_SUCCESS\n return {\n type: TaskEvent.TRANSFER_SUCCESS,\n taskData: payload,\n };\n\n case CC_EVENTS.AGENT_WRAPUP:\n return {type: TaskEvent.TASK_WRAPUP, taskData: {...payload, wrapUpRequired: true}};\n case CC_EVENTS.AGENT_CONTACT_UNASSIGNED:\n return null; // Add WRAPUP if needed\n\n case CC_EVENTS.AGENT_BLIND_TRANSFER_FAILED:\n case CC_EVENTS.AGENT_VTEAM_TRANSFER_FAILED:\n case CC_EVENTS.AGENT_CONSULT_TRANSFER_FAILED:\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFER_FAILED:\n return {type: TaskEvent.TRANSFER_FAILED, taskData: payload};\n\n case CC_EVENTS.CONTACT_ENDED: {\n const wrapUpRequired = isCampaignPreviewTask(payload)\n ? false\n : payload.agentsPendingWrapUp?.includes(agentId || '') || false;\n\n // Post-accept wxApp outdial agent-end delivers ContactEnded instead of\n // AgentOutboundFailed. Normalize to OUTBOUND_FAILED so state machine\n // enters WRAPPING_UP and emits TASK_OUTDIAL_FAILED (AGENT_ENDS).\n // Pre-accept cancelTask decline stays CONTACT_ENDED → TERMINATED (no wrapup).\n if (\n TaskManager.isAgentTerminatedOutdialWrapup(\n payload,\n wrapUpRequired,\n task,\n agentId,\n enableWxBetterTogether\n )\n ) {\n return {\n type: TaskEvent.OUTBOUND_FAILED,\n reason: 'AGENT_ENDS',\n taskData: {...payload, wrapUpRequired: true},\n };\n }\n\n return {\n type: TaskEvent.CONTACT_ENDED,\n taskData: {\n ...payload,\n wrapUpRequired,\n },\n };\n }\n\n case CC_EVENTS.AGENT_INVITE_FAILED:\n return {type: TaskEvent.INVITE_FAILED, reason: payload.reason};\n\n case CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED:\n return {type: TaskEvent.ASSIGN_FAILED, reason: payload.reason};\n\n case CC_EVENTS.AGENT_CONTACT_OFFER_RONA:\n return {type: TaskEvent.RONA, taskData: payload, reason: payload.reason};\n\n case CC_EVENTS.AGENT_OUTBOUND_FAILED: {\n const isAgentTerminatedOutdial =\n payload.interaction?.outboundType === 'OUTDIAL' &&\n (payload.terminatingParty === 'Agent' || payload.reason === 'AGENT_ENDS');\n\n const suppressOutdialFailedPopup =\n isAgentTerminatedOutdial &&\n !TaskManager.isWxAppManagedOutdialTask(agentId, payload, task, enableWxBetterTogether);\n\n return {\n type: TaskEvent.OUTBOUND_FAILED,\n taskData: suppressOutdialFailedPopup\n ? {...payload, suppressOutdialFailedPopup: true}\n : payload,\n reason: payload.reason,\n };\n }\n\n case CC_EVENTS.CAMPAIGN_PREVIEW_ACCEPT_FAILED:\n return {type: TaskEvent.CAMPAIGN_PREVIEW_ACCEPT_FAILED, taskData: payload};\n\n case CC_EVENTS.CAMPAIGN_PREVIEW_SKIP_FAILED:\n return {type: TaskEvent.CAMPAIGN_PREVIEW_SKIP_FAILED, taskData: payload};\n\n case CC_EVENTS.CAMPAIGN_PREVIEW_REMOVE_FAILED:\n return {type: TaskEvent.CAMPAIGN_PREVIEW_REMOVE_FAILED, taskData: payload};\n\n case CC_EVENTS.CONTACT_RECORDING_STARTED:\n return {type: TaskEvent.RECORDING_STARTED, taskData: payload};\n\n case CC_EVENTS.CONTACT_RECORDING_PAUSED:\n return {type: TaskEvent.PAUSE_RECORDING, taskData: payload};\n\n case CC_EVENTS.CONTACT_RECORDING_RESUMED:\n return {type: TaskEvent.RESUME_RECORDING, taskData: payload};\n\n case CC_EVENTS.AGENT_WRAPPEDUP:\n return {type: TaskEvent.WRAPUP_COMPLETE, taskData: payload};\n\n // Conference events - these trigger state machine transition to CONFERENCING\n case CC_EVENTS.AGENT_CONSULT_CONFERENCED:\n case CC_EVENTS.AGENT_CONSULT_CONFERENCING:\n case CC_EVENTS.PARTICIPANT_JOINED_CONFERENCE:\n return {type: TaskEvent.CONFERENCE_START, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_FAILED:\n return {type: TaskEvent.CONFERENCE_FAILED, reason: payload.reason, taskData: payload};\n\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_ENDED:\n return {type: TaskEvent.CONFERENCE_END, taskData: payload};\n\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE:\n return {\n type: TaskEvent.PARTICIPANT_LEAVE,\n taskData: payload,\n participantId: payload?.participantId,\n };\n\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFERRED:\n return {type: TaskEvent.TRANSFER_CONFERENCE_SUCCESS, taskData: payload};\n\n default:\n // Not all events need state machine mapping\n return null;\n }\n }\n\n /**\n * True when the current agent's task is a wxApp-managed outdial (thick-client telephony).\n */\n private static isWxAppManagedOutdialTask(\n agentId: string | undefined,\n payload: WebSocketPayload,\n task: ITask | undefined,\n enableWxBetterTogether?: boolean\n ): boolean {\n const wxAppEnabled =\n (task as {uiControlConfig?: {enableWxBetterTogether?: boolean}})?.uiControlConfig\n ?.enableWxBetterTogether ??\n enableWxBetterTogether ??\n false;\n\n if (!wxAppEnabled) {\n return false;\n }\n\n const effectiveAgentId = agentId ?? task?.data?.agentId;\n const participants = payload.interaction?.participants ?? task?.data?.interaction?.participants;\n const details = getWebexCallingDeviceDetailsForAgent(effectiveAgentId, participants);\n\n return details?.deviceType === 'wxApp';\n }\n\n /**\n * True when ContactEnded represents an agent-terminated wxApp outdial that should\n * enter wrapup with an outdial-failed popup (legacy AgentOutboundFailed parity).\n */\n private static isAgentTerminatedOutdialWrapup(\n payload: WebSocketPayload,\n wrapUpRequired: boolean,\n task?: ITask,\n agentId?: string,\n enableWxBetterTogether?: boolean\n ): boolean {\n const isOutdial = payload.interaction?.outboundType === 'OUTDIAL';\n const agentTerminated = payload.terminatingParty === 'Agent';\n\n if (!isOutdial || !agentTerminated) {\n return false;\n }\n\n if (!TaskManager.isWxAppManagedOutdialTask(agentId, payload, task, enableWxBetterTogether)) {\n return false;\n }\n\n const wxAppAnswerPending =\n (task as {uiControlConfig?: {wxAppAnswerPending?: boolean}})?.uiControlConfig\n ?.wxAppAnswerPending ?? false;\n\n // Pre-accept decline: decline() clears wxAppAnswerPending; backend may still send state wrapUp.\n if (!wxAppAnswerPending && !wrapUpRequired) {\n return false;\n }\n\n const interactionWrapUp = payload.interaction?.state === 'wrapUp';\n\n return wrapUpRequired || interactionWrapUp || wxAppAnswerPending;\n }\n\n /**\n * Register WebSocket message listeners for task events\n *\n * Main entry point that orchestrates event processing through a clear pipeline:\n * 1. Parse and validate incoming WebSocket messages\n * 2. Prepare event context with task and state machine mappings\n * 3. Handle task lifecycle (creation, updates, collection management)\n * 4. Send events to state machine (task-level transitions/emissions)\n * 5. Cleanup is triggered via task events emitted by the state machine\n *\n * This architecture separates concerns:\n * - TaskManager: Manages task collection lifecycle and operational concerns\n * - State Machine: Manages individual task state and event emissions\n */\n private registerTaskListeners() {\n this.webSocketManager.on('message', (event) => {\n // Step 1: Parse and validate the message\n const message = TaskManager.parseWebSocketMessage(event);\n if (!message) return;\n\n // Step 2: Prepare event context\n const eventContext = this.prepareEventContext(message);\n if (!eventContext) return;\n\n const actions = this.handleTaskLifecycleEvent(eventContext);\n\n const {task} = actions;\n if (!task) return;\n\n const {payload, stateMachineEvent} = eventContext;\n\n // Always keep task.data updated (even for mapped events) so consumers relying\n // on TaskManager-managed task instances see the latest payload.\n if (payload) {\n this.updateTaskData(task, payload);\n }\n\n // Send event to state machine - this will trigger all TASK_EVENTS emissions\n // including TASK_INCOMING which is now handled via the state machine callbacks\n if (stateMachineEvent) {\n task.sendStateMachineEvent(stateMachineEvent);\n }\n\n // Emit TASK_POST_CALL_ACTIVITY for ParticipantPostCallActivity events so\n // consumers (Widgets) can detect the interaction state change to post_call.\n if (eventContext.eventType === CC_EVENTS.PARTICIPANT_POST_CALL_ACTIVITY) {\n task.emit(TASK_EVENTS.TASK_POST_CALL_ACTIVITY, task);\n }\n\n // Send transcript start/stop events for relevant CC events\n this.requestRealTimeTranscripts(eventContext.eventType, payload.interactionId);\n });\n }\n\n /**\n * Parse and validate WebSocket message\n * @returns Parsed message or null if invalid/keepalive\n */\n private static parseWebSocketMessage(event: string): WebSocketMessage | null {\n try {\n const payload = JSON.parse(event) as WebSocketMessage;\n\n // Filter out keepalive messages\n if (payload?.keepalive === 'true' || payload?.keepalive === true) {\n return null;\n }\n\n // Normalize task data if present\n if (payload?.data?.interaction) {\n payload.data = normalizeTaskData(payload.data);\n }\n\n return payload;\n } catch (error) {\n LoggerProxy.error('Failed to parse WebSocket message', {\n module: TASK_MANAGER_FILE,\n method: 'parseWebSocketMessage',\n error,\n });\n\n return null;\n }\n }\n\n /**\n * Prepare context for event processing\n * @returns Event context or null if event type is invalid\n */\n private prepareEventContext(message: WebSocketMessage): EventContext | null {\n const eventType = message.data?.type || message.type;\n\n if (!eventType || !isCcEvent(eventType)) {\n return null;\n }\n\n const interactionId = message.data.interactionId;\n const reservationInteractionId = message.data.reservationInteractionId;\n let task = this.taskCollection[interactionId];\n\n // When a campaign preview contact is accepted, the assigned event may arrive\n // with a new interactionId while the task is stored under the original\n // reservationInteractionId. Fall back to that key so the task is found.\n if (!task && reservationInteractionId) {\n task = this.taskCollection[reservationInteractionId];\n if (task) {\n // Re-key the task under the new interaction ID and remove the old entry\n delete this.taskCollection[reservationInteractionId];\n this.taskCollection[interactionId] = task;\n }\n }\n\n if (!task && eventType === CC_EVENTS.CONTACT_OWNER_CHANGED) {\n task = this.findTaskForContactOwnerChange(message.data);\n }\n\n if (!task && MAIN_INTERACTION_CORRELATED_EVENTS.has(eventType)) {\n task = this.findUniqueTaskByRelatedInteraction(message.data);\n }\n\n const wasConsultedTask = Boolean(task?.data?.isConsulted);\n const computeWrapUpRequired = () => {\n if (message.data.wrapUpRequired !== undefined) {\n return message.data.wrapUpRequired;\n }\n if (message.data.isConsulted !== undefined) {\n return !message.data.isConsulted;\n }\n\n return !wasConsultedTask;\n };\n\n let adjustedPayload: WebSocketPayload =\n eventType === CC_EVENTS.AGENT_CONSULT_TRANSFERRED ||\n eventType === CC_EVENTS.AGENT_BLIND_TRANSFERRED ||\n eventType === CC_EVENTS.AGENT_VTEAM_TRANSFERRED\n ? {\n ...message.data,\n wrapUpRequired: computeWrapUpRequired(),\n }\n : message.data;\n\n if (task && eventType === CC_EVENTS.CONTACT_OWNER_CHANGED) {\n adjustedPayload = TaskManager.preserveMainTaskIdentity(task, adjustedPayload);\n }\n\n if (task && eventType === CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE) {\n adjustedPayload = TaskManager.preserveConfirmedOwner(task, adjustedPayload);\n }\n\n const stateMachineEvent = TaskManager.mapEventToTaskStateMachineEvent(\n eventType,\n adjustedPayload,\n this.agentId,\n task,\n this.configFlags?.enableWxBetterTogether\n );\n\n LoggerProxy.info(`Handling task event ${eventType}`, {\n module: TASK_MANAGER_FILE,\n method: 'prepareEventContext',\n interactionId,\n });\n\n return {\n eventType,\n payload: adjustedPayload,\n task,\n stateMachineEvent,\n };\n }\n\n /**\n * ContactOwnerChanged can identify the promoted agent's child interaction while\n * the surviving task is stored under the main interaction. Accept one related\n * task when its existing snapshot or the authoritative incoming promotion proves\n * current-agent main-call membership, while excluding non-promoted and ambiguous matches.\n */\n private findTaskForContactOwnerChange(payload: WebSocketPayload): ITask | undefined {\n const relatedCandidates = this.findRelatedTasks(payload, {\n includeCollectionKeys: true,\n includeMainCallMediaKeys: true,\n });\n const incomingShowsCurrentAgentPromotion =\n this.isCurrentAgentPromotedOnIncomingMainCall(payload);\n const eligibleCandidates = relatedCandidates.filter(\n (candidate) =>\n this.isCurrentAgentActiveOnMainInteraction(candidate.data) ||\n incomingShowsCurrentAgentPromotion\n );\n\n if (eligibleCandidates.length === 1) {\n return eligibleCandidates[0];\n }\n\n if (eligibleCandidates.length > 1) {\n LoggerProxy.warn('Unable to correlate task event to a unique main interaction task', {\n module: TASK_MANAGER_FILE,\n method: 'findTaskForContactOwnerChange',\n interactionId:\n payload.interaction?.mainInteractionId ||\n payload.interaction?.parentInteractionId ||\n payload.interaction?.callProcessingDetails?.parentInteractionId ||\n payload.interactionId,\n });\n\n return undefined;\n }\n\n return undefined;\n }\n\n private isCurrentAgentActiveOnMainInteraction(taskData: TaskData | undefined): boolean {\n const currentAgentId = this.agentId || taskData?.agentId;\n if (!currentAgentId) return false;\n\n return TaskManager.isParticipantActiveOnMainInteraction(taskData, currentAgentId);\n }\n\n private static isParticipantActiveOnMainInteraction(\n taskData: TaskData | WebSocketPayload | undefined,\n participantId: string\n ): boolean {\n const interaction = taskData?.interaction;\n const participant = interaction?.participants?.[participantId];\n if (!participant || participant.hasLeft === true) return false;\n\n return Object.values(interaction?.media ?? {}).some(\n (media) =>\n media?.mType === MEDIA_TYPE_MAIN_CALL && media.participants?.includes(participantId)\n );\n }\n\n private isCurrentAgentPromotedOnIncomingMainCall(payload: WebSocketPayload): boolean {\n return Boolean(\n this.agentId &&\n payload.interaction?.owner === this.agentId &&\n TaskManager.isParticipantActiveOnMainInteraction(payload, this.agentId)\n );\n }\n\n private static getMainCallMediaId(\n interaction: TaskData['interaction'] | undefined\n ): string | undefined {\n return Object.entries(interaction?.media ?? {}).find(\n ([, media]) => media?.mType === MEDIA_TYPE_MAIN_CALL\n )?.[0];\n }\n\n private static getStableMainInteractionId(payload: WebSocketPayload): string | undefined {\n return (\n payload.interaction?.mainInteractionId ||\n TaskManager.getMainCallMediaId(payload.interaction) ||\n payload.interaction?.interactionId ||\n payload.interactionId\n );\n }\n\n private canRecoverTaskFromContactOwnerChanged(payload: WebSocketPayload): boolean {\n const interaction = payload.interaction;\n const stableInteractionId = TaskManager.getStableMainInteractionId(payload);\n\n return Boolean(\n this.agentId &&\n stableInteractionId &&\n interaction?.mediaType === MEDIA_CHANNEL.TELEPHONY &&\n interaction.isTerminated !== true &&\n interaction.owner === this.agentId &&\n TaskManager.isParticipantActiveOnMainInteraction(payload, this.agentId)\n );\n }\n\n /** Keep a related owner-change event from re-keying the surviving main task to a child ID. */\n private static preserveMainTaskIdentity(\n task: ITask,\n payload: WebSocketPayload\n ): WebSocketPayload {\n const currentMainInteractionId = task.data?.interaction?.mainInteractionId;\n const payloadMainInteractionId = payload.interaction?.mainInteractionId;\n const currentMainMediaId = TaskManager.getMainCallMediaId(task.data?.interaction);\n const payloadMainMediaId = TaskManager.getMainCallMediaId(payload.interaction);\n const stableInteractionId =\n currentMainInteractionId ||\n payloadMainInteractionId ||\n currentMainMediaId ||\n payloadMainMediaId ||\n payload.interaction?.interactionId ||\n task.data?.interaction?.interactionId ||\n task.data?.interactionId;\n\n if (!stableInteractionId || stableInteractionId === payload.interactionId) {\n return payload;\n }\n\n return {...payload, interactionId: stableInteractionId};\n }\n\n /**\n * ParticipantLeftConference may arrive after an owner update while still carrying\n * the departed owner. Keep the confirmed owner only when the new roster proves that\n * owner is active on mainCall and identifies the incoming owner as departed.\n */\n private static preserveConfirmedOwner(task: ITask, payload: WebSocketPayload): WebSocketPayload {\n const confirmedOwner = task.data?.interaction?.owner;\n const incomingOwner = payload.interaction?.owner;\n if (!confirmedOwner || !incomingOwner || confirmedOwner === incomingOwner) {\n return payload;\n }\n\n const confirmedOwnerIsActive = TaskManager.isParticipantActiveOnMainInteraction(\n payload,\n confirmedOwner\n );\n const incomingOwnerIsExplicitlyDeparted =\n payload.participantId === incomingOwner ||\n payload.interaction?.participants?.[incomingOwner]?.hasLeft === true;\n\n if (!confirmedOwnerIsActive || !incomingOwnerIsExplicitlyDeparted) {\n return payload;\n }\n\n return {\n ...payload,\n owner: confirmedOwner,\n interaction: {...payload.interaction, owner: confirmedOwner},\n };\n }\n\n /**\n * Resolve lifecycle events that are emitted for the main interaction while the\n * local task can still be indexed by a child consult interaction. Exact task\n * keys are handled before this fallback. Multiple aliases of the same task are\n * treated as one candidate; genuinely ambiguous matches are intentionally ignored.\n */\n private findUniqueTaskByRelatedInteraction(\n payload: WebSocketPayload,\n candidateFilter: (task: ITask) => boolean = () => true\n ): ITask | undefined {\n const candidates = this.findRelatedTasks(payload).filter(candidateFilter);\n\n if (candidates.length === 1) {\n return candidates[0];\n }\n\n if (candidates.length > 1) {\n LoggerProxy.warn('Unable to correlate task event to a unique main interaction task', {\n module: TASK_MANAGER_FILE,\n method: 'findUniqueTaskByRelatedInteraction',\n interactionId:\n payload.interaction?.mainInteractionId ||\n payload.interaction?.parentInteractionId ||\n payload.interaction?.callProcessingDetails?.parentInteractionId ||\n payload.interactionId,\n });\n }\n\n return undefined;\n }\n\n private findRelatedTasks(\n payload: WebSocketPayload,\n options: {includeCollectionKeys?: boolean; includeMainCallMediaKeys?: boolean} = {}\n ): ITask[] {\n const {includeCollectionKeys = false, includeMainCallMediaKeys = false} = options;\n const payloadInteractionIds = new Set(\n [\n payload.interactionId,\n payload.interaction?.interactionId,\n payload.interaction?.mainInteractionId,\n payload.interaction?.parentInteractionId,\n payload.interaction?.callProcessingDetails?.parentInteractionId,\n ...(includeMainCallMediaKeys ? [TaskManager.getMainCallMediaId(payload.interaction)] : []),\n ].filter((interactionId): interactionId is string => Boolean(interactionId))\n );\n if (payloadInteractionIds.size === 0) return [];\n\n return [\n ...new Set(\n Object.entries(this.taskCollection)\n .filter(([taskId, candidate]) => {\n const taskInteraction = candidate?.data?.interaction;\n const candidateInteractionIds = [\n ...(includeCollectionKeys ? [taskId] : []),\n candidate?.data?.interactionId,\n taskInteraction?.interactionId,\n taskInteraction?.mainInteractionId,\n taskInteraction?.parentInteractionId,\n taskInteraction?.callProcessingDetails?.parentInteractionId,\n ...(includeMainCallMediaKeys\n ? [TaskManager.getMainCallMediaId(taskInteraction)]\n : []),\n ];\n\n return candidateInteractionIds.some(\n (interactionId) => Boolean(interactionId) && payloadInteractionIds.has(interactionId)\n );\n })\n .map(([, candidate]) => candidate)\n ),\n ];\n }\n\n /**\n * Handle task lifecycle events and determine required actions\n *\n * Delegates to specific event handlers based on event type. Each handler\n * is responsible for TaskManager-level concerns:\n * - Task creation and collection management\n * - Metrics tracking\n * - Resource cleanup decisions\n *\n * Note: Task-level state transitions and event emissions are handled by\n * the task state machine via sendStateMachineEvent()\n */\n private handleTaskLifecycleEvent(context: EventContext): TaskEventActions {\n const {eventType} = context;\n\n switch (eventType) {\n case CC_EVENTS.AGENT_CONTACT_RESERVED:\n return this.handleContactReserved(context);\n\n case CC_EVENTS.AGENT_CONTACT:\n return this.handleAgentContact(context);\n\n case CC_EVENTS.CONTACT_MERGED:\n return this.handleContactMergedEvent(context);\n\n case CC_EVENTS.CONTACT_OWNER_CHANGED:\n return this.handleContactOwnerChanged(context);\n\n case CC_EVENTS.AGENT_OFFER_CAMPAIGN_RESERVATION:\n return this.handleCampaignPreviewReservation(context);\n\n case CC_EVENTS.CAMPAIGN_CONTACT_UPDATED:\n return this.handleCampaignContactUpdated(context);\n\n default:\n return {task: context.task};\n }\n }\n\n /**\n * Recover the promoted agent's active voice task when local task state was lost.\n * Existing related tasks are never replaced: an unresolved or ambiguous relation\n * is safer to ignore than to create a duplicate task.\n */\n private handleContactOwnerChanged(context: EventContext): TaskEventActions {\n if (context.task) {\n return {task: context.task};\n }\n\n const {payload} = context;\n if (\n this.findRelatedTasks(payload, {\n includeCollectionKeys: true,\n includeMainCallMediaKeys: true,\n }).length > 0 ||\n !this.canRecoverTaskFromContactOwnerChanged(payload)\n ) {\n return {};\n }\n\n const stableInteractionId = TaskManager.getStableMainInteractionId(payload);\n if (!stableInteractionId || this.taskCollection[stableInteractionId]) {\n return {};\n }\n\n const normalizedPayload: WebSocketPayload =\n payload.interactionId === stableInteractionId\n ? payload\n : {...payload, interactionId: stableInteractionId};\n const taskData: TaskData = {\n ...normalizedPayload,\n owner: normalizedPayload.interaction.owner,\n wrapUpRequired: normalizedPayload.interaction.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(normalizedPayload),\n isConsulted: false,\n isAutoAnswering: false,\n };\n const task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId,\n this.answerCallOnWebexService\n );\n\n this.taskCollection[stableInteractionId] = task;\n\n // Restore the actor before installing listeners so the internal hydrate does\n // not leak as a second public hydrate or as an incoming-task notification.\n task.sendStateMachineEvent({\n type: TaskEvent.HYDRATE,\n taskData,\n agentId: this.agentId,\n } as TaskEventPayload);\n\n this.setupTaskListeners(task);\n context.payload = taskData;\n context.stateMachineEvent = {\n type: TaskEvent.CONTACT_OWNER_CHANGED,\n taskData,\n };\n\n return {task};\n }\n\n private handleCampaignContactUpdated(context: EventContext) {\n const {payload} = context;\n let {task} = context;\n // CampaignContactUpdated is a non-terminal event (e.g., next contact after skip/remove).\n // Update the task data and emit an event so consumers can react to the updated contact.\n // Do NOT remove the task or emit TASK_END — cleanup is handled by CONTACT_ENDED.\n if (task) {\n // Carry forward campaign preview fields from existing task data since the updated\n // contact payload may not include them, and reconcileData would delete them.\n const existingCpd = task.data?.interaction?.callProcessingDetails;\n const updatedData: TaskData = {...payload};\n\n if (existingCpd) {\n const campaignFields = {\n ...(existingCpd.campaignPreviewAutoAction && {\n campaignPreviewAutoAction: existingCpd.campaignPreviewAutoAction,\n }),\n ...(existingCpd.campaignPreviewOfferTimeout && {\n campaignPreviewOfferTimeout: existingCpd.campaignPreviewOfferTimeout,\n }),\n ...(existingCpd.campaignPreviewSkipDisabled && {\n campaignPreviewSkipDisabled: existingCpd.campaignPreviewSkipDisabled,\n }),\n ...(existingCpd.campaignPreviewRemoveDisabled && {\n campaignPreviewRemoveDisabled: existingCpd.campaignPreviewRemoveDisabled,\n }),\n };\n\n if (!updatedData.interaction) {\n updatedData.interaction = {} as typeof updatedData.interaction;\n }\n\n updatedData.interaction = {\n ...updatedData.interaction,\n callProcessingDetails: {\n ...campaignFields,\n ...(updatedData.interaction.callProcessingDetails || {}),\n } as typeof existingCpd,\n };\n }\n\n LoggerProxy.log('Campaign contact updated - carrying forward preview fields', {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.interactionId,\n data: {\n hasCpd: !!updatedData.interaction?.callProcessingDetails,\n autoAction: updatedData.interaction?.callProcessingDetails?.campaignPreviewAutoAction,\n skipDisabled: updatedData.interaction?.callProcessingDetails?.campaignPreviewSkipDisabled,\n removeDisabled:\n updatedData.interaction?.callProcessingDetails?.campaignPreviewRemoveDisabled,\n },\n });\n\n task = this.updateTaskData(task, updatedData);\n task.emit(TASK_EVENTS.TASK_CAMPAIGN_CONTACT_UPDATED, task);\n }\n\n return {task};\n }\n\n /**\n * Creates or updates a task for campaign preview reservation.\n * TASK_CAMPAIGN_PREVIEW_RESERVATION is emitted by the state machine (campaign TASK_INCOMING branch).\n */\n private handleCampaignPreviewReservation(context: EventContext): TaskEventActions {\n const {payload} = context;\n let {task} = context;\n\n LoggerProxy.log('Campaign preview reservation received', {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.interactionId,\n });\n\n if (!task) {\n task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n {\n ...payload,\n wrapUpRequired: false,\n isConferenceInProgress: false,\n isAutoAnswering: false,\n },\n this.configFlags,\n this.wrapupData,\n this.agentId,\n this.answerCallOnWebexService\n );\n this.setupTaskListeners(task);\n this.taskCollection[payload.interactionId] = task;\n } else {\n task = this.updateTaskData(task, payload);\n }\n\n return {task};\n }\n\n /**\n * Handle AGENT_CONTACT_RESERVED event\n * Creates a new task; state machine event is sent during processing\n */\n private handleContactReserved(context: EventContext): TaskEventActions {\n const {payload} = context;\n const isConsultedTask =\n payload.isConsulted === true || isSecondaryEpDnAgent(payload.interaction);\n const shouldAutoAnswer = shouldAutoAnswerTask(\n payload,\n this.agentId,\n this.webCallingService.loginOption,\n this.webRtcEnabled\n );\n\n const taskData: TaskData = {\n ...payload,\n isConsulted: isConsultedTask,\n isAutoAnswering: shouldAutoAnswer,\n };\n\n const task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId,\n this.answerCallOnWebexService\n );\n\n this.setupTaskListeners(task);\n this.taskCollection[payload.interactionId] = task;\n\n return {task};\n }\n\n /**\n * Handle AGENT_CONTACT event\n * Re-creates task if missing (multi-session scenario)\n */\n private handleAgentContact(context: EventContext): TaskEventActions {\n let {task} = context;\n const {payload} = context;\n\n if (!task) {\n const isConsultedTask =\n payload.isConsulted === true || isSecondaryEpDnAgent(payload.interaction);\n const shouldAutoAnswer = shouldAutoAnswerTask(\n payload,\n this.agentId,\n this.webCallingService.loginOption,\n this.webRtcEnabled\n );\n const taskData: TaskData = {\n ...payload,\n isConsulted: isConsultedTask,\n wrapUpRequired: payload.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(payload),\n isAutoAnswering: shouldAutoAnswer,\n };\n\n task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId,\n this.answerCallOnWebexService\n );\n this.setupTaskListeners(task);\n this.taskCollection[payload.interactionId] = task;\n }\n\n return {task};\n }\n\n private updateTaskData(task: ITask, taskData: TaskData): ITask {\n if (!task) {\n throw new Error('Task not found for update');\n }\n\n const snapshot = task.stateMachineService?.getSnapshot?.();\n const isConsultingFlow =\n snapshot?.value === 'CONSULTING' || taskData.interaction?.state === 'consulting';\n\n const updateTaskData = isConsultingFlow\n ? {\n ...taskData,\n destAgentId: taskData.destAgentId ?? snapshot?.context?.consultDestinationAgentId ?? null,\n destinationType:\n taskData.destinationType ?? snapshot?.context?.consultDestinationType ?? null,\n }\n : taskData;\n\n task.updateTaskData(updateTaskData);\n\n // A main-interaction lifecycle event can re-key a child consult task. Remove\n // any aliases first so consumers never observe duplicate task entries.\n Object.entries(this.taskCollection).forEach(([taskId, candidate]) => {\n if (candidate === task && taskId !== taskData.interactionId) {\n delete this.taskCollection[taskId];\n }\n });\n this.taskCollection[taskData.interactionId] = task;\n\n return task;\n }\n\n /**\n * Setup listeners for task events that need to be bubbled up to TaskManager\n * This replaces the previous callback injection pattern\n */\n private setupTaskListeners(task: ITask): void {\n // Listen for TASK_INCOMING and re-emit so webex.cc can notify consumers\n task.on(TASK_EVENTS.TASK_INCOMING, (t: ITask) => {\n LoggerProxy.log(`Task incoming event received`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: t.data?.interactionId,\n });\n\n this.emit(TASK_EVENTS.TASK_INCOMING, t);\n });\n\n task.on(TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION, (t: ITask) => {\n LoggerProxy.log(`Campaign preview reservation event received`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: t.data?.interactionId,\n });\n\n this.emit(TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION, t);\n });\n\n // Listen for TASK_HYDRATE on the task and re-emit on TaskManager\n task.on(TASK_EVENTS.TASK_HYDRATE, (t: ITask) => {\n // Task data is already updated by the task itself before emitting\n this.emit(TASK_EVENTS.TASK_HYDRATE, t);\n });\n\n task.on(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, (t: ITask) => {\n this.emit(TASK_EVENTS.TASK_MULTI_LOGIN_HYDRATE, t);\n });\n\n // Listen for internal cleanup signal emitted by the state machine\n task.on(TASK_EVENTS.TASK_CLEANUP, (t: ITask, options?: {removeFromCollection?: boolean}) => {\n this.handleTaskCleanup(t);\n if (options?.removeFromCollection) {\n const taskIsStillCollected = Object.values(this.taskCollection).some(\n (candidate) => candidate === t\n );\n if (taskIsStillCollected) {\n this.removeTaskFromCollection(t);\n }\n }\n });\n }\n\n private removeTaskFromCollection(task: ITask) {\n if (typeof task.cancelAutoWrapupTimer === 'function') {\n task.cancelAutoWrapupTimer();\n }\n if (task?.data?.interactionId) {\n Object.entries(this.taskCollection).forEach(([taskId, candidate]) => {\n if (candidate === task) {\n delete this.taskCollection[taskId];\n }\n });\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 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 handleContactMergedEvent(context: EventContext): TaskEventActions {\n const {payload} = context;\n let task = context.task;\n\n if (payload.childInteractionId && this.taskCollection[payload.childInteractionId]) {\n this.removeTaskFromCollection(this.taskCollection[payload.childInteractionId]);\n }\n\n if (task) {\n LoggerProxy.log(`Got CONTACT_MERGED: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.interactionId,\n });\n // update the task data\n this.updateTaskData(task, payload);\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: payload.interactionId,\n });\n\n const taskData: TaskData = {\n ...payload,\n wrapUpRequired: payload.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(payload),\n isConsulted: false,\n };\n\n task = TaskFactory.createTask(\n this.contact,\n this.webCallingService,\n taskData,\n this.configFlags,\n this.wrapupData,\n this.agentId,\n this.answerCallOnWebexService\n );\n this.taskCollection[payload.interactionId] = task;\n\n // Transition the new task out of IDLE immediately so UI controls are\n // computed before TASK_MERGED is emitted. This handles the race where\n // AgentContactAssigned arrives before ContactMerged and gets dropped.\n // Send HYDRATE before setupTaskListeners so the emitTaskHydrate action\n // doesn't bubble up to the Widget (avoids duplicate listener registration).\n task.sendStateMachineEvent({\n type: TaskEvent.HYDRATE,\n taskData,\n agentId: this.agentId,\n } as TaskEventPayload);\n\n this.setupTaskListeners(task);\n }\n\n if (task) {\n this.emit(TASK_EVENTS.TASK_MERGED, task);\n }\n\n return {task};\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 === MEDIA_CHANNEL.TELEPHONY &&\n task instanceof WebRTC\n ) {\n task.unregisterWebCallListeners();\n this.webCallingService.cleanUpCall();\n }\n\n const isOutdial = task.data.interaction.outboundType === 'OUTDIAL';\n const isNew = task.data.interaction.state === 'new';\n const needsWrapUp = task.data.agentsPendingWrapUp?.includes(this.agentId) ?? false;\n\n // For OUTDIAL: only remove if NOT terminated (user-declined, no wrap-up follows)\n // For non-OUTDIAL: remove if state is 'new'\n // Always remove if secondary EpDn agent\n if (\n (isNew && !(isOutdial && needsWrapUp)) ||\n isSecondaryEpDnAgent(task.data.interaction) ||\n (!needsWrapUp && isOutdial) // For outdial tasks, needs wrap-up is false and state is \"WRAPUP\". We need to just remove the task.\n ) {\n this.removeTaskFromCollection(task);\n }\n }\n\n /**\n * Sends transcript start/stop event based on the CC event type.\n * Fire-and-forget; errors are logged but do not interrupt event processing.\n */\n private requestRealTimeTranscripts(eventType: string, interactionId: string): void {\n const action = TRANSCRIPT_EVENT_MAP[eventType];\n if (!action || !this.apiAIAssistant) return;\n if (this.configFlags?.aiFeature?.realtimeTranscripts?.enable !== true) return;\n\n this.apiAIAssistant\n .sendEvent(\n this.agentId,\n interactionId,\n AIAssistantEventType.CUSTOM_EVENT,\n AIAssistantEventName.GET_TRANSCRIPTS,\n {action}\n )\n .catch((error) => {\n LoggerProxy.error(`Failed to send transcript ${action} event`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REQUEST_REAL_TIME_TRANSCRIPTS,\n interactionId,\n error,\n });\n });\n }\n\n public getTask(taskId: TaskId): ITask {\n return this.taskCollection[taskId];\n }\n\n public getAllTasks(): Record<TaskId, ITask> {\n return {...this.taskCollection};\n }\n\n /**\n * Propagate runtime enableWxBetterTogether changes to config flags and active tasks.\n */\n public applyEnableWxBetterTogether(enabled: boolean): void {\n if (this.configFlags) {\n this.configFlags = {...this.configFlags, enableWxBetterTogether: enabled};\n }\n\n Object.values(this.taskCollection).forEach((task) => {\n task.setEnableWxBetterTogether(enabled);\n if (enabled) {\n TaskManager.syncWxAppMuteFromCallDetailsForTask(task);\n }\n });\n }\n\n /**\n * Propagate wxApp mute state from Mercury sync to active voice tasks.\n */\n public applyWxAppMuteStateFromSync(callId: string, muted: boolean): void {\n Object.values(this.taskCollection).forEach((task) => {\n task.applyWxAppMuteStateFromSync(callId, muted);\n });\n }\n\n /**\n * Re-seeds wxApp mute state from GET telephony/calls/{callId} for one task.\n */\n public static syncWxAppMuteFromCallDetailsForTask(task: ITask): void {\n const sync = task.syncWxAppMuteFromCallDetails?.bind(task);\n if (typeof sync === 'function') {\n sync().catch(() => undefined);\n }\n }\n\n /**\n * Re-seeds wxApp mute for all engaged voice tasks (reload / runtime enable backfill).\n */\n public syncWxAppMuteFromCallDetailsForAllTasks(): void {\n Object.values(this.taskCollection).forEach((task) => {\n TaskManager.syncWxAppMuteFromCallDetailsForTask(task);\n });\n }\n\n public static getTaskManager(\n apiAIAssistant: ApiAIAssistant,\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager,\n rtdWebSocketManager?: WebSocketManager\n ): TaskManager {\n if (!TaskManager.taskManager) {\n TaskManager.taskManager = new TaskManager(\n apiAIAssistant,\n contact,\n webCallingService,\n webSocketManager,\n rtdWebSocketManager\n );\n }\n\n return TaskManager.taskManager;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.decodedLineOwnerId = decodedLineOwnerId;
7
+ exports.getWebexCallingDeviceDetailsForAgent = getWebexCallingDeviceDetailsForAgent;
8
+ exports.isWebexCallingCallForAgent = isWebexCallingCallForAgent;
9
+ exports.isWxAppEngagedForControls = isWxAppEngagedForControls;
10
+ var _constants = require("./state-machine/constants");
11
+ const normalizeId = id => {
12
+ if (typeof id !== 'string') {
13
+ return undefined;
14
+ }
15
+ const normalizedId = id.trim();
16
+ return normalizedId === '' ? undefined : normalizedId;
17
+ };
18
+ const isParticipantsById = participants => Boolean(participants) && typeof participants === 'object' && !Array.isArray(participants) && !(participants instanceof Map);
19
+ const hasWebexCallingDeviceDetails = participant => {
20
+ const participantDetails = participant;
21
+ return typeof participantDetails?.deviceCallId === 'string' && participantDetails.deviceCallId.trim() !== '' && typeof participantDetails?.deviceId === 'string' && participantDetails.deviceId.trim() !== '';
22
+ };
23
+ const isWebexCallingParticipantForAgent = (participant, agentId) => {
24
+ const participantDetails = participant;
25
+ return normalizeId(participantDetails?.id) === agentId && hasWebexCallingDeviceDetails(participant);
26
+ };
27
+ const getWebexCallingDeviceDetails = participant => ({
28
+ deviceType: typeof participant.deviceType === 'string' ? participant.deviceType : '',
29
+ deviceId: participant.deviceId,
30
+ deviceCallId: participant.deviceCallId
31
+ });
32
+ function getWebexCallingDeviceDetailsForAgent(agentId, participants) {
33
+ const normalizedAgentId = normalizeId(agentId);
34
+ if (!normalizedAgentId || !isParticipantsById(participants)) {
35
+ return undefined;
36
+ }
37
+ const agentParticipant = participants[normalizedAgentId];
38
+ const matchingAgentParticipant = hasWebexCallingDeviceDetails(agentParticipant) ? agentParticipant : Object.values(participants).find(participant => isWebexCallingParticipantForAgent(participant, normalizedAgentId));
39
+ if (!matchingAgentParticipant || !hasWebexCallingDeviceDetails(matchingAgentParticipant)) {
40
+ return undefined;
41
+ }
42
+ return getWebexCallingDeviceDetails(matchingAgentParticipant);
43
+ }
44
+ function isWebexCallingCallForAgent(agentId, participants) {
45
+ return Boolean(getWebexCallingDeviceDetailsForAgent(agentId, participants));
46
+ }
47
+
48
+ /** Matches wxAppVoiceMethods.getWebexCallingCallId engaged semantics for uiControls. */
49
+ function isWxAppEngagedForControls(enableWxBetterTogether, agentId, participants, state) {
50
+ if (!enableWxBetterTogether) {
51
+ return false;
52
+ }
53
+ if (!state || state === _constants.TaskState.OFFERED || state === _constants.TaskState.IDLE || state === _constants.TaskState.WRAPPING_UP || state === _constants.TaskState.TERMINATED || state === _constants.TaskState.COMPLETED) {
54
+ return false;
55
+ }
56
+ const details = getWebexCallingDeviceDetailsForAgent(agentId, participants);
57
+ return details?.deviceType === 'wxApp';
58
+ }
59
+ function decodedLineOwnerId(lineOwnerId) {
60
+ if (!lineOwnerId) {
61
+ return undefined;
62
+ }
63
+ try {
64
+ const decoded = atob(lineOwnerId);
65
+ return decoded.split('/').pop();
66
+ } catch {
67
+ return undefined;
68
+ }
69
+ }
70
+ //# sourceMappingURL=WebexCallingUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_constants","require","normalizeId","id","undefined","normalizedId","trim","isParticipantsById","participants","Boolean","Array","isArray","Map","hasWebexCallingDeviceDetails","participant","participantDetails","deviceCallId","deviceId","isWebexCallingParticipantForAgent","agentId","getWebexCallingDeviceDetails","deviceType","getWebexCallingDeviceDetailsForAgent","normalizedAgentId","agentParticipant","matchingAgentParticipant","Object","values","find","isWebexCallingCallForAgent","isWxAppEngagedForControls","enableWxBetterTogether","state","TaskState","OFFERED","IDLE","WRAPPING_UP","TERMINATED","COMPLETED","details","decodedLineOwnerId","lineOwnerId","decoded","atob","split","pop"],"sources":["WebexCallingUtils.ts"],"sourcesContent":["import {TaskState} from './state-machine/constants';\n\nexport type WebexCallingDeviceDetails = {\n deviceType: string;\n deviceId: string;\n deviceCallId: string;\n};\n\ntype WebexCallingParticipant = {\n id?: unknown;\n deviceType?: unknown;\n deviceCallId?: unknown;\n deviceId?: unknown;\n};\n\nconst normalizeId = (id: unknown): string | undefined => {\n if (typeof id !== 'string') {\n return undefined;\n }\n\n const normalizedId = id.trim();\n\n return normalizedId === '' ? undefined : normalizedId;\n};\n\nconst isParticipantsById = (participants: unknown): participants is Record<string, unknown> =>\n Boolean(participants) &&\n typeof participants === 'object' &&\n !Array.isArray(participants) &&\n !(participants instanceof Map);\n\nconst hasWebexCallingDeviceDetails = (\n participant: unknown\n): participant is WebexCallingParticipant &\n Pick<WebexCallingDeviceDetails, 'deviceCallId' | 'deviceId'> => {\n const participantDetails = participant as WebexCallingParticipant | undefined;\n\n return (\n typeof participantDetails?.deviceCallId === 'string' &&\n participantDetails.deviceCallId.trim() !== '' &&\n typeof participantDetails?.deviceId === 'string' &&\n participantDetails.deviceId.trim() !== ''\n );\n};\n\nconst isWebexCallingParticipantForAgent = (\n participant: unknown,\n agentId: string\n): participant is WebexCallingParticipant &\n Pick<WebexCallingDeviceDetails, 'deviceCallId' | 'deviceId'> => {\n const participantDetails = participant as WebexCallingParticipant | undefined;\n\n return (\n normalizeId(participantDetails?.id) === agentId && hasWebexCallingDeviceDetails(participant)\n );\n};\n\nconst getWebexCallingDeviceDetails = (\n participant: WebexCallingParticipant &\n Pick<WebexCallingDeviceDetails, 'deviceCallId' | 'deviceId'>\n): WebexCallingDeviceDetails => ({\n deviceType: typeof participant.deviceType === 'string' ? participant.deviceType : '',\n deviceId: participant.deviceId,\n deviceCallId: participant.deviceCallId,\n});\n\nexport function getWebexCallingDeviceDetailsForAgent(\n agentId: string | undefined,\n participants: unknown\n): WebexCallingDeviceDetails | undefined {\n const normalizedAgentId = normalizeId(agentId);\n if (!normalizedAgentId || !isParticipantsById(participants)) {\n return undefined;\n }\n\n const agentParticipant = participants[normalizedAgentId];\n const matchingAgentParticipant = hasWebexCallingDeviceDetails(agentParticipant)\n ? agentParticipant\n : Object.values(participants).find((participant) =>\n isWebexCallingParticipantForAgent(participant, normalizedAgentId)\n );\n\n if (!matchingAgentParticipant || !hasWebexCallingDeviceDetails(matchingAgentParticipant)) {\n return undefined;\n }\n\n return getWebexCallingDeviceDetails(matchingAgentParticipant);\n}\n\nexport function isWebexCallingCallForAgent(\n agentId: string | undefined,\n participants: unknown\n): boolean {\n return Boolean(getWebexCallingDeviceDetailsForAgent(agentId, participants));\n}\n\n/** Matches wxAppVoiceMethods.getWebexCallingCallId engaged semantics for uiControls. */\nexport function isWxAppEngagedForControls(\n enableWxBetterTogether: boolean,\n agentId: string | undefined,\n participants: unknown,\n state: TaskState\n): boolean {\n if (!enableWxBetterTogether) {\n return false;\n }\n\n if (\n !state ||\n state === TaskState.OFFERED ||\n state === TaskState.IDLE ||\n state === TaskState.WRAPPING_UP ||\n state === TaskState.TERMINATED ||\n state === TaskState.COMPLETED\n ) {\n return false;\n }\n\n const details = getWebexCallingDeviceDetailsForAgent(agentId, participants);\n\n return details?.deviceType === 'wxApp';\n}\n\nexport function decodedLineOwnerId(lineOwnerId?: string): string | undefined {\n if (!lineOwnerId) {\n return undefined;\n }\n\n try {\n const decoded = atob(lineOwnerId);\n\n return decoded.split('/').pop();\n } catch {\n return undefined;\n }\n}\n"],"mappings":";;;;;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAeA,MAAMC,WAAW,GAAIC,EAAW,IAAyB;EACvD,IAAI,OAAOA,EAAE,KAAK,QAAQ,EAAE;IAC1B,OAAOC,SAAS;EAClB;EAEA,MAAMC,YAAY,GAAGF,EAAE,CAACG,IAAI,CAAC,CAAC;EAE9B,OAAOD,YAAY,KAAK,EAAE,GAAGD,SAAS,GAAGC,YAAY;AACvD,CAAC;AAED,MAAME,kBAAkB,GAAIC,YAAqB,IAC/CC,OAAO,CAACD,YAAY,CAAC,IACrB,OAAOA,YAAY,KAAK,QAAQ,IAChC,CAACE,KAAK,CAACC,OAAO,CAACH,YAAY,CAAC,IAC5B,EAAEA,YAAY,YAAYI,GAAG,CAAC;AAEhC,MAAMC,4BAA4B,GAChCC,WAAoB,IAE4C;EAChE,MAAMC,kBAAkB,GAAGD,WAAkD;EAE7E,OACE,OAAOC,kBAAkB,EAAEC,YAAY,KAAK,QAAQ,IACpDD,kBAAkB,CAACC,YAAY,CAACV,IAAI,CAAC,CAAC,KAAK,EAAE,IAC7C,OAAOS,kBAAkB,EAAEE,QAAQ,KAAK,QAAQ,IAChDF,kBAAkB,CAACE,QAAQ,CAACX,IAAI,CAAC,CAAC,KAAK,EAAE;AAE7C,CAAC;AAED,MAAMY,iCAAiC,GAAGA,CACxCJ,WAAoB,EACpBK,OAAe,KAEiD;EAChE,MAAMJ,kBAAkB,GAAGD,WAAkD;EAE7E,OACEZ,WAAW,CAACa,kBAAkB,EAAEZ,EAAE,CAAC,KAAKgB,OAAO,IAAIN,4BAA4B,CAACC,WAAW,CAAC;AAEhG,CAAC;AAED,MAAMM,4BAA4B,GAChCN,WAC8D,KAC/B;EAC/BO,UAAU,EAAE,OAAOP,WAAW,CAACO,UAAU,KAAK,QAAQ,GAAGP,WAAW,CAACO,UAAU,GAAG,EAAE;EACpFJ,QAAQ,EAAEH,WAAW,CAACG,QAAQ;EAC9BD,YAAY,EAAEF,WAAW,CAACE;AAC5B,CAAC,CAAC;AAEK,SAASM,oCAAoCA,CAClDH,OAA2B,EAC3BX,YAAqB,EACkB;EACvC,MAAMe,iBAAiB,GAAGrB,WAAW,CAACiB,OAAO,CAAC;EAC9C,IAAI,CAACI,iBAAiB,IAAI,CAAChB,kBAAkB,CAACC,YAAY,CAAC,EAAE;IAC3D,OAAOJ,SAAS;EAClB;EAEA,MAAMoB,gBAAgB,GAAGhB,YAAY,CAACe,iBAAiB,CAAC;EACxD,MAAME,wBAAwB,GAAGZ,4BAA4B,CAACW,gBAAgB,CAAC,GAC3EA,gBAAgB,GAChBE,MAAM,CAACC,MAAM,CAACnB,YAAY,CAAC,CAACoB,IAAI,CAAEd,WAAW,IAC3CI,iCAAiC,CAACJ,WAAW,EAAES,iBAAiB,CAClE,CAAC;EAEL,IAAI,CAACE,wBAAwB,IAAI,CAACZ,4BAA4B,CAACY,wBAAwB,CAAC,EAAE;IACxF,OAAOrB,SAAS;EAClB;EAEA,OAAOgB,4BAA4B,CAACK,wBAAwB,CAAC;AAC/D;AAEO,SAASI,0BAA0BA,CACxCV,OAA2B,EAC3BX,YAAqB,EACZ;EACT,OAAOC,OAAO,CAACa,oCAAoC,CAACH,OAAO,EAAEX,YAAY,CAAC,CAAC;AAC7E;;AAEA;AACO,SAASsB,yBAAyBA,CACvCC,sBAA+B,EAC/BZ,OAA2B,EAC3BX,YAAqB,EACrBwB,KAAgB,EACP;EACT,IAAI,CAACD,sBAAsB,EAAE;IAC3B,OAAO,KAAK;EACd;EAEA,IACE,CAACC,KAAK,IACNA,KAAK,KAAKC,oBAAS,CAACC,OAAO,IAC3BF,KAAK,KAAKC,oBAAS,CAACE,IAAI,IACxBH,KAAK,KAAKC,oBAAS,CAACG,WAAW,IAC/BJ,KAAK,KAAKC,oBAAS,CAACI,UAAU,IAC9BL,KAAK,KAAKC,oBAAS,CAACK,SAAS,EAC7B;IACA,OAAO,KAAK;EACd;EAEA,MAAMC,OAAO,GAAGjB,oCAAoC,CAACH,OAAO,EAAEX,YAAY,CAAC;EAE3E,OAAO+B,OAAO,EAAElB,UAAU,KAAK,OAAO;AACxC;AAEO,SAASmB,kBAAkBA,CAACC,WAAoB,EAAsB;EAC3E,IAAI,CAACA,WAAW,EAAE;IAChB,OAAOrC,SAAS;EAClB;EAEA,IAAI;IACF,MAAMsC,OAAO,GAAGC,IAAI,CAACF,WAAW,CAAC;IAEjC,OAAOC,OAAO,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;EACjC,CAAC,CAAC,MAAM;IACN,OAAOzC,SAAS;EAClB;AACF","ignoreList":[]}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WRAPUP = exports.UNHOLD = exports.TRANSFER = exports.TRANSCRIPT_EVENT_MAP = exports.TIMEOUT_PREVIEW_ACCEPT = exports.TASK_MESSAGE_TYPE = exports.TASK_MANAGER_FILE = exports.TASK_FILE = exports.TASK_API = exports.RESUME = exports.PRESERVED_TASK_DATA_FIELDS = exports.PAUSE = exports.METHODS = exports.KEYS_TO_NOT_DELETE = exports.HOLD = exports.END = exports.DIALER_API = exports.CONSULT_TRANSFER = exports.CONSULT_END = exports.CONSULT_CONFERENCE = exports.CONSULT_ACCEPT = exports.CONSULT = exports.CONFERENCE_TRANSFER = exports.CONFERENCE_EXIT = exports.CAMPAIGN_PREVIEW_SKIP = exports.CAMPAIGN_PREVIEW_REMOVE = exports.CAMPAIGN_PREVIEW_ACCEPT = void 0;
6
+ exports.WRAPUP = exports.UNHOLD = exports.TRANSFER = exports.TRANSCRIPT_EVENT_MAP = exports.TIMEOUT_PREVIEW_ACCEPT = exports.TASK_MESSAGE_TYPE = exports.TASK_MANAGER_FILE = exports.TASK_FILE = exports.TASK_API = exports.RESUME = exports.PRESERVED_TASK_DATA_FIELDS = exports.PAUSE = exports.METHODS = exports.KEYS_TO_NOT_DELETE = exports.HOLD = exports.ENTRY_POINT_TRANSFER_DESTINATION_TYPE = exports.END = exports.DIALER_API = exports.CONSULT_TRANSFER = exports.CONSULT_END = exports.CONSULT_CONFERENCE = exports.CONSULT_ACCEPT = exports.CONSULT = exports.CONFERENCE_TRANSFER = exports.CONFERENCE_EXIT = exports.CAMPAIGN_PREVIEW_SKIP = exports.CAMPAIGN_PREVIEW_REMOVE = exports.CAMPAIGN_PREVIEW_ACCEPT = void 0;
7
7
  var _types = require("../config/types");
8
8
  /**
9
9
  * Constants for Task Service
@@ -19,6 +19,8 @@ const CONSULT = exports.CONSULT = '/consult';
19
19
  const CONSULT_ACCEPT = exports.CONSULT_ACCEPT = '/consult/accept';
20
20
  const CONSULT_END = exports.CONSULT_END = '/consult/end';
21
21
  const TRANSFER = exports.TRANSFER = '/transfer';
22
+ /** Backend destination value for direct entry-point transfers through the vteam endpoint. */
23
+ const ENTRY_POINT_TRANSFER_DESTINATION_TYPE = exports.ENTRY_POINT_TRANSFER_DESTINATION_TYPE = 'entrypointDialNumber';
22
24
  const CONSULT_TRANSFER = exports.CONSULT_TRANSFER = '/consult/transfer';
23
25
  const PAUSE = exports.PAUSE = '/record/pause';
24
26
  const RESUME = exports.RESUME = '/record/resume';
@@ -78,6 +80,7 @@ const METHODS = exports.METHODS = {
78
80
  TRANSFER: 'transfer',
79
81
  CONSULT_TRANSFER: 'consultTransfer',
80
82
  CONSULT_CONFERENCE: 'consultConference',
83
+ DROP_CONFERENCE_PARTICIPANT: 'dropConferenceParticipant',
81
84
  EXIT_CONFERENCE: 'exitConference',
82
85
  TRANSFER_CONFERENCE: 'transferConference',
83
86
  UPDATE_TASK_DATA: 'updateTaskData',
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","TASK_MESSAGE_TYPE","exports","TASK_API","HOLD","UNHOLD","CONSULT","CONSULT_ACCEPT","CONSULT_END","TRANSFER","CONSULT_TRANSFER","PAUSE","RESUME","WRAPUP","END","CONSULT_CONFERENCE","CONFERENCE_EXIT","CONFERENCE_TRANSFER","DIALER_API","CAMPAIGN_PREVIEW_ACCEPT","CAMPAIGN_PREVIEW_SKIP","CAMPAIGN_PREVIEW_REMOVE","TIMEOUT_PREVIEW_ACCEPT","TASK_MANAGER_FILE","TASK_FILE","PRESERVED_TASK_DATA_FIELDS","IS_CONSULTED","WRAP_UP_REQUIRED","IS_CONFERENCE_IN_PROGRESS","IS_AUTO_ANSWERING","KEYS_TO_NOT_DELETE","Object","values","METHODS","ACCEPT","TOGGLE_MUTE","DECLINE","PAUSE_RECORDING","RESUME_RECORDING","END_CONSULT","EXIT_CONFERENCE","TRANSFER_CONFERENCE","UPDATE_TASK_DATA","RECONCILE_DATA","HANDLE_INCOMING_WEB_CALL","REGISTER_TASK_LISTENERS","HANDLE_REAL_TIME_WEBSOCKET_EVENT","REMOVE_TASK_FROM_COLLECTION","HANDLE_TASK_CLEANUP","GET_TASK","GET_ALL_TASKS","GET_TASK_MANAGER","SETUP_AUTO_WRAPUP_TIMER","CANCEL_AUTO_WRAPUP_TIMER","REQUEST_REAL_TIME_TRANSCRIPTS","TRANSCRIPT_EVENT_MAP","CC_EVENTS","AGENT_CONTACT_ASSIGNED","AGENT_CONSULTING","AGENT_CONSULT_CONFERENCED","AGENT_WRAPUP","AGENT_CONSULT_ENDED","PARTICIPANT_LEFT_CONFERENCE"],"sources":["constants.ts"],"sourcesContent":["/**\n * Constants for Task Service\n * @module @webex/contact-center/services/task/constants\n * @ignore\n */\n\nimport {CC_EVENTS} from '../config/types';\n\nexport const TASK_MESSAGE_TYPE = 'RoutingMessage';\nexport const TASK_API = '/v1/tasks/';\nexport const HOLD = '/hold';\nexport const UNHOLD = '/unhold';\nexport const CONSULT = '/consult';\nexport const CONSULT_ACCEPT = '/consult/accept';\nexport const CONSULT_END = '/consult/end';\nexport const TRANSFER = '/transfer';\nexport const CONSULT_TRANSFER = '/consult/transfer';\nexport const PAUSE = '/record/pause';\nexport const RESUME = '/record/resume';\nexport const WRAPUP = '/wrapup';\nexport const END = '/end';\nexport const CONSULT_CONFERENCE = '/consult/conference';\nexport const CONFERENCE_EXIT = '/conference/exit';\nexport const CONFERENCE_TRANSFER = '/conference/transfer';\nexport const DIALER_API = '/v1/dialer';\nexport const CAMPAIGN_PREVIEW_ACCEPT = '/accept';\nexport const CAMPAIGN_PREVIEW_SKIP = '/skip';\nexport const CAMPAIGN_PREVIEW_REMOVE = '/remove';\n/** 80-second timeout for accepting preview contact (outbound call setup takes longer than default 20s) */\nexport const TIMEOUT_PREVIEW_ACCEPT = 80000;\nexport const TASK_MANAGER_FILE = 'taskManager';\nexport const TASK_FILE = 'task';\n\n/**\n * Task data field names that should be preserved during reconciliation\n * These fields are retained even if not present in new data during updates\n */\nexport const PRESERVED_TASK_DATA_FIELDS = {\n /** Indicates if the task is in consultation state */\n IS_CONSULTED: 'isConsulted',\n /** Indicates if wrap-up is required for this task */\n WRAP_UP_REQUIRED: 'wrapUpRequired',\n /** Indicates if a conference is currently in progress (2+ active agents) */\n IS_CONFERENCE_IN_PROGRESS: 'isConferenceInProgress',\n /** Indicates if auto-answer is in progress for this task */\n IS_AUTO_ANSWERING: 'isAutoAnswering',\n};\n\n/**\n * Array of task data field names that should not be deleted during reconciliation\n * Used by reconcileData method to preserve important task state fields\n */\nexport const KEYS_TO_NOT_DELETE: string[] = Object.values(PRESERVED_TASK_DATA_FIELDS);\n\n/**\n * Consultation status constants derived from state machine\n * These values are computed and available in task.data.consultStatus\n */\n// METHOD NAMES\nexport const METHODS = {\n // Task class methods\n ACCEPT: 'accept',\n TOGGLE_MUTE: 'toggleMute',\n DECLINE: 'decline',\n HOLD: 'hold',\n RESUME: 'resume',\n END: 'end',\n WRAPUP: 'wrapup',\n PAUSE_RECORDING: 'pauseRecording',\n RESUME_RECORDING: 'resumeRecording',\n CONSULT: 'consult',\n END_CONSULT: 'endConsult',\n TRANSFER: 'transfer',\n CONSULT_TRANSFER: 'consultTransfer',\n CONSULT_CONFERENCE: 'consultConference',\n EXIT_CONFERENCE: 'exitConference',\n TRANSFER_CONFERENCE: 'transferConference',\n UPDATE_TASK_DATA: 'updateTaskData',\n RECONCILE_DATA: 'reconcileData',\n\n // TaskManager class methods\n HANDLE_INCOMING_WEB_CALL: 'handleIncomingWebCall',\n REGISTER_TASK_LISTENERS: 'registerTaskListeners',\n HANDLE_REAL_TIME_WEBSOCKET_EVENT: 'handleRealtimeWebsocketEvent',\n REMOVE_TASK_FROM_COLLECTION: 'removeTaskFromCollection',\n HANDLE_TASK_CLEANUP: 'handleTaskCleanup',\n GET_TASK: 'getTask',\n GET_ALL_TASKS: 'getAllTasks',\n GET_TASK_MANAGER: 'getTaskManager',\n SETUP_AUTO_WRAPUP_TIMER: 'setupAutoWrapupTimer',\n CANCEL_AUTO_WRAPUP_TIMER: 'cancelAutoWrapupTimer',\n REQUEST_REAL_TIME_TRANSCRIPTS: 'requestRealTimeTranscripts',\n};\n\nexport const TRANSCRIPT_EVENT_MAP = {\n [CC_EVENTS.AGENT_CONTACT_ASSIGNED]: 'START',\n [CC_EVENTS.AGENT_CONSULTING]: 'START',\n [CC_EVENTS.AGENT_CONSULT_CONFERENCED]: 'START',\n [CC_EVENTS.AGENT_WRAPUP]: 'STOP',\n [CC_EVENTS.AGENT_CONSULT_ENDED]: 'STOP',\n [CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE]: 'STOP',\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_types","require","TASK_MESSAGE_TYPE","exports","TASK_API","HOLD","UNHOLD","CONSULT","CONSULT_ACCEPT","CONSULT_END","TRANSFER","ENTRY_POINT_TRANSFER_DESTINATION_TYPE","CONSULT_TRANSFER","PAUSE","RESUME","WRAPUP","END","CONSULT_CONFERENCE","CONFERENCE_EXIT","CONFERENCE_TRANSFER","DIALER_API","CAMPAIGN_PREVIEW_ACCEPT","CAMPAIGN_PREVIEW_SKIP","CAMPAIGN_PREVIEW_REMOVE","TIMEOUT_PREVIEW_ACCEPT","TASK_MANAGER_FILE","TASK_FILE","PRESERVED_TASK_DATA_FIELDS","IS_CONSULTED","WRAP_UP_REQUIRED","IS_CONFERENCE_IN_PROGRESS","IS_AUTO_ANSWERING","KEYS_TO_NOT_DELETE","Object","values","METHODS","ACCEPT","TOGGLE_MUTE","DECLINE","PAUSE_RECORDING","RESUME_RECORDING","END_CONSULT","DROP_CONFERENCE_PARTICIPANT","EXIT_CONFERENCE","TRANSFER_CONFERENCE","UPDATE_TASK_DATA","RECONCILE_DATA","HANDLE_INCOMING_WEB_CALL","REGISTER_TASK_LISTENERS","HANDLE_REAL_TIME_WEBSOCKET_EVENT","REMOVE_TASK_FROM_COLLECTION","HANDLE_TASK_CLEANUP","GET_TASK","GET_ALL_TASKS","GET_TASK_MANAGER","SETUP_AUTO_WRAPUP_TIMER","CANCEL_AUTO_WRAPUP_TIMER","REQUEST_REAL_TIME_TRANSCRIPTS","TRANSCRIPT_EVENT_MAP","CC_EVENTS","AGENT_CONTACT_ASSIGNED","AGENT_CONSULTING","AGENT_CONSULT_CONFERENCED","AGENT_WRAPUP","AGENT_CONSULT_ENDED","PARTICIPANT_LEFT_CONFERENCE"],"sources":["constants.ts"],"sourcesContent":["/**\n * Constants for Task Service\n * @module @webex/contact-center/services/task/constants\n * @ignore\n */\n\nimport {CC_EVENTS} from '../config/types';\n\nexport const TASK_MESSAGE_TYPE = 'RoutingMessage';\nexport const TASK_API = '/v1/tasks/';\nexport const HOLD = '/hold';\nexport const UNHOLD = '/unhold';\nexport const CONSULT = '/consult';\nexport const CONSULT_ACCEPT = '/consult/accept';\nexport const CONSULT_END = '/consult/end';\nexport const TRANSFER = '/transfer';\n/** Backend destination value for direct entry-point transfers through the vteam endpoint. */\nexport const ENTRY_POINT_TRANSFER_DESTINATION_TYPE = 'entrypointDialNumber';\nexport const CONSULT_TRANSFER = '/consult/transfer';\nexport const PAUSE = '/record/pause';\nexport const RESUME = '/record/resume';\nexport const WRAPUP = '/wrapup';\nexport const END = '/end';\nexport const CONSULT_CONFERENCE = '/consult/conference';\nexport const CONFERENCE_EXIT = '/conference/exit';\nexport const CONFERENCE_TRANSFER = '/conference/transfer';\nexport const DIALER_API = '/v1/dialer';\nexport const CAMPAIGN_PREVIEW_ACCEPT = '/accept';\nexport const CAMPAIGN_PREVIEW_SKIP = '/skip';\nexport const CAMPAIGN_PREVIEW_REMOVE = '/remove';\n/** 80-second timeout for accepting preview contact (outbound call setup takes longer than default 20s) */\nexport const TIMEOUT_PREVIEW_ACCEPT = 80000;\nexport const TASK_MANAGER_FILE = 'taskManager';\nexport const TASK_FILE = 'task';\n\n/**\n * Task data field names that should be preserved during reconciliation\n * These fields are retained even if not present in new data during updates\n */\nexport const PRESERVED_TASK_DATA_FIELDS = {\n /** Indicates if the task is in consultation state */\n IS_CONSULTED: 'isConsulted',\n /** Indicates if wrap-up is required for this task */\n WRAP_UP_REQUIRED: 'wrapUpRequired',\n /** Indicates if a conference is currently in progress (2+ active agents) */\n IS_CONFERENCE_IN_PROGRESS: 'isConferenceInProgress',\n /** Indicates if auto-answer is in progress for this task */\n IS_AUTO_ANSWERING: 'isAutoAnswering',\n};\n\n/**\n * Array of task data field names that should not be deleted during reconciliation\n * Used by reconcileData method to preserve important task state fields\n */\nexport const KEYS_TO_NOT_DELETE: string[] = Object.values(PRESERVED_TASK_DATA_FIELDS);\n\n/**\n * Consultation status constants derived from state machine\n * These values are computed and available in task.data.consultStatus\n */\n// METHOD NAMES\nexport const METHODS = {\n // Task class methods\n ACCEPT: 'accept',\n TOGGLE_MUTE: 'toggleMute',\n DECLINE: 'decline',\n HOLD: 'hold',\n RESUME: 'resume',\n END: 'end',\n WRAPUP: 'wrapup',\n PAUSE_RECORDING: 'pauseRecording',\n RESUME_RECORDING: 'resumeRecording',\n CONSULT: 'consult',\n END_CONSULT: 'endConsult',\n TRANSFER: 'transfer',\n CONSULT_TRANSFER: 'consultTransfer',\n CONSULT_CONFERENCE: 'consultConference',\n DROP_CONFERENCE_PARTICIPANT: 'dropConferenceParticipant',\n EXIT_CONFERENCE: 'exitConference',\n TRANSFER_CONFERENCE: 'transferConference',\n UPDATE_TASK_DATA: 'updateTaskData',\n RECONCILE_DATA: 'reconcileData',\n\n // TaskManager class methods\n HANDLE_INCOMING_WEB_CALL: 'handleIncomingWebCall',\n REGISTER_TASK_LISTENERS: 'registerTaskListeners',\n HANDLE_REAL_TIME_WEBSOCKET_EVENT: 'handleRealtimeWebsocketEvent',\n REMOVE_TASK_FROM_COLLECTION: 'removeTaskFromCollection',\n HANDLE_TASK_CLEANUP: 'handleTaskCleanup',\n GET_TASK: 'getTask',\n GET_ALL_TASKS: 'getAllTasks',\n GET_TASK_MANAGER: 'getTaskManager',\n SETUP_AUTO_WRAPUP_TIMER: 'setupAutoWrapupTimer',\n CANCEL_AUTO_WRAPUP_TIMER: 'cancelAutoWrapupTimer',\n REQUEST_REAL_TIME_TRANSCRIPTS: 'requestRealTimeTranscripts',\n};\n\nexport const TRANSCRIPT_EVENT_MAP = {\n [CC_EVENTS.AGENT_CONTACT_ASSIGNED]: 'START',\n [CC_EVENTS.AGENT_CONSULTING]: 'START',\n [CC_EVENTS.AGENT_CONSULT_CONFERENCED]: 'START',\n [CC_EVENTS.AGENT_WRAPUP]: 'STOP',\n [CC_EVENTS.AGENT_CONSULT_ENDED]: 'STOP',\n [CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE]: 'STOP',\n};\n"],"mappings":"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","ignoreList":[]}
@@ -487,6 +487,35 @@ function routingContact(aqm) {
487
487
  errId: 'Service.aqm.task.consultConference'
488
488
  }
489
489
  })),
490
+ /*
491
+ * Drop another participant from an active conference
492
+ */
493
+ dropConferenceParticipant: aqm.req(p => ({
494
+ url: `${_constants3.TASK_API}${p.interactionId}/conference/participants/${encodeURIComponent(p.participantId)}/drop`,
495
+ data: {},
496
+ host: _constants.WCC_API_GATEWAY,
497
+ err: _Utils.createErrDetailsObject,
498
+ redactSensitiveLogs: true,
499
+ notifSuccess: {
500
+ bind: {
501
+ type: _constants3.TASK_MESSAGE_TYPE,
502
+ data: {
503
+ type: _types.CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE,
504
+ interactionId: p.interactionId
505
+ }
506
+ },
507
+ msg: {}
508
+ },
509
+ notifFail: {
510
+ bind: {
511
+ type: _constants3.TASK_MESSAGE_TYPE,
512
+ data: {
513
+ type: _types.CC_EVENTS.PARTICIPANT_DROP_CONFERENCE_FAILED
514
+ }
515
+ },
516
+ errId: 'Service.aqm.task.dropConferenceParticipant'
517
+ }
518
+ })),
490
519
  /*
491
520
  * Exit conference
492
521
  */