@webex/contact-center 3.12.0-next.9 → 3.12.0-next.90

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 (229) hide show
  1. package/.sdd/manifest.json +876 -0
  2. package/AGENTS.md +94 -0
  3. package/ai-docs/ARCHITECTURE.md +168 -0
  4. package/ai-docs/CONTRACTS.md +46 -0
  5. package/ai-docs/GETTING_STARTED.md +168 -0
  6. package/ai-docs/GLOSSARY.md +43 -0
  7. package/ai-docs/README.md +138 -0
  8. package/ai-docs/REVIEW_CHECKLIST.md +41 -0
  9. package/ai-docs/RULES.md +444 -0
  10. package/ai-docs/SECURITY.md +52 -0
  11. package/ai-docs/SERVICE_STATE.md +48 -0
  12. package/ai-docs/SPEC_INDEX.md +65 -0
  13. package/ai-docs/adr/0001-spec-source-policy.md +55 -0
  14. package/ai-docs/adr/README.md +8 -0
  15. package/ai-docs/adr/_adr-template.md +31 -0
  16. package/ai-docs/contact-center-spec.md +341 -0
  17. package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
  18. package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
  19. package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -0
  20. package/ai-docs/patterns/event-driven-patterns.md +485 -0
  21. package/ai-docs/patterns/testing-patterns.md +480 -0
  22. package/ai-docs/patterns/typescript-patterns.md +365 -0
  23. package/ai-docs/templates/README.md +102 -0
  24. package/ai-docs/templates/documentation/create-agents-md.md +240 -0
  25. package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
  26. package/ai-docs/templates/existing-service/bug-fix.md +254 -0
  27. package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
  28. package/ai-docs/templates/new-method/00-master.md +80 -0
  29. package/ai-docs/templates/new-method/01-requirements.md +232 -0
  30. package/ai-docs/templates/new-method/02-implementation.md +295 -0
  31. package/ai-docs/templates/new-method/03-tests.md +201 -0
  32. package/ai-docs/templates/new-method/04-validation.md +141 -0
  33. package/ai-docs/templates/new-service/00-master.md +109 -0
  34. package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
  35. package/ai-docs/templates/new-service/02-code-generation.md +346 -0
  36. package/ai-docs/templates/new-service/03-integration.md +178 -0
  37. package/ai-docs/templates/new-service/04-test-generation.md +205 -0
  38. package/ai-docs/templates/new-service/05-validation.md +145 -0
  39. package/dist/cc.js +265 -29
  40. package/dist/cc.js.map +1 -1
  41. package/dist/config.js +6 -0
  42. package/dist/config.js.map +1 -1
  43. package/dist/constants.js +17 -1
  44. package/dist/constants.js.map +1 -1
  45. package/dist/index.js +20 -5
  46. package/dist/index.js.map +1 -1
  47. package/dist/metrics/behavioral-events.js +101 -0
  48. package/dist/metrics/behavioral-events.js.map +1 -1
  49. package/dist/metrics/constants.js +25 -4
  50. package/dist/metrics/constants.js.map +1 -1
  51. package/dist/services/ApiAiAssistant.js +153 -8
  52. package/dist/services/ApiAiAssistant.js.map +1 -1
  53. package/dist/services/UserPreference.js +427 -0
  54. package/dist/services/UserPreference.js.map +1 -0
  55. package/dist/services/config/Util.js +3 -3
  56. package/dist/services/config/Util.js.map +1 -1
  57. package/dist/services/config/constants.js +23 -2
  58. package/dist/services/config/constants.js.map +1 -1
  59. package/dist/services/config/types.js +49 -9
  60. package/dist/services/config/types.js.map +1 -1
  61. package/dist/services/core/Err.js.map +1 -1
  62. package/dist/services/core/Utils.js +107 -32
  63. package/dist/services/core/Utils.js.map +1 -1
  64. package/dist/services/core/websocket/WebSocketManager.js +2 -1
  65. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  66. package/dist/services/core/websocket/types.js.map +1 -1
  67. package/dist/services/index.js +1 -1
  68. package/dist/services/index.js.map +1 -1
  69. package/dist/services/task/Task.js +688 -0
  70. package/dist/services/task/Task.js.map +1 -0
  71. package/dist/services/task/TaskFactory.js +45 -0
  72. package/dist/services/task/TaskFactory.js.map +1 -0
  73. package/dist/services/task/TaskManager.js +728 -527
  74. package/dist/services/task/TaskManager.js.map +1 -1
  75. package/dist/services/task/TaskUtils.js +162 -26
  76. package/dist/services/task/TaskUtils.js.map +1 -1
  77. package/dist/services/task/constants.js +9 -2
  78. package/dist/services/task/constants.js.map +1 -1
  79. package/dist/services/task/dialer.js +78 -0
  80. package/dist/services/task/dialer.js.map +1 -1
  81. package/dist/services/task/digital/Digital.js +77 -0
  82. package/dist/services/task/digital/Digital.js.map +1 -0
  83. package/dist/services/task/state-machine/TaskStateMachine.js +837 -0
  84. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  85. package/dist/services/task/state-machine/actions.js +543 -0
  86. package/dist/services/task/state-machine/actions.js.map +1 -0
  87. package/dist/services/task/state-machine/constants.js +161 -0
  88. package/dist/services/task/state-machine/constants.js.map +1 -0
  89. package/dist/services/task/state-machine/guards.js +340 -0
  90. package/dist/services/task/state-machine/guards.js.map +1 -0
  91. package/dist/services/task/state-machine/index.js +53 -0
  92. package/dist/services/task/state-machine/index.js.map +1 -0
  93. package/dist/services/task/state-machine/types.js +54 -0
  94. package/dist/services/task/state-machine/types.js.map +1 -0
  95. package/dist/services/task/state-machine/uiControlsComputer.js +553 -0
  96. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  97. package/dist/services/task/taskDataNormalizer.js +99 -0
  98. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  99. package/dist/services/task/types.js +212 -4
  100. package/dist/services/task/types.js.map +1 -1
  101. package/dist/services/task/voice/Voice.js +1042 -0
  102. package/dist/services/task/voice/Voice.js.map +1 -0
  103. package/dist/services/task/voice/WebRTC.js +149 -0
  104. package/dist/services/task/voice/WebRTC.js.map +1 -0
  105. package/dist/types/cc.d.ts +94 -1
  106. package/dist/types/config.d.ts +6 -0
  107. package/dist/types/constants.d.ts +17 -1
  108. package/dist/types/index.d.ts +21 -6
  109. package/dist/types/metrics/constants.d.ts +21 -1
  110. package/dist/types/services/ApiAiAssistant.d.ts +22 -4
  111. package/dist/types/services/UserPreference.d.ts +118 -0
  112. package/dist/types/services/config/constants.d.ts +21 -0
  113. package/dist/types/services/config/types.d.ts +171 -10
  114. package/dist/types/services/core/Err.d.ts +4 -0
  115. package/dist/types/services/core/Utils.d.ts +33 -13
  116. package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -0
  117. package/dist/types/services/core/websocket/types.d.ts +1 -1
  118. package/dist/types/services/index.d.ts +1 -1
  119. package/dist/types/services/task/Task.d.ts +157 -0
  120. package/dist/types/services/task/TaskFactory.d.ts +12 -0
  121. package/dist/types/services/task/TaskUtils.d.ts +46 -2
  122. package/dist/types/services/task/constants.d.ts +7 -0
  123. package/dist/types/services/task/dialer.d.ts +30 -0
  124. package/dist/types/services/task/digital/Digital.d.ts +22 -0
  125. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1144 -0
  126. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  127. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  128. package/dist/types/services/task/state-machine/guards.d.ts +90 -0
  129. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  130. package/dist/types/services/task/state-machine/types.d.ts +267 -0
  131. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  132. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  133. package/dist/types/services/task/types.d.ts +603 -66
  134. package/dist/types/services/task/voice/Voice.d.ts +184 -0
  135. package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
  136. package/dist/types/types.d.ts +135 -0
  137. package/dist/types/webex.d.ts +1 -0
  138. package/dist/types.js +118 -2
  139. package/dist/types.js.map +1 -1
  140. package/dist/webex.js +14 -2
  141. package/dist/webex.js.map +1 -1
  142. package/package.json +15 -12
  143. package/src/cc.ts +329 -30
  144. package/src/config.ts +6 -0
  145. package/src/constants.ts +17 -1
  146. package/src/index.ts +23 -5
  147. package/src/metrics/ai-docs/AGENTS.md +350 -0
  148. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  149. package/src/metrics/ai-docs/metrics-spec.md +854 -0
  150. package/src/metrics/behavioral-events.ts +106 -0
  151. package/src/metrics/constants.ts +27 -4
  152. package/src/services/ApiAiAssistant.ts +203 -8
  153. package/src/services/UserPreference.ts +509 -0
  154. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  155. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  156. package/src/services/agent/ai-docs/agent-spec.md +504 -0
  157. package/src/services/ai-docs/AGENTS.md +386 -0
  158. package/src/services/ai-docs/services-spec.md +492 -0
  159. package/src/services/config/Util.ts +3 -3
  160. package/src/services/config/ai-docs/AGENTS.md +255 -0
  161. package/src/services/config/ai-docs/ARCHITECTURE.md +426 -0
  162. package/src/services/config/ai-docs/config-spec.md +669 -0
  163. package/src/services/config/constants.ts +25 -1
  164. package/src/services/config/types.ts +174 -11
  165. package/src/services/core/Err.ts +2 -0
  166. package/src/services/core/Utils.ts +123 -37
  167. package/src/services/core/ai-docs/AGENTS.md +381 -0
  168. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  169. package/src/services/core/ai-docs/core-spec.md +783 -0
  170. package/src/services/core/websocket/WebSocketManager.ts +2 -0
  171. package/src/services/core/websocket/types.ts +1 -1
  172. package/src/services/index.ts +1 -1
  173. package/src/services/task/Task.ts +837 -0
  174. package/src/services/task/TaskFactory.ts +55 -0
  175. package/src/services/task/TaskManager.ts +739 -614
  176. package/src/services/task/TaskUtils.ts +205 -25
  177. package/src/services/task/ai-docs/AGENTS.md +457 -0
  178. package/src/services/task/ai-docs/ARCHITECTURE.md +594 -0
  179. package/src/services/task/ai-docs/task-spec.md +1319 -0
  180. package/src/services/task/constants.ts +7 -0
  181. package/src/services/task/dialer.ts +80 -0
  182. package/src/services/task/digital/Digital.ts +95 -0
  183. package/src/services/task/state-machine/TaskStateMachine.ts +1077 -0
  184. package/src/services/task/state-machine/actions.ts +685 -0
  185. package/src/services/task/state-machine/ai-docs/AGENTS.md +458 -0
  186. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1137 -0
  187. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2115 -0
  188. package/src/services/task/state-machine/constants.ts +172 -0
  189. package/src/services/task/state-machine/guards.ts +406 -0
  190. package/src/services/task/state-machine/index.ts +28 -0
  191. package/src/services/task/state-machine/types.ts +241 -0
  192. package/src/services/task/state-machine/uiControlsComputer.ts +867 -0
  193. package/src/services/task/taskDataNormalizer.ts +137 -0
  194. package/src/services/task/types.ts +710 -71
  195. package/src/services/task/voice/Voice.ts +1267 -0
  196. package/src/services/task/voice/WebRTC.ts +187 -0
  197. package/src/types.ts +166 -2
  198. package/src/utils/AGENTS.md +278 -0
  199. package/src/utils/ai-docs/utils-spec.md +381 -0
  200. package/src/webex.js +2 -0
  201. package/test/unit/spec/cc.ts +343 -23
  202. package/test/unit/spec/logger-proxy.ts +70 -0
  203. package/test/unit/spec/services/ApiAiAssistant.ts +178 -20
  204. package/test/unit/spec/services/UserPreference.ts +401 -0
  205. package/test/unit/spec/services/WebCallingService.ts +7 -1
  206. package/test/unit/spec/services/config/index.ts +30 -30
  207. package/test/unit/spec/services/core/Utils.ts +425 -8
  208. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +66 -40
  209. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  210. package/test/unit/spec/services/task/Task.ts +477 -0
  211. package/test/unit/spec/services/task/TaskFactory.ts +62 -0
  212. package/test/unit/spec/services/task/TaskManager.ts +834 -1704
  213. package/test/unit/spec/services/task/TaskUtils.ts +206 -0
  214. package/test/unit/spec/services/task/dialer.ts +190 -0
  215. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  216. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +1825 -0
  217. package/test/unit/spec/services/task/state-machine/guards.ts +479 -0
  218. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  219. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +2020 -0
  220. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  221. package/test/unit/spec/services/task/voice/Voice.ts +631 -0
  222. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  223. package/umd/contact-center.min.js +2 -2
  224. package/umd/contact-center.min.js.map +1 -1
  225. package/dist/services/task/index.js +0 -1525
  226. package/dist/services/task/index.js.map +0 -1
  227. package/dist/types/services/task/index.d.ts +0 -650
  228. package/src/services/task/index.ts +0 -1801
  229. package/test/unit/spec/services/task/index.ts +0 -2184
@@ -1 +1 @@
1
- {"version":3,"names":["_events","_interopRequireDefault","require","_calling","_types","_constants","_constants2","_types2","_types3","_loggerProxy","_","_MetricsManager","_constants3","_TaskUtils","e","__esModule","default","TaskManager","EventEmitter","constructor","apiAIAssistant","contact","webCallingService","webSocketManager","taskCollection","metricsManager","MetricsManager","getInstance","registerTaskListeners","registerIncomingCallEvent","setWrapupData","wrapupData","setAgentId","agentId","getAgentId","setWebRtcEnabled","webRtcEnabled","handleRealtimeWebsocketEvent","event","payload","JSON","parse","eventType","type","data","notifType","interactionId","conversationId","task","LoggerProxy","info","module","TASK_MANAGER_FILE","method","METHODS","HANDLE_REAL_TIME_WEBSOCKET_EVENT","emit","error","handleIncomingWebCall","call","currentTask","Object","values","find","interaction","mediaType","isCampaignPreviewReservation","mapCallToTask","getCallId","log","HANDLE_INCOMING_WEB_CALL","TASK_EVENTS","TASK_INCOMING","on","LINE_EVENTS","INCOMING_CALL","unregisterIncomingCallEvent","off","CC_TASK_EVENTS","includes","REGISTER_TASK_LISTENERS","CC_EVENTS","AGENT_CONTACT","shouldAutoAnswer","shouldAutoAnswerTask","loginOption","Task","wrapUpRequired","participants","isWrapUp","isConferenceInProgress","getIsConferenceInProgress","isAutoAnswering","state","TASK_HYDRATE","AGENT_CONTACT_RESERVED","shouldAutoAnswerReserved","isConsulted","LoginOption","BROWSER","MEDIA_CHANNEL","TELEPHONY","AGENT_OFFER_CONTACT","updateTaskData","TASK_OFFER_CONTACT","handleAutoAnswer","AGENT_OUTBOUND_FAILED","trackEvent","METRIC_EVENT_NAMES","TASK_OUTDIAL_FAILED","getCommonTrackingFieldForAQMResponse","taskId","reason","reasonCode","AGENT_CONTACT_ASSIGNED","reservationInteractionId","TASK_ASSIGNED","AGENT_CONTACT_UNASSIGNED","TASK_END","AGENT_CONTACT_OFFER_RONA","AGENT_CONTACT_ASSIGN_FAILED","AGENT_INVITE_FAILED","warn","eventTypeToMetricMap","metricEventName","handleTaskCleanup","TASK_REJECT","CONTACT_ENDED","agentsPendingWrapUp","CAMPAIGN_CONTACT_UPDATED","CONTACT_MERGED","handleContactMerged","AGENT_CONTACT_HELD","TASK_HOLD","AGENT_CONTACT_UNHELD","TASK_RESUME","AGENT_VTEAM_TRANSFERRED","AGENT_CTQ_CANCEL_FAILED","TASK_CONSULT_QUEUE_FAILED","AGENT_CONSULT_CREATED","TASK_CONSULT_CREATED","AGENT_OFFER_CONSULT","TASK_OFFER_CONSULT","AGENT_CONSULTING","TASK_CONSULT_ACCEPTED","TASK_CONSULTING","AGENT_CONSULT_FAILED","AGENT_CONSULT_ENDED","removeTaskFromCollection","TASK_CONSULT_END","AGENT_CTQ_CANCELLED","TASK_CONSULT_QUEUE_CANCELLED","AGENT_WRAPUP","AGENT_WRAPPEDUP","cancelAutoWrapupTimer","TASK_WRAPPEDUP","CONTACT_RECORDING_PAUSED","TASK_RECORDING_PAUSED","CONTACT_RECORDING_PAUSE_FAILED","TASK_RECORDING_PAUSE_FAILED","CONTACT_RECORDING_RESUMED","TASK_RECORDING_RESUMED","CONTACT_RECORDING_RESUME_FAILED","TASK_RECORDING_RESUME_FAILED","AGENT_CONSULT_CONFERENCING","TASK_CONFERENCE_ESTABLISHING","AGENT_CONSULT_CONFERENCED","TASK_CONFERENCE_STARTED","AGENT_CONSULT_CONFERENCE_FAILED","TASK_CONFERENCE_FAILED","AGENT_CONSULT_CONFERENCE_ENDED","isPrimary","isParticipantInMainInteraction","TASK_CONFERENCE_ENDED","PARTICIPANT_JOINED_CONFERENCE","TASK_PARTICIPANT_JOINED","PARTICIPANT_LEFT_CONFERENCE","checkParticipantNotInInteraction","TASK_PARTICIPANT_LEFT","PARTICIPANT_LEFT_CONFERENCE_FAILED","TASK_PARTICIPANT_LEFT_FAILED","AGENT_CONSULT_CONFERENCE_END_FAILED","TASK_CONFERENCE_END_FAILED","AGENT_CONFERENCE_TRANSFERRED","TASK_CONFERENCE_TRANSFERRED","AGENT_CONFERENCE_TRANSFER_FAILED","TASK_CONFERENCE_TRANSFER_FAILED","PARTICIPANT_POST_CALL_ACTIVITY","TASK_POST_CALL_ACTIVITY","AGENT_OFFER_CAMPAIGN_RESERVATION","TASK_CAMPAIGN_PREVIEW_RESERVATION","transcriptInteractionId","TRANSCRIPT_EVENT_MAP","requestRealTimeTranscripts","taskData","undefined","UPDATE_TASK_DATA","childInteractionId","TASK_MERGED","REMOVE_TASK_FROM_COLLECTION","accept","TASK_AUTO_ANSWER_SUCCESS","isAutoAnswered","TASK_AUTO_ANSWERED","TASK_AUTO_ANSWER_FAILED","message","unregisterWebCallListeners","cleanUpCall","isOutdial","outboundType","isNew","needsWrapUp","isSecondaryEpDnAgent","action","aiFeature","realtimeTranscripts","enable","sendEvent","AIAssistantEventType","CUSTOM_EVENT","AIAssistantEventName","GET_TRANSCRIPTS","catch","getTask","getAllTasks","getTaskManager","taskManager","exports"],"sources":["TaskManager.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport {ICall, LINE_EVENTS} from '@webex/calling';\nimport {WebSocketManager} from '../core/websocket/WebSocketManager';\nimport routingContact from './contact';\nimport WebCallingService from '../WebCallingService';\nimport {ITask, MEDIA_CHANNEL, TASK_EVENTS, TaskData, TaskId} from './types';\nimport {TASK_MANAGER_FILE} from '../../constants';\nimport {METHODS, TRANSCRIPT_EVENT_MAP} from './constants';\nimport {CC_EVENTS, CC_TASK_EVENTS, WrapupData} from '../config/types';\nimport {AIAssistantEventName, AIAssistantEventType, LoginOption} from '../../types';\nimport LoggerProxy from '../../logger-proxy';\nimport Task from '.';\nimport MetricsManager from '../../metrics/MetricsManager';\nimport {METRIC_EVENT_NAMES} from '../../metrics/constants';\nimport {\n checkParticipantNotInInteraction,\n getIsConferenceInProgress,\n isCampaignPreviewReservation,\n isParticipantInMainInteraction,\n isPrimary,\n isSecondaryEpDnAgent,\n shouldAutoAnswerTask,\n} from './TaskUtils';\nimport ApiAIAssistant from '../ApiAiAssistant';\n\n/** @internal */\nexport default class TaskManager extends EventEmitter {\n private call: ICall;\n private contact: ReturnType<typeof routingContact>;\n /**\n * Collection of tasks indexed by TaskId\n * @type {Record<TaskId, ITask>}\n * @private\n */\n private taskCollection: Record<TaskId, ITask>;\n private webCallingService: WebCallingService;\n private webSocketManager: WebSocketManager;\n private metricsManager: MetricsManager;\n private static taskManager;\n private wrapupData: WrapupData;\n private agentId: string;\n 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 ) {\n super();\n this.apiAIAssistant = apiAIAssistant;\n this.contact = contact;\n this.taskCollection = {};\n this.webCallingService = webCallingService;\n this.webSocketManager = webSocketManager;\n this.metricsManager = MetricsManager.getInstance();\n this.registerTaskListeners();\n this.registerIncomingCallEvent();\n }\n\n public setWrapupData(wrapupData: WrapupData) {\n this.wrapupData = wrapupData;\n }\n\n public setAgentId(agentId: string) {\n this.agentId = agentId;\n }\n\n /**\n * Gets the current agent ID\n * @returns {string} The agent ID set for this task manager instance\n * @public\n */\n public getAgentId(): string {\n return this.agentId;\n }\n\n public setWebRtcEnabled(webRtcEnabled: boolean) {\n this.webRtcEnabled = webRtcEnabled;\n }\n\n public handleRealtimeWebsocketEvent(event: string) {\n try {\n const payload = JSON.parse(event);\n\n const eventType = payload?.type || payload?.data?.notifType;\n const interactionId = payload?.data?.data?.conversationId;\n if (!eventType || !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 task.emit(eventType, payload.data);\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 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 this.emit(TASK_EVENTS.TASK_INCOMING, currentTask);\n }\n this.call = call;\n };\n\n public registerIncomingCallEvent() {\n this.webCallingService.on(LINE_EVENTS.INCOMING_CALL, this.handleIncomingWebCall);\n }\n\n public unregisterIncomingCallEvent() {\n this.webCallingService.off(LINE_EVENTS.INCOMING_CALL, this.handleIncomingWebCall);\n }\n\n private registerTaskListeners() {\n this.webSocketManager.on('message', (event) => {\n const payload = JSON.parse(event);\n // Re-emit the task events to the task object\n let task: ITask;\n if (payload.data?.type || payload.type) {\n if (Object.values(CC_TASK_EVENTS).includes(payload.data.type || payload.type)) {\n task =\n this.taskCollection[payload.data?.interactionId] ||\n this.taskCollection[payload.data?.data?.conversationId];\n }\n LoggerProxy.info(`Handling task event ${payload.data?.type}`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data?.interactionId,\n });\n switch (payload.data.type) {\n case CC_EVENTS.AGENT_CONTACT:\n // Case1 : Task is already present in taskCollection\n if (this.taskCollection[payload.data.interactionId]) {\n LoggerProxy.log(`Got AGENT_CONTACT: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n });\n break;\n } else if (!this.taskCollection[payload.data.interactionId]) {\n // Case2 : Task is not present in taskCollection\n LoggerProxy.log(`Got AGENT_CONTACT : Creating new task in taskManager`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n });\n\n // Check if auto-answer should happen for this task\n const shouldAutoAnswer = shouldAutoAnswerTask(\n payload.data,\n this.agentId,\n this.webCallingService.loginOption,\n this.webRtcEnabled\n );\n\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...payload.data,\n wrapUpRequired:\n payload.data.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(payload.data),\n isAutoAnswering: shouldAutoAnswer, // Set flag before emitting\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.data.interactionId] = task;\n // Condition 1: The state is=new i.e it is a incoming task\n if (payload.data.interaction.state === 'new') {\n LoggerProxy.log(\n `Got AGENT_CONTACT for a task with state=new, sending TASK_INCOMING event`,\n {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n }\n );\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n } else {\n // Condition 2: The state is anything else i.e the task was connected\n LoggerProxy.log(\n `Got AGENT_CONTACT for a task with state=${payload.data.interaction.state}, sending TASK_HYDRATE event`,\n {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n }\n );\n this.emit(TASK_EVENTS.TASK_HYDRATE, task);\n }\n }\n break;\n\n case CC_EVENTS.AGENT_CONTACT_RESERVED: {\n // Check if auto-answer should happen for this task\n const shouldAutoAnswerReserved = shouldAutoAnswerTask(\n payload.data,\n this.agentId,\n this.webCallingService.loginOption,\n this.webRtcEnabled\n );\n\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...payload.data,\n isConsulted: false,\n isAutoAnswering: shouldAutoAnswerReserved, // Set flag before emitting\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.data.interactionId] = task;\n if (\n this.webCallingService.loginOption !== LoginOption.BROWSER ||\n task.data.interaction.mediaType !== MEDIA_CHANNEL.TELEPHONY // for digital channels\n ) {\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n } else if (this.call) {\n this.emit(TASK_EVENTS.TASK_INCOMING, task);\n }\n break;\n }\n case CC_EVENTS.AGENT_OFFER_CONTACT:\n // We don't have to emit any event here since this will be result of promise.\n task = this.updateTaskData(task, payload.data);\n LoggerProxy.log(`Agent offer contact received for task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data?.interactionId,\n });\n this.emit(TASK_EVENTS.TASK_OFFER_CONTACT, task);\n\n // Handle auto-answer for offer contact\n this.handleAutoAnswer(task);\n break;\n case CC_EVENTS.AGENT_OUTBOUND_FAILED:\n if (task) {\n task = this.updateTaskData(task, payload.data);\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_OUTDIAL_FAILED,\n {\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(payload.data),\n taskId: payload.data.interactionId,\n reason: payload.data.reasonCode || payload.data.reason,\n },\n ['behavioral', 'operational']\n );\n LoggerProxy.log(`Agent outbound failed for task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n });\n task.emit(TASK_EVENTS.TASK_OUTDIAL_FAILED, payload.data.reason ?? 'UNKNOWN_REASON');\n }\n break;\n case CC_EVENTS.AGENT_CONTACT_ASSIGNED:\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 && payload.data.reservationInteractionId) {\n task = this.taskCollection[payload.data.reservationInteractionId];\n if (task) {\n // Re-key the task under the new interaction ID and remove the old entry\n delete this.taskCollection[payload.data.reservationInteractionId];\n this.taskCollection[payload.data.interactionId] = task;\n }\n }\n if (task) {\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_ASSIGNED, task);\n }\n break;\n case CC_EVENTS.AGENT_CONTACT_UNASSIGNED:\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired: true,\n });\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_CONTACT_OFFER_RONA:\n case CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED:\n case CC_EVENTS.AGENT_INVITE_FAILED: {\n LoggerProxy.warn(\n `[DEBUG-CAMPAIGN-CLEAR] Task removal triggered by ${payload.data.type}, interactionId=${payload.data.interactionId}, taskType=${task?.data?.type}`,\n {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n }\n );\n task = this.updateTaskData(task, payload.data);\n\n const eventTypeToMetricMap: Record<string, keyof typeof METRIC_EVENT_NAMES> = {\n [CC_EVENTS.AGENT_CONTACT_ASSIGN_FAILED]: 'AGENT_CONTACT_ASSIGN_FAILED',\n [CC_EVENTS.AGENT_INVITE_FAILED]: 'AGENT_INVITE_FAILED',\n };\n const metricEventName: keyof typeof METRIC_EVENT_NAMES =\n eventTypeToMetricMap[payload.data.type] || 'AGENT_RONA';\n\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES[metricEventName],\n {\n ...MetricsManager.getCommonTrackingFieldForAQMResponse(payload.data),\n taskId: payload.data.interactionId,\n reason: payload.data.reason,\n },\n ['behavioral', 'operational']\n );\n this.handleTaskCleanup(task);\n task.emit(TASK_EVENTS.TASK_REJECT, payload.data.reason);\n break;\n }\n case CC_EVENTS.CONTACT_ENDED:\n // Update task data\n if (task) {\n LoggerProxy.warn(\n `[DEBUG-CAMPAIGN-CLEAR] CONTACT_ENDED, interactionId=${payload.data.interactionId}, taskType=${task?.data?.type}, state=${task?.data?.interaction?.state}`,\n {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n }\n );\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired: payload.data.agentsPendingWrapUp?.includes(this.agentId) || false,\n });\n\n // Handle cleanup based on whether task should be deleted\n this.handleTaskCleanup(task);\n\n task?.emit(TASK_EVENTS.TASK_END, task);\n }\n break;\n case CC_EVENTS.CAMPAIGN_CONTACT_UPDATED:\n // CampaignContactUpdated is a non-terminal event (intermediate update during accept).\n // Only update the task data — do NOT remove the task or emit TASK_END.\n // Task cleanup is handled by CONTACT_ENDED or other terminal events.\n if (task) {\n task = this.updateTaskData(task, payload.data);\n }\n break;\n case CC_EVENTS.CONTACT_MERGED:\n task = this.handleContactMerged(task, payload.data);\n break;\n case CC_EVENTS.AGENT_CONTACT_HELD:\n // As soon as the main interaction is held, we need to emit TASK_HOLD\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_HOLD, task);\n break;\n case CC_EVENTS.AGENT_CONTACT_UNHELD:\n // As soon as the main interaction is unheld, we need to emit TASK_RESUME\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RESUME, task);\n break;\n case CC_EVENTS.AGENT_VTEAM_TRANSFERRED:\n task = this.updateTaskData(task, {\n ...payload.data,\n wrapUpRequired: true,\n });\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_CTQ_CANCEL_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONSULT_QUEUE_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CREATED:\n // Received when self agent initiates a consult\n task = this.updateTaskData(task, {\n ...payload.data,\n isConsulted: false, // This ensures that the task consult status is always reset\n });\n task.emit(TASK_EVENTS.TASK_CONSULT_CREATED, task);\n break;\n case CC_EVENTS.AGENT_OFFER_CONSULT:\n // Received when other agent sends us a consult offer\n task = this.updateTaskData(task, {\n ...payload.data,\n isConsulted: true, // This ensures that the task is marked as us being requested for a consult\n });\n task.emit(TASK_EVENTS.TASK_OFFER_CONSULT, task);\n\n // Handle auto-answer for consult offer\n this.handleAutoAnswer(task);\n break;\n case CC_EVENTS.AGENT_CONSULTING:\n // Received when agent is in an active consult state\n // TODO: Check if we can use backend consult state instead of isConsulted\n task = this.updateTaskData(task, payload.data);\n if (task.data.isConsulted) {\n // Fire only if you are the agent who received the consult request\n task.emit(TASK_EVENTS.TASK_CONSULT_ACCEPTED, task);\n } else {\n // Fire only if you are the agent who initiated the consult\n task.emit(TASK_EVENTS.TASK_CONSULTING, task);\n }\n break;\n case CC_EVENTS.AGENT_CONSULT_FAILED:\n // This can only be received by the agent who initiated the consult.\n // We need not emit any event here since this will be result of promise\n task = this.updateTaskData(task, payload.data);\n break;\n case CC_EVENTS.AGENT_CONSULT_ENDED:\n task = this.updateTaskData(task, payload.data);\n if (task.data.isConsulted) {\n // This will be the end state of the task as soon as we end the consult in case of\n // us being offered a consult\n this.removeTaskFromCollection(task);\n }\n task.emit(TASK_EVENTS.TASK_CONSULT_END, task);\n break;\n case CC_EVENTS.AGENT_CTQ_CANCELLED:\n // This event is received when the consult using queue is cancelled using API\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONSULT_QUEUE_CANCELLED, task);\n break;\n case CC_EVENTS.AGENT_WRAPUP:\n task = this.updateTaskData(task, {...payload.data, wrapUpRequired: true});\n task.emit(TASK_EVENTS.TASK_END, task);\n break;\n case CC_EVENTS.AGENT_WRAPPEDUP:\n task.cancelAutoWrapupTimer();\n this.removeTaskFromCollection(task);\n task.emit(TASK_EVENTS.TASK_WRAPPEDUP, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_PAUSED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_PAUSED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_PAUSE_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_PAUSE_FAILED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_RESUMED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_RESUMED, task);\n break;\n case CC_EVENTS.CONTACT_RECORDING_RESUME_FAILED:\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_RECORDING_RESUME_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCING:\n // Conference is being established - update task state and emit establishing event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_ESTABLISHING, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCED:\n // Conference started successfully - update task state and emit event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_STARTED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_FAILED:\n // Conference failed - update task state and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_ENDED:\n // Conference ended - update task state and emit event\n task = this.updateTaskData(task, payload.data);\n if (\n !task ||\n isPrimary(task, this.agentId) ||\n isParticipantInMainInteraction(task, this.agentId)\n ) {\n LoggerProxy.log('Primary or main interaction participant leaving conference');\n } else {\n this.removeTaskFromCollection(task);\n }\n task.emit(TASK_EVENTS.TASK_CONFERENCE_ENDED, task);\n break;\n case CC_EVENTS.PARTICIPANT_JOINED_CONFERENCE: {\n task = this.updateTaskData(task, {\n ...payload.data,\n isConferenceInProgress: getIsConferenceInProgress(payload.data),\n });\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_JOINED, task);\n break;\n }\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE: {\n // Conference ended - update task state and emit event\n\n task = this.updateTaskData(task, {\n ...payload.data,\n isConferenceInProgress: getIsConferenceInProgress(payload.data),\n });\n if (checkParticipantNotInInteraction(task, this.agentId)) {\n if (\n isParticipantInMainInteraction(task, this.agentId) ||\n isPrimary(task, this.agentId)\n ) {\n LoggerProxy.log('Primary or main interaction participant leaving conference');\n } else {\n this.removeTaskFromCollection(task);\n }\n }\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_LEFT, task);\n break;\n }\n case CC_EVENTS.PARTICIPANT_LEFT_CONFERENCE_FAILED:\n // Conference exit failed - update task state and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_PARTICIPANT_LEFT_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONSULT_CONFERENCE_END_FAILED:\n // Conference end failed - update task state with error details and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_END_FAILED, task);\n break;\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFERRED:\n // Conference was transferred - update task state and emit transfer success event\n // Note: Backend should provide hasLeft and wrapUpRequired status\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_TRANSFERRED, task);\n break;\n case CC_EVENTS.AGENT_CONFERENCE_TRANSFER_FAILED:\n // Conference transfer failed - update task state with error details and emit failure event\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_CONFERENCE_TRANSFER_FAILED, task);\n break;\n case CC_EVENTS.PARTICIPANT_POST_CALL_ACTIVITY:\n // Post-call activity for participant - update task state with activity details\n task = this.updateTaskData(task, payload.data);\n task.emit(TASK_EVENTS.TASK_POST_CALL_ACTIVITY, task);\n break;\n case CC_EVENTS.AGENT_OFFER_CAMPAIGN_RESERVATION: {\n // Campaign preview contact offered to agent\n // Create a task in the collection so subsequent events (e.g. AGENT_CONTACT_ASSIGNED\n // after acceptPreviewContact) can find and update it.\n // Emit TASK_CAMPAIGN_PREVIEW_RESERVATION instead of TASK_INCOMING so the call\n // does not ring out to the customer before the agent explicitly accepts the preview contact.\n LoggerProxy.log('Campaign preview reservation received', {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: payload.data.interactionId,\n });\n\n if (!this.taskCollection[payload.data.interactionId]) {\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...payload.data,\n wrapUpRequired: false,\n isConferenceInProgress: false,\n isAutoAnswering: false,\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[payload.data.interactionId] = task;\n } else {\n task = this.updateTaskData(task, payload.data);\n }\n\n this.emit(TASK_EVENTS.TASK_CAMPAIGN_PREVIEW_RESERVATION, task);\n break;\n }\n\n default:\n break;\n }\n if (task) {\n task.emit(payload.data.type, payload.data);\n }\n\n const transcriptInteractionId =\n payload.data?.interactionId ||\n payload.data?.data?.conversationId ||\n task?.data?.interactionId;\n\n if (TRANSCRIPT_EVENT_MAP[payload.data.type] && transcriptInteractionId) {\n this.requestRealTimeTranscripts(payload.data.type, transcriptInteractionId);\n }\n }\n });\n }\n\n private updateTaskData(task: ITask, taskData: TaskData): ITask {\n if (!task) {\n return undefined;\n }\n\n if (!taskData?.interactionId) {\n LoggerProxy.warn('Received task update with missing interactionId', {\n module: TASK_MANAGER_FILE,\n method: METHODS.UPDATE_TASK_DATA,\n });\n }\n\n try {\n const currentTask = task.updateTaskData(taskData);\n this.taskCollection[taskData.interactionId] = currentTask;\n\n return currentTask;\n } catch (error) {\n LoggerProxy.error(`Failed to update task`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.UPDATE_TASK_DATA,\n interactionId: taskData.interactionId,\n });\n\n return task;\n }\n }\n\n /**\n * Handles CONTACT_MERGED event logic\n * @param task - The task to process\n * @param taskData - The task data from the event payload\n * @returns Updated or newly created task\n * @private\n */\n private handleContactMerged(task: ITask, taskData: TaskData): ITask {\n if (taskData.childInteractionId) {\n // remove the child task from collection\n this.removeTaskFromCollection(this.taskCollection[taskData.childInteractionId]);\n }\n\n if (this.taskCollection[taskData.interactionId]) {\n LoggerProxy.log(`Got CONTACT_MERGED: Task already exists in collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: taskData.interactionId,\n });\n // update the task data\n task = this.updateTaskData(task, taskData);\n } else {\n // Case2 : Task is not present in taskCollection\n LoggerProxy.log(`Got CONTACT_MERGED : Creating new task in taskManager`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REGISTER_TASK_LISTENERS,\n interactionId: taskData.interactionId,\n });\n\n task = new Task(\n this.contact,\n this.webCallingService,\n {\n ...taskData,\n wrapUpRequired: taskData.interaction?.participants?.[this.agentId]?.isWrapUp || false,\n isConferenceInProgress: getIsConferenceInProgress(taskData),\n },\n this.wrapupData,\n this.agentId\n );\n this.taskCollection[taskData.interactionId] = task;\n }\n\n this.emit(TASK_EVENTS.TASK_MERGED, task);\n\n return task;\n }\n\n private removeTaskFromCollection(task: ITask) {\n if (task?.data?.interactionId) {\n delete this.taskCollection[task.data.interactionId];\n LoggerProxy.info(`Task removed from collection`, {\n module: TASK_MANAGER_FILE,\n method: METHODS.REMOVE_TASK_FROM_COLLECTION,\n interactionId: task.data.interactionId,\n });\n }\n }\n\n /**\n * Handles auto-answer logic for incoming tasks\n * Automatically accepts tasks when isAutoAnswering flag is set\n * The flag is set during task creation based on:\n * 1. WebRTC calls with auto-answer enabled in agent profile\n * 2. Agent-initiated WebRTC outdial calls\n * 3. Agent-initiated digital outbound (Email/SMS) without previous transfers\n *\n * @param task - The task to auto-answer\n * @private\n */\n private async handleAutoAnswer(task: ITask): Promise<void> {\n if (!task || !task.data || !task.data.isAutoAnswering) {\n return;\n }\n\n LoggerProxy.info(`Auto-answering task`, {\n module: TASK_MANAGER_FILE,\n method: 'handleAutoAnswer',\n interactionId: task.data.interactionId,\n });\n\n try {\n await task.accept();\n LoggerProxy.info(`Task auto-answered successfully`, {\n module: TASK_MANAGER_FILE,\n method: 'handleAutoAnswer',\n interactionId: task.data.interactionId,\n });\n\n // Track successful auto-answer\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_AUTO_ANSWER_SUCCESS,\n {\n taskId: task.data.interactionId,\n mediaType: task.data.interaction.mediaType,\n isAutoAnswered: true,\n },\n ['behavioral', 'operational']\n );\n // Emit task:autoAnswered event for widgets/UI to react\n task.emit(TASK_EVENTS.TASK_AUTO_ANSWERED, task);\n } catch (error) {\n // Reset isAutoAnswering flag on failure\n task.updateTaskData({...task.data, isAutoAnswering: false});\n LoggerProxy.error(`Failed to auto-answer task`, {\n module: TASK_MANAGER_FILE,\n method: 'handleAutoAnswer',\n interactionId: task.data.interactionId,\n error,\n });\n\n // Track auto-answer failure\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.TASK_AUTO_ANSWER_FAILED,\n {\n taskId: task.data.interactionId,\n mediaType: task.data.interaction.mediaType,\n error: error?.message || 'Unknown error',\n isAutoAnswered: false,\n },\n ['behavioral', 'operational']\n );\n }\n }\n\n /**\n * Handles cleanup of task resources including Desktop/WebRTC call cleanup and task removal\n * @param task - The task to clean up\n * @private\n */\n private handleTaskCleanup(task: ITask) {\n // Clean up Desktop/WebRTC calling resources for browser-based telephony tasks\n if (\n this.webCallingService.loginOption === LoginOption.BROWSER &&\n task.data.interaction.mediaType === 'telephony'\n ) {\n task.unregisterWebCallListeners();\n this.webCallingService.cleanUpCall();\n }\n\n 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 (\n !action ||\n !this.apiAIAssistant ||\n this.apiAIAssistant.aiFeature?.realtimeTranscripts?.enable === false\n )\n 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: 'requestRealTimeTranscripts',\n interactionId,\n error,\n });\n });\n }\n\n public getTask(taskId: TaskId): ITask {\n return this.taskCollection[taskId];\n }\n\n /**\n * @param taskId - Unique identifier for each task\n */\n public getAllTasks = (): Record<TaskId, ITask> => {\n return this.taskCollection;\n };\n\n public static getTaskManager(\n apiAIAssistant: ApiAIAssistant,\n contact: ReturnType<typeof routingContact>,\n webCallingService: WebCallingService,\n webSocketManager: WebSocketManager\n ): TaskManager {\n if (!TaskManager.taskManager) {\n TaskManager.taskManager = new TaskManager(\n apiAIAssistant,\n contact,\n webCallingService,\n webSocketManager\n );\n }\n\n return this.taskManager;\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAIA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,UAAA,GAAAH,OAAA;AACA,IAAAI,WAAA,GAAAJ,OAAA;AACA,IAAAK,OAAA,GAAAL,OAAA;AACA,IAAAM,OAAA,GAAAN,OAAA;AACA,IAAAO,YAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,CAAA,GAAAT,sBAAA,CAAAC,OAAA;AACA,IAAAS,eAAA,GAAAV,sBAAA,CAAAC,OAAA;AACA,IAAAU,WAAA,GAAAV,OAAA;AACA,IAAAW,UAAA,GAAAX,OAAA;AAQqB,SAAAD,uBAAAa,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGrB;AACe,MAAMG,WAAW,SAASC,eAAY,CAAC;EAGpD;AACF;AACA;AACA;AACA;;EAUE;AACF;AACA;AACA;AACA;EACEC,WAAWA,CACTC,cAA8B,EAC9BC,OAA0C,EAC1CC,iBAAoC,EACpCC,gBAAkC,EAClC;IACA,KAAK,CAAC,CAAC;IACP,IAAI,CAACH,cAAc,GAAGA,cAAc;IACpC,IAAI,CAACC,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACG,cAAc,GAAG,CAAC,CAAC;IACxB,IAAI,CAACF,iBAAiB,GAAGA,iBAAiB;IAC1C,IAAI,CAACC,gBAAgB,GAAGA,gBAAgB;IACxC,IAAI,CAACE,cAAc,GAAGC,uBAAc,CAACC,WAAW,CAAC,CAAC;IAClD,IAAI,CAACC,qBAAqB,CAAC,CAAC;IAC5B,IAAI,CAACC,yBAAyB,CAAC,CAAC;EAClC;EAEOC,aAAaA,CAACC,UAAsB,EAAE;IAC3C,IAAI,CAACA,UAAU,GAAGA,UAAU;EAC9B;EAEOC,UAAUA,CAACC,OAAe,EAAE;IACjC,IAAI,CAACA,OAAO,GAAGA,OAAO;EACxB;;EAEA;AACF;AACA;AACA;AACA;EACSC,UAAUA,CAAA,EAAW;IAC1B,OAAO,IAAI,CAACD,OAAO;EACrB;EAEOE,gBAAgBA,CAACC,aAAsB,EAAE;IAC9C,IAAI,CAACA,aAAa,GAAGA,aAAa;EACpC;EAEOC,4BAA4BA,CAACC,KAAa,EAAE;IACjD,IAAI;MACF,MAAMC,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACH,KAAK,CAAC;MAEjC,MAAMI,SAAS,GAAGH,OAAO,EAAEI,IAAI,IAAIJ,OAAO,EAAEK,IAAI,EAAEC,SAAS;MAC3D,MAAMC,aAAa,GAAGP,OAAO,EAAEK,IAAI,EAAEA,IAAI,EAAEG,cAAc;MACzD,IAAI,CAACL,SAAS,IAAI,CAACI,aAAa,EAAE;MAElC,MAAME,IAAI,GAAG,IAAI,CAACxB,cAAc,CAACsB,aAAa,CAAC;MAC/C,IAAI,CAACE,IAAI,EAAE;QACTC,oBAAW,CAACC,IAAI,CAAC,uCAAuC,EAAE;UACxDC,MAAM,EAAEC,4BAAiB;UACzBC,MAAM,EAAEC,mBAAO,CAACC,gCAAgC;UAChDT;QACF,CAAC,CAAC;QAEF;MACF;MAEAE,IAAI,CAACQ,IAAI,CAACd,SAAS,EAAEH,OAAO,CAACK,IAAI,CAAC;IACpC,CAAC,CAAC,OAAOa,KAAK,EAAE;MACdR,oBAAW,CAACQ,KAAK,CAAC,uCAAuC,EAAE;QACzDN,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAEC,mBAAO,CAACC,gCAAgC;QAChDE;MACF,CAAC,CAAC;IACJ;EACF;EAEQC,qBAAqB,GAAIC,IAAW,IAAK;IAC/C,MAAMC,WAAW,GAAGC,MAAM,CAACC,MAAM,CAAC,IAAI,CAACtC,cAAc,CAAC,CAACuC,IAAI,CACxDf,IAAI,IACHA,IAAI,CAACJ,IAAI,CAACoB,WAAW,CAACC,SAAS,KAAK,WAAW,IAAI,CAAC,IAAAC,uCAA4B,EAAClB,IAAI,CACzF,CAAC;IAED,IAAIY,WAAW,EAAE;MACf,IAAI,CAACtC,iBAAiB,CAAC6C,aAAa,CAACR,IAAI,CAACS,SAAS,CAAC,CAAC,EAAER,WAAW,CAAChB,IAAI,CAACE,aAAa,CAAC;MACtFG,oBAAW,CAACoB,GAAG,CAAC,qBAAqB,EAAE;QACrClB,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAEC,mBAAO,CAACgB,wBAAwB;QACxCxB,aAAa,EAAEc,WAAW,CAAChB,IAAI,CAACE;MAClC,CAAC,CAAC;MACF,IAAI,CAACU,IAAI,CAACe,kBAAW,CAACC,aAAa,EAAEZ,WAAW,CAAC;IACnD;IACA,IAAI,CAACD,IAAI,GAAGA,IAAI;EAClB,CAAC;EAEM9B,yBAAyBA,CAAA,EAAG;IACjC,IAAI,CAACP,iBAAiB,CAACmD,EAAE,CAACC,oBAAW,CAACC,aAAa,EAAE,IAAI,CAACjB,qBAAqB,CAAC;EAClF;EAEOkB,2BAA2BA,CAAA,EAAG;IACnC,IAAI,CAACtD,iBAAiB,CAACuD,GAAG,CAACH,oBAAW,CAACC,aAAa,EAAE,IAAI,CAACjB,qBAAqB,CAAC;EACnF;EAEQ9B,qBAAqBA,CAAA,EAAG;IAC9B,IAAI,CAACL,gBAAgB,CAACkD,EAAE,CAAC,SAAS,EAAGnC,KAAK,IAAK;MAC7C,MAAMC,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACH,KAAK,CAAC;MACjC;MACA,IAAIU,IAAW;MACf,IAAIT,OAAO,CAACK,IAAI,EAAED,IAAI,IAAIJ,OAAO,CAACI,IAAI,EAAE;QACtC,IAAIkB,MAAM,CAACC,MAAM,CAACgB,sBAAc,CAAC,CAACC,QAAQ,CAACxC,OAAO,CAACK,IAAI,CAACD,IAAI,IAAIJ,OAAO,CAACI,IAAI,CAAC,EAAE;UAC7EK,IAAI,GACF,IAAI,CAACxB,cAAc,CAACe,OAAO,CAACK,IAAI,EAAEE,aAAa,CAAC,IAChD,IAAI,CAACtB,cAAc,CAACe,OAAO,CAACK,IAAI,EAAEA,IAAI,EAAEG,cAAc,CAAC;QAC3D;QACAE,oBAAW,CAACC,IAAI,CAAC,uBAAuBX,OAAO,CAACK,IAAI,EAAED,IAAI,EAAE,EAAE;UAC5DQ,MAAM,EAAEC,4BAAiB;UACzBC,MAAM,EAAEC,mBAAO,CAAC0B,uBAAuB;UACvClC,aAAa,EAAEP,OAAO,CAACK,IAAI,EAAEE;QAC/B,CAAC,CAAC;QACF,QAAQP,OAAO,CAACK,IAAI,CAACD,IAAI;UACvB,KAAKsC,iBAAS,CAACC,aAAa;YAC1B;YACA,IAAI,IAAI,CAAC1D,cAAc,CAACe,OAAO,CAACK,IAAI,CAACE,aAAa,CAAC,EAAE;cACnDG,oBAAW,CAACoB,GAAG,CAAC,sDAAsD,EAAE;gBACtElB,MAAM,EAAEC,4BAAiB;gBACzBC,MAAM,EAAEC,mBAAO,CAAC0B,uBAAuB;gBACvClC,aAAa,EAAEP,OAAO,CAACK,IAAI,CAACE;cAC9B,CAAC,CAAC;cACF;YACF,CAAC,MAAM,IAAI,CAAC,IAAI,CAACtB,cAAc,CAACe,OAAO,CAACK,IAAI,CAACE,aAAa,CAAC,EAAE;cAC3D;cACAG,oBAAW,CAACoB,GAAG,CAAC,sDAAsD,EAAE;gBACtElB,MAAM,EAAEC,4BAAiB;gBACzBC,MAAM,EAAEC,mBAAO,CAAC0B,uBAAuB;gBACvClC,aAAa,EAAEP,OAAO,CAACK,IAAI,CAACE;cAC9B,CAAC,CAAC;;cAEF;cACA,MAAMqC,gBAAgB,GAAG,IAAAC,+BAAoB,EAC3C7C,OAAO,CAACK,IAAI,EACZ,IAAI,CAACX,OAAO,EACZ,IAAI,CAACX,iBAAiB,CAAC+D,WAAW,EAClC,IAAI,CAACjD,aACP,CAAC;cAEDY,IAAI,GAAG,IAAIsC,SAAI,CACb,IAAI,CAACjE,OAAO,EACZ,IAAI,CAACC,iBAAiB,EACtB;gBACE,GAAGiB,OAAO,CAACK,IAAI;gBACf2C,cAAc,EACZhD,OAAO,CAACK,IAAI,CAACoB,WAAW,EAAEwB,YAAY,GAAG,IAAI,CAACvD,OAAO,CAAC,EAAEwD,QAAQ,IAAI,KAAK;gBAC3EC,sBAAsB,EAAE,IAAAC,oCAAyB,EAACpD,OAAO,CAACK,IAAI,CAAC;gBAC/DgD,eAAe,EAAET,gBAAgB,CAAE;cACrC,CAAC,EACD,IAAI,CAACpD,UAAU,EACf,IAAI,CAACE,OACP,CAAC;cACD,IAAI,CAACT,cAAc,CAACe,OAAO,CAACK,IAAI,CAACE,aAAa,CAAC,GAAGE,IAAI;cACtD;cACA,IAAIT,OAAO,CAACK,IAAI,CAACoB,WAAW,CAAC6B,KAAK,KAAK,KAAK,EAAE;gBAC5C5C,oBAAW,CAACoB,GAAG,CACb,0EAA0E,EAC1E;kBACElB,MAAM,EAAEC,4BAAiB;kBACzBC,MAAM,EAAEC,mBAAO,CAAC0B,uBAAuB;kBACvClC,aAAa,EAAEP,OAAO,CAACK,IAAI,CAACE;gBAC9B,CACF,CAAC;gBACD,IAAI,CAACU,IAAI,CAACe,kBAAW,CAACC,aAAa,EAAExB,IAAI,CAAC;cAC5C,CAAC,MAAM;gBACL;gBACAC,oBAAW,CAACoB,GAAG,CACb,2CAA2C9B,OAAO,CAACK,IAAI,CAACoB,WAAW,CAAC6B,KAAK,8BAA8B,EACvG;kBACE1C,MAAM,EAAEC,4BAAiB;kBACzBC,MAAM,EAAEC,mBAAO,CAAC0B,uBAAuB;kBACvClC,aAAa,EAAEP,OAAO,CAACK,IAAI,CAACE;gBAC9B,CACF,CAAC;gBACD,IAAI,CAACU,IAAI,CAACe,kBAAW,CAACuB,YAAY,EAAE9C,IAAI,CAAC;cAC3C;YACF;YACA;UAEF,KAAKiC,iBAAS,CAACc,sBAAsB;YAAE;cACrC;cACA,MAAMC,wBAAwB,GAAG,IAAAZ,+BAAoB,EACnD7C,OAAO,CAACK,IAAI,EACZ,IAAI,CAACX,OAAO,EACZ,IAAI,CAACX,iBAAiB,CAAC+D,WAAW,EAClC,IAAI,CAACjD,aACP,CAAC;cAEDY,IAAI,GAAG,IAAIsC,SAAI,CACb,IAAI,CAACjE,OAAO,EACZ,IAAI,CAACC,iBAAiB,EACtB;gBACE,GAAGiB,OAAO,CAACK,IAAI;gBACfqD,WAAW,EAAE,KAAK;gBAClBL,eAAe,EAAEI,wBAAwB,CAAE;cAC7C,CAAC,EACD,IAAI,CAACjE,UAAU,EACf,IAAI,CAACE,OACP,CAAC;cACD,IAAI,CAACT,cAAc,CAACe,OAAO,CAACK,IAAI,CAACE,aAAa,CAAC,GAAGE,IAAI;cACtD,IACE,IAAI,CAAC1B,iBAAiB,CAAC+D,WAAW,KAAKa,mBAAW,CAACC,OAAO,IAC1DnD,IAAI,CAACJ,IAAI,CAACoB,WAAW,CAACC,SAAS,KAAKmC,oBAAa,CAACC,SAAS,CAAC;cAAA,EAC5D;gBACA,IAAI,CAAC7C,IAAI,CAACe,kBAAW,CAACC,aAAa,EAAExB,IAAI,CAAC;cAC5C,CAAC,MAAM,IAAI,IAAI,CAACW,IAAI,EAAE;gBACpB,IAAI,CAACH,IAAI,CAACe,kBAAW,CAACC,aAAa,EAAExB,IAAI,CAAC;cAC5C;cACA;YACF;UACA,KAAKiC,iBAAS,CAACqB,mBAAmB;YAChC;YACAtD,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CK,oBAAW,CAACoB,GAAG,CAAC,uCAAuC,EAAE;cACvDlB,MAAM,EAAEC,4BAAiB;cACzBC,MAAM,EAAEC,mBAAO,CAAC0B,uBAAuB;cACvClC,aAAa,EAAEP,OAAO,CAACK,IAAI,EAAEE;YAC/B,CAAC,CAAC;YACF,IAAI,CAACU,IAAI,CAACe,kBAAW,CAACiC,kBAAkB,EAAExD,IAAI,CAAC;;YAE/C;YACA,IAAI,CAACyD,gBAAgB,CAACzD,IAAI,CAAC;YAC3B;UACF,KAAKiC,iBAAS,CAACyB,qBAAqB;YAClC,IAAI1D,IAAI,EAAE;cACRA,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;cAC9C,IAAI,CAACnB,cAAc,CAACkF,UAAU,CAC5BC,8BAAkB,CAACC,mBAAmB,EACtC;gBACE,GAAGnF,uBAAc,CAACoF,oCAAoC,CAACvE,OAAO,CAACK,IAAI,CAAC;gBACpEmE,MAAM,EAAExE,OAAO,CAACK,IAAI,CAACE,aAAa;gBAClCkE,MAAM,EAAEzE,OAAO,CAACK,IAAI,CAACqE,UAAU,IAAI1E,OAAO,CAACK,IAAI,CAACoE;cAClD,CAAC,EACD,CAAC,YAAY,EAAE,aAAa,CAC9B,CAAC;cACD/D,oBAAW,CAACoB,GAAG,CAAC,gCAAgC,EAAE;gBAChDlB,MAAM,EAAEC,4BAAiB;gBACzBC,MAAM,EAAEC,mBAAO,CAAC0B,uBAAuB;gBACvClC,aAAa,EAAEP,OAAO,CAACK,IAAI,CAACE;cAC9B,CAAC,CAAC;cACFE,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACsC,mBAAmB,EAAEtE,OAAO,CAACK,IAAI,CAACoE,MAAM,IAAI,gBAAgB,CAAC;YACrF;YACA;UACF,KAAK/B,iBAAS,CAACiC,sBAAsB;YACnC;YACA;YACA;YACA,IAAI,CAAClE,IAAI,IAAIT,OAAO,CAACK,IAAI,CAACuE,wBAAwB,EAAE;cAClDnE,IAAI,GAAG,IAAI,CAACxB,cAAc,CAACe,OAAO,CAACK,IAAI,CAACuE,wBAAwB,CAAC;cACjE,IAAInE,IAAI,EAAE;gBACR;gBACA,OAAO,IAAI,CAACxB,cAAc,CAACe,OAAO,CAACK,IAAI,CAACuE,wBAAwB,CAAC;gBACjE,IAAI,CAAC3F,cAAc,CAACe,OAAO,CAACK,IAAI,CAACE,aAAa,CAAC,GAAGE,IAAI;cACxD;YACF;YACA,IAAIA,IAAI,EAAE;cACRA,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;cAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAAC6C,aAAa,EAAEpE,IAAI,CAAC;YAC5C;YACA;UACF,KAAKiC,iBAAS,CAACoC,wBAAwB;YACrCrE,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAE;cAC/B,GAAGT,OAAO,CAACK,IAAI;cACf2C,cAAc,EAAE;YAClB,CAAC,CAAC;YACFvC,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAAC+C,QAAQ,EAAEtE,IAAI,CAAC;YACrC;UACF,KAAKiC,iBAAS,CAACsC,wBAAwB;UACvC,KAAKtC,iBAAS,CAACuC,2BAA2B;UAC1C,KAAKvC,iBAAS,CAACwC,mBAAmB;YAAE;cAClCxE,oBAAW,CAACyE,IAAI,CACd,oDAAoDnF,OAAO,CAACK,IAAI,CAACD,IAAI,mBAAmBJ,OAAO,CAACK,IAAI,CAACE,aAAa,cAAcE,IAAI,EAAEJ,IAAI,EAAED,IAAI,EAAE,EAClJ;gBACEQ,MAAM,EAAEC,4BAAiB;gBACzBC,MAAM,EAAEC,mBAAO,CAAC0B,uBAAuB;gBACvClC,aAAa,EAAEP,OAAO,CAACK,IAAI,CAACE;cAC9B,CACF,CAAC;cACDE,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;cAE9C,MAAM+E,oBAAqE,GAAG;gBAC5E,CAAC1C,iBAAS,CAACuC,2BAA2B,GAAG,6BAA6B;gBACtE,CAACvC,iBAAS,CAACwC,mBAAmB,GAAG;cACnC,CAAC;cACD,MAAMG,eAAgD,GACpDD,oBAAoB,CAACpF,OAAO,CAACK,IAAI,CAACD,IAAI,CAAC,IAAI,YAAY;cAEzD,IAAI,CAAClB,cAAc,CAACkF,UAAU,CAC5BC,8BAAkB,CAACgB,eAAe,CAAC,EACnC;gBACE,GAAGlG,uBAAc,CAACoF,oCAAoC,CAACvE,OAAO,CAACK,IAAI,CAAC;gBACpEmE,MAAM,EAAExE,OAAO,CAACK,IAAI,CAACE,aAAa;gBAClCkE,MAAM,EAAEzE,OAAO,CAACK,IAAI,CAACoE;cACvB,CAAC,EACD,CAAC,YAAY,EAAE,aAAa,CAC9B,CAAC;cACD,IAAI,CAACa,iBAAiB,CAAC7E,IAAI,CAAC;cAC5BA,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACuD,WAAW,EAAEvF,OAAO,CAACK,IAAI,CAACoE,MAAM,CAAC;cACvD;YACF;UACA,KAAK/B,iBAAS,CAAC8C,aAAa;YAC1B;YACA,IAAI/E,IAAI,EAAE;cACRC,oBAAW,CAACyE,IAAI,CACd,uDAAuDnF,OAAO,CAACK,IAAI,CAACE,aAAa,cAAcE,IAAI,EAAEJ,IAAI,EAAED,IAAI,WAAWK,IAAI,EAAEJ,IAAI,EAAEoB,WAAW,EAAE6B,KAAK,EAAE,EAC1J;gBACE1C,MAAM,EAAEC,4BAAiB;gBACzBC,MAAM,EAAEC,mBAAO,CAAC0B,uBAAuB;gBACvClC,aAAa,EAAEP,OAAO,CAACK,IAAI,CAACE;cAC9B,CACF,CAAC;cACDE,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAE;gBAC/B,GAAGT,OAAO,CAACK,IAAI;gBACf2C,cAAc,EAAEhD,OAAO,CAACK,IAAI,CAACoF,mBAAmB,EAAEjD,QAAQ,CAAC,IAAI,CAAC9C,OAAO,CAAC,IAAI;cAC9E,CAAC,CAAC;;cAEF;cACA,IAAI,CAAC4F,iBAAiB,CAAC7E,IAAI,CAAC;cAE5BA,IAAI,EAAEQ,IAAI,CAACe,kBAAW,CAAC+C,QAAQ,EAAEtE,IAAI,CAAC;YACxC;YACA;UACF,KAAKiC,iBAAS,CAACgD,wBAAwB;YACrC;YACA;YACA;YACA,IAAIjF,IAAI,EAAE;cACRA,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAChD;YACA;UACF,KAAKqC,iBAAS,CAACiD,cAAc;YAC3BlF,IAAI,GAAG,IAAI,CAACmF,mBAAmB,CAACnF,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YACnD;UACF,KAAKqC,iBAAS,CAACmD,kBAAkB;YAC/B;YACApF,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAAC8D,SAAS,EAAErF,IAAI,CAAC;YACtC;UACF,KAAKiC,iBAAS,CAACqD,oBAAoB;YACjC;YACAtF,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACgE,WAAW,EAAEvF,IAAI,CAAC;YACxC;UACF,KAAKiC,iBAAS,CAACuD,uBAAuB;YACpCxF,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAE;cAC/B,GAAGT,OAAO,CAACK,IAAI;cACf2C,cAAc,EAAE;YAClB,CAAC,CAAC;YACFvC,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAAC+C,QAAQ,EAAEtE,IAAI,CAAC;YACrC;UACF,KAAKiC,iBAAS,CAACwD,uBAAuB;YACpCzF,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACmE,yBAAyB,EAAE1F,IAAI,CAAC;YACtD;UACF,KAAKiC,iBAAS,CAAC0D,qBAAqB;YAClC;YACA3F,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAE;cAC/B,GAAGT,OAAO,CAACK,IAAI;cACfqD,WAAW,EAAE,KAAK,CAAE;YACtB,CAAC,CAAC;YACFjD,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACqE,oBAAoB,EAAE5F,IAAI,CAAC;YACjD;UACF,KAAKiC,iBAAS,CAAC4D,mBAAmB;YAChC;YACA7F,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAE;cAC/B,GAAGT,OAAO,CAACK,IAAI;cACfqD,WAAW,EAAE,IAAI,CAAE;YACrB,CAAC,CAAC;YACFjD,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACuE,kBAAkB,EAAE9F,IAAI,CAAC;;YAE/C;YACA,IAAI,CAACyD,gBAAgB,CAACzD,IAAI,CAAC;YAC3B;UACF,KAAKiC,iBAAS,CAAC8D,gBAAgB;YAC7B;YACA;YACA/F,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9C,IAAII,IAAI,CAACJ,IAAI,CAACqD,WAAW,EAAE;cACzB;cACAjD,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACyE,qBAAqB,EAAEhG,IAAI,CAAC;YACpD,CAAC,MAAM;cACL;cACAA,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAAC0E,eAAe,EAAEjG,IAAI,CAAC;YAC9C;YACA;UACF,KAAKiC,iBAAS,CAACiE,oBAAoB;YACjC;YACA;YACAlG,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9C;UACF,KAAKqC,iBAAS,CAACkE,mBAAmB;YAChCnG,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9C,IAAII,IAAI,CAACJ,IAAI,CAACqD,WAAW,EAAE;cACzB;cACA;cACA,IAAI,CAACmD,wBAAwB,CAACpG,IAAI,CAAC;YACrC;YACAA,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAAC8E,gBAAgB,EAAErG,IAAI,CAAC;YAC7C;UACF,KAAKiC,iBAAS,CAACqE,mBAAmB;YAChC;YACAtG,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACgF,4BAA4B,EAAEvG,IAAI,CAAC;YACzD;UACF,KAAKiC,iBAAS,CAACuE,YAAY;YACzBxG,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAE;cAAC,GAAGT,OAAO,CAACK,IAAI;cAAE2C,cAAc,EAAE;YAAI,CAAC,CAAC;YACzEvC,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAAC+C,QAAQ,EAAEtE,IAAI,CAAC;YACrC;UACF,KAAKiC,iBAAS,CAACwE,eAAe;YAC5BzG,IAAI,CAAC0G,qBAAqB,CAAC,CAAC;YAC5B,IAAI,CAACN,wBAAwB,CAACpG,IAAI,CAAC;YACnCA,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACoF,cAAc,EAAE3G,IAAI,CAAC;YAC3C;UACF,KAAKiC,iBAAS,CAAC2E,wBAAwB;YACrC5G,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACsF,qBAAqB,EAAE7G,IAAI,CAAC;YAClD;UACF,KAAKiC,iBAAS,CAAC6E,8BAA8B;YAC3C9G,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACwF,2BAA2B,EAAE/G,IAAI,CAAC;YACxD;UACF,KAAKiC,iBAAS,CAAC+E,yBAAyB;YACtChH,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAAC0F,sBAAsB,EAAEjH,IAAI,CAAC;YACnD;UACF,KAAKiC,iBAAS,CAACiF,+BAA+B;YAC5ClH,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAAC4F,4BAA4B,EAAEnH,IAAI,CAAC;YACzD;UACF,KAAKiC,iBAAS,CAACmF,0BAA0B;YACvC;YACApH,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAAC8F,4BAA4B,EAAErH,IAAI,CAAC;YACzD;UACF,KAAKiC,iBAAS,CAACqF,yBAAyB;YACtC;YACAtH,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACgG,uBAAuB,EAAEvH,IAAI,CAAC;YACpD;UACF,KAAKiC,iBAAS,CAACuF,+BAA+B;YAC5C;YACAxH,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACkG,sBAAsB,EAAEzH,IAAI,CAAC;YACnD;UACF,KAAKiC,iBAAS,CAACyF,8BAA8B;YAC3C;YACA1H,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9C,IACE,CAACI,IAAI,IACL,IAAA2H,oBAAS,EAAC3H,IAAI,EAAE,IAAI,CAACf,OAAO,CAAC,IAC7B,IAAA2I,yCAA8B,EAAC5H,IAAI,EAAE,IAAI,CAACf,OAAO,CAAC,EAClD;cACAgB,oBAAW,CAACoB,GAAG,CAAC,4DAA4D,CAAC;YAC/E,CAAC,MAAM;cACL,IAAI,CAAC+E,wBAAwB,CAACpG,IAAI,CAAC;YACrC;YACAA,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACsG,qBAAqB,EAAE7H,IAAI,CAAC;YAClD;UACF,KAAKiC,iBAAS,CAAC6F,6BAA6B;YAAE;cAC5C9H,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAE;gBAC/B,GAAGT,OAAO,CAACK,IAAI;gBACf8C,sBAAsB,EAAE,IAAAC,oCAAyB,EAACpD,OAAO,CAACK,IAAI;cAChE,CAAC,CAAC;cACFI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACwG,uBAAuB,EAAE/H,IAAI,CAAC;cACpD;YACF;UACA,KAAKiC,iBAAS,CAAC+F,2BAA2B;YAAE;cAC1C;;cAEAhI,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAE;gBAC/B,GAAGT,OAAO,CAACK,IAAI;gBACf8C,sBAAsB,EAAE,IAAAC,oCAAyB,EAACpD,OAAO,CAACK,IAAI;cAChE,CAAC,CAAC;cACF,IAAI,IAAAqI,2CAAgC,EAACjI,IAAI,EAAE,IAAI,CAACf,OAAO,CAAC,EAAE;gBACxD,IACE,IAAA2I,yCAA8B,EAAC5H,IAAI,EAAE,IAAI,CAACf,OAAO,CAAC,IAClD,IAAA0I,oBAAS,EAAC3H,IAAI,EAAE,IAAI,CAACf,OAAO,CAAC,EAC7B;kBACAgB,oBAAW,CAACoB,GAAG,CAAC,4DAA4D,CAAC;gBAC/E,CAAC,MAAM;kBACL,IAAI,CAAC+E,wBAAwB,CAACpG,IAAI,CAAC;gBACrC;cACF;cACAA,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAAC2G,qBAAqB,EAAElI,IAAI,CAAC;cAClD;YACF;UACA,KAAKiC,iBAAS,CAACkG,kCAAkC;YAC/C;YACAnI,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAAC6G,4BAA4B,EAAEpI,IAAI,CAAC;YACzD;UACF,KAAKiC,iBAAS,CAACoG,mCAAmC;YAChD;YACArI,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAAC+G,0BAA0B,EAAEtI,IAAI,CAAC;YACvD;UACF,KAAKiC,iBAAS,CAACsG,4BAA4B;YACzC;YACA;YACAvI,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACiH,2BAA2B,EAAExI,IAAI,CAAC;YACxD;UACF,KAAKiC,iBAAS,CAACwG,gCAAgC;YAC7C;YACAzI,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACmH,+BAA+B,EAAE1I,IAAI,CAAC;YAC5D;UACF,KAAKiC,iBAAS,CAAC0G,8BAA8B;YAC3C;YACA3I,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;YAC9CI,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACqH,uBAAuB,EAAE5I,IAAI,CAAC;YACpD;UACF,KAAKiC,iBAAS,CAAC4G,gCAAgC;YAAE;cAC/C;cACA;cACA;cACA;cACA;cACA5I,oBAAW,CAACoB,GAAG,CAAC,uCAAuC,EAAE;gBACvDlB,MAAM,EAAEC,4BAAiB;gBACzBC,MAAM,EAAEC,mBAAO,CAAC0B,uBAAuB;gBACvClC,aAAa,EAAEP,OAAO,CAACK,IAAI,CAACE;cAC9B,CAAC,CAAC;cAEF,IAAI,CAAC,IAAI,CAACtB,cAAc,CAACe,OAAO,CAACK,IAAI,CAACE,aAAa,CAAC,EAAE;gBACpDE,IAAI,GAAG,IAAIsC,SAAI,CACb,IAAI,CAACjE,OAAO,EACZ,IAAI,CAACC,iBAAiB,EACtB;kBACE,GAAGiB,OAAO,CAACK,IAAI;kBACf2C,cAAc,EAAE,KAAK;kBACrBG,sBAAsB,EAAE,KAAK;kBAC7BE,eAAe,EAAE;gBACnB,CAAC,EACD,IAAI,CAAC7D,UAAU,EACf,IAAI,CAACE,OACP,CAAC;gBACD,IAAI,CAACT,cAAc,CAACe,OAAO,CAACK,IAAI,CAACE,aAAa,CAAC,GAAGE,IAAI;cACxD,CAAC,MAAM;gBACLA,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAET,OAAO,CAACK,IAAI,CAAC;cAChD;cAEA,IAAI,CAACY,IAAI,CAACe,kBAAW,CAACuH,iCAAiC,EAAE9I,IAAI,CAAC;cAC9D;YACF;UAEA;YACE;QACJ;QACA,IAAIA,IAAI,EAAE;UACRA,IAAI,CAACQ,IAAI,CAACjB,OAAO,CAACK,IAAI,CAACD,IAAI,EAAEJ,OAAO,CAACK,IAAI,CAAC;QAC5C;QAEA,MAAMmJ,uBAAuB,GAC3BxJ,OAAO,CAACK,IAAI,EAAEE,aAAa,IAC3BP,OAAO,CAACK,IAAI,EAAEA,IAAI,EAAEG,cAAc,IAClCC,IAAI,EAAEJ,IAAI,EAAEE,aAAa;QAE3B,IAAIkJ,gCAAoB,CAACzJ,OAAO,CAACK,IAAI,CAACD,IAAI,CAAC,IAAIoJ,uBAAuB,EAAE;UACtE,IAAI,CAACE,0BAA0B,CAAC1J,OAAO,CAACK,IAAI,CAACD,IAAI,EAAEoJ,uBAAuB,CAAC;QAC7E;MACF;IACF,CAAC,CAAC;EACJ;EAEQxF,cAAcA,CAACvD,IAAW,EAAEkJ,QAAkB,EAAS;IAC7D,IAAI,CAAClJ,IAAI,EAAE;MACT,OAAOmJ,SAAS;IAClB;IAEA,IAAI,CAACD,QAAQ,EAAEpJ,aAAa,EAAE;MAC5BG,oBAAW,CAACyE,IAAI,CAAC,iDAAiD,EAAE;QAClEvE,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAEC,mBAAO,CAAC8I;MAClB,CAAC,CAAC;IACJ;IAEA,IAAI;MACF,MAAMxI,WAAW,GAAGZ,IAAI,CAACuD,cAAc,CAAC2F,QAAQ,CAAC;MACjD,IAAI,CAAC1K,cAAc,CAAC0K,QAAQ,CAACpJ,aAAa,CAAC,GAAGc,WAAW;MAEzD,OAAOA,WAAW;IACpB,CAAC,CAAC,OAAOH,KAAK,EAAE;MACdR,oBAAW,CAACQ,KAAK,CAAC,uBAAuB,EAAE;QACzCN,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAEC,mBAAO,CAAC8I,gBAAgB;QAChCtJ,aAAa,EAAEoJ,QAAQ,CAACpJ;MAC1B,CAAC,CAAC;MAEF,OAAOE,IAAI;IACb;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACUmF,mBAAmBA,CAACnF,IAAW,EAAEkJ,QAAkB,EAAS;IAClE,IAAIA,QAAQ,CAACG,kBAAkB,EAAE;MAC/B;MACA,IAAI,CAACjD,wBAAwB,CAAC,IAAI,CAAC5H,cAAc,CAAC0K,QAAQ,CAACG,kBAAkB,CAAC,CAAC;IACjF;IAEA,IAAI,IAAI,CAAC7K,cAAc,CAAC0K,QAAQ,CAACpJ,aAAa,CAAC,EAAE;MAC/CG,oBAAW,CAACoB,GAAG,CAAC,uDAAuD,EAAE;QACvElB,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAEC,mBAAO,CAAC0B,uBAAuB;QACvClC,aAAa,EAAEoJ,QAAQ,CAACpJ;MAC1B,CAAC,CAAC;MACF;MACAE,IAAI,GAAG,IAAI,CAACuD,cAAc,CAACvD,IAAI,EAAEkJ,QAAQ,CAAC;IAC5C,CAAC,MAAM;MACL;MACAjJ,oBAAW,CAACoB,GAAG,CAAC,uDAAuD,EAAE;QACvElB,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAEC,mBAAO,CAAC0B,uBAAuB;QACvClC,aAAa,EAAEoJ,QAAQ,CAACpJ;MAC1B,CAAC,CAAC;MAEFE,IAAI,GAAG,IAAIsC,SAAI,CACb,IAAI,CAACjE,OAAO,EACZ,IAAI,CAACC,iBAAiB,EACtB;QACE,GAAG4K,QAAQ;QACX3G,cAAc,EAAE2G,QAAQ,CAAClI,WAAW,EAAEwB,YAAY,GAAG,IAAI,CAACvD,OAAO,CAAC,EAAEwD,QAAQ,IAAI,KAAK;QACrFC,sBAAsB,EAAE,IAAAC,oCAAyB,EAACuG,QAAQ;MAC5D,CAAC,EACD,IAAI,CAACnK,UAAU,EACf,IAAI,CAACE,OACP,CAAC;MACD,IAAI,CAACT,cAAc,CAAC0K,QAAQ,CAACpJ,aAAa,CAAC,GAAGE,IAAI;IACpD;IAEA,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAAC+H,WAAW,EAAEtJ,IAAI,CAAC;IAExC,OAAOA,IAAI;EACb;EAEQoG,wBAAwBA,CAACpG,IAAW,EAAE;IAC5C,IAAIA,IAAI,EAAEJ,IAAI,EAAEE,aAAa,EAAE;MAC7B,OAAO,IAAI,CAACtB,cAAc,CAACwB,IAAI,CAACJ,IAAI,CAACE,aAAa,CAAC;MACnDG,oBAAW,CAACC,IAAI,CAAC,8BAA8B,EAAE;QAC/CC,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAEC,mBAAO,CAACiJ,2BAA2B;QAC3CzJ,aAAa,EAAEE,IAAI,CAACJ,IAAI,CAACE;MAC3B,CAAC,CAAC;IACJ;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAc2D,gBAAgBA,CAACzD,IAAW,EAAiB;IACzD,IAAI,CAACA,IAAI,IAAI,CAACA,IAAI,CAACJ,IAAI,IAAI,CAACI,IAAI,CAACJ,IAAI,CAACgD,eAAe,EAAE;MACrD;IACF;IAEA3C,oBAAW,CAACC,IAAI,CAAC,qBAAqB,EAAE;MACtCC,MAAM,EAAEC,4BAAiB;MACzBC,MAAM,EAAE,kBAAkB;MAC1BP,aAAa,EAAEE,IAAI,CAACJ,IAAI,CAACE;IAC3B,CAAC,CAAC;IAEF,IAAI;MACF,MAAME,IAAI,CAACwJ,MAAM,CAAC,CAAC;MACnBvJ,oBAAW,CAACC,IAAI,CAAC,iCAAiC,EAAE;QAClDC,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAE,kBAAkB;QAC1BP,aAAa,EAAEE,IAAI,CAACJ,IAAI,CAACE;MAC3B,CAAC,CAAC;;MAEF;MACA,IAAI,CAACrB,cAAc,CAACkF,UAAU,CAC5BC,8BAAkB,CAAC6F,wBAAwB,EAC3C;QACE1F,MAAM,EAAE/D,IAAI,CAACJ,IAAI,CAACE,aAAa;QAC/BmB,SAAS,EAAEjB,IAAI,CAACJ,IAAI,CAACoB,WAAW,CAACC,SAAS;QAC1CyI,cAAc,EAAE;MAClB,CAAC,EACD,CAAC,YAAY,EAAE,aAAa,CAC9B,CAAC;MACD;MACA1J,IAAI,CAACQ,IAAI,CAACe,kBAAW,CAACoI,kBAAkB,EAAE3J,IAAI,CAAC;IACjD,CAAC,CAAC,OAAOS,KAAK,EAAE;MACd;MACAT,IAAI,CAACuD,cAAc,CAAC;QAAC,GAAGvD,IAAI,CAACJ,IAAI;QAAEgD,eAAe,EAAE;MAAK,CAAC,CAAC;MAC3D3C,oBAAW,CAACQ,KAAK,CAAC,4BAA4B,EAAE;QAC9CN,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAE,kBAAkB;QAC1BP,aAAa,EAAEE,IAAI,CAACJ,IAAI,CAACE,aAAa;QACtCW;MACF,CAAC,CAAC;;MAEF;MACA,IAAI,CAAChC,cAAc,CAACkF,UAAU,CAC5BC,8BAAkB,CAACgG,uBAAuB,EAC1C;QACE7F,MAAM,EAAE/D,IAAI,CAACJ,IAAI,CAACE,aAAa;QAC/BmB,SAAS,EAAEjB,IAAI,CAACJ,IAAI,CAACoB,WAAW,CAACC,SAAS;QAC1CR,KAAK,EAAEA,KAAK,EAAEoJ,OAAO,IAAI,eAAe;QACxCH,cAAc,EAAE;MAClB,CAAC,EACD,CAAC,YAAY,EAAE,aAAa,CAC9B,CAAC;IACH;EACF;;EAEA;AACF;AACA;AACA;AACA;EACU7E,iBAAiBA,CAAC7E,IAAW,EAAE;IACrC;IACA,IACE,IAAI,CAAC1B,iBAAiB,CAAC+D,WAAW,KAAKa,mBAAW,CAACC,OAAO,IAC1DnD,IAAI,CAACJ,IAAI,CAACoB,WAAW,CAACC,SAAS,KAAK,WAAW,EAC/C;MACAjB,IAAI,CAAC8J,0BAA0B,CAAC,CAAC;MACjC,IAAI,CAACxL,iBAAiB,CAACyL,WAAW,CAAC,CAAC;IACtC;IAEA,MAAMC,SAAS,GAAGhK,IAAI,CAACJ,IAAI,CAACoB,WAAW,CAACiJ,YAAY,KAAK,SAAS;IAClE,MAAMC,KAAK,GAAGlK,IAAI,CAACJ,IAAI,CAACoB,WAAW,CAAC6B,KAAK,KAAK,KAAK;IACnD,MAAMsH,WAAW,GAAGnK,IAAI,CAACJ,IAAI,CAACoF,mBAAmB,EAAEjD,QAAQ,CAAC,IAAI,CAAC9C,OAAO,CAAC,IAAI,KAAK;;IAElF;IACA;IACA;IACA,IACGiL,KAAK,IAAI,EAAEF,SAAS,IAAIG,WAAW,CAAC,IACrC,IAAAC,+BAAoB,EAACpK,IAAI,CAACJ,IAAI,CAACoB,WAAW,CAAC,IAC1C,CAACmJ,WAAW,IAAIH,SAAU,CAAC;IAAA,EAC5B;MACA,IAAI,CAAC5D,wBAAwB,CAACpG,IAAI,CAAC;IACrC;EACF;;EAEA;AACF;AACA;AACA;EACUiJ,0BAA0BA,CAACvJ,SAAiB,EAAEI,aAAqB,EAAQ;IACjF,MAAMuK,MAAM,GAAGrB,gCAAoB,CAACtJ,SAAS,CAAC;IAC9C,IACE,CAAC2K,MAAM,IACP,CAAC,IAAI,CAACjM,cAAc,IACpB,IAAI,CAACA,cAAc,CAACkM,SAAS,EAAEC,mBAAmB,EAAEC,MAAM,KAAK,KAAK,EAEpE;IAEF,IAAI,CAACpM,cAAc,CAChBqM,SAAS,CACR,IAAI,CAACxL,OAAO,EACZa,aAAa,EACb4K,4BAAoB,CAACC,YAAY,EACjCC,4BAAoB,CAACC,eAAe,EACpCR,MACF,CAAC,CACAS,KAAK,CAAErK,KAAK,IAAK;MAChBR,oBAAW,CAACQ,KAAK,CAAC,6BAA6B4J,MAAM,QAAQ,EAAE;QAC7DlK,MAAM,EAAEC,4BAAiB;QACzBC,MAAM,EAAE,4BAA4B;QACpCP,aAAa;QACbW;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;EACN;EAEOsK,OAAOA,CAAChH,MAAc,EAAS;IACpC,OAAO,IAAI,CAACvF,cAAc,CAACuF,MAAM,CAAC;EACpC;;EAEA;AACF;AACA;EACSiH,WAAW,GAAGA,CAAA,KAA6B;IAChD,OAAO,IAAI,CAACxM,cAAc;EAC5B,CAAC;EAED,OAAcyM,cAAcA,CAC1B7M,cAA8B,EAC9BC,OAA0C,EAC1CC,iBAAoC,EACpCC,gBAAkC,EACrB;IACb,IAAI,CAACN,WAAW,CAACiN,WAAW,EAAE;MAC5BjN,WAAW,CAACiN,WAAW,GAAG,IAAIjN,WAAW,CACvCG,cAAc,EACdC,OAAO,EACPC,iBAAiB,EACjBC,gBACF,CAAC;IACH;IAEA,OAAO,IAAI,CAAC2M,WAAW;EACzB;AACF;AAACC,OAAA,CAAAnN,OAAA,GAAAC,WAAA","ignoreList":[]}
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":[]}
@@ -3,19 +3,111 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.shouldAutoAnswerTask = exports.isWebRTCCall = exports.isSecondaryEpDnAgent = exports.isSecondaryAgent = exports.isPrimary = exports.isParticipantInMainInteraction = exports.isDigitalOutbound = exports.isCampaignPreviewReservation = exports.isAutoAnswerEnabled = exports.hasAgentInitiatedOutdial = exports.getIsConferenceInProgress = exports.checkParticipantNotInInteraction = void 0;
6
+ exports.shouldAutoAnswerTask = exports.isWebRTCCall = exports.isSecondaryEpDnAgent = exports.isSecondaryAgent = exports.isPrimary = exports.isParticipantInMainInteraction = exports.isDigitalOutbound = exports.isCampaignPreviewTask = exports.isCampaignPreviewReservation = exports.isAutoAnswerEnabled = exports.hasAgentInitiatedOutdial = exports.getServerHoldStateForControls = exports.getIsCustomerInCall = exports.getIsConsultedAgentForControls = exports.getIsConsultInProgressForConferenceControls = exports.getIsConferenceInProgress = exports.getConsultMediaResourceId = exports.getConferenceParticipantsCount = exports.checkParticipantNotInInteraction = void 0;
7
7
  var _types = require("./types");
8
- var _types2 = require("../config/types");
9
- var _constants = require("../../constants");
10
- var _types3 = require("../../types");
8
+ var _types2 = require("../../types");
9
+ var _constants = require("./state-machine/constants");
10
+ var _types3 = require("../config/types");
11
+ var _constants2 = require("../../constants");
11
12
  /* eslint-disable import/prefer-default-export */
12
13
 
14
+ const CAMPAIGN_PREVIEW_OUTBOUND_TYPES = ['STANDARD_PREVIEW_CAMPAIGN', 'DIRECT_PREVIEW_CAMPAIGN'];
15
+ const CAMPAIGN_PREVIEW_CAMPAIGN_TYPES = ['preview_standard', 'preview_direct'];
16
+
17
+ /**
18
+ * Checks if the customer is still in the call (not left)
19
+ *
20
+ * @param interaction - The interaction object
21
+ * @param interactionId - The main interaction ID
22
+ * @returns true if customer is in the call
23
+ */
24
+ const getIsCustomerInCall = (interaction, interactionId) => {
25
+ const mainCallMedia = interaction.media?.[interactionId];
26
+ const participants = interaction.participants;
27
+ if (!mainCallMedia?.participants || !participants) {
28
+ return false;
29
+ }
30
+ return mainCallMedia.participants.some(participantId => {
31
+ const participant = participants[participantId];
32
+ return participant?.pType === _constants.PARTICIPANT_TYPE.CUSTOMER && !participant.hasLeft;
33
+ });
34
+ };
35
+
36
+ /**
37
+ * Gets the count of active agent participants in the conference
38
+ * Excludes Customer, Supervisor, and VVA participant types
39
+ *
40
+ * @param interaction - The interaction object
41
+ * @param interactionId - The main interaction ID
42
+ * @returns Number of active agent participants
43
+ */
44
+ exports.getIsCustomerInCall = getIsCustomerInCall;
45
+ const getConferenceParticipantsCount = (interaction, interactionId) => {
46
+ const mainCallMedia = interaction.media?.[interactionId];
47
+ const participants = interaction.participants;
48
+ if (!mainCallMedia?.participants || !participants) {
49
+ return 0;
50
+ }
51
+ let count = 0;
52
+ for (const participantId of mainCallMedia.participants) {
53
+ const participant = participants[participantId];
54
+ if (participant && participant.pType !== _constants.PARTICIPANT_TYPE.CUSTOMER && participant.pType !== _constants.PARTICIPANT_TYPE.SUPERVISOR && participant.pType !== _constants.PARTICIPANT_TYPE.VVA && !participant.hasLeft) {
55
+ count += 1;
56
+ }
57
+ }
58
+ return count;
59
+ };
60
+
61
+ /**
62
+ * Determines if a consult is actively in-progress for conference control gating.
63
+ * This is used to disable conference controls (End/Consult) only when a consult leg
64
+ * still exists outside the main call participants.
65
+ */
66
+ exports.getConferenceParticipantsCount = getConferenceParticipantsCount;
67
+ const getIsConsultInProgressForConferenceControls = (interaction, mainCallId, selfAgentId) => {
68
+ if (!interaction || !mainCallId) return false;
69
+ const mainParticipants = interaction.media?.[mainCallId]?.participants;
70
+ if (!Array.isArray(mainParticipants) || mainParticipants.length === 0) return false;
71
+ const mainSet = new Set(mainParticipants);
72
+ const media = interaction.media;
73
+ if (!media) return false;
74
+ return Object.values(media).some(m => {
75
+ if (!m || m.mType !== 'consult') return false;
76
+ if (!Array.isArray(m.participants) || m.participants.length === 0) return false;
77
+ return m.participants.some(participantId => {
78
+ const p = interaction.participants?.[participantId];
79
+ if (!p || p.hasLeft) return false;
80
+ if (selfAgentId && participantId === selfAgentId) return false;
81
+ const consultState = p.consultState;
82
+ const isRonaPendingConsultee = consultState === 'consultReserved' && p.hasJoined === false;
83
+ const consultLegActive = consultState === 'consulting' || p.currentState === 'consulting' || p.isConsulted === true && consultState !== 'consultCompleted' && !isRonaPendingConsultee;
84
+ return consultLegActive && !mainSet.has(participantId);
85
+ });
86
+ });
87
+ };
88
+ exports.getIsConsultInProgressForConferenceControls = getIsConsultInProgressForConferenceControls;
89
+ const getIsConsultedAgentForControls = (taskData, context, isConsultingState) => {
90
+ return Boolean(taskData?.isConsulted) || isConsultingState && !context.consultInitiator;
91
+ };
92
+ exports.getIsConsultedAgentForControls = getIsConsultedAgentForControls;
93
+ const getServerHoldStateForControls = (context, mainCallId, fallbackTaskData) => {
94
+ const media = context.taskData?.interaction?.media ?? fallbackTaskData?.interaction?.media;
95
+ if (!media) return undefined;
96
+ if (mainCallId && media[mainCallId]) {
97
+ return media[mainCallId].isHold ?? false;
98
+ }
99
+ const mediaId = context.taskData?.mediaResourceId ?? fallbackTaskData?.mediaResourceId;
100
+ if (!mediaId) return undefined;
101
+ return media[mediaId]?.isHold;
102
+ };
103
+
13
104
  /**
14
105
  * Determines if the given agent is the primary agent (owner) of the task
15
106
  * @param task - The task to check
16
107
  * @param agentId - The agent ID to check for primary status
17
108
  * @returns true if the agent is the primary agent, false otherwise
18
109
  */
110
+ exports.getServerHoldStateForControls = getServerHoldStateForControls;
19
111
  const isPrimary = (task, agentId) => {
20
112
  if (!task.data?.interaction?.owner) {
21
113
  // Fall back to checking data.agentId when owner is not set
@@ -35,7 +127,7 @@ const isParticipantInMainInteraction = (task, agentId) => {
35
127
  if (!task?.data?.interaction?.media) {
36
128
  return false;
37
129
  }
38
- return Object.values(task.data.interaction.media).some(mediaObj => mediaObj && mediaObj.mType === 'mainCall' && mediaObj.participants?.includes(agentId));
130
+ return Object.values(task.data.interaction.media).some(mediaObj => mediaObj && mediaObj.mType === _constants.MEDIA_TYPE_MAIN_CALL && mediaObj.participants?.includes(agentId));
39
131
  };
40
132
 
41
133
  /**
@@ -57,23 +149,28 @@ const checkParticipantNotInInteraction = (task, agentId) => {
57
149
 
58
150
  /**
59
151
  * Determines if a conference is currently in progress based on the number of active agent participants
60
- * @param TaskData - The payLoad data to check for conference status
152
+ * @param data - The task data to check for conference status
61
153
  * @returns true if there are 2 or more active agent participants in the main call, false otherwise
154
+ *
155
+ * For Agent B (consulted agent), their task's interactionId may be different from the main call.
156
+ * We use mainInteractionId from the interaction if available, otherwise fallback to interactionId.
62
157
  */
63
158
  exports.checkParticipantNotInInteraction = checkParticipantNotInInteraction;
64
159
  const getIsConferenceInProgress = data => {
65
- const mediaMainCall = data.interaction.media?.[data?.interactionId];
160
+ if (!data.interaction) return false;
161
+ const mainCallId = data.interaction.mainInteractionId || data.interactionId;
162
+ const mediaMainCall = data.interaction.media?.[mainCallId];
66
163
  const participantsInMainCall = new Set(mediaMainCall?.participants);
67
- const participants = data.interaction.participants;
164
+ const {
165
+ participants
166
+ } = data.interaction;
68
167
  const agentParticipants = new Set();
69
- if (participantsInMainCall.size > 0) {
70
- participantsInMainCall.forEach(participantId => {
71
- const participant = participants?.[participantId];
72
- if (participant && participant.pType !== 'Customer' && participant.pType !== 'Supervisor' && !participant.hasLeft && participant.pType !== 'VVA') {
73
- agentParticipants.add(participantId);
74
- }
75
- });
76
- }
168
+ participantsInMainCall.forEach(participantId => {
169
+ const participant = participants[participantId];
170
+ if (participant && participant.pType !== _constants.PARTICIPANT_TYPE.CUSTOMER && participant.pType !== _constants.PARTICIPANT_TYPE.SUPERVISOR && participant.pType !== _constants.PARTICIPANT_TYPE.VVA && !participant.hasLeft) {
171
+ agentParticipants.add(participantId);
172
+ }
173
+ });
77
174
  return agentParticipants.size >= 2;
78
175
  };
79
176
 
@@ -94,24 +191,33 @@ const isSecondaryAgent = interaction => {
94
191
  /**
95
192
  * Checks if the current agent is a secondary EP-DN (Entry Point Dial Number) agent.
96
193
  * This is specifically for telephony consultations to external numbers/entry points.
97
- * @param task - The task object containing interaction details
194
+ * @param interaction - The interaction object
98
195
  * @returns true if this is a secondary EP-DN agent in telephony consultation, false otherwise
99
196
  */
100
197
  exports.isSecondaryAgent = isSecondaryAgent;
101
198
  const isSecondaryEpDnAgent = interaction => {
102
- if (!interaction) {
103
- return false;
104
- }
105
199
  return interaction.mediaType === 'telephony' && isSecondaryAgent(interaction);
106
200
  };
107
201
 
202
+ /**
203
+ * Checks if the task belongs to a campaign preview interaction.
204
+ * Campaign preview ContactEnded events are terminal cleanup events and should not trigger wrapup.
205
+ */
206
+ exports.isSecondaryEpDnAgent = isSecondaryEpDnAgent;
207
+ const isCampaignPreviewTask = taskData => {
208
+ const outboundType = taskData?.interaction?.outboundType ?? '';
209
+ const cpd = taskData?.interaction?.callProcessingDetails;
210
+ const campaignType = cpd?.campaignType ?? '';
211
+ return CAMPAIGN_PREVIEW_OUTBOUND_TYPES.includes(outboundType) || CAMPAIGN_PREVIEW_CAMPAIGN_TYPES.includes(campaignType);
212
+ };
213
+
108
214
  /**
109
215
  * Checks if auto-answer is enabled for the agent participant
110
216
  * @param interaction - The interaction object
111
217
  * @param agentId - Current agent ID
112
218
  * @returns true if auto-answer is enabled, false otherwise
113
219
  */
114
- exports.isSecondaryEpDnAgent = isSecondaryEpDnAgent;
220
+ exports.isCampaignPreviewTask = isCampaignPreviewTask;
115
221
  const isAutoAnswerEnabled = (interaction, agentId) => {
116
222
  return interaction.participants?.[agentId]?.autoAnswerEnabled === true;
117
223
  };
@@ -125,7 +231,7 @@ const isAutoAnswerEnabled = (interaction, agentId) => {
125
231
  */
126
232
  exports.isAutoAnswerEnabled = isAutoAnswerEnabled;
127
233
  const isWebRTCCall = (interaction, loginOption, webRtcEnabled) => {
128
- return webRtcEnabled && loginOption === _types3.LoginOption.BROWSER && interaction.mediaType === _constants.OUTDIAL_MEDIA_TYPE;
234
+ return webRtcEnabled && loginOption === _types2.LoginOption.BROWSER && interaction.mediaType === _constants2.OUTDIAL_MEDIA_TYPE;
129
235
  };
130
236
 
131
237
  /**
@@ -135,7 +241,7 @@ const isWebRTCCall = (interaction, loginOption, webRtcEnabled) => {
135
241
  */
136
242
  exports.isWebRTCCall = isWebRTCCall;
137
243
  const isDigitalOutbound = interaction => {
138
- return interaction.contactDirection?.type === _constants.OUTDIAL_DIRECTION && interaction.outboundType === _constants.OUTBOUND_TYPE && (interaction.mediaChannel === _types.MEDIA_CHANNEL.EMAIL || interaction.mediaChannel === _types.MEDIA_CHANNEL.SMS);
244
+ return interaction.contactDirection?.type === _constants2.OUTDIAL_DIRECTION && interaction.outboundType === _constants2.OUTBOUND_TYPE && (interaction.mediaChannel === _types.MEDIA_CHANNEL.EMAIL || interaction.mediaChannel === _types.MEDIA_CHANNEL.SMS);
139
245
  };
140
246
 
141
247
  /**
@@ -146,7 +252,7 @@ const isDigitalOutbound = interaction => {
146
252
  */
147
253
  exports.isDigitalOutbound = isDigitalOutbound;
148
254
  const hasAgentInitiatedOutdial = (interaction, agentId) => {
149
- return interaction.contactDirection?.type === _constants.OUTDIAL_DIRECTION && interaction.outboundType === _constants.OUTBOUND_TYPE && interaction.callProcessingDetails?.outdialAgentId === agentId && interaction.owner === agentId && !interaction.callProcessingDetails?.BLIND_TRANSFER_IN_PROGRESS;
255
+ return interaction.contactDirection?.type === _constants2.OUTDIAL_DIRECTION && interaction.outboundType === _constants2.OUTBOUND_TYPE && interaction.callProcessingDetails?.outdialAgentId === agentId && interaction.owner === agentId && !interaction.callProcessingDetails?.BLIND_TRANSFER_IN_PROGRESS;
150
256
  };
151
257
 
152
258
  /**
@@ -191,6 +297,36 @@ const shouldAutoAnswerTask = (taskData, agentId, loginOption, webRtcEnabled) =>
191
297
  return false;
192
298
  };
193
299
 
300
+ /**
301
+ * Gets the consult media resource ID for switch-call operations.
302
+ * Searches for the consult media leg in the interaction.
303
+ *
304
+ * @param interaction - The interaction object
305
+ * @param consultMediaResourceId - The consult media resource ID from task data
306
+ * @param agentId - Current agent ID
307
+ * @returns The consult media resource ID or undefined
308
+ */
309
+ exports.shouldAutoAnswerTask = shouldAutoAnswerTask;
310
+ const getConsultMediaResourceId = (interaction, consultMediaResourceId, agentId) => {
311
+ // First priority: use consultMediaResourceId from task data if available
312
+ if (consultMediaResourceId) {
313
+ return consultMediaResourceId;
314
+ }
315
+
316
+ // Second priority: search for consult media leg in interaction.media
317
+ if (!interaction?.media || !agentId) {
318
+ return undefined;
319
+ }
320
+
321
+ // Find the consult media leg where this agent is a participant
322
+ for (const [mediaId, media] of Object.entries(interaction.media)) {
323
+ if (media.mType === 'consult' && media.participants?.includes(agentId)) {
324
+ return mediaId;
325
+ }
326
+ }
327
+ return undefined;
328
+ };
329
+
194
330
  /**
195
331
  * Checks if a task is a campaign preview reservation that has not yet been accepted.
196
332
  * Campaign preview tasks should not trigger incoming call handling until the agent
@@ -198,9 +334,9 @@ const shouldAutoAnswerTask = (taskData, agentId, loginOption, webRtcEnabled) =>
198
334
  * @param task - The task to check
199
335
  * @returns true if the task is a pending campaign preview reservation, false otherwise
200
336
  */
201
- exports.shouldAutoAnswerTask = shouldAutoAnswerTask;
337
+ exports.getConsultMediaResourceId = getConsultMediaResourceId;
202
338
  const isCampaignPreviewReservation = task => {
203
- return task?.data?.type === _types2.CC_EVENTS.AGENT_OFFER_CAMPAIGN_RESERVATION;
339
+ return task?.data?.type === _types3.CC_EVENTS.AGENT_OFFER_CAMPAIGN_RESERVATION;
204
340
  };
205
341
  exports.isCampaignPreviewReservation = isCampaignPreviewReservation;
206
342
  //# sourceMappingURL=TaskUtils.js.map